Rate limits
What's limited, how much, and what to do when you hit a limit.
Starting work is rate-limited, per user. Reading — status, history, data — is not.
| Limited | Endpoints | Default |
|---|---|---|
| Starting jobs and runs | POST /api/scraper-agents/{externalAgentId}/start-job, /run, POST /api/search-groups/{groupId}/run, POST /api/pipelines/{pipelineId}/run | 60 per minute, per user |
The limit is a fixed one-minute window, counted separately for each user — so each integration with its own user and key gets its own budget.
Bulk exports have a separate limit: one at a time per account and company. A second concurrent export also returns 429, with Retry-After: 5.
When you're limited
You get 429 Too Many Requests, with a Retry-After header saying how many seconds to wait:
HTTP/1.1 429 Too Many Requests
Retry-After: 23Wait that long, then retry the same request.
async function withRetry(send) {
for (;;) {
const response = await send()
if (response.status !== 429) return response
const seconds = Number(response.headers.get("Retry-After") ?? 1)
await new Promise((resolve) => setTimeout(resolve, seconds * 1000))
}
}Need more?
If your integration needs a higher limit, talk to us — it's a platform setting, not a hard cap.