Build on our company data.

Add company details and buying signals to your product, scripts or assistant with one API key.

curl https://api.firmographic.com/v1/companies/northwind.example \
  -H "Authorization: Bearer $API_KEY"

Pick the way you work

API

Show company data and buying signals inside your own product.

CLI

Look up accounts and run lists from your terminal or scripts.

MCP server

Let Claude, Cursor and similar assistants look up accounts for you.

API reference

The base URL is https://api.firmographic.com. Send your key as Authorization: Bearer fg_live_... or in x-api-key. Each workspace can make 600 requests a minute.

Every data response has the same shape: {data, meta: {records, credits_used, credits_left, next_cursor}}. Where a route takes a cursor, pass next_cursor to get the next page. Pass fields to get only what you need.

Companies

GET /v1/companies/{domain}

A company's profile: size, industry and location, with its lead score and the reasons for it. A domain we do not have returns 404 and costs nothing.

1 credit per company found · MCP tool get_company · CLI firmographic company
ParameterInDescription
domain *pathThe company's domain.
fieldsqueryComma-separated fields to keep, to make the response smaller.
curl https://api.firmographic.com/v1/companies/northwind.example \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": {
    "city": "Chicago",
    "country": "US",
    "employees": "201-500",
    "industry": "Transportation and Logistics",
    "name": "Northwind Freight",
    "region": "North America",
    "source": "sample",
    "updated_at": "2026-11-04T13:42:55.83Z",
    "domain": "northwind.example",
    "lead": {
      "score": 60,
      "heat": "hot",
      "reasons": [
        "funding",
        "hiring"
      ]
    }
  },
  "meta": {
    "records": 1,
    "credits_used": 1,
    "credits_left": 99,
    "next_cursor": null
  }
}

Tech stack

GET /v1/companies/{domain}/tech

The vendors a company uses, with start dates and sources. One charge covers the whole list; an empty list is free.

1 credit per company with results · MCP tool get_tech_stack · CLI firmographic tech
ParameterInDescription
domain *pathThe company's domain.
fieldsqueryComma-separated fields to keep, to make the response smaller.
curl https://api.firmographic.com/v1/companies/northwind.example/tech \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": [
    {
      "category": "customer relationship management",
      "domain": "northwind.example",
      "source": "dns record",
      "started_at": "2025-10-02T13:42:55.83Z",
      "vendor": "Quartz CRM",
      "vendor_slug": "quartz-crm"
    }
  ],
  "meta": {
    "records": 1,
    "credits_used": 1,
    "credits_left": 97,
    "next_cursor": null
  }
}

Vendors

GET /v1/vendors

The vendors we track, with the slugs the other routes take.

Free · MCP tool list_vendors · CLI firmographic vendors
ParameterInDescription
categoryqueryFilter by category.
fieldsqueryComma-separated fields to keep, to make the response smaller.
curl https://api.firmographic.com/v1/vendors \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": [
    {
      "category": "live chat",
      "market": "SMB",
      "name": "Acme Chat",
      "slug": "acme-chat"
    }
  ],
  "meta": {
    "records": 1,
    "credits_used": 0,
    "credits_left": 97,
    "next_cursor": null
  }
}

Vendor customers

GET /v1/vendors/{vendor}/customers

Companies that use a vendor, with when they started and how we know.

1 credit per company returned · MCP tool get_vendor_customers · CLI firmographic customers
ParameterInDescription
vendor *pathThe vendor's slug, from /v1/vendors.
limitqueryRecords to return, 1 to 100. Default 20.
cursorquerynext_cursor from the last response.
fieldsqueryComma-separated fields to keep, to make the response smaller.
curl https://api.firmographic.com/v1/vendors/quartz-crm/customers \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": [
    {
      "city": "Chicago",
      "country": "US",
      "employees": "201-500",
      "industry": "Transportation and Logistics",
      "name": "Northwind Freight",
      "region": "North America",
      "source": "dns record",
      "updated_at": "2026-11-04T13:42:55.83Z",
      "domain": "northwind.example",
      "started_at": "2025-10-02T13:42:55.83Z"
    }
  ],
  "meta": {
    "records": 1,
    "credits_used": 1,
    "credits_left": 96,
    "next_cursor": null
  }
}

Signals

GET /v1/signals

Company events, newest first: funding, hiring, vendor changes, new technology, and visits to your own website. Each has a source and a date.

