// post /v1/bulk/company
Bulk Company Enrichment API
Convert domain lists into structured company intelligence with one async bulk job built for modern GTM teams.
Domains or company namesUp to 25,000 rows
curl -X POST "https://api.tomba.io/v1/bulk/company" \
-H "X-Tomba-Key: $TOMBA_API_KEY" \
-H "X-Tomba-Secret: $TOMBA_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Company Enrichment job","list":"piedpiper.com\nshopify.com","launch":true,"webhook_url":"https://hooks.example.com/tomba"}'const res = await fetch("https://api.tomba.io/v1/bulk/company", {
method: "POST",
headers: {
"X-Tomba-Key": process.env.TOMBA_API_KEY,
"X-Tomba-Secret": process.env.TOMBA_SECRET_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Company Enrichment job",
"list": "piedpiper.com\nshopify.com",
"launch": true,
"webhook_url": "https://hooks.example.com/tomba"
})
});
const { data } = await res.json(); // { id }import os, requests
res = requests.post(
"https://api.tomba.io/v1/bulk/company",
headers={
"X-Tomba-Key": os.environ["TOMBA_API_KEY"],
"X-Tomba-Secret": os.environ["TOMBA_SECRET_KEY"],
},
json={
"name": "Company Enrichment job",
"list": "piedpiper.com\nshopify.com",
"launch": True,
"webhook_url": "https://hooks.example.com/tomba"
},
)
job_id = res.json()["data"]["id"]// 01 · request
Bulk Company Enrichment is one HTTPS request
Send the parameters with your key and secret. Every SDK, the CLI and the MCP server make this same call.
- type
- company
- list | data | file
- Domains or company names
- launch
- true starts the job at once
- webhook_url
- Receives a signed event when the job ends
- rows
- Up to 25,000 per job
curl -X POST "https://api.tomba.io/v1/bulk/company" \
-H "X-Tomba-Key: $TOMBA_API_KEY" \
-H "X-Tomba-Secret: $TOMBA_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Company Enrichment job","list":"piedpiper.com\nshopify.com","launch":true,"webhook_url":"https://hooks.example.com/tomba"}'const res = await fetch("https://api.tomba.io/v1/bulk/company", {
method: "POST",
headers: {
"X-Tomba-Key": process.env.TOMBA_API_KEY,
"X-Tomba-Secret": process.env.TOMBA_SECRET_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Company Enrichment job",
"list": "piedpiper.com\nshopify.com",
"launch": true,
"webhook_url": "https://hooks.example.com/tomba"
})
});
const { data } = await res.json(); // { id }import os, requests
res = requests.post(
"https://api.tomba.io/v1/bulk/company",
headers={
"X-Tomba-Key": os.environ["TOMBA_API_KEY"],
"X-Tomba-Secret": os.environ["TOMBA_SECRET_KEY"],
},
json={
"name": "Company Enrichment job",
"list": "piedpiper.com\nshopify.com",
"launch": True,
"webhook_url": "https://hooks.example.com/tomba"
},
)
job_id = res.json()["data"]["id"]// 02 · response
What comes back
JSON, the same in every language. Fields Tomba doesn't know are null, never guessed.
GET
/companies/findFielddata.name, data.legalName, data.domainstring | null- Who the company is
data.description, data.foundedYear, data.typestring | null- What it does, when it was founded, its ownership
data.categoryobject- Sector, industry, SIC and NAICS codes
data.geoobject- Street address, city, state, country, coordinates
data.metricsobject- Employees, traffic rank, revenue, funding
data.linkedin, data.twitter, data.facebookobject- Social handles
data.tech[], data.techCategories[]array | null- Technologies the website runs
meta.domainstring | null- The domain you sent
errorsobject- When nothing is found the response is still 200, with errors {type, message, code} instead of data
POST /bulk/company
201 Created
{
"data": {
"id": 1042
}
}Each row, as GET /companies/find returns it
200 OK
{
"data": {
"name": "Pied Piper",
"legalName": "Pied Piper, Inc.",
"domain": "piedpiper.com",
"domainAliases": [],
"site": {
"phoneNumbers": [],
"emailAddresses": [
"hello@piedpiper.com"
]
},
"category": {
"sector": "Information Technology",
"industryGroup": "Software & Services",
"industry": "Internet Software & Services",
"subIndustry": "Internet Software & Services",
"sicCode": "73",
"sic4Codes": [
"7372"
],
"naicsCode": "51",
"naics6Codes": [
"511210"
],
"naics6Codes2022": [
"513210"
]
},
"tags": [
"Compression",
"Decentralized internet"
],
"description": "Pied Piper builds middle-out compression for files, video and a decentralized internet.",
"foundedYear": "2014",
"location": "5230 Newell Road, Palo Alto, CA 94303, United States",
"timeZone": "America/Los_Angeles",
"utcOffset": -8,
"geo": {
"streetNumber": "5230",
"streetName": "Newell Road",
"subPremise": null,
"streetAddress": "5230 Newell Road",
"city": "Palo Alto",
"postalCode": "94303",
"state": "California",
"stateCode": "CA",
"country": "United States",
"countryCode": "US",
"lat": 37.4419,
"lng": -122.143
},
"logo": "https://logo.tomba.io/piedpiper.com",
"facebook": {
"handle": null,
"likes": null
},
"linkedin": {
"handle": "company/pied-piper"
},
"twitter": {
"handle": null,
"id": null,
"bio": null,
"followers": null,
"following": null,
"location": null,
"site": null,
"avatar": null
},
"whois": {
"registrar_name": null,
"created_date": null,
"referral_url": null
},
"emailProvider": "Google",
"type": "private",
"ticker": null,
"identifiers": {
"usEIN": null
},
"metrics": {
"alexaUsRank": null,
"alexaGlobalRank": null,
"trafficRank": null,
"employees": "11-50",
"marketCap": null,
"raised": null,
"annualRevenue": null,
"estimatedAnnualRevenue": null,
"fiscalYearEnd": null
},
"indexedAt": "2025-01-15T10:32:00+01:00",
"tech": [
"google_apps",
"intercom"
],
"techCategories": [
"email_hosting_service",
"live_chat"
],
"parent": {
"domain": null
},
"ultimateParent": {
"domain": null
}
},
"meta": {
"domain": "piedpiper.com"
}
}// 03 · cost and limits
What a call costs
A call is charged only under the condition below. Rate limits depend on your plan.
// cost
1 search credit per company found. Plus 1 per company with phone data.
Charged once, at the first download; later downloads are free
- Jobs created: 15 per day for each type
- Running jobs: 2 per type
- Downloads: 25 per day for each job
- Request size: 4 MB (CSV, list or rows)
Create a bulk operation by uploading company domains, then launch the operation. The API enriches each domain with comprehensive company data asynchronously.
You can enrich up to 25,000 company domains per bulk operation. For larger datasets, create multiple bulk operations.
Each domain is enriched with company name, description, industry classification (SIC/NAICS codes), location, employee count, revenue estimates, technology stack, and social profiles.
Processing time depends on the list size and the lookups it needs. Poll the job or set a webhook to hear when it finishes.
Each domain that returns enrichment data counts as 1 request. Domains with no data found are not counted against your quota.
The API detects 6000+ technologies including web frameworks, CMS platforms, analytics tools, cloud providers, and development tools used by each company.
Yes, configure a webhook URL to receive a notification when your bulk company enrichment operation completes with results ready for download.
Once processing completes, use the download endpoint to get all enriched company data as CSV or JSON format.
Yes. Many teams enrich domains first to qualify target accounts, then run Domain Search and Email Finder only on high-fit companies.
Use root company domains, remove URL paths/subdomains where possible, and deduplicate records before upload for best enrichment coverage.