Skip to content

Rate limits ​

Requests are limited so that one client cannot crowd out the others. A request over the limit is answered

HTTP 429
Retry-After: <seconds>

with code: "rate_limited" in the body. Wait that long and send it again. The web app does this by itself: a change that hits a limit waits and is sent again, and is not lost.

The limits ​

Per minute. "By address" means per client address.

The API (:3009) ​

WhatLimit
Every request, by address3000
Password sign-in for one account, by address10
Password sign-ins over all accounts, by address60
A signed-in person's changes1200

Narrower limits apply to a few things that cost more or send something out: adding people (which can send mail), making API keys, uploads, chat messages and new workspaces.

The MCP server (:8811) ​

WhatLimit
Every request, by address6000
By API key300
Requests with a key the server does not know, by address20, then nothing from that address is looked at until some come back

GraphQL mutations go through the MCP server, so they count against the key's 300. GraphQL answers a limit with the error code RATE_LIMITED.

Webhooks (:8080) ​

WhatLimit
Every delivery, by address1200
By connector600
Deliveries to a connector nobody listens at, by address30
Deliveries no trigger accepted, by address30

For whoever runs the server ​

  • Behind a proxy, set CK_CLIENT_IP_HEADER to the header the proxy puts the client's address in. Without it, everybody behind the proxy shares one address and one allowance.
  • CK_RATE_LIMIT=off switches limiting off.
  • Counts are kept in memory per process: two instances of a service each allow the full limit, and a restart starts the counts again.

Every picture on this site was saved by a test that had just seen the feature work.