You are viewing the documentation of the new API versions. We would love to hear from you. You can write to use at support@crustdata.co for feedback and clarifications.
Use this file to discover all available pages before exploring further.
GET /screener/person/enrich
POST /person/enrich
This page lists every behavioral and contract change between the legacy
person-enrich endpoint (called without enrich_realtime=true, i.e. the
cached/indexed path) and the current one. Use it as a side-by-side
reference when porting an integration; each section gives the old shape,
the new shape, and the smallest edit that closes the gap.
Topic
Legacy
Current
Path
GET /screener/person/enrich
POST /person/enrich
Method
GET with query parameters
POST with a JSON body
Auth
Authorization: Token <key>
Authorization: Bearer <key>
Version
(not required)
x-api-version: 2025-11-01 (required)
Base URL
https://api.crustdata.com
https://api.crustdata.com
Three header / shape changes are required. The HTTP method moved from
GET to POST, the authorization scheme moved from Token <key> to
Bearer <key>, and the x-api-version: 2025-11-01 header is now
required on every call. Calls missing any of these are rejected.
This guide covers the indexed (cached) path of the legacy endpoint —
requests sent without enrich_realtime=true. The current
/person/enrich endpoint serves the indexed dataset only; on-demand
live retrieval is not part of this endpoint. See
Removed features for what happened to
enrich_realtime.
Identifiers moved from comma-separated query parameters to JSON arrays in
the request body. Submit exactly one identifier type per request (up to 25
values).
Colleague expansion is no longer part of person enrich.
?enrichment_method=salesnavigator|voyager
(removed)
Internal routing flag — no replacement.
Submit exactly one identifier type per request. Mixing
professional_network_profile_urls and business_emails in the same
call returns 400. Maximum 25 values per identifier array.
The legacy response was a flat object with top-level fields like
linkedin_profile_url, name, headline, current_employers, and
github_profiles. The current response groups fields under basic_profile,
professional_network, social_handles, contact, experience,
education, skills, certifications, honors, and
dev_platform_profiles.
The legacy response carried four parallel arrays (current_employers,
past_employers, all_employers, all_employers_company_id, all_titles).
The current response consolidates these under
experience.employment_details, with one entry per employment record.
Legacy field
Current field
current_employers[]
experience.employment_details.current[]
past_employers[]
experience.employment_details.past[]
all_employers[] (company names)
(derive from experience.employment_details.{current,past}[].name)
all_employers_company_id[]
(derive from experience.employment_details.{current,past}[].crustdata_company_id)
all_titles[]
(derive from experience.employment_details.{current,past}[].title)
contact.business_emails[] (verified business addresses) and contact.personal_emails[] (personal addresses) — each entry now carries email, status (verified / unverified), and last_updated.
dev_platform_profiles[] — neutral name; same one-entry-per-profile shape. To enrich a person by a dev-platform URL only, use the dedicated dev-platform endpoint.
Each contact email is now { email, status, last_updated } rather than a bare string. Split between contact.business_emails[] and contact.personal_emails[].
location
string
object
The raw string is preserved at basic_profile.location.raw; parsed city, state, country, continent are also returned.
business_email request
single string
array of strings
The request key is now plural (business_emails) and accepts up to 25 values.
linkedin_profile_url request
comma-separated string
array of strings
Renamed to professional_network_profile_urls and now a JSON array.
The legacy endpoint used enrich_realtime=true to fall back to real-time
retrieval from the web when a person was not in the indexed dataset, with
force_fetch=true bypassing the cache and open_to_cards=true pulling
additional opt-in fields. These flags have been removed from
/person/enrich — the current endpoint serves the indexed dataset only.
If a person is not present, the request returns an entry with empty
matches: [] rather than attempting a real-time fetch.If you previously called the legacy endpoint with enrich_realtime=true,
use the dedicated live-enrich endpoint instead — see
Person Live Enrich. It performs
real-time retrieval and supports the same identifier shape as
/person/enrich.
The legacy endpoint accepted a comma-separated list of dev-platform profile
URLs as an identifier. This input mode has been removed from
/person/enrich. Dev-platform profiles are still returned in the
response under dev_platform_profiles[] when present, but a separate
endpoint is used to enrich a person starting from a dev-platform URL — see
Person Dev-Platform reference.
The legacy colleagues=true flag expanded the response with a list of the
target person’s colleagues. This feature has been removed; build a colleague
list explicitly by calling Person Search
with the appropriate company filter.
The legacy enrichment_method parameter (salesnavigator / voyager)
routed requests to specific upstream collection paths. This parameter has
been removed — routing is handled internally.
The legacy enriched_realtime boolean indicated whether a record was
served from cache or fetched live. Because /person/enrich serves the
indexed dataset only, this flag has been removed from responses.
The envelope shape changed. The legacy endpoint returned a top-level array
of person records. The current endpoint returns a top-level array of
match-result envelopes, each containing one or more person_data
candidates.
The legacy endpoint returned 404 when no profiles matched. The current
endpoint returns 200 with empty matches: [] for unmatched
identifiers. The OpenAPI contract still defines 404 for completeness —
handle both.
Convert comma-separated identifier values to JSON arrays. Wrap single business emails in an array.
Drop enrich_realtime=true, force_fetch=true, and open_to_cards=true — the new endpoint serves indexed data only. For real-time retrieval, use Person Live Enrich instead.
Drop colleagues=true — build colleague lists with Person Search instead.
Drop enrichment_method — routing is handled internally.
Convert fields from a comma-separated string to a JSON array, and migrate field names to the new section-prefixed paths (see Field-name mapping).
Unwrap each result from the new { matched_on, match_type, matches: [{ confidence_score, person_data }] } envelope.
Update parsers for the nested person_data shape: name → basic_profile.name, title → basic_profile.current_title, headline → basic_profile.headline, summary → basic_profile.summary.
Update location parsing — it is now an object with raw, city, state, country, continent rather than a single string.
Update email[] parsing — emails are now objects ({ email, status, last_updated }) and split between contact.business_emails[] and contact.personal_emails[].
Map current_employers[] / past_employers[] to experience.employment_details.current[] / experience.employment_details.past[]. Derive all_employers, all_titles, all_employers_company_id from these arrays if you still need them.
Map education_background[] to education.schools[].
Map linkedin_profile_url (response) to social_handles.professional_network_identifier.profile_url, twitter_handle to social_handles.twitter_identifier.slug.
Map num_of_connections to professional_network.connections, skills[] to skills.professional_network_skills[].
Map github_profiles[] to dev_platform_profiles[].
Map person_id to crustdata_person_id.
Handle no-match as matches: [] (legacy returned 404).
Update error handlers for the new error.type / error.message envelope.
Drop any parsing of enriched_realtime from the response — the field no longer exists.