Errors & Rate Limits
Error Response Format
All API errors follow a consistent JSON format:
{
"statusCode": 400,
"errorCode": "BR-1",
"errorMessage": "Invalid address provided",
"timestamp": "2026-04-28T12:10:30.938Z",
"endpoint": "POST /api/v1/transactions"
}
Error Codes
| HTTP Status (statusCode) | Error Code (errorCode) | Description |
|---|---|---|
| 400 | BR-1 | Invalid request parameters |
| 400 | BR-2 | Request parameters schema validation failed |
| 400 | BR-1001 | Invalid blockchain network specified |
| 400 | BR-1002 | Invalid blockchain network/asset specified |
| 401 | AU-1 | Authentication failed or missing credentials |
| 403 | AU-1 | Insufficient privileges |
| 404 | NE-1 | Requested entity not found |
| 409 | CFR-1 | Conflicting request |
| 409 | ADR-3001 | Address conflict or ambiguous address |
| 409 | ADR-3002 | Inconsistent address network combination |
| 409 | MEM-4001 | Conflicting memo record detected |
| 409 | TX-2002 | Ambiguous transaction request |
| 422 | UE-1 | Unprocessable request entity |
| 429 | RL-1 | Rate limit exceeded |
| 500 | GE-1 | Internal server error |
| 500 | APM-1 | Application maintenance or processing failure |
| 503 | HAC-1 | Upstream blockchain provider exception |
| 503 | HAC-2 | Upstream blockchain provider bad request |
| 503 | HAC-3 | Upstream blockchain provider bad response |
Rate Limits
| Tier | Limit |
|---|---|
| Standard | 100 requests/minute |
| Burst | 1,000 requests/hour |
Rate limit information is returned in response headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed in window |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Retry-After | Seconds until the limit resets (on 429) |
When rate limited, the API returns 429 Too Many Requests with a Retry-After header. Implement exponential backoff in your client.
note
If you need higher rate limits for your use case, contact your account manager.
Pagination
All list endpoints support pagination:
GET /api/v1/vaults?page=0&pageSize=25&sort=createdAt:desc
| Parameter | Default | Max | Description |
|---|---|---|---|
| page | 0 | — | Page number (0-based) |
| pageSize | 100 | 1000 | Items per page |
| sort | — | — | Sort field and order |
Pagination Response
{
"data": [...],
"pagination": {
"page": 0,
"pageSize": 25,
"total": 142
}
}
Filtering
Use filter[] parameters to narrow results:
GET /api/v1/transactions?filter[status]=mined
GET /api/v1/transactions?filter[status]=mined&filter[network]=ethereum-mainnet
GET /api/v1/vaults?search=treasury
Relations
Use relations[] to eager-load related data and reduce API calls:
GET /api/v1/vaults?relations[]=organization&relations[]=accountsCount
GET /api/v1/transactions/{id}?relations[]=events&relations[]=approvals
Idempotency
Several creation endpoints are idempotent:
| Endpoint | Idempotency Key | Behavior |
|---|---|---|
POST /transactions | orderId | Returns existing tx if orderId matches |
POST /accounts | Name + vault | Returns existing account |
POST /addresses | HD path | Returns existing address |
POST /memos | Address + memo | Returns existing memo |
Idempotent endpoints return 200 for existing resources and 201 for newly created ones.