Runtime errors are JSON envelopes, not only OpenAPI schema shapes. Parse `error.code`, show or log `error.message`, follow `error.hint`, and inspect `issues` or `details` when present. `429` responses also include a `Retry-After` header.
Validation error
400 Bad Request
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request body",
"hint": "Fix the request body or query parameters and retry.",
"issues": [
{
"path": [
"task",
"title"
],
"message": "String must contain at least 1 character(s)"
}
]
}
}Agent recovery: fix the request body using `issues`, then retry with the same idempotency key if the operation creates a resource.
Rate limit exceeded
429 Too Many Requests
Retry-After: 30
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests",
"hint": "Wait for the retry window before sending another request.",
"details": {
"retryAfter": 30
}
}
}Agent recovery: pause for the Retry-After window, then resume polling or retry the idempotent request.
Authentication required
401 Unauthorized
{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"hint": "Provide a valid Bearer API key or signed-in session, then retry."
}
}Agent recovery: refresh or rotate the Bearer API key, then retry. Do not ask for OAuth; Floop does not support OAuth 2.0 yet.
Invalid task state transition
409 Conflict
{
"error": {
"code": "INVALID_TRANSITION",
"message": "Can only update draft or posted tasks",
"hint": "Read the error message, adjust the request, and retry."
}
}Agent recovery: fetch the latest task with GET /v1/tasks/:id, branch on status, and avoid repeating a completed transition.
Internal service error
500 Internal Server Error
{
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error",
"hint": "Retry later; contact support if the problem persists."
}
}Agent recovery: retry later with backoff, then check Floop status before escalating with redacted request context.