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.
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 alinkedin_url or a domain, and one job can mix both.
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.
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
domainfield, or a value that isn’t a domain) is skipped, costs nothing, and comes back asresult: invalid_urlwith areason. The request is rejected with422only when no valid row is left.
Checking job status
PollGET /v1/company-enrichment/bulk/{job_id} to track progress.
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
Oncestatus is completed, fetch the results. Use limit and offset to page through them. The default limit is 50 and the maximum is 500.
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 costs1 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,000rows per submission. Split larger lists across multiple jobs. - This endpoint shares the
20requests per second per account limit with the rest of the/v1/*API.
Complete example
Python