Errors
HTTP status codes, error response format, and error codes
Errors
The Jobiflow API uses conventional HTTP status codes and returns a consistent JSON error body on every failure.
HTTP Status Codes
| Code | Meaning |
|---|---|
200 OK | Request succeeded |
201 Created | Resource successfully created |
204 No Content | Request succeeded; no body returned (e.g. DELETE) |
400 Bad Request | The request body or parameters are invalid |
401 Unauthorized | Missing, invalid, or expired API key / token |
403 Forbidden | Valid credentials but insufficient scope |
404 Not Found | Resource does not exist or does not belong to your company |
409 Conflict | State conflict (e.g. trying to publish an already-active listing) |
422 Unprocessable Entity | Semantically invalid input (validation failed) |
429 Too Many Requests | Rate limit exceeded |
500 Internal Server Error | Unexpected server error; contact support |
Error Response Format
All error responses follow the same JSON structure:
{
"status": 422,
"error": "VALIDATION_ERROR",
"message": "Request validation failed",
"timestamp": "2026-05-17T12:00:00Z",
"path": "/public/v1/job-listings",
"details": [
{
"field": "position",
"message": "must not be blank"
}
]
}| Field | Description |
|---|---|
status | HTTP status code (mirrors the response status) |
error | Machine-readable error code (see below) |
message | Human-readable description |
timestamp | ISO-8601 timestamp of when the error occurred |
path | Request path that produced the error |
details | (optional) Array of field-level validation errors |
Error Codes
| Code | Status | Description |
|---|---|---|
UNAUTHORIZED | 401 | No credentials provided, or the token/key is invalid |
TOKEN_EXPIRED | 401 | The API key or OAuth token has expired |
KEY_REVOKED | 401 | The API key was revoked |
FORBIDDEN | 403 | Credentials are valid but the required scope is missing |
NOT_FOUND | 404 | The requested resource could not be found |
VALIDATION_ERROR | 422 | One or more input fields failed validation |
CONFLICT | 409 | The operation conflicts with the current resource state |
RATE_LIMITED | 429 | Too many requests; back off and retry |
INTERNAL_ERROR | 500 | Unexpected server-side failure |
Handling Errors
const res = await fetch('https://api.jobiflow.com/public/v1/job-listings', {
headers: { 'X-API-Key': process.env.JOBIFLOW_API_KEY },
});
if (!res.ok) {
const err = await res.json();
console.error(`[${err.error}] ${err.message}`);
if (res.status === 422 && err.details) {
for (const d of err.details) {
console.error(` - ${d.field}: ${d.message}`);
}
}
throw new Error(err.message);
}
const { data, pagination } = await res.json();Rate Limits
The API enforces rate limits per API key. When exceeded, you receive 429 Too Many Requests with a Retry-After header indicating how many seconds to wait before retrying.
HTTP/1.1 429 Too Many Requests
Retry-After: 30Default rate limits:
| Tier | Requests / minute |
|---|---|
| Standard | 300 |
| Pro | 1 000 |
Contact support to discuss elevated limits for high-volume integrations.