Read your workspace’s actual limit from
GET /v1/me rather than hard-coding these.
Reading the headers
Every response carries the current state:integer
Requests left in the window. Slowing down as this approaches zero is cheaper than being
throttled.
integer
Unix timestamp when the window resets.
429 with a Retry-After header in seconds. Honor it — backing
off on your own schedule keeps you limited longer.
Staying under
Page with limit=100
Page with limit=100
Requesting 100 rows per page instead of the default 25 cuts your request count by four for the
same data, at no extra credit cost — credits are charged per row.
Batch resolution and enrichment
Batch resolution and enrichment
/resolve and /enrich take 100 inputs per call. One hundred single-input calls will exhaust
a 60/minute budget immediately; one batched call uses a single request.Use jobs for bulk work
Use jobs for bulk work
A job is one request regardless of how much work it does. Anything above a few thousand rows
belongs in a job rather than a paging loop.
Replace polling with webhooks
Replace polling with webhooks
Polling job status every five seconds burns a read budget to learn nothing. Subscribe to
job.completed instead.Cache what does not move
Cache what does not move
GET /channels and GET /categories change on the order of weeks. Refresh them on a schedule,
not per request.Concurrency
Alongside the per-minute limits, a workspace may have at most 20 requests in flight at once. Exceeding it returns429 with Retry-After: 1.
A bounded worker pool is the fix, not a retry loop:
If you need more
Limits are raised for workspaces with a demonstrated pattern. Before asking, check that the volume is real rather than avoidable — the list above removes most of it. If it is real, contact [email protected] with your workspace ID and the sustained rate you need.Rate limits and credits are independent. Staying under the rate limit
does not mean you have credits, and having credits does not raise your rate limit.