{ "error": "error_code", "message": "Human-readable description of what went wrong"}
The error value is a snake_case string for programmatic handling. The message is for debugging — clients should not parse it. Error responses may include additional structured fields to help clients recover (for example, a violations array on constraint errors).
Agent never had an active grant for this capability
403
grant_revoked
A previously-active grant for this capability was revoked. Distinct from capability_not_granted so clients can surface a "your access was revoked" message rather than "request access"
Per-grant revocation — accepts { agent_id, capabilities: string[] } and flips every matching active grant to revoked (handling the multiple-constrained-grants-for-the-same-capability case in one call). Idempotent: revoking an already-revoked capability is a no-op success, not an error.
Status
Error Code
Meaning
401
unauthorized
Caller is not the agent itself, the owning host, or the linked user
Servers may return additional error codes beyond those listed. Clients should handle unknown codes gracefully by falling back to the HTTP status code semantics. For device authorization endpoints, error responses follow RFC 8628 §3.5.