Errors
All API errors return JSON with an error field describing what went wrong:
{ "error": "Description of what went wrong" }
Status codes
| Status | Meaning |
|---|---|
400 |
Validation error — see error field for details |
401 |
Missing or invalid API key |
403 |
Plan doesn't allow this feature, or billing lapsed past grace |
404 |
Resource not found |
413 |
Request too large (over bulkRowsPerRequest) |
429 |
Rate limit exceeded (X-RateLimit-Limit, Retry-After headers) |
500 |
Server error — retry with exponential backoff |
503 |
Transient infrastructure error — safe to retry |
Retry strategy
429, 500, and 503 are safe to retry. Use exponential backoff:
| Attempt | Wait |
|---|---|
| 1 | (initial request) |
| 2 | 1s |
| 3 | 2s |
| 4 | 4s |
| 5 | 8s |
| 6+ | give up, log, alert |
For 429, respect the Retry-After header rather than your backoff schedule — it tells you exactly when the rate limit window resets.
For 503, the response body always includes "transient": true to make it unambiguous from a permanent 503. Konduit's frontend uses bounded auto-retry on this signal.
Validation errors
400 responses include a human-readable error string. For multi-field forms, the error may include the offending field name:
{ "error": "priority must be one of: low, normal, high, urgent" }
For per-row validation in bulk inserts (POST /datatables/{tableId}/rows/bulk), individual row errors are reported in the response with row-level context — the request as a whole still returns 200 if at least some rows succeeded.
404 vs 403
404 means the resource doesn't exist or isn't visible to your API key. If you're certain it exists, double-check you're using the right key.
403 is reserved for: plan doesn't include the feature, billing has lapsed past grace, or your scoped key doesn't permit this action.
Next
- Workspace → —
GET /me - Authentication & Limits → — keys and rate limits