---
title: "Submit a batch person contact enrichment job"
method: POST
path: "/batch/person/contact/enrich"
tags: ["Batch APIs"]
---

# Submit a batch person contact enrichment job

`POST /batch/person/contact/enrich`

Enrich contact information — business email, personal emails, and phone numbers — for up to
**300 people** in a single asynchronous job. Provide `professional_network_profile_urls` (the
only identifier type accepted) and a required `fields` list naming which contact kinds to
retrieve for each profile.

<Note>
    An account may have at most 5 active (`pending` or `processing`) batch jobs at a time;
    submitting a sixth returns `429`.
</Note>

The job responds immediately with a `batch_id`. Poll `GET /batch/{batch_id}` (or provide a
`webhook_url`) and download the gzipped JSONL results file when the job completes. Each record
is wrapped in an `{original_identifier, internal_id, data}` envelope, where `data` holds the
resolved contact information — `business_email` plus a nested `personal_contact_info` object —
in the same shape as the non-batch `/person/contact/enrich` response. Profiles for which no
requested contact kind could be found are still listed with empty values (compare
`entities_requested` with `entities_fulfilled`).

## Headers

- `x-api-version` '2025-11-01', required

## Request body

- BatchPersonContactEnrichRequest — Request body for a batch person contact enrichment job. `professional_network_profile_urls` is the only identifier type accepted, and `fields` is required — it names which contact kinds to retrieve for each profile.
  - `professional_network_profile_urls` union, required — Person profile URLs to enrich. Maximum 300 identifiers per job — larger submissions are rejected with `400`. Also accepted as a single comma-separated string.
    - string — Comma-separated person profile URLs.
    - string[]
  - `fields` union, required — Required, non-empty list naming which contact kinds to retrieve for each profile (also accepted as a single comma-separated string). An empty value returns `400`; any value outside the supported set returns `400` with the full list in `metadata.available_fields`. `personal_contact_info` is shorthand for both `personal_contact_info.personal_emails` and `personal_contact_info.phone_numbers`.
    - string — Comma-separated contact-field paths.
    - string[]
  - `webhook_url` string, uri — Optional URL that receives a POST notification when the job finishes, so you do not have to poll.
  - `chunk_size` integer — Optional internal processing chunk size (number of identifiers per processing unit). Values outside 10-1000 return `400`.

## Response `200`

Batch job accepted for processing

- BatchSubmitResponse — Returned immediately when a batch job is accepted. No data is returned at submit time — poll `status_url` for progress and download links.
  - `batch_id` string, uuid, required — Unique ID of the batch job. Use it to poll `GET /batch/{batch_id}`.
  - `status` 'pending', required — Initial job status. Always `pending` at submit time.
  - `entity` 'company' | 'person' | 'social_post', required — Entity type the job operates on.
  - `action` 'enrich' | 'enrich_live' | 'contact_enrich' | 'search' | 'search_live', required — Internal action name for the job. Live endpoints report `enrich_live` / `search_live`; the person contact enrichment endpoint reports `contact_enrich`.
  - `identifier_count` integer, required — Number of identifiers submitted. Search jobs always report `1` (the query).
  - `entities_requested` integer, required — Number of entities the job was asked to produce. For enrich jobs this equals `identifier_count`; for search jobs it is `1` until results are known.
  - `status_url` string, required — Relative URL to poll for the job status (`GET /batch/{batch_id}`).

## Other responses

- `400` — Invalid request — missing identifier, missing or unsupported fields, or invalid chunk size
- `401` — Unauthorized — invalid or missing API key
- `403` — Forbidden — your account is not entitled to this batch endpoint
- `429` — Too many active jobs — the account already has 5 batch jobs in `pending` or `processing` status
- `500` — Internal server error — the job could not be started

---

[API](https://skmtc.dev/crustdata/apis/batch-api.md) · [All operations](https://skmtc.dev/crustdata/apis/batch-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/crustdata/batch-api/revisions/581689e66ae7/schema)
