Enrich companies
Submit up to 100 companies by domain or website URL and get full company profiles, tech stack, funding and decision makers.
Send a batch of companies by domain or website URL. For each company, you get its firmographics, tech stack, team size by department, funding rounds, account intel and the decision makers that match your Knock account.
POST https://app.knock-ai.com/v1/enrichment-requests/companiesBillable
Submitting companies consumes enrichment credits. See Credits and side effects.
Request body
Prop
Type
{
"companies": [
{ "domain": "acme.com" },
{ "domain": "https://www.globex.com/about" }
]
}Knock reduces each value to its domain: it drops the scheme, the path and a leading www.. So https://www.globex.com/about is enriched as globex.com, and repeated companies in one request are collapsed into one item.
Invalid domains don't fail the request
A value that isn't a valid domain once normalized, such as localhost or acme, doesn't cause a 400. It becomes an item with status failed while the rest of the batch is enriched. Only a domain that is missing, empty, not a string or longer than 320 characters is a validation error.
Submit the request
curl -X POST https://app.knock-ai.com/v1/enrichment-requests/companies \
-H "x-api-key: $KNOCK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"companies": [
{ "domain": "acme.com" },
{ "domain": "https://www.globex.com/about" }
]
}'Response
{
"enrichRequestId": "c1a9e2d4-5b6f-4a7c-8d9e-0f1a2b3c4d5e",
"status": "pending"
}| Field | Type | Description |
|---|---|---|
enrichRequestId | string (UUID) | The ID of the new enrichment request. Store it: there is no endpoint that lists your requests. |
status | string | pending when every company was queued, in_progress when some were invalid, failed when none could be queued. |
Company items always start as pending (queued for enrichment) or failed (invalid domain, or the company couldn't be queued).
How companies are processed
- Every company gets a full run for your account. Even when Knock already holds a recent base profile for a company, it still finds the decision makers that match your Knock account, so a company request always does some work.
- Companies are paced. Knock runs company enrichment through a shared, rate-limited queue, so the companies in a large batch start one after another rather than all at once. Expect a 100-company request to finish gradually.
- Repeat submissions join in-progress work. If you submit a company that is already queued or running for your account, the new item is finished by the same run.
- The 24-hour deadline applies. A company still
pending24 hours after the request was created is settled on your next read:completedif Knock has data for it,failedotherwise. See Timing and the 24-hour deadline.
What you get back
Read the request with GET /v1/enrichment-requests/{enrichRequestId}. A completed company item looks like this:
{
"input": "https://www.globex.com/about",
"status": "completed",
"result": {
"name": "Globex",
"domain": "globex.com",
"logoUrl": "https://logo.example.com/globex.png",
"description": "Industrial automation software for mid-size manufacturers.",
"industry": "COMPUTER_SOFTWARE",
"size": "101-200",
"employees": "120",
"foundedDate": "2015",
"totalFunding": "$22M",
"lastFunding": "series_a",
"annualRevenue": "$10m-$25m",
"ownership": "Private",
"headquarters": "Austin, Texas",
"country": "US",
"region": "North America",
"state": "Texas",
"competitors": "Initech, Umbrella",
"techStack": [{ "name": "Salesforce", "category": "CRM" }],
"teamSize": [{ "department": "Sales", "headcount": 40 }],
"fundingRounds": [
{
"type": "series_a",
"amountMillions": 15,
"currency": "USD",
"date": "2023-06-01",
"investors": ["Example Ventures"]
}
],
"accountIntel": {
"targetPersona": ["Operations leaders"],
"segments": ["Mid-market"],
"verticals": ["Manufacturing"],
"spaces": ["Industrial automation"],
"productTypes": ["SaaS"],
"salesMotions": ["Sales-led"]
},
"decisionMakers": [
{
"name": "Bob Smith",
"title": "CRO",
"linkedinUrl": "https://linkedin.com/in/bobsmith",
"matchedRole": "Sales leader"
}
]
}
}inputis exactly the string you sent (for repeated companies, the first one), so you can match results to your records without normalizing anything.domainin the result is the company's primary domain. It is usually your normalized input, but it can differ when Knock resolves the company to another domain. Match byinput.decisionMakersare people at the company who match the decision-maker roles set up in your Knock account.matchedRoleis the role each one matched.- Every key is always present. Text fields Knock has no data for are
null; list fields are empty arrays.
See Company result for every field.
Errors
| Status | code | Cause |
|---|---|---|
400 | validation | The body is invalid. errors lists each problem, for example companies.0.domain: domain should not be empty. |
400 | external-api.enrichment-request.rejected | Knock couldn't accept this request. Check the input and contact Knock if it persists. |
413 | – | The body is larger than 100 KB. Send fewer companies per request. |
500 | external-api.enrichment-request.not-stored | Knock accepted the companies but couldn't save the request, so you have no enrichRequestId. Don't resubmit automatically: the items may already be enriched and charged. Contact Knock with the X-Request-Id response header. |
502 | external-api.enrichment.unavailable | Enrichment is briefly unavailable. No request was created; retry with backoff. |
Authentication, permission and rate-limit errors apply too. See Errors for the full list and the API reference for the complete schema.