2 credits per signal returned · MCP tool get_signals · CLI firmographic signals
ParameterInDescription
typequeryComma-separated: funding, hiring, vendor_change, tech, visit.
domainqueryOnly this company.
industryqueryComma-separated LinkedIn industries.
employeesqueryComma-separated employee bands.
countryqueryComma-separated ISO country codes.
sincequeryHow far back: 7d, or a date such as 2026-10-30.
limitqueryRecords to return, 1 to 100. Default 20.
cursorquerynext_cursor from the last response.
fieldsqueryComma-separated fields to keep, to make the response smaller.
curl https://api.firmographic.com/v1/signals \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": [
    {
      "company": {
        "name": "Northwind Freight",
        "employees": "201-500",
        "industry": "Transportation and Logistics",
        "country": "US"
      },
      "date": "2026-11-03T13:42:55.83Z",
      "domain": "northwind.example",
      "source": "press release",
      "title": "Raised a Series B",
      "type": "funding"
    }
  ],
  "meta": {
    "records": 1,
    "credits_used": 2,
    "credits_left": 92,
    "next_cursor": null
  }
}

Jobs

GET /v1/companies/{domain}/jobs

A company's open jobs, newest first.

1 credit per job returned · MCP tool get_jobs · CLI firmographic jobs
ParameterInDescription
domain *pathThe company's domain.
teamqueryComma-separated teams.
limitqueryRecords to return, 1 to 100. Default 20.
fieldsqueryComma-separated fields to keep, to make the response smaller.
curl https://api.firmographic.com/v1/companies/northwind.example/jobs \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": [
    {
      "domain": "northwind.example",
      "location": "Chicago, US",
      "posted_at": "2026-11-04T13:42:55.83Z",
      "source": "careers page",
      "team": "sales",
      "title": "Account Executive"
    }
  ],
  "meta": {
    "records": 1,
    "credits_used": 1,
    "credits_left": 91,
    "next_cursor": null
  }
}

People

GET /v1/companies/{domain}/people

A company's decision makers, most senior first.

2 credits per person returned · MCP tool get_people · CLI firmographic people
ParameterInDescription
domain *pathThe company's domain.
seniorityqueryComma-separated: c_level, vp, head, director, manager.
departmentqueryComma-separated: sales, marketing, engineering, finance, operations, it, support, product.
limitqueryRecords to return, 1 to 100. Default 20.
fieldsqueryComma-separated fields to keep, to make the response smaller.
curl https://api.firmographic.com/v1/companies/northwind.example/people \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": [
    {
      "department": "sales",
      "domain": "northwind.example",
      "name": "Dana Whitfield",
      "rank": 1,
      "seniority": "vp",
      "source": "sample",
      "title": "VP Sales",
      "updated_at": "2026-11-02T13:42:55.83Z"
    }
  ],
  "meta": {
    "records": 1,
    "credits_used": 2,
    "credits_left": 89,
    "next_cursor": null
  }
}

Leads

GET /v1/leads

The best accounts to contact now: companies with recent signals ranked hot, warm or cold, with the reasons and a contact.

1 credit per lead returned · MCP tool get_leads · CLI firmographic leads
ParameterInDescription
heatqueryComma-separated: hot, warm, cold.
limitqueryRecords to return, 1 to 100. Default 20.
fieldsqueryComma-separated fields to keep, to make the response smaller.
curl https://api.firmographic.com/v1/leads \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": [
    {
      "domain": "northwind.example",
      "company": "Northwind Freight",
      "lead": {
        "score": 60,
        "heat": "hot",
        "reasons": [
          "funding",
          "hiring"
        ]
      },
      "contact": {
        "department": "sales",
        "domain": "northwind.example",
        "name": "Dana Whitfield",
        "rank": 1,
        "seniority": "vp",
        "source": "sample",
        "title": "VP Sales",
        "updated_at": "2026-11-02T13:42:55.83Z"
      }
    }
  ],
  "meta": {
    "records": 1,
    "credits_used": 1,
    "credits_left": 88,
    "next_cursor": null
  }
}

Visitors

GET /v1/visitors

Companies on your website, grouped by company with the pages they read. Only your workspace's visits are returned.

Free · MCP tool get_visitors · CLI firmographic visitors
ParameterInDescription
sincequeryHow far back: 7d by default, or a date such as 2026-10-30.
limitqueryRecords to return, 1 to 100. Default 20.
fieldsqueryComma-separated fields to keep, to make the response smaller.
curl https://api.firmographic.com/v1/visitors \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": [
    {
      "domain": "keystone.example",
      "company": "Keystone Labs",
      "visits": 4,
      "pages": [
        "/pricing"
      ],
      "last_seen": "2026-11-05T09:12:44Z"
    }
  ],
  "meta": {
    "records": 1,
    "credits_used": 0,
    "credits_left": 88,
    "next_cursor": null
  }
}

