Export Bulk Data with the Jobs API
Export data in bulk: for example, create any task via type, track it by job_id, fetch result when ready.
Core endpoints
| Method | Path | Purpose |
|---|---|---|
| POST | /v1/jobs | Create job |
| GET | /v1/jobs/{job_id} | Get status (polling) |
| GET | /v1/jobs/{job_id}/result | Fetch final result |
Create job
POST /v1/jobs
Headers
Authorization: Bearer YOUR_TOKEN
Idempotency-Key: <uuid>
Content-Type: application/json
Idempotency-Key prevents duplicates when Zapier/Make retries.
Body
{
"type": "contact.decision_maker.linkedin",
"input": { "company": "OpenAI", "domain": "openai.com" },
"callback_url": "https://hooks.zapier.com/hooks/catch/123/abc",
"metadata": { "source": "zapier", "external_id": "row_9481" }
}
Response
{
"job_id": "job_01HTXXXX",
"status": "queued",
"created_at": "2025-12-29T11:30:00Z",
"poll_url": "/v1/jobs/job_01HTXXXX",
"result_url": "/v1/jobs/job_01HTXXXX/result"
}
Poll status
GET /v1/jobs/{job_id}
Response
{
"job_id": "job_01HTXXXX",
"status": "running",
"progress": 35,
"retry_after": 5,
"error": null
}
Use retry_after seconds between polls to reduce operations.
Statuses
- queued → waiting
- running → processing
- succeeded → result ready
- failed → see error
Get result
GET /v1/jobs/{job_id}/result
Response
{
"job_id": "job_01HTXXXX",
"status": "succeeded",
"data": {
"contacts": [
{ "name": "John Doe", "title": "CMO", "email": "john@openai.com" }
]
}
}
If not ready, return 409 with error code NOT_READY.
Job types
type → what job does. (We’ll fill real list from your Postman collection next.)
| type | Description |
|---|---|
| contact.decision_maker.linkedin | Find decision maker by LinkedIn/company signals |
| apollo.search | Run Apollo search and return results |
| linkedin.post | Create LinkedIn post (if supported) |