Data Enrichment API: Endpoints, Fields and Matching Rules

A reference to data enrichment API endpoints, sample payloads, matching logic, latency, quality metrics and how to choose a provider for GTM teams.

In a 2024 global study of 631 CRM users and stakeholders in the United States, United Kingdom, and Australia, 31% of administrators said poor-quality data cost their organizations at least 20% of annual revenue, according to Experian's CRM data quality report. That isn't a cleanup backlog. It's what happens when routing, personalization, and forecasts run on records nobody can defend.

A data enrichment API takes a thin identifier and returns the attributes a revenue team needs before anyone is contacted. Treat every call as a matching and provenance decision, not a field-filling exercise. Score completeness and accuracy apart, and judge the work by qualified-meeting yield, not by match rate alone.

Outbound teams usually send from Instantly, run LinkedIn steps in HeyReach, and time the first touch with Whitewhale. None of those tools can repair a wrong company or a stale title. The API has to earn trust before a sequence starts.

Table of Contents

Data Enrichment API Endpoints and Fields at a Glance

A data enrichment API accepts a partial record, such as a domain, a company name, an email, or a person's name plus employer, and returns missing attributes such as industry, headcount band, location, job title, or technology stack. Providers, including Apollo, split that work into a few endpoint families. Compare inputs and returned fields, not the route name, because labels differ between vendors.

In a 2022 study of 1,241 CRM users across the United States, United Kingdom, and Australia, 50% had lost new sales because of inaccurate or incomplete CRM information, according to the Validity CRM data management study. The table below maps each family to the outbound job it serves.

Endpoint

Input

Returned Fields

Typical Use

Company enrichment

Domain or company name

Industry, headcount band, revenue band, HQ location, funding stage

Account selection and segmentation

Person enrichment

Email, or name plus company domain

Job title, seniority, function, business email status

Persona targeting and personalisation

Email finder

First name, last name, company domain

Candidate email addresses with confidence value

Building contact lists

Email verification

Email address

Syntax, domain and mailbox status

Protecting sender reputation

Technographic lookup

Domain

Detected software by category

Tool-based targeting

Bulk job

File of records

Job ID and downloadable results

Refreshing whole databases

Company enrichment drives account selection. Person enrichment drives persona and personalization. The finder builds the list, and verification protects the domain you send from.

RFC 5322 defines an addr-spec as a locally interpreted string, an at-sign, and a domain. The local part may be a quoted string or a dot-atom. A check that only looks for @ creates false positives. A check that rejects every unusual but legal local part creates false negatives. Separate syntax from domain, mailbox, and deliverability checks, and keep the original address when you score it.

Technographic lookup supports tool-based targeting. A bulk job accepts a file, returns a job ID, and delivers results later, which is how you refresh a database without blocking the CRM.

A field marked unavailable for a market is a coverage gap to log, not a null to ignore. If Singapore headcount comes back blank while the US figure is full, record the gap before you treat the account as small. Teams wiring similar contracts can browse the recruitment API reference to see inputs, outputs, and error cases written down. Payloads show the shape of a response. Matching decides which record you trust.

Sample Request and Response Payloads

Send a small POST body: the domain or email, the fields you asked for, and a client reference ID that maps the answer back to the CRM row. Don't let the provider invent your primary key.

A useful response isn't a flat bag of strings. The JSON-LD specification uses @id as an IRI for the entity, and @type plus @context to map short names onto shared vocabulary. Compact JSON can follow the same idea.

