Documentation Index
Fetch the complete documentation index at: https://docs.unifygtm.com/llms.txt
Use this file to discover all available pages before exploring further.
Overview
Use the Bulk API to request large datasets from Unify without waiting for a long-running HTTP request to finish. The Bulk API is asynchronous: you create a query job, poll the job until it is finished, and then page through the materialized results. Use the Bulk API when you need to export or sync many records. For small operational reads, use the standard API for the resource instead.The Bulk API is currently in preview. Endpoint behavior, filters, and response
shapes may change before general availability.The Bulk API is for requesting data from Unify. To create or update records in
Unify, see Send records via API.
Supported resources
The Bulk API currently supports these resources:| Resource | Create a query job | Fetch results |
|---|---|---|
| Sequence enrollments | POST /sequences/v1/enrollments/jobs/query | GET /sequences/v1/enrollments/jobs/{job_id}/results |
| Sequence enrollment steps | POST /sequences/v1/enrollment-steps/jobs/query | GET /sequences/v1/enrollment-steps/jobs/{job_id}/results |
{resource} is either enrollments or enrollment-steps.
Authentication
The Bulk API requires a user-backed API key. Generate an API key in Settings → Developers and include it with each request:How the Bulk API works
Create a query job
Submit a query job for the resource you want to export. The request body is
optional and defaults to an empty filter.The response includes the
job_id, current status, and expires_at time:Poll job metadata
Poll the job metadata endpoint until the job reaches a terminal status.
Avoid tight polling loops; use a steady interval or exponential backoff. Most
Jobs should finish within a few seconds.A finished job includes
total_rows:Fetch results
After the job status is
FINISHED, fetch results by page. Results are
immutable for a finished job, so each page is stable for that job.Create a query job
Create-job endpoints are resource-specific:Filter fields
Available filter fields depend on the resource. Common filters include:| Filter | Description |
|---|---|
updated_at | Filter by the time records were last updated. |
person | Filter by person. |
company | Filter by company. |
id.in | Include only specific record IDs. |
id.not_in | Exclude specific record IDs. |
Job statuses
A job can have one of the following statuses:| Status | Meaning |
|---|---|
IN_PROGRESS | The job has been created and results are still being prepared. |
FINISHED | The job completed successfully and results are available. |
FAILED | The job failed. Check error_code on the job metadata. |
CANCELED | The job was canceled before completion. |
EXPIRED | The job or its results are no longer available. |
expires_at, which is currently 24 hours
after job creation. Download all required result pages before that time.
List jobs
List jobs for a resource:| Parameter | Description |
|---|---|
limit | Number of jobs to return. Defaults to 100; maximum is 100. |
cursor | Opaque pagination cursor from the previous response. |
status | Optional job status filter. |
Fetch results
Fetch results for a finished job:JSON results
JSON is the default response format:| Limit | Value |
|---|---|
Default page_size | 1000 |
Maximum page_size | 2000 |
| Maximum raw payload size | 8 MiB |
page_size or use NDJSON.
NDJSON results
Use NDJSON for larger streamed pages by providing the following header in your request.page_size is 10000.
Job states
The results endpoint validates the job state before returning data:| Job state | HTTP status | Error code |
|---|---|---|
IN_PROGRESS | 409 | results_not_ready |
FAILED | 409 | results_failed |
CANCELED | 409 | results_canceled |
Expired | 410 | results_expired |
FINISHED.
Rate limiting
Bulk API rate limits are applied by operation type. Query job creation is limited to roughly 100 jobs per day, so create jobs only when you need a new snapshot and use filters or checkpoints to keep each job focused.| Operation | Rate limit |
|---|---|
| Create query jobs | ~100 jobs per day |
| query/list job status | ~10 requests per second |
| list/stream job results | ~5 requests per second |
| cancel in flight jobs | ~1 request per second |
429 Too Many Requests, wait before retrying, honor the Retry-After header to avoid additional rate limiting.
Best practices
- Request only the data you need. Use filters to keep result sets small and exports fast.
- Prefer incremental syncs. Use checkpoints such as
updated_atso recurring jobs only request new or changed records. - Design for retries. Store the
job_id, job status, and processing checkpoint in your system. - Process results idempotently. Use stable record IDs so retrying a page does not create duplicate downstream records.
- Use NDJSON for large pages. NDJSON streams results and supports larger pages than JSON.
- Download before expiration. Jobs expire at
expires_at; create a new job if you need the data again after expiration.
What’s next
Data API reference
Review the Data API for object, attribute, and record operations.
Send records via API
Learn how to create and update records in Unify.