All public agent-spend errors use this shape:
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded",
"details": {}
}
}
#Error catalog
| Code | HTTP | Meaning | Retry? | What to do |
|---|---|---|---|---|
invalid_api_key | 401 | Missing, malformed, or unknown Dino spending key | No | Check the Authorization header and key value |
revoked_api_key | 403 | Spending key was revoked | No | Issue a new key and rotate the runtime |
invalid_request | 400 or 409 | Bad request body or idempotency misuse | Sometimes | Fix the payload, or retry with the same idempotency key if the original request may have succeeded |
funding_source_budget_exceeded | 402 | Parent funding-source limit would be exceeded | No | Top up or increase the funding-source limit |
plan_spend_volume_exceeded | 402 | Workspace plan cap for monthly agent-spend volume was exceeded | No | Reduce spend volume or upgrade plan limits |
rate_limited | 429 | Too many requests in a short period | Yes | Back off and retry |
internal_error | 500 | Unexpected server error | Yes | Retry with backoff while preserving the idempotency key |
not_found | 404 | Spend request or account not found in the current scope | No | Check the identifier and owning account/team |
#Retry guidance
- Retry
429and500with exponential backoff. - Preserve the same idempotency key when retrying
POST /v1/spend. - Do not blindly retry
401,403,404, or402responses.
#Idempotency guidance
For POST /v1/spend, always send an Idempotency-Key header or idempotency_key field.
- Same key + same logical request: safe replay, returns the original spend request
- Reused key for a conflicting request: returns
invalid_request
#Funding limit details
When Dino returns funding_source_budget_exceeded, the details object can include:
limitspentremainingperiodwindowStartwindowEnd
Use those fields to explain the failure to operators or automation logs.