{
  "entity_id": "org_9f3c",
  "schema_version": "2024-06",
  "match": { "status": "matched", "score": 0.94, "keys": ["domain"] },
  "fields": {
    "industry": { "value": "Software", "sources": ["registry"], "observed_at": "2024-11-02", "expires_at": "2025-05-01" },
    "headcount_band": { "value": "51-200", "sources": ["filing"], "observed_at": "2024-11-02", "expires_at": "2025-05-01" },
    "hq": { "value": "Singapore", "sources": ["registry"], "observed_at": "2024-11-02", "expires_at": "2025-05-01" },
    "contact_title": { "value": "VP of Sales", "sources": ["provider_a", "provider_b"], "observed_at": "2024-11-02", "expires_at": "2025-05-01" }
  }
}
{
  "entity_id": "org_9f3c",
  "schema_version": "2024-06",
  "match": { "status": "matched", "score": 0.94, "keys": ["domain"] },
  "fields": {
    "industry": { "value": "Software", "sources": ["registry"], "observed_at": "2024-11-02", "expires_at": "2025-05-01" },
    "headcount_band": { "value": "51-200", "sources": ["filing"], "observed_at": "2024-11-02", "expires_at": "2025-05-01" },
    "hq": { "value": "Singapore", "sources": ["registry"], "observed_at": "2024-11-02", "expires_at": "2025-05-01" },
    "contact_title": { "value": "VP of Sales", "sources": ["provider_a", "provider_b"], "observed_at": "2024-11-02", "expires_at": "2025-05-01" }
  }
}
{
  "entity_id": "org_9f3c",
  "schema_version": "2024-06",
  "match": { "status": "matched", "score": 0.94, "keys": ["domain"] },
  "fields": {
    "industry": { "value": "Software", "sources": ["registry"], "observed_at": "2024-11-02", "expires_at": "2025-05-01" },
    "headcount_band": { "value": "51-200", "sources": ["filing"], "observed_at": "2024-11-02", "expires_at": "2025-05-01" },
    "hq": { "value": "Singapore", "sources": ["registry"], "observed_at": "2024-11-02", "expires_at": "2025-05-01" },
    "contact_title": { "value": "VP of Sales", "sources": ["provider_a", "provider_b"], "observed_at": "2024-11-02", "expires_at": "2025-05-01" }
  }
}

Those values are illustrative, not from a named vendor. Ask for the documented schema before you build.

What each field is for

entity_id is the deduplication key across CRM, prospecting, and sequencing. Source-specific IDs can sit beside it. One person, one company, one join.

match.status and match.score gate sequencing. A high score on the wrong status still stays out of the queue.

sources and observed_at show where a value came from and whether it is current. The VP of Sales title above rests on two sources inside a 180-day window. Treat each source as an assertion, not as truth.

expires_at is the re-enrichment trigger. When that date passes, the field is stale even if it still looks tidy.

schema_version protects integrations when a vendor renames a band or adds a field. Pin the version and keep old readers working.

Practical rule: Store source and observed date on every field so a later audit can rebuild the record without guessing.

Errors and disagreements

A rate-limited call returns HTTP 429 with retry_after in seconds. An invalid domain returns HTTP 422 with a reason code. Retry or log. Never write an empty company into the CRM.

When providers disagree, keep every candidate with its sources. Apply a written order, such as verified contact data over scraped web data. A newer observed_at wins only when source tiers are equal. Never overwrite a verified field with an inferred one.

Matching Logic and Match Keys

An enrichment lookup is a matching decision, and the output is only as trustworthy as the match. NIST SP 800-63A describes identity resolution as deciding whether supplied attributes correspond to one unique individual in a defined population, and it says to collect only the minimum needed. Exact matching is often inadequate, so variation-aware rules are allowed, but those rules must be documented for the people who rely on them.

A four-step infographic illustrating the data enrichment process, including normalization, matching keys, confidence resolution, and returning fields.

Separate match inputs from the enrichment fields you return. The API should answer with a machine-readable status: matched, ambiguous, unmatched, or suppressed, plus a score, the keys that fired, and reason codes.

  1. Normalise inputs. Lowercase domains, strip tracking parameters, standardise country names, and drop legal suffixes such as Pte Ltd or Inc.

  2. Try deterministic keys. A verified domain, a normalised business registration number, or a provider entity ID either hits one record or it doesn't.

  3. Score probabilistic matches only if those keys fail. Use company name, address, website, and person role, which are weaker signals.

  4. Assign one status. matched means a single candidate cleared the bar. ambiguous means two or more did. unmatched means none did. suppressed means an opt-out or suppression list applies.

Person-level confidence and company-level confidence stay separate. A correct company doesn't validate the contact pinned to it. NIST allows one-to-many identification for resolution or deduplication only with a privacy risk assessment, and it specifies a 1:1,000-or-better false-positive threshold in that context. For outbound, the control is simpler: ambiguous rows never enter sequencing. They go to a review queue with a deadline. Every result should also support suppression, deletion, retention limits, and a reprocess when source data changes. How that lands in the CRM is covered in our note on data enrichment and CRM hygiene.

