Rate limits
How many requests a workspace's API keys may send, what the API answers when you go over, and the other limits to plan for.
A workspace's API keys share 120 requests a minute. The count is for the workspace, so two keys in one workspace draw on the same 120, whoever made them.
The limit is the same on every plan.
When you go over
The API answers 429 with a Retry-After header and this body:
{ "errors": [{ "code": "rate_limited", "detail": "Too many requests; try again later" }] }
Retry-After is the length of the limit you reached, in seconds. For the limit on requests that is 60. It is the longest you have to wait: the API does not say when the minute began.
Wait that long, then send the request again with the same Idempotency-Key. A refused request changed nothing.
There are no headers that count down what you have left. Pace your own requests instead of waiting to be refused.
Staying under it
- Ask for 100 records a page with
per_page=100when you read a whole list. - Use the filters a list offers, such as
queryor a date range, before you page through everything. - Space out a bulk job. One request a second uses half the allowance and leaves room for another script.
- Keep what you read. Customers and services change less often than visits.
People using the web, iPhone and Android apps are counted apart from keys, so a busy script does not lock your team out of TradeSender.
Other limits
| What | Limit | Over it |
|---|---|---|
Emails to customers with sendQuote, sendInvoice and sendVisitOnMyWay | 100 a day for the workspace, shared with the emails your team sends by hand in the apps. Every try counts, including one that is then refused | 429 with Retry-After: 86400 |
sendVisitOnMyWay for one visit | One in any 5 minutes, whoever sends it | 409 on_my_way_already_sent. Nothing is sent |
Jobs in one createMonthEndInvoices run | 300. Its emails are not counted towards the 100 a day | 422 round_too_large, and nothing is invoiced. Send the jobs in parts with job_ids |
Rows in one importCustomers request | 100 | 422 too_many_rows. Send the rows in parts |
Visits in one getDayRoute | 250 | 422 route_too_large. Ask for one person with membership_id |
Visits in one moveCalendarDay | 300 | 422 day_too_large, and nothing moves. Move one person at a time with membership_id |
Emails moveCalendarDay sends with notify_customers | 300 in any 24 hours for the workspace. They are not counted towards the 100 a day | 422 email_limit_reached, and nothing moves. Send it again without notify_customers |
One Direct Debit collection with collectInvoice | Between £0.50 and £10,000, in pounds | 409 invoice_not_collectable |
| Enquiries through the website form | See The enquiry form's address | 429 |
An AI assistant's connection at /mcp | 300 requests a minute for each connection | 429 with Retry-After: 60 |
| API keys a member can hold | 10 |
The emails a workspace sends by itself (overdue reminders, quote follow-ups and visit reminders) have a ceiling of their own: 200 in any 24 hours. No request is refused for it. An email over the ceiling is held back and goes later.
Plan limits are a separate matter. A request the plan does not allow answers 402 with the code plan_limit_reached. collectInvoice answers it on a plan without Direct Debit collection. See Plans and limits.
Checked against the app on 29 October 2026. Still stuck? Ask usAsk us.