Enrich Company Data
POST https://api.onfire.ai/data-access-api/v1/company/enrichRetrieve firmographic and technographic data for one or more companies.
How it works
Section titled “How it works”- Send a list of company identifiers (website, LinkedIn URL, or LinkedIn ID).
- Specify which
fieldsyou want returned. - Optionally set
include_metadata: trueto automatically append your tenant’s pre-configured buying-committee and technology insight queries. - Optionally include
allow_signalsto attach intent signals to each matched company, filtered by date range and/or signal type.
Available fields
Section titled “Available fields”Standard profile fields are returned directly from the company’s
firmographic record. Pass any of the names below in the fields array
to retrieve them.
Identifiers
Section titled “Identifiers”| Field | Type | Description |
|---|---|---|
linkedin_url | string | The company’s LinkedIn page URL. |
linkedin_id | string | Numeric LinkedIn company id. |
linkedin_url_hash | string | Stable hash of the canonical LinkedIn URL — useful as a join key. |
website | string | Normalized primary website domain. |
Profile
Section titled “Profile”| Field | Type | Description |
|---|---|---|
name | string | Canonical company name. |
industry | string | Primary industry classification. |
size | string | Employee-count band (e.g. "1001-5000", "10001+"). |
employee_count | int | Exact reported employee headcount. |
founded_year | int | Year the company was founded. |
account_type | string | Account classification (e.g. Public, Private, Educational, Nonprofit). |
annual_revenue_range | string | Revenue band (e.g. "$100M-$500M"). |
account_description | string | Long-form company description (from the company’s own profile). |
tagline | string | Short tagline / one-line positioning. |
follower_count | int | LinkedIn follower count. |
specialities | string[] | Self-declared areas of focus / specialities. |
is_b2b | boolean | Whether the company is classified as B2B. |
enriched_category | string | Onfire-derived category label. |
ticker | string | Stock ticker symbol (for public companies). |
account_last_updated | string | ISO timestamp of the last firmographic refresh. |
AI-generated
Section titled “AI-generated”| Field | Type | Description |
|---|---|---|
ai_account_summary | string | LLM-generated executive summary of the company. |
account_keywords | string[] | LLM-derived keywords summarising the company’s focus areas. |
Location
Section titled “Location”| Field | Type | Description |
|---|---|---|
location_name | string | Free-text label for the headquarters location. |
location_street_address | string | Street-level address. |
location_locality | string | City. |
location_region | string | State, province, or region. |
location_metro | string | Metro area (e.g. "San Francisco Bay Area"). |
location_postal_code | string | Postal / ZIP code. |
location_country | string | Country. |
location_continent | string | Continent. |
location_geo | string | "lat,lng" coordinate pair for the headquarters. |
Funding
Section titled “Funding”| Field | Type | Description |
|---|---|---|
funding_profile_url | string | URL to the company’s funding profile (e.g. Crunchbase). |
funding_last_date | string | Date of the most recent funding round (ISO). |
funding_last_type | string | Round type (e.g. "Series B", "IPO", "Acquisition"). |
Contact
Section titled “Contact”| Field | Type | Description |
|---|---|---|
account_phones | string[] | Listed phone numbers for the company. |
account_emails | string[] | Listed contact email addresses for the company. |
Social
Section titled “Social”| Field | Type | Description |
|---|---|---|
facebook_url | string | Facebook page URL. |
instagram_url | string | Instagram profile URL. |
youtube_url | string | YouTube channel URL. |
github_url | string | GitHub organization URL. |
tiktok_url | string | TikTok profile URL. |
x_url | string | X (formerly Twitter) profile URL. |
discord_url | string | Discord invite or server URL. |
reddit_url | string | Reddit community URL. |
Custom query fields (tenant-specific) return numeric counts of
employees matching a role or technology query configured for your
tenant — for example cto, security, it, Splunk, SIEM, Jira,
ServiceNow, CrowdStrike, Datadog. The exact set is configured per
tenant; use include_metadata: true to append all of your tenant’s
custom queries automatically.
Billing
Section titled “Billing”Credits are consumed up-front for the total number of companies in the
request, then confirmed for the number of successfully matched
results. Unmatched results are not billed. Each unique company counts
as one credit under the data-access-api feature.
Request
Section titled “Request”Headers
Section titled “Headers”| Header | Required | Description |
|---|---|---|
Content-Type | Yes | Must be application/json. |
X-Api-Key | Yes | Your tenant API key. |
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
companies | CompanyIdentifier[] | Yes | — | One or more company identifiers (see CompanyIdentifier below). |
fields | string[] | No* | [] | Data fields to return for each company. See the catalogue above. |
include_metadata | boolean | No | false | When true, appends your tenant’s pre-configured query fields to fields. See include_metadata below. |
enhanced_matching | boolean | No | true | When true, uses fuzzy domain matching and cross-referencing across identifiers for higher match rates. Set to false only if you need strict exact-match behavior. |
allow_signals | AllowSignals | No | null | When present, retrieves intent signals per company, matched by account_website. Pass {} for unfiltered results, or supply start_time, end_time, and/or type to narrow them. |
* At least one of fields (non-empty), include_metadata: true, or
allow_signals must be provided. Otherwise the API returns
400 NO_FIELDS_PROVIDED.
CompanyIdentifier (inline) {#companyidentifier-inline}
Section titled “CompanyIdentifier (inline) {#companyidentifier-inline}”Each entry in companies is a CompanyIdentifier. You must provide
at least one of website, linkedin_url, or linkedin_id. When
multiple are supplied the system uses them together for higher-confidence
matching.
| Field | Type | Required | Description |
|---|---|---|---|
website | string | One-of | The company’s primary website domain or full URL — e.g. "crowdstrike.com" or "https://www.crowdstrike.com". The domain is normalized internally, so either format works. |
linkedin_url | string | One-of | The company’s LinkedIn page URL — e.g. "linkedin.com/company/crowdstrike". The https://www. prefix is optional and will be normalized. |
linkedin_id | string | One-of | The numeric LinkedIn company ID — e.g. "2135371". Use this when the LinkedIn URL isn’t available but the numeric ID is. |
external_id | string | No | A caller-supplied identifier — for example a spreadsheet row number, a UUID, or a CRM record ID. Not used for matching. It is echoed back unchanged in the response’s identifier object so you can correlate enrichment results with your source records. |
include_metadata {#include_metadata}
Section titled “include_metadata {#include_metadata}”When true, the service looks up your tenant’s pre-configured query
fields (configured under tenant.companyEnrichQueries in tenant
settings) and appends them to whatever you passed in fields.
- Additive: any fields you explicitly list are still returned.
- De-duplicated: fields already in your list are not added twice.
- Tenant-specific: the appended fields depend on your tenant
configuration. Typical entries include role queries (
cto,security,it) and technology queries (Splunk,Datadog,Jira,CrowdStrike,SIEM,ServiceNow).
Use this when you want every available buying-committee and tech-stack signal for the company without hard-coding the list of queries in your client.
enhanced_matching
Section titled “enhanced_matching”When true (the default), the matcher applies fuzzy domain
normalization (e.g. stripping subdomains, handling www. and protocol
prefixes) and cross-references identifiers (e.g. resolving a LinkedIn
URL to a website when only one identifier matched directly). This
yields the highest match rate.
Set to false only when you need strict, exact-match behavior — for
example when reconciling against a curated CRM list where you trust the
identifier exactly as supplied.
allow_signals (inline) {#allow_signals-inline}
Section titled “allow_signals (inline) {#allow_signals-inline}”When provided, the response attaches a signals array to each matched
company’s data. Signals are looked up in the signals database by
account_website. All filter fields are optional.
| Field | Type | Description |
|---|---|---|
start_time | string (ISO YYYY-MM-DD) | Include signals on or after this calendar date. |
end_time | string (ISO YYYY-MM-DD) | Include signals up to and including this calendar date. Omit (along with start_time) to return all dates. |
type | SignalType | Filter by signal type. When omitted, all signal types are returned. |
Pass an empty object {} to retrieve all signals for the matched
companies with no filtering. When allow_signals is omitted entirely,
no signals array is attached to the response.
Example: minimal request
Section titled “Example: minimal request”Look up a single company by LinkedIn URL and return standard profile fields. No signals, no tenant metadata.
curl -X POST "https://api.onfire.ai/data-access-api/v1/company/enrich" \ -H "Content-Type: application/json" \ -H "X-Api-Key: your-api-key" \ -d '{ "companies": [ { "linkedin_url": "linkedin.com/company/crowdstrike" } ], "fields": [ "name", "industry", "size", "employee_count", "location_country" ] }'Example: with tenant metadata and signals
Section titled “Example: with tenant metadata and signals”Append your tenant’s pre-configured query fields automatically and attach high-intent signals from Q4 2024.
curl -X POST "https://api.onfire.ai/data-access-api/v1/company/enrich" \ -H "Content-Type: application/json" \ -H "X-Api-Key: your-api-key" \ -d '{ "companies": [ { "linkedin_url": "linkedin.com/company/crowdstrike" } ], "fields": [ "name", "industry", "size", "employee_count", "website", "company_linkedin_url", "company_website", "location_country", "location_region", "location_locality", "location_postal_code" ], "include_metadata": true, "enhanced_matching": true, "allow_signals": { "start_time": "2024-09-01", "end_time": "2024-12-31", "type": "High Intent" } }'Example: batch lookup with external_id correlation
Section titled “Example: batch lookup with external_id correlation”Enrich multiple companies in one call. Each input carries an
external_id (here, spreadsheet row numbers) that is echoed back in
the response so you can join the results back to your source.
curl -X POST "https://api.onfire.ai/data-access-api/v1/company/enrich" \ -H "Content-Type: application/json" \ -H "X-Api-Key: your-api-key" \ -d '{ "companies": [ { "website": "crowdstrike.com", "external_id": "row_1" }, { "linkedin_url": "linkedin.com/company/datadog", "external_id": "row_2" }, { "linkedin_id": "2135371", "external_id": "row_3" } ], "fields": ["name", "industry", "size", "location_country"], "include_metadata": true }'Example: signals only (no firmographic fields)
Section titled “Example: signals only (no firmographic fields)”You can omit fields entirely if you only want signals back. The
response will include each company’s identifier plus a signals array.
curl -X POST "https://api.onfire.ai/data-access-api/v1/company/enrich" \ -H "Content-Type: application/json" \ -H "X-Api-Key: your-api-key" \ -d '{ "companies": [ { "website": "bankofamerica.com" } ], "allow_signals": {} }'Responses
Section titled “Responses”200 — Success
Section titled “200 — Success”Returns a results array with one EnrichmentResult
per input company, in the same order as the request.
{ "results": [ { "identifier": { "linkedin_url": "linkedin.com/company/crowdstrike" }, "data": { "name": "crowdstrike", "industry": "computer and network security", "size": "5001-10000", "employee_count": "10846", "website": "crowdstrike.com", "company_linkedin_url": "linkedin.com/company/crowdstrike", "company_website": "crowdstrike.com", "location_country": "united states", "location_region": "texas", "location_locality": "austin", "location_postal_code": "78758", "cto": 12, "security": 3421, "it": 540, "Splunk": 18, "SIEM": 92, "CrowdStrike": 1274, "signals": [] }, "matched": true } ]}Each result includes:
identifier— the identifier fields you supplied, echoed back (includingexternal_idif you provided one).data— the requested fields plus, ifallow_signalswas set, asignalsarray ofSignalRecordentries.matched—trueif a record was found,falseif not. Whenfalse, every requested field key is still present indatabut with anullvalue, and the result is not billed.
400 — Validation error
Section titled “400 — Validation error”Returned when the request body is structurally valid but missing required
input — i.e. an empty companies list, or no fields, include_metadata,
or allow_signals provided.
{ "detail": { "status": "NO_COMPANIES_PROVIDED", "message": "At least one company identifier must be provided" }}{ "detail": { "status": "NO_FIELDS_PROVIDED", "message": "Provide at least one field name in 'fields', set 'include_metadata' to true, or provide 'allow_signals'" }}401 — Invalid or missing API key
Section titled “401 — Invalid or missing API key”{ "detail": "Invalid API key" }422 — Schema validation error
Section titled “422 — Schema validation error”Returned when the JSON body fails Pydantic validation — for example, a
CompanyIdentifier with no website, linkedin_url, or linkedin_id;
a non-string external_id; or an allow_signals.type value outside the
SignalType enum.
The response body conforms to
HTTPValidationError — a detail
array of one entry per offending field, with the JSON pointer path,
human-readable message, and Pydantic error type.
{ "detail": [ { "loc": ["body", "companies", 0], "msg": "Value error, At least one identifier (website, linkedin_url, or linkedin_id) must be provided", "type": "value_error" } ]}429 — Rate limit exceeded
Section titled “429 — Rate limit exceeded”{ "detail": "Rate limit exceeded" }500 — Internal enrichment failure
Section titled “500 — Internal enrichment failure”{ "detail": { "status": "ENRICHMENT_FAILED", "message": "An error occurred while processing the request" }}