Starting points to tune, not universal laws: auto-accept company matches above 0.90, and person matches above 0.95. Common names and shared domains should sit higher.

Match Key

Strength

Typical Use

Provider entity ID

Very high

Re-running enrichment on a known record

Verified domain

High

Company-level matching for B2B accounts

Business registration number

High

Legal entity matching in regulated markets

Normalised email address

High for person matching

Contact-level matching when an email is known

Company name plus country

Medium

Fallback when no domain is available

Person name plus company domain

Medium

Person lookup; common names need extra attributes

Job title and address alone

Low

Supporting evidence only, never a sole match key

Deterministic keys come first because they don't ask you to guess. A job title plus a street address can support a decision. It can't make one.

Ambiguous means "two plausible people," not "close enough to email."

Latency, Rate Limits and Coverage Trade-offs

Speed, coverage, and cost pull against each other. Pick a mode per workflow, not one mode for the whole stack.

  • Synchronous single lookup: Returns in seconds, using only sources that answer immediately. Coverage is lower. Use it for a form fill or a new CRM record that must be routed within the next minute.

  • Asynchronous bulk job: Results arrive in minutes to hours. Coverage is usually higher because the provider can run deeper matching. Use it for lists of thousands.

  • Scheduled refresh: A weekly or monthly batch re-checks rows whose expires_at has passed, so active accounts don't age in silence.

Mode

Speed

Coverage

Best Use

Synchronous single lookup

Seconds

Lower, only immediately available sources

Form fills and new CRM records routed within a minute

Asynchronous bulk job

Minutes to hours

Higher, deeper matching by the provider

Lists of thousands of records

Scheduled refresh

Batch, weekly or monthly

Re-checks records whose expires_at has passed

Keeping active records current

Most APIs cap requests per second or per day. When you cross the cap you get HTTP 429. Queue the work and retry with exponential backoff instead of hammering the endpoint. A clear public write-up of how caps, headers, and retries are documented is the RealtyAPI.io rate limit reference. Cache the response and reuse it until expires_at, or you pay twice for the same fact and add delay for nothing.

A small speed and coverage test

Run the same 500 records through synchronous and bulk modes. Compare populated-field rate per second and per credit spent. APAC coverage often differs from North America, so break the result out by country. A global average will hide a weak market.

Enrich synchronously only what must be routed within the next minute. Batch everything else.

Measuring Completeness, Accuracy and Freshness

A single match rate hides the failures that break outreach. NIST's data quality material defines completeness as how fully information is captured against a potential of 100%, and it treats accuracy as information that is correct and factual. A lead can hold every requested field and still name an outdated employer. It can also name a verified company and title and still have no usable channel.

One summary of B2B contact data puts annual database decay at 25–30%, as noted by Security Boulevard. A matched person can be the wrong person to email by the time the sequence runs. Report field-level coverage and correctness apart. Don't collapse them into one score.

Metric

What It Measures

How to Calculate

Populated-field rate

Share of requested fields returned

Populated fields divided by requested fields

Verified-field rate

Share of returned fields confirmed by a second source or check

Verified fields divided by populated fields

Stale-record rate

Share of records past their expires_at date

Expired records divided by active records

Conflict rate

Share of fields where providers disagree

Conflicting fields divided by fields compared

Match precision

Share of accepted matches confirmed correct on a sample

Correct accepted matches divided by sampled accepted matches

Meeting yield per verified record

Qualified meetings generated per verified record contacted

Qualified meetings divided by verified records contacted

How to sample

Each month, pull a random sample of about 200 accepted records. Check them by hand or against a second source, and log errors by field. Segment by market, persona, record age, and channel. A strong populated rate in one country can sit next to a weak rate in another, and a blended number will not show it. The same split is what separates good data from bad data once the list is live.

Keep factual fields and model-generated predictions, such as inferred seniority or an intent score, in separate columns. A confident prediction can help you prioritise. It isn't a verified fact you can put in a sentence or a compliance file.

If a metric falls under the threshold you agreed, pause that segment. Don't stop the whole pipeline.

Provenance, Consent and Deletion Requirements

