Limits
Rate limits, token lifetimes, size limits and retry windows.
On this page
API quotas
Every channel route is metered per key on a rolling one-hour window. A 429 RATE_LIMITED names the bucket and the ceiling, and Retry-After gives the wait in seconds. To raise a ceiling, ask your WTN contact.
| Bucket | Per hour | Covers |
|---|---|---|
provision | 30 | Creating a campaign (it drafts a survey). |
audience | 300 | Attaching respondents (up to 1,000 rows per call). |
results | 1,200 | Reading status, results, installs and devices. |
workspaces | 600 | Listing workspaces. |
workspaceCreate | 20 | Creating a workspace. |
export | 30 | Queueing an export. |
webhooks | 120 | Registering, listing and testing webhooks. |
launch | 36,000 | One-time launch links, sized for about 10 per second. |
App registration and the page's public routes are limited per network, not per key. Registration is idempotent for the same inputs, so a retry is safe.
Lifetimes and sizes
| What | Limit |
|---|---|
| One-time launch link | single use, expires in 10 minutes |
| Signed launch token | exp at most 30 minutes ahead; jti single use |
accessToken | 24 hours by default |
refreshToken | 180 days by default, renewed on every heartbeat |
Idempotency-Key | replays for 24 hours |
| Webhook timeout | 10 seconds; 5 attempts (1 min, 5 min, 30 min, 2 h, 12 h) |
| Webhook signature window | 5 minutes |
attributes on a launch | 64 keys, 8 KB, values up to 1,024 characters |
metadata on register | flat string map, up to 2 KB |
externalUserRef | up to 200 characters |
vendorDeviceId and user.externalId | up to 128 characters |
| Tags in a signed token | up to 8 |
A heartbeat or register that arrives within the coalescing window (15 minutes by default) does not count as a new session, so a burst of starts costs one write.