Every fixed limit of the /v1 API in one place: what it is, what you get when you go
over it, and where it is explained. Each operation’s reference page states its own
limits too.
A value over a field limit is refused with 400 VALIDATION_ERROR, with the field in
errors and, for a size or count, its maximum. Nothing in the request is
applied. A body over its route’s size is refused with 413 PAYLOAD_TOO_LARGE before
it is read. Plan limits, such as emails a month or contacts, are not listed here: they
depend on the workspace owner’s plan and are refused with 403 PLAN_LIMIT_REACHED
(see Errors).
Request size
A body larger than its route takes is refused whole with 413 PAYLOAD_TOO_LARGE; on the
routes below with a limit of their own, the message states it. Every batch at its
documented item limits fits.
| Route | Largest body |
|---|---|
POST /v1/transactional/messages |
15 MiB (10 MB of attachments, base64-encoded) |
POST /v1/transactional/messages/batch |
10 MiB |
POST /v1/campaigns/{id}/trigger |
10 MiB |
POST /v1/events/batch, POST /v1/contacts/batch, POST /v1/suppressions |
4 MiB |
Every other /v1 route |
1 MiB |
Uploads (multipart/form-data) have their own file limits, stated on each route and in
the table below.
Batches and bulk calls
| Limit | Value | Over it | Guide |
|---|---|---|---|
Contacts in identifyContactsBatch |
100 | 400 VALIDATION_ERROR |
Batches |
Events in trackEventsBatch |
100 | 400 VALIDATION_ERROR |
Batches |
Messages in sendTransactionalMessagesBatch |
100 | 400 VALIDATION_ERROR |
Batches |
Recipients of triggerCampaign |
5,000 | 400 VALIDATION_ERROR |
Transactional messages |
Contacts in addListContacts or deleteListContacts |
500 | 400 VALIDATION_ERROR |
Rate limits |
Contacts in deleteContacts |
100 | 400 VALIDATION_ERROR |
API reference |
Addresses in addSuppressions |
10,000 | 400 VALIDATION_ERROR |
API reference |
Addresses in deleteSuppressions |
100 | 400 VALIDATION_ERROR |
API reference |
| Calls in one Segment request | 500 calls and 500 KB; 32 KB a call | 413 over 500 KB, 400 over 500 calls; a call over 32 KB is listed in refused |
Sending data from Segment |
Events
| Limit | Value | Over it | Guide |
|---|---|---|---|
| Distinct event names per workspace | 1,000 (Kirora’s own contact.* events not counted) |
409 EVENT_NAME_LIMIT_REACHED |
Events |
| Event name | 128 characters, no control characters | 400 VALIDATION_ERROR |
Events |
| Property name | 64 characters | 400 VALIDATION_ERROR |
Events |
properties |
16 KB as JSON | 400 VALIDATION_ERROR |
Events |
products in an event’s properties |
250 lines | 400 VALIDATION_ERROR |
E-commerce events |
occurredAt |
At most 24 hours in the future | 400 VALIDATION_ERROR |
Events |
| Age of an event that starts a journey | 72 hours after occurredAt |
Recorded, but starts no journey | Events |
Contacts
| Limit | Value | Over it | Guide |
|---|---|---|---|
externalId |
255 characters | 400 VALIDATION_ERROR |
IDs and identity |
| Custom attributes | 50 keys and 16 KB in all; a key up to 64 characters | 400 VALIDATION_ERROR |
API reference |
| Topic choices in one identify | 50 | 400 VALIDATION_ERROR |
API reference |
meta.count on listContacts and listSegmentContacts |
Counted up to 10,000 | meta.countExact is false |
Pagination |
Sending
| Limit | Value | Over it | Guide |
|---|---|---|---|
| Attachments on a transactional email | 10 files, 10 MB in all once decoded | 400 VALIDATION_ERROR |
Transactional messages |
| Attachments in a transactional batch | None allowed | That entry is refused with VALIDATION_ERROR |
Transactional messages |
sendAt on a transactional send |
In the future, at most 90 days ahead | 400 VALIDATION_ERROR at sendAt |
Transactional messages |
A campaign’s schedule |
A fixed sendAt in the future; a local localDateTime still to come in one time zone |
400 INVALID_SCHEDULE |
Campaigns and journeys |
A campaign’s delivery.expiresAfter |
1 to 720 hours; longer than abTest.decideAfter |
400 VALIDATION_ERROR |
Campaigns and journeys |
A campaign’s delivery.rateLimit.recipients |
1 to 1,000,000 per minute, hour or day | 400 VALIDATION_ERROR |
Campaigns and journeys |
A campaign’s abTest.decideAfter |
1 to 72 hours, or null to pick by hand |
400 VALIDATION_ERROR |
Campaigns and journeys |
| Email subject | 998 characters | 400 VALIDATION_ERROR |
API reference |
| Campaign audience sent at once | 5,000; a larger one, or an A/B test, is queued in the background | Not refused: the campaign reads sending until queued |
Campaigns and journeys |
Audiences, journeys and templates
| Limit | Value | Over it | Guide |
|---|---|---|---|
| Rules or groups in one segment group | 20 | 400 VALIDATION_ERROR |
Objects and rules |
| Group nesting | Two levels: the top group and groups inside it | 400 VALIDATION_ERROR |
Objects and rules |
| Segments referring to segments | 3 levels deep, 1,000 rules once written out in full | 400 VALIDATION_ERROR at rules |
Objects and rules |
Values in an in rule |
100 | 400 VALIDATION_ERROR |
Objects and rules |
Property conditions (where) on an event rule |
5 | 400 VALIDATION_ERROR |
Objects and rules |
| Journey steps | 50 | 400 VALIDATION_ERROR |
Objects and rules |
| Journey exit conditions | 10 | 400 VALIDATION_ERROR |
Objects and rules |
Paths in a split step; in a random_split step |
5; 2 to 5 | 400 VALIDATION_ERROR |
Objects and rules |
| Template blocks | 200 across the whole tree, five levels deep | 400 VALIDATION_ERROR |
Objects and rules |
Template alias |
64 characters | 400 VALIDATION_ERROR |
Objects and rules |
Image upload or copy (uploadAsset, importAsset) |
One PNG, JPEG or GIF, 2 MB and 25 megapixels | 413 PAYLOAD_TOO_LARGE over 2 MB on upload; 400 VALIDATION_ERROR otherwise |
API reference |
Keys, sessions and webhooks
| Limit | Value | Over it | Guide |
|---|---|---|---|
allowedIps on a key |
50 addresses or CIDR ranges | Refused when you save the key | Authentication |
allowedOrigins on a partner key |
20 origins | Refused when you save the key | Choose an integration |
| Rotation overlap | Up to 168 hours (7 days) | Refused when you rotate | Authentication |
| Embed session | Valid 15 minutes | 401 UNAUTHORIZED once expired |
Choose an integration |
testSendTo on an embed session |
5 addresses | 400 VALIDATION_ERROR |
Choose an integration |
| User token for the web SDK | Valid at most 24 hours | 401 from the SDK’s endpoints | Web SDK |
| Webhook URL | HTTPS, public host, 2,000 characters | 400 VALIDATION_ERROR |
Webhooks |
| Webhook response time | 5 seconds | Counted as a failed delivery and retried | Webhooks |
Reading lists and reports
| Limit | Value | Over it | Guide |
|---|---|---|---|
limit |
Default 20, maximum 100 | 400 VALIDATION_ERROR |
Pagination |
query |
64 characters on tags; 100 on contacts and messages; 128 on the event catalogue and attributes; 200 on campaigns, templates, segments, a contact’s segments, journeys, forms and assets; 255 on lists; 320 on the event log and suppressions | 400 VALIDATION_ERROR |
Pagination |
Report window (from, to) |
Ends no later than the end of today, at most 366 days; without them, the last 30 days ending today | 400 VALIDATION_ERROR |
Pagination |
| Campaign series | 72 hours of hourly points or 366 days of daily ones | Later events fall outside the series | Pagination |
| Campaign breakdown | The 50 largest rows; the rest summed in other |
Not refused | Campaigns and journeys |
listCampaignReports, getFunnelReport |
A plan with advanced reports | 403 PLAN_FEATURE_UNAVAILABLE |
Errors |
Retries and rates
| Limit | Value | Over it | Guide |
|---|---|---|---|
Idempotency-Key |
8 to 255 characters; a key is kept 24 hours (a trigger’s, as long as its campaign) | 400 VALIDATION_ERROR |
Idempotency |
| Requests per minute | Per key and per workspace, in three budgets | 429 RATE_LIMITED with Retry-After |
Rate limits |