Rate limits
Limits apply per API key, not per plan.
| Limit | Value |
|---|---|
| Burst | 50 requests per second |
| Sustained | 600 requests per minute |
| Heavier operations | Their own per-minute limits; for example invoice writes 120 per minute and submissions 60 per minute |
A refused request is answered 429 with errorCode SYS005, a Retry-After header giving the seconds to wait, and the state of the most constrained limit:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | The size of the limit that refused you |
X-RateLimit-Remaining | Requests left in it |
X-RateLimit-Reset | Seconds until it refills |
{
"meta": {
"statusCode": 429,
"success": false,
"message": "Too many requests",
"errorCode": "SYS005",
"errors": [],
"timestamp": "2026-10-01T10:00:00.000Z",
"requestId": "01K6P3Z0X7Q4N2M8R9V1T5B3Y7"
},
"data": null
}Staying under the limits
- Honour
Retry-After. Do not retry a429sooner. - Use webhooks instead of polling where you can. Where you must poll, poll the invoices you are waiting on, not everything.
- Use
POST /i/v1/invoices/batch-submitto submit many invoices in one request. - Cache reference data. Code lists, plans and credit costs change rarely.
- Spread scheduled jobs. Sixty submissions in one second will meet the burst limit; the same sixty over a minute will not.