504
Retry with backoffRequest timed out — The request took too long. The API stops at 50 seconds and says so in JSON.
Response body
{ "error": { "code": "request_timeout", … } }
Should you retry?
Yes — with exponential backoff, and honour Retry-After
when it is present.
What it means
Two codes, one client action. request_timeout is the API's own answer: the request passed its 50-second limit (error.details.timeout_seconds is 50), or a search inside it timed out. gateway_timeout means the proxy in front of the API stopped waiting first, at 58 seconds; it is a rare backstop. Neither means the request was malformed, and a request that times out returns no records, so it is never billed. Both carry Retry-After. Set your HTTP client's timeout to at least 55 seconds so you receive request_timeout instead of abandoning the request and seeing a bare network error such as ECONNABORTED; use 60 seconds to receive the proxy's gateway_timeout as well. A 504 with no JSON body came from the load balancer; treat it the same way. On MCP the timeout is the JSON-RPC error -32007 — see MCP errors.
Common causes
- A very deep `offset` — every page skips past everything before it, so the cost grows with depth. Cursor pagination does not.
- Very broad free-text search across a wide scope.
- Many large filters at once, such as long `sources` or `collections` lists.
- A brief slow spell on JobFront's side, which clears on retry.
How to fix it
Retry with exponential backoff, starting at Retry-After seconds. If the same request keeps timing out, it is too expensive as written: follow the cursor instead of a deep offset, lower limit, or narrow the filters or free-text term. Check that your client timeout is at least 55 seconds.
Endpoints that return this
Read from the OpenAPI specification, so this list cannot claim an endpoint returns a status the contract does not list.
| Method | Endpoint | What it does |
|---|---|---|
| GET | /v4/jobs | Search jobs |
| GET | /v4/jobs/search | Search jobs (alias of /v4/jobs) |
| GET | /v4/jobs/options | Job facet values |
| GET | /v4/jobs/{job_id} | One job by global id |
| GET | /v4/autocomplete/titles | Job-title suggestions |
| GET | /v4/autocomplete/sources | Source (company) suggestions |
| GET | /v4/sources | Search sources (companies) |
| GET | /v4/sources/search | Search sources (alias of /v4/sources) |
| GET | /v4/sources/options | Source facet values |
| GET | /v4/sources-id/{source_id} | One source by id |
| GET | /v4/sources-url/{url_source} | One source by URL |
| GET | /v4/sources/{url_source} | One source by URL (alias) |
| GET | /v4/sources-id/{source_id}/jobs | A source's jobs (by id) |
| GET | /v4/sources/{url_source}/jobs | A source's jobs (by URL) |
| GET | /v4/sources-id/{source_id}/related | Related sources (by id) |
| GET | /v4/sources/{url_source}/related | Related sources (by URL) |
| GET | /v4/jobs/hidden | Jobs you have hidden |
| POST | /v4/jobs/hidden/{job_id} | Hide a job |
| DELETE | /v4/jobs/hidden/{job_id} | Un-hide a job |
| GET | /v4/sources/blocked | Companies you have blocked |
| POST | /v4/sources/blocked/{source_id} | Block a company |
| DELETE | /v4/sources/blocked/{source_id} | Unblock a company |
| GET | /v4/me | Your plan and current quota |
| GET | /v4/usage | Daily usage history |
| POST | /mcp | MCP server (JSON-RPC 2.0) |