CRM enrichment API
B2B contact data decays somewhere around a quarter to a third a year, and almost all of that decay is people changing jobs. Enrichment is less about filling blank fields than about noticing when a record stopped being true.
Endpoints used
/v1/profile
Get profile
From $0.0288 per request at Scale
/v1/company
Get company
From $0.0180 per request at Scale
Resolving a record
If you hold a LinkedIn URL, pass it as url. If you have stored the public identifier, pass publicIdentifier and skip a redirect. If the record came from an earlier call, store and pass profileId — it survives someone editing their vanity URL, which the URL itself does not.
That last point is the one that bites. Teams key their CRM on the profile URL, someone rebrands their vanity handle, and a live contact silently becomes a 404 in the next enrichment run. Store the ID as the key and treat the URL as a display field.
Detecting job changes cheaply
You do not need the full profile to notice that someone moved. short=1 returns identity plus current position for $0.0400 instead of $0.0640 — a 37% saving on what is, for most CRMs, the highest-volume call there is.
The pattern that works: rotate through your contact table with the short call, compare current company against what you hold, and resolve the full profile only for the records that changed. On a 50,000-contact database refreshed quarterly, that is roughly $2,000 a year of short calls at Starter — under $900 on Scale — with full resolutions only for the 25% that actually moved.
Enriching the account, not just the contact
Contact enrichment without account enrichment leaves you routing on stale headcount. company gives you employee count and range, industry, specialities and headquarters, which is what territory assignment and scoring actually key on.
Accounts move much more slowly than people, so refresh them on a longer cycle. One sensible split is contacts quarterly, accounts annually, and both on demand when a deal opens.
What enrichment will not fix
It will not give you email addresses or phone numbers. If your CRM has blank email fields, this API cannot fill them — you need a dedicated provider for that, and we would rather tell you now than sell you a plan that disappoints.
It will not resolve a person from a name and company alone with any reliability. You need a LinkedIn identifier, or a profile-search pass first — and search on a common name returns several plausible people, which means a human or a confidence threshold has to make the final call. Automatically binding the top search result to a CRM record is how you end up emailing the wrong Sarah Chen.
Deciding what to overwrite
Enrichment that overwrites everything is how you lose data a rep added by hand. The safer rule is to overwrite only fields the API is authoritative for — current employer, title, location — and to append rather than replace anywhere a human may have contributed.
Keep the previous value when a field changes. "Moved from Acme to Globex last month" is a far better prompt than the new employer on its own.
Frequently asked questions
Can I enrich a contact from just a name and company?
You can run profile-search with firstName, lastName and currentCompany, but common names return several plausible matches. Treat the result as a candidate needing a confidence threshold or human confirmation, not as a definitive match.
What is the cheapest way to detect job changes?
The short profile variant, short=1, at $0.0400. It returns current position without the expensive history sections. Resolve the full profile only for records that changed.
Will this fill in missing email addresses?
No. Email is not public profile data and we do not offer email enrichment on any endpoint or plan.
How do I handle contacts whose profile no longer resolves?
A deleted or private profile returns a successful response with an empty element. Flag those records rather than deleting them — a profile can also be temporarily unavailable, and you do not want a transient failure wiping your CRM.