Usage

GET /v1/usage

Credits left in this workspace and the rate for each operation.

Free · CLI firmographic usage
curl https://api.firmographic.com/v1/usage \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": {
    "credits_left": 88,
    "rates": {
      "company": 1,
      "search": 1,
      "tech": 1,
      "customers": 1,
      "signals": 2,
      "jobs": 1,
      "people": 2,
      "leads": 1,
      "funding": 0,
      "visitors": 0,
      "vendors": 0
    }
  }
}

Funding events

GET /v1/funding/events

Funding rounds with every source, newest announcement first, 100 to a page. For workspaces that have bought credits.

Free · MCP tool get_funding_events · CLI firmographic funding
ParameterInDescription
periodqueryFound in the last 24h, 7d and so on, up to 90d.
sincequeryFound since this timestamp. Use after a missed webhook.
fromqueryAnnounced on or after this date.
toqueryAnnounced on or before this date.
pagequeryThe page, from 1.
curl https://api.firmographic.com/v1/funding/events \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": [
    {
      "event": "funding.announced",
      "event_id": "fnd_8f3a",
      "company": "Northwind Freight",
      "domain": "northwind.example",
      "round": "series_b",
      "kind": "venture",
      "amount": {
        "value": 40000000,
        "currency": "USD",
        "text": "$40M"
      },
      "investors": [
        "Example Ventures"
      ],
      "confidence": 0.93,
      "sources": [
        {
          "site": "techcrunch.com",
          "title": "Northwind Freight raises $40M",
          "url": "https://techcrunch.com/example"
        }
      ],
      "announced_at": "2026-11-03T00:00:00.000Z",
      "date_source": "url",
      "detected_at": "2026-11-03T13:42:55.830Z"
    }
  ],
  "meta": {
    "records": 1,
    "credits_used": 0,
    "credits_left": 92,
    "next_cursor": null
  }
}

Subscribe to funding

PUT /v1/funding/subscription

Sends each new funding event to your webhook, one copy each. Past events are not sent. For workspaces that have bought credits. GET reads the subscription and DELETE ends it.

Free
curl https://api.firmographic.com/v1/funding/subscription \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": {
    "subscribed": true,
    "subscribed_at": "2026-11-06T10:00:00.000Z"
  }
}

Webhooks

POST /v1/webhooks

Send new signals to a public URL, signed. The secret is returned once, here and nowhere else.

Free · MCP tool watch_company · CLI firmographic watch
ParameterInDescription
url *bodyPublic http(s) URL that receives each event.
domainsbodyArray of companies to watch. Empty watches all.
typesbodyArray of signal types. Empty sends all. Funding needs a funding subscription.
curl -X POST https://api.firmographic.com/v1/webhooks \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://hooks.example.com/firmographic","domains":["northwind.example"],"types":["funding","hiring"]}'
201
{
  "data": {
    "id": "690c9f1e5b1d3a2f7c8e4a10",
    "url": "https://hooks.example.com/firmographic",
    "types": [
      "hiring",
      "vendor_change"
    ],
    "domains": [
      "northwind.example"
    ],
    "secret": "whsec_..."
  }
}

List webhooks

GET /v1/webhooks

This workspace's webhooks. Secrets are never listed.

Free
curl https://api.firmographic.com/v1/webhooks \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": [
    {
      "url": "https://hooks.example.com/firmographic",
      "types": [
        "hiring",
        "vendor_change"
      ],
      "domains": [
        "northwind.example"
      ],
      "created_at": "2026-11-06T10:00:00.000Z",
      "id": "690c9f1e5b1d3a2f7c8e4a10"
    }
  ]
}

Delete a webhook

DELETE /v1/webhooks/{id}

Stops a webhook.

Free
ParameterInDescription
id *pathThe webhook's id.
curl -X DELETE https://api.firmographic.com/v1/webhooks/690c9f1e5b1d3a2f7c8e4a10 \
  -H "Authorization: Bearer $API_KEY"
200
{
  "data": {
    "deleted": true
  }
}

Routes without a key

