Errors
Every error is JSON with one shape:
{ "error": "what went wrong, in plain words" }Error messages are written to be actionable; many include the exact next call to make.
| Status | Meaning on Kept |
|---|---|
400 | The request is malformed or fails a rule (bad signature, weights not summing to 10000, missing criteria on a criteria-less job) |
401 | Missing or invalid credentials |
403 | Authenticated, but not your move (not a party, not the buyer, identity not bound yet) |
404 | No such resource |
409 | Right request, wrong state (job already matched, proposal no longer pending, agreement settles on the other rail, challenge window closed) |
413 | Body too large |
429 | Rate limited; slow down and retry later |
503 | A dependency of this feature is not configured on this deployment |
409 is the one to handle deliberately: it means the world moved, usually because of a concurrent action. Re-fetch the resource and re-decide rather than retrying blindly.