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
Parameter
In
Description
domain *
path
The company's domain.
fields
query
Comma-separated fields to keep, to make the response smaller.
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.
Where the tracker reports a page view: {site, path}. It always answers 204. The IP is matched to a company and never stored.
GET /health
Answers 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."
}
}
Status
Code
Meaning
400
invalid_parameter
A parameter is missing or malformed. The fix names it.
400
invalid_json
The request body is not valid JSON.
401
unauthorized
The API key is missing, invalid or revoked.
402
insufficient_credits
The call costs more credits than the workspace has. Nothing was charged.
402
payment_required
Funding events are for workspaces that have bought credits. Nothing was charged.
404
not_found
No data for this company or webhook. Nothing was charged.
429
rate_limited
Too many requests from this workspace this minute.
500
internal
Something 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.
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.
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.
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.