Rate Limits
Requests are limited over a rolling 60-second window. Most endpoints share a generous default; heavier or more sensitive operations have their own lower limits.
Limits by operation
| Requests / minute | Applies to |
|---|---|
| 500 | Default — every endpoint not listed below |
| 100 | List endpoints — GET /invoices, /estimates, /payments, /customers, /vendors, /items, /transactions |
| 30 | Recording money — POST /invoices/:id/payments, POST /payments/:id/refunds |
| 3 | Sending a document by email — POST /invoices/:id/send, POST /estimates/:id/send |
Response headers
Every response that clears the rate limiter carries:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Requests allowed in the current window |
X-RateLimit-Remaining | Requests left in the current window |
X-RateLimit-Reset | Seconds until the window resets |
These count requests to that endpoint, and nothing else. Some operations carry their own caps on what a request does — the number of emails a send produces, for example (see Other limits). Those are checked after the rate limiter, so a 403 can arrive while X-RateLimit-Remaining still shows requests available.
When a request is rejected for going too fast it returns 429 Too Many Requests with a Retry-After header giving the seconds to wait. Nothing else in the API returns a 429, so a 429 always means "too fast, come back shortly". Limits that waiting a few seconds won't clear return 403 with an error code instead, so you never have to guess whether retrying will help.
Other limits
These are not rate limits. They cap volume or protect deliverability, and they do not clear by retrying.
| Status | Code | Meaning |
|---|---|---|
| 403 | SEND_LIMIT_REACHED | A sending cap was reached. details.limit is its value and details.scope names which cap: hour, day, week, invoiceSends, invoiceRecipients or userDay |
| 403 | MAIL_SENDING_SUSPENDED | Sending is paused because recent emails bounced or were rejected. Correct the recipient address, then contact support |
Handling limits
- Send requests sequentially — await each response before starting the next. Firing requests in parallel is the most common cause of unexpected 429s.
- On a 429, wait for
Retry-Afterrather than retrying immediately. - Watch
X-RateLimit-Remainingon high-volume jobs and pace accordingly. - If your integration needs a higher limit, contact contact@invoiless.com with your use case and expected volume.