API Reference
Errors
HTTP status codes the JobsPipe API returns, and how to handle them.
Errors return a JSON body with an error message and the matching HTTP status:
{ "error": "Rate limit exceeded" }Status codes
| Status | error message | Cause | What to do |
|---|---|---|---|
401 | Unauthorized / Invalid API key | Missing, malformed, or revoked key. | Check the Authorization header and key validity. |
402 | Monthly request quota exceeded | You've used your plan's monthly request allowance. | Wait for the monthly reset or upgrade. |
429 | Rate limit exceeded | Too many requests in one second for your plan. | Back off and retry (see below). |
504 | (upstream message) | The upstream search timed out. | Retry; if persistent, narrow your filters. |
500 | Internal Server Error | Unexpected server error. | Retry; contact support if it persists. |
See rate limits & plans for the exact per-second and monthly thresholds.
Handling 429 with backoff
When you hit the per-second rate limit, pause briefly and retry. Exponential backoff works well:
import time, requests
def search_with_retry(body, headers, tries=4):
for i in range(tries):
resp = requests.post(
"https://api.jobspipe.dev/v1/jobs/search", headers=headers, json=body
)
if resp.status_code != 429:
resp.raise_for_status()
return resp.json()
time.sleep(0.25 * (2 ** i))
raise RuntimeError("rate limited")async function searchWithRetry(body, headers, tries = 4) {
for (let i = 0; i < tries; i++) {
const resp = await fetch("https://api.jobspipe.dev/v1/jobs/search", {
method: "POST",
headers,
body: JSON.stringify(body),
});
if (resp.status !== 429) return resp.json();
await new Promise((r) => setTimeout(r, 250 * 2 ** i));
}
throw new Error("rate limited");
}A 402 means your monthly quota is exhausted - backing off won't help. Either wait for the reset at the start of the month or upgrade your plan.