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 Company Enrich call per company.
POST https://api.crustdata.com/batch/company/enrich

Identifiers: exactly one type per job

Each job takes exactly one identifier type with up to 10,000 identifiers — providing none, or more than one type, returns 400; over-cap submissions are rejected. String-list identifiers also accept a single comma-separated string.
Identifier typeExample values
domains["stripe.com", "openai.com"]
names["Stripe", "OpenAI"]
professional_network_profile_urls["https://www.linkedin.com/company/stripe"]
crustdata_company_ids[631394, 631466]

Your first batch enrichment: companies by domain

curl --request POST \
  --url https://api.crustdata.com/batch/company/enrich \
  --header 'authorization: Bearer YOUR_API_KEY' \
  --header 'content-type: application/json' \
  --header 'x-api-version: 2025-11-01' \
  --data '{
    "domains": ["stripe.com", "openai.com"],
    "fields": ["basic_info.name", "basic_info.primary_domain", "headcount.total"]
  }'
When the job completes, each line in the downloaded file is one company wrapped in the enrichment envelope:
One record from the results file
{
    "original_identifier": "stripe.com",
    "internal_id": 631394,
    "data": {
        "crustdata_company_id": 631394,
        "basic_info": {
            "name": "Stripe",
            "primary_domain": "stripe.com",
            "company_type": "Privately Held",
            "year_founded": 2010
        },
        "headcount": {
            "total": 15554
        }
    }
}
Record trimmed for clarity.

Enrich by Crustdata ID

If you already hold crustdata_company_id values — for example from a previous search — they are the most precise identifier type. In the results file, original_identifier echoes the ID you submitted as a string:
curl --request POST \
  --url https://api.crustdata.com/batch/company/enrich \
  --header 'authorization: Bearer YOUR_API_KEY' \
  --header 'content-type: application/json' \
  --header 'x-api-version: 2025-11-01' \
  --data '{
    "crustdata_company_ids": [631394, 631466],
    "fields": ["basic_info.name", "basic_info.primary_domain"]
  }'
Record trimmed for clarity.

Fields: requested plus defaults

fields accepts dotted leaf paths (headcount.total), whole family names (headcount), or a comma-separated string of either. A family name expands to its entire subtree. The response contains the requested fields plus the default basic_info family — matching the non-batch Company Enrich exactly, including the selectable field list. An unsupported value returns 400 with every selectable field in metadata.available_fields. This request also shows the comma-separated string identifier form:
Request
curl --request POST \
  --url https://api.crustdata.com/batch/company/enrich \
  --header 'authorization: Bearer YOUR_API_KEY' \
  --header 'content-type: application/json' \
  --header 'x-api-version: 2025-11-01' \
  --data '{
    "domains": "stripe.com,openai.com",
    "fields": ["headcount"]
  }'
One record, trimmed — the full headcount family comes back
{
    "original_identifier": "stripe.com",
    "internal_id": 631394,
    "data": {
        "basic_info": { "name": "Stripe", "primary_domain": "stripe.com" },
        "crustdata_company_id": 631394,
        "headcount": {
            "by_function_timeseries": {
                "CURRENT_FUNCTION": {
                    "Accounting": [
                        { "date": "2024-12-01 00:00:00", "employee_count": 222 }
                    ]
                }
            }
        }
    }
}

chunk_size

Optional internal processing chunk size (identifiers per processing unit), 10–1000, default 100. Out-of-range values return 400.

Errors

400 — no identifier
{
    "error": {
        "type": "invalid_request",
        "message": "Exactly one identifier must be provided: names, domains, professional_network_profile_urls, or crustdata_company_ids",
        "metadata": []
    }
}
400 — two identifier types
{
    "error": {
        "type": "invalid_request",
        "message": "Only one identifier type can be provided. Found: domains, crustdata_company_ids",
        "metadata": []
    }
}
400 — invalid field (with available_fields)
{
    "error": {
        "type": "invalid_request",
        "message": "Invalid fields: bogus.field",
        "metadata": [
            {
                "available_fields": [
                    "basic_info.name",
                    "basic_info.primary_domain",
                    "headcount.total"
                ]
            }
        ]
    }
}

What to do next