Bulk Operations
Best practices for importing and updating data at scale
Batch sizing
The bulk endpoints accept an array of records under a data key. There's no
fixed cap on the number of records per request: the practical ceiling is the
request body size, so very large payloads are rejected. Because batches are
atomic (see below), the real question when picking a batch size is blast
radius, not a maximum:
| Scenario | Batch size | Why |
|---|---|---|
| Clean, validated data | 100 | Fewer round trips |
| First import, some unknowns | 25 | Limits blast radius |
| Retrying failures | 1 | Isolate the bad record |
Batches are atomic: one bad record fails the entire batch, so a single duplicate email takes down every other record in the same request. The larger the batch, the more work a single bad record rolls back.
Import order
Always import in this order so foreign keys resolve:
- Companies: no dependencies
- People: can reference
company_id - Deals: can reference
company_id - Associations: link people to deals
- Transcripts: link to meetings and people
Rate limiting
The API allows 3,000 requests per minute, per workspace, per endpoint. Bulk endpoints help you stay under it: one request with many records counts as a single request. We recommend:
- A short delay between batches to smooth out bursts
- Back off on
429responses, honoring theRetry-Afterheader
See rate limits for the response headers and a backoff example.
Common errors
| Status | Meaning | Fix |
|---|---|---|
| 400 | Duplicate record (unique-field collision) | Use match_on for upsert, or pre-match and use PATCH |
| 404 | ID not found (bulk PATCH) | Verify record IDs exist |
| 422 | Validation error (id in POST, enum) | Fix payload |
| 500 | Unexpected server error | Retry with backoff; contact support if it persists |