Company Enrichment API Benchmark:
6 Providers Tested on 500 Domains
Company enrichment APIs often look similar on feature lists. But the real question is simple: if you send the same domains to different enrichment APIs, which providers actually return useful company data?
To answer that, we tested 6 domain-based company enrichment APIs using the same input dataset. We started with 500 random domains from the Majestic Million. After running a DNS resolution check, 349 domains resolved and were used as the main benchmark set.
This benchmark focuses on coverage and data depth. It is not a full manual accuracy audit.
Disclosure: The data analysis, canonical-field model, and write-up on this page were prepared by Claude Opus 4.7 (Anthropic) and fact-checked with OpenAI GPT-5.5. Every percentage is recomputed from the raw provider JSONL and generator script in the linked GitHub repository, so the numbers can be re-derived independently. CompanyEnrich is one of the six tested providers and wins several categories below — readers should weigh the page on the verifiable data, not on the publisher's identity.
Quick summary
The benchmark measured two things:
- Coverage — how many domains returned usable company data
- Data depth — how complete the returned company profiles were
The headline finding is that company enrichment APIs differ not only in whether they return a match, but also in what they return after a match. The most honest reading is use-case specific:
- CompanyEnrich was strongest overall in this sample: highest find rate plus the highest average and median field depth.
- Apollo was the closest broad runner-up, especially when technologies and funding signals matter.
- People Data Labs was strongest for LinkedIn URL, employee count, company type, and Crunchbase-link coverage.
- ContactOut was strongest for revenue and follower count, but its tested profile was narrower outside those areas.
- Coresignal and Crustdata may still fit narrower workflows, but their all-request coverage was lower in this domain test.
| Benchmark detail | Value |
|---|---|
| Initial domains sampled | 500 |
| DNS-resolved domains tested | 349 |
| Providers tested | 6 |
| Input type | Domain |
| Benchmark type | Company enrichment coverage + data depth |
| Dataset source | Majestic Million |
| Test date | April 23, 2026 |
| Benchmark repository | GitHub |
Methodology
1. Domain sampling
We randomly sampled 500 domains from the Majestic Million dataset.
The Majestic Million is a public list of highly ranked domains. Our script randomly selected 500 domains from that file.
| Source dataset | Majestic Million |
| Initial sample size | 500 domains |
| Sampling method | Random selection |
| Script | maj.py |
2. DNS cleanup
Before testing the enrichment APIs, we ran an A-record DNS resolution check by performing dig A <domain> for each sampled domain.
An A record maps a domain to an IPv4 address, so we looked for at least one returned A record as a basic sign that the domain resolved.
Domains that did not resolve were removed from the main benchmark set.
| Initial domains | 500 |
| DNS-resolved domains | 349 |
| Removed from main benchmark | 151 |
We used the 349 DNS-resolved domains as the main comparison set.
Note: DNS resolution does not guarantee that a domain is an active company website. It only means the domain resolved in the DNS check used for this benchmark.
3. API testing
Each provider received the same 349 domains.
For each provider, we recorded:
- whether the API returned a usable company profile
- which fields were returned
- which fields were populated
- how many social links were returned
- which counted firmographic fields were returned
- whether funding data was returned
4. Definition of "enriched"
A domain was counted as enriched when the response included a company name or company profile object plus at least one supporting signal — website/domain, LinkedIn URL, description, industry, logo, address, employee count, or social URL.
Empty responses, failed responses, and responses without usable company identity data were not counted as enriched.
5. What this benchmark measures
| Metric | Meaning |
|---|---|
| Coverage / find rate | Percentage of the 349 DNS-resolved domains where the provider returned usable company data |
| Data depth | How much data was returned for enriched domains |
| Field fill rate | How often a specific field was populated, calculated as populated records divided by all 349 submitted domains |
| Social depth | How many social/profile URLs were returned |
| Firmographic depth | Company Name, Logo URL, Description, Keywords, Industry, Technologies, Address, Phone, Employees, Founded Year, Company Type, and Revenue |
| Funding depth | Whether any funding signal was returned — funding rounds, total funding, or funding stage — counted as one combined canonical field |
| Unique fields | Fields that one provider returns but others do not |
6. What this benchmark does not measure
| Not measured | Why |
|---|---|
| Full field-level accuracy | We measured whether data was returned, not whether every returned value was manually verified |
| All possible endpoints | Some providers may offer extra data through separate APIs |
| Person/contact enrichment | This benchmark focuses on company/domain enrichment |
| Pricing value | Pricing depends on plans, credits, volume, and contract terms |
| Long-term freshness | Results reflect the test date |
| Every market segment | A random domain sample does not perfectly represent every region, industry, or company size |
Coverage results
Coverage measures how often each provider returned usable company data for the 349 DNS-resolved domains.
Every find-rate percentage below uses the same denominator: 349.
| Provider | Domains submitted | Domains enriched | Not enriched | Find rate |
|---|---|---|---|---|
| CompanyEnrich | 349 | 236 | 113 | 67.6% |
| Apollo | 349 | 215 | 134 | 61.6% |
| People Data Labs | 349 | 210 | 139 | 60.2% |
| ContactOut | 349 | 185 | 164 | 53.0% |
| Coresignal | 349 | 176 | 173 | 50.4% |
| Crustdata | 349 | 135 | 214 | 38.7% |
Coverage takeaway
CompanyEnrich had the highest find rate, enriching 236 of the 349 DNS-resolved domains. Apollo and People Data Labs were close behind at 215 and 210 enriched domains. ContactOut and Coresignal followed at 185 and 176, while Crustdata returned 135 enriched domains.
Several providers are close enough on raw coverage that data depth and field-level coverage are important to read alongside find rate.
Data depth overview
Data depth measures how much usable company data came back after a provider found a company. To keep this concrete, each returned profile was checked against the same 27 canonical benchmark fields. The table below compares average and median field depth.
| Provider | Avg fields per returned profile | Median fields per returned profile | Avg data points per submitted domain |
|---|---|---|---|
| CompanyEnrich | 17.9 / 27 | 19 / 27 | 12.1 |
| Apollo | 15.4 / 27 | 16 / 27 | 9.5 |
| People Data Labs | 13.7 / 27 | 14 / 27 | 8.2 |
| Coresignal | 14.2 / 27 | 15 / 27 | 7.2 |
| ContactOut | 11.5 / 27 | 12 / 27 | 6.1 |
| Crustdata | 6.7 / 27 | 7 / 27 | 2.6 |
Data depth takeaway
CompanyEnrich returned the fullest matched profiles, averaging 17.9 of the 27 benchmark fields with a median of 19. It also had the highest per-submitted-domain depth at 12.1 fields, because it combined the highest find rate with the deepest returned profiles.
Apollo was the strongest broad runner-up at 15.4 fields on average and a median of 16. Coresignal matched fewer domains than People Data Labs and ContactOut, but returned slightly more benchmark fields per match than both, so its matched records were deeper even with a lower find rate. The per-submitted-domain column lets you compare profile depth on the same 349-domain basis as the find rate.
Field category comparison
This table groups fields into broader categories. Since each provider uses different raw field names, we first mapped comparable fields into a shared canonical model, then grouped those canonical fields into the buckets below.
Category averages use field-level found counts divided by the 349 submitted domains. A provider does not need to return every field in a category for the category to count. Each canonical field contributes independently to the category average. Fields missing from a provider's tested schema are counted as 0.0% so every displayed percentage uses the same total denominator.
How categories are defined
| Category | What it measures | Canonical fields counted |
|---|---|---|
| Core identity | Whether the response identifies the company and its basic web presence. | company_id, name, domain_website, description, logo |
| Firmographics | Basic company attributes used for account sizing, segmentation, and qualification. | industry, employee_count_or_range, revenue, founded_year, company_type |
| Location / contact | Geographic and direct contact details for the company. | location, phone, email |
| Socials | Company profile URLs and audience signals from social or profile platforms. | linkedin, facebook, twitter_x, instagram, youtube, crunchbase, follower_count |
| Taxonomy | Classification fields that describe what the company does in more structured ways. | categories, keywords_tags_specialties, naics, sic |
| Technology | Detected or returned technologies used by the company. | technologies |
| Funding | Whether the response includes any funding signal (rounds, total raised, or stage). | funding_data |
| Org structure | Whether the response includes any corporate-relationship signal (parent, subsidiary, or affiliate). | corporate_relations |
How a category percentage is calculated
A category percentage is the sum of populated canonical fields in the category, divided by 349 submitted domains × number of canonical fields in the category. For firmographics that denominator is 349 × 5, because the bucket contains five canonical fields. If a provider returns only industry and employee count, those count toward the category and the three missing fields drag the average down.
Different providers use different raw field names for the same concept — one might call it estimated_num_employees, another employees. Both map to the same canonical field, employee_count_or_range, before the firmographics average is calculated.
How specific canonical fields are defined
Location is counted when any mapped component is present — country, state, city, street or full address, postal code, headquarters field, or location array entry. Providers structure location differently, so this measures whether location data was returned, not whether a full postal address was.
Domain and website are combined into a single canonical field, domain_website. Every tested provider populates the two from the same source, so counting them separately would have double-counted the same signal. The combined field counts as present when either was returned.
Industry is counted as a single canonical field. Some providers expose both a primary industry and a multi-industry array, but in this benchmark they are not counted separately when they map to the same source signal. Providers that genuinely return a multi-industry array still receive credit through industry; the additional richness is not measured as a separate field.
Edge cases
When profile arrays contain mixed social links, the Crunchbase field is counted only when the individual value is a Crunchbase URL.
Where providers use placeholder values, those placeholders are treated as missing. This includes numeric 0 for employee count, revenue, founded year, and follower count, plus N/A-style strings for revenue.
| Provider | Core identity | Firmographics | Location contact | Socials | Taxonomy | Technology | Funding | Org structure |
|---|---|---|---|---|---|---|---|---|
| CompanyEnrich | 67.6% | 48.1% | 38.5% | 34.5% | 50.5% | 60.2% | 9.2% | 0.9% |
| Apollo | 60.5% | 37.3% | 35.8% | 20.2% | 32.2% | 61.0% | 10.6% | 8.0% |
| People Data Labs | 46.0% | 48.1% | 18.6% | 25.4% | 25.5% | 0.0% | 7.2% | 10.6% |
| ContactOut | 39.1% | 44.7% | 16.1% | 14.9% | 7.6% | 0.0% | 5.2% | 0.0% |
| Coresignal | 48.1% | 34.2% | 26.0% | 13.7% | 24.0% | 29.8% | 4.0% | 0.0% |
| Crustdata | 30.0% | 14.1% | 0.0% | 5.4% | 0.0% | 0.0% | 0.0% | 0.0% |
Category takeaway
CompanyEnrich led core identity, location/contact, social web, and taxonomy category averages. Apollo narrowly led technology and also led the merged funding signal at 10.6% — a 5-record gap over CompanyEnrich that is not statistically distinguishable at this sample size.
People Data Labs and CompanyEnrich both round to 48.1% on firmographics, with People Data Labs slightly higher before rounding. CompanyEnrich paired firmographics with stronger contact, taxonomy, and social breadth.
Funding and org structure were the two thinnest categories. Funding signals were sparse for every provider, so the column should be read as partial signal coverage rather than complete funding intelligence. On org structure, People Data Labs led at 10.6%, Apollo reached 8.0% via subsidiaries only, and CompanyEnrich populated subsidiaries for 0.9% of submitted domains; ContactOut, Coresignal, and Crustdata returned no corporate-relation data. Both columns are near-floor across the benchmark, not meaningful differentiators.
Field-level fill rates
The tables below show how often each field was populated across all 349 submitted domains.
These are population rates, not correctness rates. A populated description, keyword, address, phone number, or other field was counted as present, but not manually verified for accuracy.
For every percentage in the main field tables, the calculation is field found / 349 submitted domains. Schema-missing fields are shown as 0.0% instead of N/A to keep the denominator consistent. Placeholder values such as zero employee counts, zero revenue, zero founded years, zero follower counts, and N/A revenue are not counted as found. Crunchbase is counted only for actual Crunchbase URLs, not every URL in a mixed profile array.
Firmographic fields
| Field | CompanyEnrich | Apollo | People Data Labs | ContactOut | Coresignal | Crustdata |
|---|---|---|---|---|---|---|
| Company Name | 67.6% | 61.6% | 60.2% | 53.0% | 50.4% | 38.7% |
| Logo URL | 67.6% | 61.6% | 0.0% | 43.0% | 40.4% | 34.1% |
| Description | 67.3% | 56.4% | 50.4% | 46.7% | 48.7% | 0.0% |
| Keywords / specialties | 67.3% | 48.7% | 36.4% | 30.4% | 48.7% | 0.0% |
| Industry | 67.3% | 53.6% | 54.2% | 51.0% | 49.9% | 35.5% |
| Technologies | 60.2% | 61.0% | 0.0% | 0.0% | 29.8% | 0.0% |
| Location | 61.6% | 59.6% | 55.9% | 48.4% | 44.7% | 0.0% |
| Phone | 53.9% | 47.9% | 0.0% | 0.0% | 21.8% | 0.0% |
| Employees | 50.4% | 53.3% | 60.2% | 52.4% | 48.7% | 35.0% |
| Founded Year | 43.3% | 43.6% | 39.0% | 35.5% | 32.7% | 0.0% |
| Company Type | 42.4% | 0.0% | 60.2% | 39.0% | 39.8% | 0.0% |
| Revenue | 37.0% | 36.1% | 27.2% | 45.6% | 0.0% | 0.0% |
Identity, firmographics, and technology takeaway: CompanyEnrich led company name, logo, description, keywords, industry, location, and phone when measured against all 349 submitted domains. Apollo led technologies and founded year. People Data Labs led employees and company type. ContactOut led revenue.
Social URL fields
| Field | CompanyEnrich | Apollo | People Data Labs | ContactOut | Coresignal | Crustdata |
|---|---|---|---|---|---|---|
| 55.6% | 56.7% | 60.2% | 53.0% | 50.4% | 38.1% | |
| 58.2% | 45.8% | 30.7% | 0.0% | 0.0% | 0.0% | |
| X/Twitter | 52.4% | 39.0% | 20.6% | 0.0% | 0.0% | 0.0% |
| 38.7% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | |
| YouTube | 29.5% | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% |
| Crunchbase | 7.4% | 0.0% | 38.1% | 0.0% | 4.0% | 0.0% |
| Follower count | 0.0% | 0.0% | 28.4% | 51.6% | 41.5% | 0.0% |
Social data takeaway: CompanyEnrich had the broadest social URL coverage overall, leading Facebook, X/Twitter, Instagram, and YouTube. People Data Labs led LinkedIn and the tracked Crunchbase signal after filtering mixed profile arrays to Crunchbase URLs. ContactOut was strongest on follower count among the tracked social fields.
Funding
Funding rounds, total funding, and funding stage are counted as a single canonical field, funding_data, that registers as present when any of the three is populated. For every tested provider, "any funding signal" equals the funding-rounds count exactly — funding stage and total funding are subsets of rounds — so treating them as three independent signals overstated funding coverage. The merged signal looks like this:
| Field | CompanyEnrich | Apollo | People Data Labs | ContactOut | Coresignal | Crustdata |
|---|---|---|---|---|---|---|
| Funding data | 9.2% | 10.6% | 7.2% | 5.2% | 4.0% | 0.0% |
Funding takeaway: Funding signals were sparse across the entire benchmark. Apollo led the merged signal at 10.6% (37/349) via its funding_events[] array, with CompanyEnrich at 9.2% and People Data Labs at 7.2%. The gap between Apollo and CompanyEnrich is 5 records, which is not statistically distinguishable at this sample size. ContactOut and Coresignal populated funding for fewer than 6% of submitted domains; Crustdata returned no funding data in the tested response.
Org structure
Parent-company, subsidiary, and affiliate signals are counted as a single canonical field, corporate_relations, that registers as present when any of the three is populated. For PDL, the only provider that exposes all three, the affiliates field is a near-superset of parent and subsidiary, so treating them as three independent signals overstated coverage. The merged signal looks like this:
| Field | CompanyEnrich | Apollo | People Data Labs | ContactOut | Coresignal | Crustdata |
|---|---|---|---|---|---|---|
| Corporate relations | 0.9% | 8.0% | 10.6% | 0.0% | 0.0% | 0.0% |
Org structure takeaway: People Data Labs led the merged field at 10.6%, populating affiliate-entity links for most of its corporate-relation records, and was the only provider to return parent-company information. Apollo reached 8.0% via its suborganizations[] array (subsidiaries only). CompanyEnrich populated subsidiaries for 3 of 236 matched records (0.9%); ContactOut, Coresignal, and Crustdata returned no corporate-relation data in the tested response. The category is a near-floor signal across the benchmark, not a meaningful differentiator for most domains.
Provider-by-provider analysis
The provider-level picture is easier to read as a compact comparison. The table below summarizes where each provider looked strongest in this sample and where the tested response was weaker.
| Provider | Find rate | Avg fields per returned profile | Strongest signals in this benchmark | Main limitation in this benchmark |
|---|---|---|---|---|
| CompanyEnrich | 67.6% | 17.9 / 27 | Highest coverage and depth; led core identity, location/contact, social web, taxonomy, company name, logo, description, keywords, industry, location, phone, Facebook, X/Twitter, Instagram, and YouTube. | Did not lead every field; Apollo led technologies, founded year, and funding, People Data Labs led employees, LinkedIn, and company type, and ContactOut led revenue and follower count. |
| Apollo | 61.6% | 15.4 / 27 | Strongest broad runner-up; led technologies, founded year, and the merged funding signal. | Company type, Instagram, YouTube, and follower count were unpopulated in the tested response. |
| People Data Labs | 60.2% | 13.7 / 27 | Led LinkedIn URL, employee count, company type, and actual Crunchbase-link coverage after filtering mixed profile arrays. | Logo URL, technologies, phone, Instagram, YouTube, and follower count were unpopulated in the tested endpoint. |
| ContactOut | 53.0% | 11.5 / 27 | Strongest revenue and follower-count coverage after placeholder values were excluded. | Technologies, phone, Facebook, X/Twitter, Instagram, YouTube, and most broader social URLs were unpopulated in the tested response. |
| Coresignal | 50.4% | 14.2 / 27 | Lower coverage than the top four, but relatively deep matched profiles with company name, LinkedIn, employees, industry, keywords, location, phone, follower count, technologies, and limited funding signals. | All-request find rate was lower than CompanyEnrich, Apollo, People Data Labs, and ContactOut, and several tracked social and revenue fields were unpopulated. |
| Crustdata | 38.7% | 6.7 / 27 | Focused company identity profile; strongest tracked fields were company name, LinkedIn URL, industry, employees, and logo URL. | Lowest find rate, lowest returned-profile depth, and narrowest coverage across location, contact, social breadth, funding, and technology fields. |
Important limitations
This benchmark should be read with the following limitations.
1. This is not a full accuracy audit
We measured whether providers returned data and how complete the returned records were. We did not manually verify every value in every returned field.
2. The dataset is one random sample
The test used 500 random domains from the Majestic Million, with 349 DNS-resolved domains used in the final benchmark. Results may differ with another sample, region, company size, industry, or domain type.
3. DNS resolution does not prove active company status
A domain can resolve via DNS but still be parked, inactive, redirected, or not connected to an operating company.
4. Provider APIs change over time
API coverage, schemas, pricing, endpoints, and data sources can change. This benchmark reflects the test date shown above.
5. Some providers may expose more data through other endpoints
This benchmark tested domain enrichment APIs. Some providers may have additional endpoints for funding data, people data, contact data, company search, or account intelligence.
6. Field presence can still overstate usable quality
A field can be present but stale, incomplete, formatted differently, or attached to the wrong company entity. Before choosing a provider for production, run a small manual accuracy review on your own accounts and the exact fields your workflow depends on.
Reproducibility
The reproducibility materials are available in the company-enrichment-api-benchmark GitHub repository. The repository includes the Majestic Million sampling and DNS script, the sampled domain file, raw provider JSONL responses, generated benchmark CSV outputs, the canonical field mapping, and a Python generator that rebuilds the metrics from the raw source files.
To rerun the benchmark calculations, clone the repository and run python3 generate_benchmark_results.py. The generator reads the provider JSONL files under data/ and regenerates the coverage, depth, canonical-field, category, and per-record benchmark outputs.
FAQ
Why 27 canonical fields, and how were they chosen?
We mapped every provider's raw fields onto a shared canonical model so the six APIs can be compared on the same axes. The 27 fields avoid double-counting overlapping source signals: domain and website are counted as one field, industry and multi-industry values are credited through industry, parent-company and subsidiary signals are credited through corporate_relations, and funding rounds, total funding, and stage are credited through funding_data. The goal is to count independent buyer-relevant data points, not multiple names for the same underlying signal.
What does find rate mean?
Find rate is the percentage of submitted domains for which the provider returned usable company data. In this benchmark, find rate is calculated using the 349 DNS-resolved domains: find rate = enriched domains / 349.
How are field percentages calculated?
Field percentages use the same denominator: field found / 349 submitted domains. They are not divided by each provider's returned-record count, and schema-missing fields are shown as 0.0% rather than N/A so every cell uses the same total.
Is this an accuracy benchmark?
No. This benchmark measures coverage and data depth — whether each provider returned company data and which fields were populated. We did not manually verify the values themselves for accuracy, freshness, or correct entity matching. Before choosing a provider for production, run a small accuracy check on your own target accounts.