Skip to main content
Appenda
Sign inDownload

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.

PlanRequestsRun starts
trial300 / 600 / 120025 / 50 / 100
starter300 / 600 / 120025 / 50 / 100
pro600 / 1200 / 240050 / 100 / 200
business1200 / 2400 / 480050 / 100 / 200
enterprise1200 / 2400 / 480050 / 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.

PlanRows per table
starter25,000
pro100,000
business500,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
HeaderMeaning
RateLimit-LimitRequests the bucket allows per window.
RateLimit-RemainingRequests left in the current window.
RateLimit-ResetSeconds until the window resets.
Retry-AfterSent 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.

  1. Wait the number of seconds in Retry-After.
  2. Send the same request again. A retry within 10 minutes is answered once, so it never acts twice; see Retry safely.
  3. If you get 429 again, 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-Remaining and 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.

FAQs

Do reads and writes share one limit?
Yes. Every read and write counts against your key's one limit per minute. Starting a run or a list import has its own limit.
How do I find my plan's limit?
Read RateLimit-Limit on any response. It is the size of the bucket that answered, for your plan.