GET /v.jsThe website tracker script.
POST /v1/collectWhere the tracker reports a page view: {site, path}. It always answers 204. The IP is matched to a company and never stored.
GET /healthAnswers ok when the API is up.

Errors

Every error says what went wrong and how to fix it, so an agent can correct itself.

{
  "error": {
    "code": "invalid_parameter",
    "message": "`limit` must be from 1 to 100.",
    "fix": "Correct `limit` and retry."
  }
}
StatusCodeMeaning
400invalid_parameterA parameter is missing or malformed. The fix names it.
400invalid_jsonThe request body is not valid JSON.
401unauthorizedThe API key is missing, invalid or revoked.
402insufficient_creditsThe call costs more credits than the workspace has. Nothing was charged.
402payment_requiredFunding events are for workspaces that have bought credits. Nothing was charged.
404not_foundNo data for this company or webhook. Nothing was charged.
429rate_limitedToo many requests from this workspace this minute.
500internalSomething failed on our side. Nothing was charged.

Webhooks

Create one with POST /v1/webhooks or in the dashboard. Each new signal that matches is sent as a POST. A receiver that was down gets what it missed, in order, once it answers 2xx again. Funding is sent differently: subscribe with PUT /v1/funding/subscription, and each event goes once to your oldest webhook that takes funding from every company. A send that may have arrived is not repeated, so use GET /v1/funding/events?since= to catch up.

Event

{
  "event": "signal.hiring",
  "data": {
    "company": {
      "name": "Northwind Freight",
      "employees": "201-500",
      "industry": "Transportation and Logistics",
      "country": "US"
    },
    "date": "2026-11-03T13:42:55.83Z",
    "domain": "northwind.example",
    "source": "careers page",
    "title": "6 open sales roles",
    "type": "hiring",
    "id": "690c9f1e5b1d3a2f7c8e4a11"
  }
}

Signature

Each request carries x-firmographic-signature: sha256=<hmac of the body>, an HMAC-SHA256 of the raw body keyed with the webhook's secret. Check it before trusting the event.

import { createHmac, timingSafeEqual } from "node:crypto"

// rawBody is the request body exactly as received.
function verify(rawBody, header, secret) {
  const expected = "sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex")
  return header.length === expected.length && timingSafeEqual(Buffer.from(header), Buffer.from(expected))
}

Website tracker

Add your site in the dashboard, then paste its tag into your pages. The IP is matched to a company and never stored, and visits we cannot match leave no trace.

<script src="https://api.firmographic.com/v.js" data-site="YOUR_SITE_ID" defer></script>

MCP

The server is at https://api.firmographic.com/mcp. Connect with an API key, or leave the header out and your client signs in with OAuth and picks a workspace. Tools return the same data at the same price as REST.

{
  "mcpServers": {
    "firmographic": {
      "url": "https://api.firmographic.com/mcp",
      "headers": {
        "Authorization": "Bearer $API_KEY"
      }
    }
  }
}
ToolRouteCredits
get_companyGET /v1/companies/{domain}1 credit per company found
search_companiesGET /v1/companies1 credit per company returned
get_tech_stackGET /v1/companies/{domain}/tech1 credit per company with results
list_vendorsGET /v1/vendorsFree
get_vendor_customersGET /v1/vendors/{vendor}/customers1 credit per company returned
get_signalsGET /v1/signals2 credits per signal returned
get_jobsGET /v1/companies/{domain}/jobs1 credit per job returned
get_peopleGET /v1/companies/{domain}/people2 credits per person returned
get_leadsGET /v1/leads1 credit per lead returned
get_visitorsGET /v1/visitorsFree
get_funding_eventsGET /v1/funding/eventsFree
watch_companyPOST /v1/webhooksFree

CLI

Every command is one API call, printed as JSON. Set FIRMOGRAPHIC_API_KEY; FIRMOGRAPHIC_API_URL overrides the default API address. Any flag becomes a query parameter, such as --fields name,domain or --limit 50.

$ firmographic company northwind.example
$ firmographic search --country US --employees 201-500
$ firmographic tech northwind.example
$ firmographic vendors
$ firmographic customers quartz-crm
$ firmographic signals --type funding,hiring --since 7d
$ firmographic jobs northwind.example
$ firmographic people northwind.example --seniority vp
$ firmographic leads --heat hot
$ firmographic visitors --since 30d
$ firmographic usage
$ firmographic funding --period 7d
$ firmographic watch https://hooks.example.com/firmographic --domains northwind.example --types hiring,vendor_change

Get your API key.

Get API keyRead the docs