Skip to main content
Use this when you have an identifier and need to know who it belongs to. Each match returns the person’s crustdata_person_id, basic profile, and profile URL. You pay only for identifiers that resolve to a person. Two endpoints share the same result row:
Identify is enabled per account. If your plan does not include it, contact your Crustdata account team.
Identify vs Enrich. Identify answers “who is this?”. It returns the matched person’s crustdata_person_id, basic_profile (name, headline, title, location), and social_handles (profile URL). If you also need contact data, full employment history, or company IDs per role, use Person Enrich with the profile URL from the match.
Replace YOUR_API_KEY in each example with your actual API key. All requests require the x-api-version: 2025-11-01 header.

Identify a few people now

Send exactly one identifier key with up to 25 values. The response comes back in the same request, one row per identifier, in the order you sent them. Profile URLs and Scholar profile URLs match exactly. An email matches exactly when the address is on file; otherwise Crustdata can match it by the name in the address at the company that owns the domain, then by a contact vendor lookup.
Pricing: 1 credit per identifier that resolves to a person. Unmatched and redacted identifiers are never charged. See Pricing. Limits: up to 25 identifiers per request, 30 requests per minute by default. See Rate limits.

Request

business_emails is not accepted here. Send business addresses in emails. An address that is not on file is matched by the name in the address at the company that owns the domain, when that match is confident enough for the company’s size, and otherwise looked up with a contact vendor inside the same request. A match on a new address can take a few seconds longer than one already on file.
The example leaves some basic_profile fields out. A match returns the same basic_profile fields, from the same source, that the Person Enrich reference lists. Pass social_handles.professional_network_identifier.profile_url to Person Enrich for the full profile, or to Contact Enrich for emails and phone numbers.

Response

A top-level array with one row per identifier you sent, in request order.

Error responses

An invalid request body returns 400 with error.type of invalid_request and one of these messages:
400 - business_emails
If Identify is not enabled on your account, the request returns 403:
403 - not enabled
When the identification service cannot answer, the request returns 503. Nothing is charged. Retry after a short wait.
503 - service unavailable

Summary


Identify a list in bulk

For lists larger than 25, submit a job. It accepts emails, business_emails, or professional_network_profile_urls (up to 300) and delivers one record per identifier as a file. Batch rows carry matched_on, match_type, and matches like the synchronous endpoint, and match_type can also be business_email. Batch matches include social_handles.professional_network_identifier.urn_url, the permanent form of the profile URL.

How it works

Reverse identify is an asynchronous, two-call flow — you submit a job, then fetch the results once it finishes:
1

Submit your emails

POST /batch/person/identify with your list of emails (or professional_network_profile_urls). You get a batch_id back immediately.
2

Poll, or wait for a webhook

GET /batch/{batch_id} to check the job status — or pass a webhook_url on submit and we call you when it finishes.
3

Download the results

Once status is completed, the status response includes a download_url: a gzipped JSONL file with one record per input, valid for 5 days.
Emails already known to Crustdata resolve in seconds. Emails that require real-time retrieval take longer, which is why this endpoint is asynchronous.
Pricing: 1 credit per email that resolves to a person — unmatched emails are free. See Pricing for details. Limits: up to 300 identifiers per submission. Active jobs are capped per account across the live endpoints (5 on default limits) - see Rate limits.

1. Submit your emails

Send your emails in emails — business or personal addresses both work. The response returns a batch_id immediately — the job runs asynchronously.
You can submit professional_network_profile_urls instead of emails to resolve profile URLs to their crustdata_person_id. Submit exactly one identifier type per job. To be notified when the job finishes instead of polling, include a webhook_url in the request body.

2. Get the results

Poll the status_url (or GET /batch/{batch_id}). While the job runs, status is pending or processing. When it is completed, the response includes a download_url.
The download_url points to gzipped JSONL (.jsonl.gz) with one record per submitted identifier. The link is valid for 5 days. download_urls lists the same data split into parts. Both links are pre-signed, and the example trims their query string to ?....

Result format

Each line is one record for an input identifier:
A match carries the person’s profile URL in social_handles.professional_network_identifier.profile_url. Submit that URL to Person Enrich for the full profile, or to Batch Contact Enrich for emails and phone numbers. The same object holds urn_url, the permanent form of the profile URL. The profile_url can change when the person edits it. The urn_url does not change, so you can use it as a stable key for the person. The example leaves some basic_profile fields out. A match returns the same basic_profile fields that the Person Enrich reference lists. An email with no match returns an empty matches array (and is not billed):

Invalid emails

An invalid email does not fail the job. Its row has an empty matches array and an error_message that gives the reason:
You do not pay for an invalid email, and the job’s result_count leaves it out. If every email in the request is invalid, the submit returns 400 instead. See Errors.

Personal emails resolve too

Reverse lookup is not limited to business addresses — a personal email (for example a Gmail address) resolves the same way when it can be matched to a person. Submit it in emails like any other address:
The result row has the same shape as above. Personal addresses that cannot be matched return the usual empty matches array and are not billed.

Request parameters

Submit exactly one identifier type per job: emails, business_emails, or professional_network_profile_urls. This endpoint does not accept fields. Every match returns the same sections.

Response fields

Job lifecycle

Errors

An invalid request body returns 400 with error.type of invalid_request and one of these messages:
400 - no identifier
The API rejects the whole request when one profile URL is malformed. It accepts a request where only some emails are invalid. See Invalid emails. If Identify is not enabled on your account, the submit returns 403 with error.type of permission_error.

API reference summary

For credit pricing, see Pricing. For throughput guidance, see Rate limits.

What to do next

  • Need contact data? Use Contact Enrich.
  • Need full employment history? Use Person Enrich with the profile_url from the match.
  • Enrich contact info in bulk — Batch Contact Enrich returns emails and phone numbers for a list of profile URLs.
  • Find people first — use Person Search to build the list to identify.