Skip to content
KnockDevelopers

Enrich companies

Submit up to 100 companies by domain or website URL and get full company profiles, tech stack, funding and decision makers.

Chat with a Developer

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.

Endpoint
POST https://app.knock-ai.com/v1/enrichment-requests/companies

Billable

Submitting companies consumes enrichment credits. See Credits and side effects.

Request body

Prop

Type

Request body
{
  "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

Terminal
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

202 Accepted
{
  "enrichRequestId": "c1a9e2d4-5b6f-4a7c-8d9e-0f1a2b3c4d5e",
  "status": "pending"
}
FieldTypeDescription
enrichRequestIdstring (UUID)The ID of the new enrichment request. Store it: there is no endpoint that lists your requests.
statusstringpending 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 pending 24 hours after the request was created is settled on your next read: completed if Knock has data for it, failed otherwise. 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:

Companies item
{
  "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"
      }
    ]
  }
}
  • input is exactly the string you sent (for repeated companies, the first one), so you can match results to your records without normalizing anything.
  • domain in 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 by input.
  • decisionMakers are people at the company who match the decision-maker roles set up in your Knock account. matchedRole is 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

StatuscodeCause
400validationThe body is invalid. errors lists each problem, for example companies.0.domain: domain should not be empty.
400external-api.enrichment-request.rejectedKnock 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.
500external-api.enrichment-request.not-storedKnock 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.
502external-api.enrichment.unavailableEnrichment 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.

Chat with a Developer

On this page