429 even with hourly and daily headroom left.
Limits are grouped. Each endpoint belongs to exactly one group with its own independent counters, so hammering search never eats into your feed throughput.
Rate limits are checked before credits are deducted, so a rate-limited request never costs you anything. See Billing.
Limits by group
The Subscribed column applies when your account has any active subscription. Otherwise the Free column applies.
The group that applied to a request is echoed back on every response as
X-RateLimit-Group, so you never have to guess.
A Jobs Feed subscription waives the wallet charge on feed endpoints — it does not remove the rate limit. The
JobFeed budgets above still apply. If you need more feed throughput than the subscribed tier allows, contact support@jobo.world; per-key overrides are possible.GET /api/companies/{id} requires no API key and is not rate limited at the key level — it is served from CDN cache. Every other endpoint requires a key and is counted.Reading the headers
Every authenticated response carries your current position in the window. See Response headers for the full inventory.When you exceed a limit
You get429 with Retry-After and a body naming the group and window. The envelope is documented in full under Errors.
Retry-After seconds. Never hardcode a delay — see the retry strategy for a working implementation.
Staying under the limits
1
Throttle on X-RateLimit-Remaining, not on 429
Treat
429 as a bug in your pacing rather than a signal to react to. When X-RateLimit-Remaining drops below roughly 10–20% of X-RateLimit-Limit, slow down — you avoid the round trips you would otherwise waste.2
Use the feed for bulk, not paginated search
Walking search results to export the corpus burns
JobSearch requests and costs more per job. POST /api/jobs/feed returns up to 1,000 jobs per request from a separate budget. See Sync a database.3
Cache geocode results
A location string always resolves to the same output, so results are indefinitely cacheable. Most integrations can eliminate nearly all repeat
Geocode traffic.4
Request only the fields you need
include_fields shrinks responses substantially — description alone dominates payload size. This does not change your request count but makes each one much faster.5
Paginate the feed serially
One in-flight request per cursor. Parallel fan-out on a cursor is both unsupported and the fastest way to hit the per-minute wall. See Pagination.
Repeated authentication failures
Separately from the per-key limits above, an IP address that produces a large number of failed-authentication401s in a short window is temporarily blocked with 429 for a few minutes. This protects against key-guessing and only affects requests that were already failing — a correctly configured integration never encounters it.
