Submit Bulk Company Enrichment Job
Submit up to 100,000 companies, by LinkedIn URL or website domain, for enrichment in one job. Returns a job ID at once; poll GET /v1/company-enrichment/bulk/ for progress.
curl --request POST \
--url https://api.orbisearch.com/v1/company-enrichment/bulk \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"input": [
{
"linkedin_url": "https://www.linkedin.com/company/kearney"
},
{
"linkedin_url": "https://www.linkedin.com/company/maple-inc"
}
]
}
'import requests
url = "https://api.orbisearch.com/v1/company-enrichment/bulk"
payload = { "input": [{ "linkedin_url": "https://www.linkedin.com/company/kearney" }, { "linkedin_url": "https://www.linkedin.com/company/maple-inc" }] }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
input: [
{linkedin_url: 'https://www.linkedin.com/company/kearney'},
{linkedin_url: 'https://www.linkedin.com/company/maple-inc'}
]
})
};
fetch('https://api.orbisearch.com/v1/company-enrichment/bulk', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.orbisearch.com/v1/company-enrichment/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'input' => [
[
'linkedin_url' => 'https://www.linkedin.com/company/kearney'
],
[
'linkedin_url' => 'https://www.linkedin.com/company/maple-inc'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.orbisearch.com/v1/company-enrichment/bulk"
payload := strings.NewReader("{\n \"input\": [\n {\n \"linkedin_url\": \"https://www.linkedin.com/company/kearney\"\n },\n {\n \"linkedin_url\": \"https://www.linkedin.com/company/maple-inc\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.orbisearch.com/v1/company-enrichment/bulk")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"input\": [\n {\n \"linkedin_url\": \"https://www.linkedin.com/company/kearney\"\n },\n {\n \"linkedin_url\": \"https://www.linkedin.com/company/maple-inc\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbisearch.com/v1/company-enrichment/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"input\": [\n {\n \"linkedin_url\": \"https://www.linkedin.com/company/kearney\"\n },\n {\n \"linkedin_url\": \"https://www.linkedin.com/company/maple-inc\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"status": "submitted",
"total_rows": 500,
"total_invalid": 10,
"credits_consumed": 490
}{
"detail": "API key required in X-API-Key header"
}{
"detail": "Insufficient credits. You have 0.15 credits but need 0.2."
}{
"detail": "Invalid request body field '0': Input should be a valid string.",
"errors": [
{
"loc": "body.0",
"msg": "Invalid request body field '0': Input should be a valid string.",
"type": "string_type"
}
]
}{
"detail": "Rate limit exceeded. Maximum 20 requests per second per API key. Contact us to discuss higher limits.",
"code": "rate_limited"
}{
"detail": "Bulk company enrichment is not available in this environment"
}linkedin_url or a domain:
{
"input": [
{ "linkedin_url": "https://www.linkedin.com/company/kearney" },
{ "domain": "oliverwyman.com" }
]
}
domain for rows where you only have the website. If a row fills both, the LinkedIn URL is used. Domains are read the same way as on single enrichment, and only return a company whose own website is on that domain.
The API accepts your list, charges your credit balance upfront, and returns a job_id immediately. Enrichment happens in the background. Poll GET /v1/company-enrichment/bulk/{job_id} to track progress, then fetch results via GET /v1/company-enrichment/bulk/{job_id}/results when the job is complete.
This endpoint is credit-metered and needs a pay-as-you-go API key.
Your rows come back as you sent them
Results contain one row for every row you submitted, in the order you submitted them, with the LinkedIn URL or domain exactly as you sent it ininput. You can join the results back to your own list by position or by input, without matching on our version of the URL.
Duplicates and invalid rows
- Duplicates are charged once. Rows with the same input are charged once, even when they are written differently (for example
linkedin.com/company/kearneyandhttps://www.linkedin.com/company/kearney/about/, orkearney.comandhttps://www.kearney.com/). Each duplicate still gets its own row in the results, with the same data andcredits_consumed: 0. A LinkedIn URL and a domain for the same company are two inputs, so each is charged. - Invalid rows are skipped, not rejected. 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) doesn’t fail the job. It costs nothing, and it comes back in its place in the results asresult: invalid_urlwith a one-linereason.total_invalidin the response counts these rows.
422, and nothing is charged, only when no valid row is left, the list is empty, it has more than 100,000 rows, or a single value is longer than 2,048 characters.
Pricing and refunds
Each unique input costs1 credit, charged once for the whole job when you submit it. credits_consumed in the response is the amount charged.
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.
If your account has insufficient credits for the unique inputs in the list, the request fails with 403 Forbidden.
Limits
- Maximum
100,000rows per submission. Larger lists must be split across multiple jobs. - Each
linkedin_urlanddomainis capped at 2,048 characters.
Rate limits
This endpoint shares the20 requests per second per API key limit with the rest of the /v1/* API. Exceeding it returns a 429 Too Many Requests response. See errors for how to handle rate limit responses.Authorizations
API key for authentication
Body
Submission payload for POST /v1/company-enrichment/bulk.
Companies to enrich, one row each: a LinkedIn company/showcase URL (preferred) or a website domain. Repeats of the same input are charged once but each comes back as its own result row, in order. Maximum 100,000 rows per submission.
1 - 100000 elementsShow child attributes
Show child attributes
Response
Successful Response
Response when submitting a bulk company-enrichment job.
Unique job identifier. Pass this to GET /v1/company-enrichment/bulk/{job_id} to poll status.
Submission acknowledgement status.
submitted "submitted""submitted"
Number of rows submitted, duplicates and invalid rows included.
500
Input rows that were skipped at submit (a numeric-ID or malformed URL, a name over 200 characters, a domain cell that is not a website domain, or a blank row), repeats included. They cost nothing and appear in results as invalid_url.
10
Credits deducted for this submission: 1 credit per distinct input (a LinkedIn URL and a domain for the same company are two inputs), charged once per job. Repeats of the same input and invalid rows are not charged.
490
curl --request POST \
--url https://api.orbisearch.com/v1/company-enrichment/bulk \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"input": [
{
"linkedin_url": "https://www.linkedin.com/company/kearney"
},
{
"linkedin_url": "https://www.linkedin.com/company/maple-inc"
}
]
}
'import requests
url = "https://api.orbisearch.com/v1/company-enrichment/bulk"
payload = { "input": [{ "linkedin_url": "https://www.linkedin.com/company/kearney" }, { "linkedin_url": "https://www.linkedin.com/company/maple-inc" }] }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
input: [
{linkedin_url: 'https://www.linkedin.com/company/kearney'},
{linkedin_url: 'https://www.linkedin.com/company/maple-inc'}
]
})
};
fetch('https://api.orbisearch.com/v1/company-enrichment/bulk', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.orbisearch.com/v1/company-enrichment/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'input' => [
[
'linkedin_url' => 'https://www.linkedin.com/company/kearney'
],
[
'linkedin_url' => 'https://www.linkedin.com/company/maple-inc'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.orbisearch.com/v1/company-enrichment/bulk"
payload := strings.NewReader("{\n \"input\": [\n {\n \"linkedin_url\": \"https://www.linkedin.com/company/kearney\"\n },\n {\n \"linkedin_url\": \"https://www.linkedin.com/company/maple-inc\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.orbisearch.com/v1/company-enrichment/bulk")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"input\": [\n {\n \"linkedin_url\": \"https://www.linkedin.com/company/kearney\"\n },\n {\n \"linkedin_url\": \"https://www.linkedin.com/company/maple-inc\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbisearch.com/v1/company-enrichment/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"input\": [\n {\n \"linkedin_url\": \"https://www.linkedin.com/company/kearney\"\n },\n {\n \"linkedin_url\": \"https://www.linkedin.com/company/maple-inc\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"job_id": "123e4567-e89b-12d3-a456-426614174000",
"status": "submitted",
"total_rows": 500,
"total_invalid": 10,
"credits_consumed": 490
}{
"detail": "API key required in X-API-Key header"
}{
"detail": "Insufficient credits. You have 0.15 credits but need 0.2."
}{
"detail": "Invalid request body field '0': Input should be a valid string.",
"errors": [
{
"loc": "body.0",
"msg": "Invalid request body field '0': Input should be a valid string.",
"type": "string_type"
}
]
}{
"detail": "Rate limit exceeded. Maximum 20 requests per second per API key. Contact us to discuss higher limits.",
"code": "rate_limited"
}{
"detail": "Bulk company enrichment is not available in this environment"
}