Skip to content

Enrich Company Data

POST https://api.onfire.ai/data-access-api/v1/company/enrich

Retrieve firmographic and technographic data for one or more companies.

  1. Send a list of company identifiers (website, LinkedIn URL, or LinkedIn ID).
  2. Specify which fields you want returned.
  3. Optionally set include_metadata: true to automatically append your tenant’s pre-configured buying-committee and technology insight queries.
  4. Optionally include allow_signals to attach intent signals to each matched company, filtered by date range and/or signal type.

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.

FieldTypeDescription
linkedin_urlstringThe company’s LinkedIn page URL.
linkedin_idstringNumeric LinkedIn company id.
linkedin_url_hashstringStable hash of the canonical LinkedIn URL — useful as a join key.
websitestringNormalized primary website domain.
FieldTypeDescription
namestringCanonical company name.
industrystringPrimary industry classification.
sizestringEmployee-count band (e.g. "1001-5000", "10001+").
employee_countintExact reported employee headcount.
founded_yearintYear the company was founded.
account_typestringAccount classification (e.g. Public, Private, Educational, Nonprofit).
annual_revenue_rangestringRevenue band (e.g. "$100M-$500M").
account_descriptionstringLong-form company description (from the company’s own profile).
taglinestringShort tagline / one-line positioning.
follower_countintLinkedIn follower count.
specialitiesstring[]Self-declared areas of focus / specialities.
is_b2bbooleanWhether the company is classified as B2B.
enriched_categorystringOnfire-derived category label.
tickerstringStock ticker symbol (for public companies).
account_last_updatedstringISO timestamp of the last firmographic refresh.
FieldTypeDescription
ai_account_summarystringLLM-generated executive summary of the company.
account_keywordsstring[]LLM-derived keywords summarising the company’s focus areas.
FieldTypeDescription
location_namestringFree-text label for the headquarters location.
location_street_addressstringStreet-level address.
location_localitystringCity.
location_regionstringState, province, or region.
location_metrostringMetro area (e.g. "San Francisco Bay Area").
location_postal_codestringPostal / ZIP code.
location_countrystringCountry.
location_continentstringContinent.
location_geostring"lat,lng" coordinate pair for the headquarters.
FieldTypeDescription
funding_profile_urlstringURL to the company’s funding profile (e.g. Crunchbase).
funding_last_datestringDate of the most recent funding round (ISO).
funding_last_typestringRound type (e.g. "Series B", "IPO", "Acquisition").
FieldTypeDescription
account_phonesstring[]Listed phone numbers for the company.
account_emailsstring[]Listed contact email addresses for the company.
FieldTypeDescription
facebook_urlstringFacebook page URL.
instagram_urlstringInstagram profile URL.
youtube_urlstringYouTube channel URL.
github_urlstringGitHub organization URL.
tiktok_urlstringTikTok profile URL.
x_urlstringX (formerly Twitter) profile URL.
discord_urlstringDiscord invite or server URL.
reddit_urlstringReddit 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.

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.

HeaderRequiredDescription
Content-TypeYesMust be application/json.
X-Api-KeyYesYour tenant API key.
FieldTypeRequiredDefaultDescription
companiesCompanyIdentifier[]YesOne or more company identifiers (see CompanyIdentifier below).
fieldsstring[]No*[]Data fields to return for each company. See the catalogue above.
include_metadatabooleanNofalseWhen true, appends your tenant’s pre-configured query fields to fields. See include_metadata below.
enhanced_matchingbooleanNotrueWhen 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_signalsAllowSignalsNonullWhen 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.

FieldTypeRequiredDescription
websitestringOne-ofThe 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_urlstringOne-ofThe company’s LinkedIn page URL — e.g. "linkedin.com/company/crowdstrike". The https://www. prefix is optional and will be normalized.
linkedin_idstringOne-ofThe numeric LinkedIn company ID — e.g. "2135371". Use this when the LinkedIn URL isn’t available but the numeric ID is.
external_idstringNoA 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.

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.

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.

FieldTypeDescription
start_timestring (ISO YYYY-MM-DD)Include signals on or after this calendar date.
end_timestring (ISO YYYY-MM-DD)Include signals up to and including this calendar date. Omit (along with start_time) to return all dates.
typeSignalTypeFilter 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.

Look up a single company by LinkedIn URL and return standard profile fields. No signals, no tenant metadata.

Terminal window
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"
]
}'

Append your tenant’s pre-configured query fields automatically and attach high-intent signals from Q4 2024.

Terminal window
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.

Terminal window
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.

Terminal window
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": {}
}'

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 (including external_id if you provided one).
  • data — the requested fields plus, if allow_signals was set, a signals array of SignalRecord entries.
  • matchedtrue if a record was found, false if not. When false, every requested field key is still present in data but with a null value, and the result is not billed.

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'"
}
}
{ "detail": "Invalid API key" }

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"
}
]
}
{ "detail": "Rate limit exceeded" }
{
"detail": {
"status": "ENRICHMENT_FAILED",
"message": "An error occurred while processing the request"
}
}