Skip to main content
Bulk company enrichment turns a list of LinkedIn company URLs or website domains into company records in a single asynchronous job. Submit the list; OrbiSearch processes it in the background and returns one result row per submitted row, in your order, with the data from single company enrichment added. This endpoint is credit-metered and needs a pay-as-you-go API key.

When to use bulk company enrichment

  • Account list enrichment: add domain, industry, headcount, and headquarters to a CRM export or a list of target accounts.
  • Finding LinkedIn pages for a list of websites: submit domains and get each company’s LinkedIn URL back with its record.
  • Preparing an email finder run: get each company’s email_domain, then find people’s work emails there by name with the bulk email finder.
  • Periodic refresh: re-run an account list to pick up changes in headcount, followers, or headquarters.
For a single company on demand, use single company enrichment.

How bulk company enrichment works

1

Submit a job

Send a POST request to /v1/company-enrichment/bulk with an input array of {"linkedin_url": ...} or {"domain": ...} objects. OrbiSearch returns a job_id immediately and begins processing in the background. Credits are deducted upfront, once per unique input.
2

Poll for status

Use GET /v1/company-enrichment/bulk/{job_id} to check the job’s progress. Poll every 10–30 seconds until status becomes completed.
3

Retrieve results

Once the job is completed, fetch results with GET /v1/company-enrichment/bulk/{job_id}/results. Results are paginated. Page through them with limit and offset.

Submitting a job

Send your list in the JSON body. Each row has a linkedin_url or a domain, and one job can mix both.
Use the LinkedIn URL whenever you have it. It names the company directly, so it gives the best results. Use domain for rows where you only have the website. If a row fills both, the LinkedIn URL is used.
A domain can be bare (kearney.com), a subdomain or a full URL, and only returns a company whose own website is on that domain. See searching by domain for how domains are matched and how redirects are reported.
OrbiSearch responds with a job ID, the row counts, and the credits charged:
In this example, the first two rows are the same company written two ways, so they are charged once. The numeric company URL in the last row isn’t supported, so it is skipped and costs nothing. That leaves three unique inputs and 3 credits.

Duplicates and invalid rows

  • Duplicates are charged once, even when they are written differently. Each duplicate still gets its own row in the results, with the same data. A LinkedIn URL and a domain for the same company are two inputs, so each is charged. Send one or the other per company.
  • Invalid rows don’t fail the job. A row that isn’t a usable LinkedIn company URL (a person’s profile, a numeric company URL, a blank value, or a company name over 200 characters) or website domain (a LinkedIn URL in the domain field, or a value that isn’t a domain) is skipped, costs nothing, and comes back as result: invalid_url with a reason. The request is rejected with 422 only when no valid row is left.

Checking job status

Poll GET /v1/company-enrichment/bulk/{job_id} to track progress.
While the job is running, the response looks like this:
status is running until every row has been answered, at which point it becomes completed and finished_at is populated. Even a small job can take up to a minute.

Retrieving results

Once status is completed, fetch the results. Use limit and offset to page through them. The default limit is 50 and the maximum is 500.
The results hold one row for every row you submitted, in the same order. Each row echoes the LinkedIn URL or domain you sent in input and carries the same data fields as a single company enrichment response. For the job above: See bulk results for the full row shape and an example response. A row with result: error is one OrbiSearch couldn’t answer. It is charged like any other accepted row. You can submit those rows again in a new job.

Pricing

Each unique input costs 1 credit, deducted upfront when you submit the job. Duplicates and invalid rows cost nothing. Every accepted row is charged, including rows that end as not_found or error. Refunds are issued only when OrbiSearch infrastructure cannot accept the submission itself. In that case the upfront charge is reversed and no job is created.

Limits and rate limits

  • Maximum 100,000 rows per submission. Split larger lists across multiple jobs.
  • This endpoint shares the 20 requests per second per account limit with the rest of the /v1/* API.

Complete example

Python