Errors
Every error response has this shape.
{
"errors": [
{
"code": 422,
"type": "insufficient_funds",
"message": "insufficient funds"
}
]
}
Use type for programmatic handling. Use message for debugging.
Error types
| Code | Type | Meaning |
|---|---|---|
| 400 | bad_request | Malformed request body or invalid parameter |
| 401 | invalid_api_key | API key not found |
| 401 | api_key_expired | Key has expired |
| 401 | api_key_revoked | Key was revoked |
| 404 | not_found | Resource does not exist |
| 409 | already_exists | Resource with same idempotency key already exists |
| 409 | not_pending | Transfer is not in pending state |
| 409 | already_posted | Pending transfer was already posted |
| 409 | already_voided | Pending transfer was already voided |
| 410 | expired | Pending transfer has expired |
| 422 | validation_error | Missing or invalid fields |
| 422 | insufficient_funds | Debit account does not have enough balance |
| 422 | same_account | Debit and credit accounts must be different |
| 422 | zero_amount | Amount must be greater than zero |
| 422 | account_closed | Account is closed |
| 422 | linked_minimum | Linked transfers require at least 2 entries |
| 429 | rate_limited | Too many requests |
Rate limiting
Your account has a per-minute request limit. Response headers tell you where you stand.
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 594