Errors
jeCheck uses conventional HTTP status codes and returns every error in the same JSON shape:
{
"error": {
"code": "validation_failed",
"message": "The given data was invalid",
"fields": {
"title": ["The title field is required."],
"priority": ["The selected priority is invalid."]
}
}
}
codeis stable and machine-readable — branch on it, not on the message.messageis a human-readable English explanation.fieldsis present only for422and lists problems per parameter.
Every response carries an X-Request-Id header. Include it when contacting support.
Error codes
| HTTP | code |
Meaning | What to do |
|---|---|---|---|
| 400 | bad_request, empty_update |
Malformed request, nothing to update | Fix the request |
| 401 | unauthorized |
Token missing, invalid, revoked, expired, or its user was deactivated | Check the token; for OAuth refresh it |
| 403 | forbidden |
The token's user lacks the permission (message names it) | Grant the role/permission or use another key |
| 403 | insufficient_scope |
Read-only token tried to change data | Use a token with the write scope |
| 403 | plan_required |
The plan has no API access or lacks a paid feature | Upgrade the plan |
| 404 | not_found |
The record doesn't exist or isn't visible to the token | Check the id and the key's locations |
| 404 | route_not_found |
No such endpoint | Check method and path |
| 409 | conflict |
The record's state doesn't allow the action (already closed, locked period…) | Re-read the record |
| 422 | validation_failed |
Invalid parameters, see fields |
Fix the listed fields |
| 429 | rate_limited |
Too many requests | Wait Retry-After seconds — see Rate limits |
| 500 | internal_error |
Something broke on our side; it's logged | Retry with backoff; contact support with X-Request-Id |
Note For privacy, a record that exists but belongs to another location or company returns
404, not403— the API never confirms the existence of data you can't see.
Retrying
- Retry
429and5xxwith exponential backoff (e.g. 1s, 2s, 4s… up to a minute). GET,PUT,PATCHandDELETEare safe to retry. RetryingPOSTmay create duplicates — check first (for example list withupdated_since) or use endpoints that accept a client-generated UUID (HACCP entries, routine marks).
Errors in MCP
Over MCP a failed tool call returns a normal result with isError: true and the same error object in structuredContent, so the assistant can read it and react. Protocol problems (unknown tool, bad JSON-RPC) use JSON-RPC errors such as -32602.