> ## Documentation Index
> Fetch the complete documentation index at: https://docs.crustdata.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Job Batch Search

> Pull every job listing for up to 10 companies in one asynchronous job and receive the complete result set as a single file.

Batch job search runs one asynchronous job and delivers the **entire result
set** as a single file. Where [Search Jobs](/job-docs/search/introduction)
returns one cursor page per call, a batch job walks every page for you and
returns **all** listings for the companies you name.

<Snippet file="batch-headers-note.mdx" />

<Snippet file="batch-pricing-callout.mdx" />

***

## Batch search

```
POST https://api.crustdata.com/batch/job/search
```

Retrieve every job listing in the dataset for up to **10 companies** in a single
asynchronous job. Records in the downloaded file are flat, identical to the
non-batch [Search Jobs](/job-docs/search/reference) record shape.

### How batch job search differs from non-batch search

* **Companies, not filters.** Provide a `crustdata_company_ids` list — a JSON array of integers (a comma-separated string is rejected). The job returns **all** listings for those companies. To search listings by arbitrary filters, use the non-batch [Search Jobs](/job-docs/search/reference) instead.
* **Up to 10 companies per job.** More than 10 IDs returns `400`. Resolve IDs from a name, domain, or profile URL with the free [Company Identify](/company-docs/identify/introduction) endpoint.
* **Whole result set.** The job paginates server-side and delivers every listing — there is no `max_results` or cursor control.
* **Flat records.** Each line in the results file has exactly the non-batch [Search Jobs](/job-docs/search/reference) record shape. No envelope.
* **Exact field projection.** When you pass `fields`, each record contains exactly those dotted paths — nothing more. Omit `fields` to get every field your account can read. The selectable fields are the same as non-batch Search Jobs.

<CodeGroup>
  ```bash Request theme={"theme":"vitesse-black"}
  curl --request POST \
    --url https://api.crustdata.com/batch/job/search \
    --header 'authorization: Bearer YOUR_API_KEY' \
    --header 'content-type: application/json' \
    --header 'x-api-version: 2025-11-01' \
    --data '{
      "crustdata_company_ids": [6036032]
    }'
  ```

  ```json Response theme={"theme":"vitesse-black"}
  {
      "batch_id": "0afed646-ce96-430a-92c0-b6b7589e937c",
      "status": "pending",
      "entity": "job",
      "action": "search",
      "identifier_count": 1,
      "entities_requested": 1,
      "status_url": "/batch/0afed646-ce96-430a-92c0-b6b7589e937c"
  }
  ```
</CodeGroup>

The response is a **ticket, not the listings** — `status: "pending"` means the
job is queued. Poll it with `GET /batch/{batch_id}` until `status` reaches
`completed`, then download the results file, as described in [Working with batch
jobs](#working-with-batch-jobs) below. (Search jobs always report
`identifier_count: 1` — the one submission.)

To keep each record small, project just the fields you need:

```json Request body — title and URL only theme={"theme":"vitesse-black"}
{
    "crustdata_company_ids": [6036032],
    "fields": ["job_details.title", "job_details.url"]
}
```

When the job completes, the downloaded file has one flat JSON record per line —
exactly the fields you requested:

```json The results file (title and URL only) theme={"theme":"vitesse-black"}
{"job_details": {"title": "Senior Software Engineer", "url": "https://example.com/careers/senior-software-engineer"}}
{"job_details": {"title": "Product Manager, Growth", "url": "https://example.com/careers/product-manager-growth"}}
```

### Errors

```json 400 — no company IDs theme={"theme":"vitesse-black"}
{
    "error": {
        "type": "invalid_request",
        "message": "Exactly one identifier must be provided: crustdata_company_ids",
        "metadata": []
    }
}
```

```json 400 — comma-separated string instead of a JSON array theme={"theme":"vitesse-black"}
{
    "error": {
        "type": "invalid_request",
        "message": "crustdata_company_ids must be a list",
        "metadata": []
    }
}
```

```json 400 — more than 10 company IDs theme={"theme":"vitesse-black"}
{
    "error": {
        "type": "invalid_request",
        "message": "Maximum 10 identifiers allowed for job/search. Found 11",
        "metadata": []
    }
}
```

***

<Snippet file="batch-job-lifecycle.mdx" />

<Snippet file="batch-errors.mdx" />

***

## What to do next

* **Build queries interactively first** — iterate with [Search Jobs](/job-docs/search/introduction) page by page, then pull the full set for your target companies as a batch job.
* **Look up fields** — see the [Search reference](/job-docs/search/reference).
* **Resolve company IDs** — use the free [Company Identify](/company-docs/identify/introduction) endpoint.
* **Search people or companies in batch** — see [Batch Person Search](/person-docs/search/batch-search) or [Batch Company Search](/company-docs/search/batch-search).
* **Full schema** — see the [API reference](/openapi-specs/2025-11-01/introduction).


## Related topics

- [Batch Search Jobs](/api-reference/batch-apis/submit-a-batch-job-listings-search-job.md)
- [List Batch Jobs](/api-reference/batch-apis/list-batch-jobs-for-the-authenticated-account.md)
- [Person Batch Search](/person-docs/search/batch-search.md)
- [Company Batch Search](/company-docs/search/batch-search.md)
- [Get Batch Job Status](/api-reference/batch-apis/get-the-status-and-download-urls-for-a-batch-job.md)
