Skip to main content
Batch enrichment takes a list of identifiers you already have and returns the enriched record for each as a single results file, instead of one Person Enrich call per person.
POST https://api.crustdata.com/batch/person/enrich
For profiles retrieved fresh from the web at request time, see Batch Person Live Enrich.

Database batch enrichment

POST /batch/person/enrich takes exactly one identifier type — professional_network_profile_urls or business_emails — with up to 10,000 identifiers per job. Providing none, or more than one type, returns 400; over-cap submissions are rejected. Identifier lists also accept a single comma-separated string.
curl --request POST \
  --url https://api.crustdata.com/batch/person/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/dvdhsu/"],
    "fields": ["basic_profile.name", "basic_profile.headline", "basic_profile.current_title"]
  }'
When the job completes, each line in the downloaded file is one person wrapped in the enrichment envelope:
One record from the results file
{
    "original_identifier": "https://www.linkedin.com/in/dvdhsu/",
    "internal_id": 14540,
    "data": {
        "basic_profile": {
            "name": "David Hsu",
            "headline": "Founder, CEO @ Retool",
            "current_title": "Founder, CEO"
        },
        "social_handles": {
            "professional_network_identifier": {
                "profile_url": "https://www.linkedin.com/in/dvdhsu"
            }
        },
        "crustdata_person_id": 14540
    }
}
Record trimmed for clarity.

Fields: requested plus defaults

fields accepts dotted leaf paths, whole family names (basic_profile), or a comma-separated string of either. A family name expands to its entire subtree. The response contains the requested fields plus the default families (basic_profile and social_handles) — matching the non-batch Person Enrich exactly, including the selectable field list. An unsupported value returns 400 with every selectable field in metadata.available_fields.

Enrich by business email — and detect no-matches

Emails that don’t resolve to a person are silently dropped: the job still completes, and entities_requested vs entities_fulfilled is your no-match signal.
curl --request POST \
  --url https://api.crustdata.com/batch/person/enrich \
  --header 'authorization: Bearer YOUR_API_KEY' \
  --header 'content-type: application/json' \
  --header 'x-api-version: 2025-11-01' \
  --data '{
    "business_emails": ["nonexistent-probe-xyz@example-no-such-domain.com"]
  }'

chunk_size

Optional internal processing chunk size (identifiers per processing unit), 10–1000, default 100. Out-of-range values return 400 with "chunk_size must be between 10 and 1000".

Errors

400 — no identifier
{
    "error": {
        "type": "invalid_request",
        "message": "Exactly one identifier must be provided: professional_network_profile_urls",
        "metadata": []
    }
}
400 — chunk_size out of range
{
    "error": {
        "type": "invalid_request",
        "message": "chunk_size must be between 10 and 1000",
        "metadata": []
    }
}

What to do next