Bought B2B contact data isn't exempt from privacy duties. When a field describes a person, purpose limitation, transparency, minimisation, accuracy, security, and storage limitation still apply. EU working material on AI and personal data is clear that processing for AI has to meet those GDPR duties, and data preparation includes cleaning, updating, enrichment, and aggregation.

An infographic illustrating the data enrichment API process for verifying and updating personal user profile records.

Most API write-ups stop at "send a domain, get a title." They skip what happens when the title was scraped, repurposed, or inferred. A confidently inferred job title needs a different label from a verified one. Confidence isn't lawful basis.

What to store on each field

For every returned attribute, keep the source, the collection date, the processing purpose, lawful-basis metadata, and the retention rule. Without that set, you can't answer a basic buyer question: which enriched fields selected or contacted this person?

Regional rules don't travel as one setting. EU processing constraints and APAC privacy laws differ by country, and some markets expect processing to stay in-region. Channel rules sit beside the data rules. Our overview of email marketing laws is the place to check before a sequence uses an enriched address.

Deletion has to leave the vendor

Individuals can ask for correction of inaccurate or incomplete personal data. Organisations generally must respond without undue delay and, in principle, within one month, and if the data was passed to others those parties must be told unless that is impossible or disproportionate, as set out in the European Commission's guidance for individuals.

Use one record ID in the enrichment store, the CRM, marketing automation, analytics, and any downstream list. A suppression that stops at the vendor copy leaves the person in the sequence. Propagate opt-outs with timestamps. Set retention per field type. Keep an audit log of who changed what, and when.

This is an engineering checklist, not legal advice. Review it with counsel for each market you will contact.

Choosing a Provider Against Clear Criteria

No single provider wins in every market, so choose by criteria weighted to your targets.

A five-step guide for choosing a data provider based on specific criteria like coverage and compliance.
  1. Coverage in your markets and personas (20%). A strong US file doesn't prove Japan or Indonesia.

  2. Field accuracy from your sample (25%). This outweighs a homepage match rate.

  3. Provenance and schema (15%). You want a source per field, expires_at, and versioning.

  4. Compliance controls (15%). Deletion has to propagate, and regional processing has to be real.

  5. Latency and rate limits (10%). They must fit the mode you run.

  6. Cost per successful enriched record (10%). Failed lookups often still spend credits.

  7. Integration effort (5%). CRM and sequencing connectors, not a slide.

Score each provider from 1 to 5, multiply by the weight, and write the reason in a shared sheet. A claimed match rate is a marketing figure until you reproduce it on your own rows. Side-by-side notes such as ZoomInfo alternatives for B2B prospecting help you see how vendors describe themselves. They don't replace your sample. A longer vendor map lives in our data enrichment tools write-up.

Red flags in the docs

Walk away, or at least don't automate, when you see no documented schema, no match status, no expiry dates, a vague line about "multiple sources," or coverage with no country split. Those gaps show up later as bad meetings, not as a low score on a spreadsheet.

Run a One-Week Enrichment Pilot Before You Commit

A week of your own records beats a demo dataset.

  1. Pull 300 to 500 records that match your current ICP, mixed across the markets you will sell into, including APAC countries if they are in scope.

  2. Run the same rows through two or three providers in the same week so freshness is comparable.

  3. Score each output on the weighted criteria, logging completeness and accuracy apart.

  4. Review 50 disagreements by hand. Note the cause: a stale source, the wrong company, or the wrong person.

  5. Set match thresholds, quarantine rules, and suppression behaviour before any sequencing starts.

  6. Map each field into the CRM with its source and observed_at stored beside the value.

Continue with the provider that clears your thresholds in your markets. Use a hybrid, one vendor for contacts and another for firmographics, only when the pilot shows that no single provider clears both in every target market. Write that reason on the scoring sheet. List work of this kind follows the same discipline as lead generation list building: define who belongs, then verify, then rank.

We can walk through a customized scoring matrix and a pilot plan for a single vendor or a hybrid. On a discovery call, we show how we would find the buyers, build the system, and generate pipeline, and we train the sales team to run it so the results continue after the build.

The Social Search designs outbound systems for B2B teams selling into APAC and beyond, including enrichment, verification, and routing into sequences you own. If you want that matching and provenance model applied to your ICP, visit The Social Search and book a working session on your own records.