Skip to content

Rate limits and quotas ​

Every number on this page is a deployment setting shown with its default, not a product limit. They are abuse guards, set far above what a real integration needs. Nothing here is a reason to redesign an integration; if you are close to one, ask us.

Status

The REST limits below ship with the Business API. The webhook delivery numbers are live today.

The REST API ​

LimitDefaultDeployment setting
API keys per shop10API_KEY_MAX_PER_SHOP
Requests per minute, per key300API_KEY_RATE_LIMIT_PER_MINUTE
Maximum page size100 itemsPUBLIC_API_MAX_PAGE_SIZE
Idempotency-Key retention24 hoursIDEMPOTENCY_DEDUPE_WINDOW_HOURS
Overlap when a key is rotated24 hoursCREDENTIAL_ROTATION_GRACE_HOURS

Every value above is a deployment setting with the default shown, not a product limit, and every one of them is an abuse guard set far above what a real integration needs. If yours needs more, ask — it is a configuration change, not a release.

The rate limit is per key, not per shop. That is deliberate: one runaway integration must not be able to lock out a working one. The consequence is actionable — if you run a nightly bulk sync and a live provisioning flow, give them separate keys and the bulk job cannot starve the interactive one.

When you are limited ​

http
HTTP/1.1 429 Too Many Requests
Retry-After: 12
Content-Type: application/json

{ "error": { "code": "rate_limited", "message": "Rate limit exceeded", "request_id": "req_01J9…" } }

Honour Retry-After, and retry with the same Idempotency-Key. The integration kit has this loop written and tested in three languages, including the part people get wrong (a fresh key per attempt is not a retry — it is a second write).

Webhook delivery ​

LimitDefaultDeployment setting
Webhooks per shop50WEBHOOK_MAX_PER_SHOP
Delivery attempts per event5lib/queues.ts (shared queue defaults)
Backoff between attemptsexponential from 5slib/queues.ts
Request timeout10000 msWEBHOOK_DELIVERY_TIMEOUT_MS
Consecutive failures before a webhook is auto-disabled15WEBHOOK_MAX_CONSECUTIVE_FAILURES
Delivery-log retention30 daysWEBHOOK_DELIVERY_RETENTION_DAYS
Custom headers per webhook20WEBHOOK_MAX_CUSTOM_HEADERS
Custom headers, total size4096 bytesWEBHOOK_CUSTOM_HEADERS_MAX_BYTES

Custom headers and per-shop fan-out budgets ship with the shop-scoped webhook update; see Webhooks.

The MCP connector ​

LimitDefaultDeployment setting
MCP keys per shop5MCP_KEY_MAX_PER_SHOP
Calls per minute, per key60MCP_KEY_RATE_LIMIT_PER_MINUTE
Calls per day, per key5000MCP_KEY_DAILY_CALL_BUDGET

The per-minute limit bounds a spike; the daily budget bounds a loop that runs all night. An agent loop is a different traffic shape from a nightly CRM sync, and a runaway loop is its normal failure mode rather than an exceptional one — which is also why these limits are tighter than the REST API's.

What it costs ​

Nothing about pricing is written on this page on purpose — a price typed into a document is a price that goes stale. Current prices come from one place:

bash
curl -s https://api.tesserapp.eu/api/v1/pricing

See Limits for what the integration module includes.

Requires the Business API add-on.