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 the plan 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 Plan limits for what the integration module includes.

Requires the Business API add-on.