Skip to main content
Use this when you need contact data for hundreds of people at once — bulk lists, CRM backfills, or back-office pipelines. Submit a job, then poll or receive a webhook when it finishes. You pay only for the contact values that come back, with no per-profile base fee.
Choose this for a higher fill rate. Submit a bulk list and get results as a file, typically within 2–3 minutes. For a quick, synchronous response on a few people, use Contact Enrich instead.

How it works

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

Submit your profile URLs

POST /batch/person/contact/enrich with your list of profile URLs and the contact fields you want. 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 URL, valid for 5 days.
Replace YOUR_API_KEY in each example with your actual API key. All requests require the x-api-version: 2025-11-01 header.
Pricing: no per-profile base fee — you are charged only for the contact values that are delivered. See Pricing for per-field credit costs. Limits: up to 5 active batch jobs per user at a time.

1. Submit your profile URLs

Send your profile URLs in professional_network_profile_urls along with the contact fields you want. The response returns a batch_id immediately — the job runs asynchronously.
curl --request POST \
  --url https://api.crustdata.com/batch/person/contact/enrich \
  --header 'authorization: Bearer YOUR_API_KEY' \
  --header 'content-type: application/json' \
  --header 'x-api-version: 2025-11-01' \
  --data '{
    "professional_network_profile_urls": [
      "https://www.linkedin.com/in/cassandrebay",
      "https://www.linkedin.com/in/ruchavora"
    ],
    "fields": ["business_email", "personal_contact_info"]
  }'
To be notified when the job finishes instead of polling, include a webhook_url in the request body. Crustdata sends a callback to that URL when the batch completes.

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.
curl --request GET \
  --url https://api.crustdata.com/batch/c97333e3-046f-4fd2-b888-a5b07793a0ac \
  --header 'authorization: Bearer YOUR_API_KEY' \
  --header 'x-api-version: 2025-11-01'
The download_url points to gzipped JSONL (.jsonl.gz) with one record per submitted profile URL. The link is valid for 5 days.

Fields

Request any combination of these contact fields. Only professional network profile URLs are supported as identifiers for this endpoint.
FieldReturns
business_emailVerified business email addresses
personal_contact_infoBoth personal emails and phone numbers
personal_contact_info.personal_emailsPersonal email addresses only
personal_contact_info.phone_numbersPhone numbers only

Request parameters

ParameterTypeRequiredDescription
professional_network_profile_urlsstring[]YesProfile URLs to enrich. Professional network profile URLs only.
fieldsstring[]YesWhich contact fields to enrich (see the table above).
webhook_urlstringNoURL to call when the job finishes, instead of polling.

Job lifecycle

StatusMeaning
pendingJob accepted, not yet started.
processingJob is running.
completedJob finished — download_url is available.
failedJob failed. No contact values were billed.

Errors

StatusMeaning
400Invalid request — missing identifier, invalid field, or no URLs.
401Invalid or missing API key.
403Permission denied or insufficient credits.
429Too many active batch jobs (max 5 per user).
500Internal server error. Retry with exponential backoff.

API reference summary

DetailValue
SubmitPOST /batch/person/contact/enrich
PollGET /batch/{batch_id}
AuthBearer token + x-api-version: 2025-11-01
Requestprofessional_network_profile_urls (required), fields (required). Optional: webhook_url.
ResponseSubmit returns batch_id + status; poll returns status and a download_url when complete.
OutputGzipped JSONL, one record per profile URL, download link valid 5 days.
Errors400, 401, 403, 429, 500
For credit pricing, see Pricing. For throughput guidance, see Rate limits. See the full API reference for the complete OpenAPI schema.

What to do next

  • Enrich interactivelyContact Enrich returns contact data synchronously for up to 25 URLs per request.
  • Find people first — use Person Search to build the list of profile URLs to enrich.