Stay inside your rate limit.
Every read and write counts against one limit per key. Starting a run or a list import has its own, smaller limit. Each request must fit your key's limit, your workspace's limit and your instance's limit. Each operation in the API reference names the limit it uses.
Limits by plan
The numbers below are requests per 60 seconds. Each cell shows key / workspace / instance. The Free plan has no API access.
| Plan | Requests | Run starts |
|---|---|---|
| trial | 300 / 600 / 1200 | 25 / 50 / 100 |
| starter | 300 / 600 / 1200 | 25 / 50 / 100 |
| pro | 600 / 1200 / 2400 | 50 / 100 / 200 |
| business | 1200 / 2400 / 4800 | 50 / 100 / 200 |
| enterprise | 1200 / 2400 / 4800 | 50 / 100 / 200 |
To read your own numbers from the API, including how many list imports and CSV imports a workspace may have open at once, call Get rate limits in the API reference.
Table limits by plan
Writes that would take a table past its row limit are refused with
table_row_limit_reached, and nothing is written or charged. A table already
over its limit keeps its rows, and you can still edit and delete them.
| Plan | Rows per table |
|---|---|
| starter | 25,000 |
| pro | 100,000 |
| business | 500,000 |
A trial holds 20,000 rows per table, or 100,000 with a card on file.
Every plan allows 120 columns per table, of which 60 can be enrichment columns.
Read the headers
After your key is checked, each response tells you where you stand. Before
that, only RateLimit-Policy describes the limit for your address:
curl -i https://api.appenda.app/v1/tables \
-H "Authorization: Bearer $APPENDA_API_KEY"
HTTP/2 200
RateLimit-Limit: 1200
RateLimit-Remaining: 1198
RateLimit-Reset: 42
RateLimit-Policy: 1200;w=60
| Header | Meaning |
|---|---|
RateLimit-Limit | Requests the bucket allows per window. |
RateLimit-Remaining | Requests left in the current window. |
RateLimit-Reset | Seconds until the window resets. |
Retry-After | Sent with 429, 503 and 504: seconds to wait before you retry. |
The limit closest to being exhausted supplies these headers. A
RateLimit-Policy header also states that limit and its window in seconds.
When you get 429
A 429 with code rate_limited means the bucket is empty. It ran nothing and
cost nothing.
- Wait the number of seconds in
Retry-After. - Send the same request again. A retry within 10 minutes is answered once, so it never acts twice; see Retry safely.
- If you get
429again, wait twice as long as last time, plus a small random delay, before each further try.
The random delay keeps many clients from retrying at the same moment.
A too_many_jobs error means your workspace already has 50 list imports, or 50
CSV imports, waiting or running. Wait for one to finish, or stop one before
starting another. A CSV import that nobody finishes or stops stops counting after
24 hours. Enrichment runs have no such limit: they queue and start in order. See
Errors for other refusals.
Stay under the limit
- Watch
RateLimit-Remainingand slow down before it reaches zero. - Use bulk operations: one request can create, update or delete up to 100 records.
- Ask for 100 items per page when you read whole lists.