Where limits apply

  • Request validation. Sizes and counts on a request (recipients, subject length, attachments, tags, headers, batch size, idempotency key length) are checked before anything is stored and fail with 422 validation_error and an issues list, or 400 invalid_idempotency_key.
  • Rate limits. Each key has a per-second request limit, counted in one-second windows and reported in ratelimit-limit, ratelimit-remaining and ratelimit-reset; past it, requests answer 429 rate_limit_exceeded with retry-after. A key's own rate_limit_per_second stays within the project's ceiling (API keys).
  • Daily cap. Live mail is capped per project per UTC day. The cap counts the live emails the project accepted since midnight UTC, suppressed ones included; past it, sends answer 429 daily_quota_exceeded until the next day. Owners and admins raise it in the project's settings.
  • Sending pauses. A project whose bounce or complaint rate climbs too high stops sending live mail until an owner or admin resumes it. Alerts warn first, and the thresholds are in the console (When sending pauses).
  • Retention. Content (bodies, attachments, raw inbound mail) is purged after the content retention period, subjects and custom headers with it; metadata, events and runs after the metadata retention period; request logs after theirs. Daily counts and the consent ledger are kept.

The keys are the names the platform gives each limit. Byte values are in KB and MB, fractions in percent.

The table

LimitValueDescription
recipientsPerEmail50to, cc and bcc together on one email.
recipientsPerField50
subjectMax998
messageBytesMax40 MBWhole MIME message after encoding, SES v2's maximum. Also what one request (a batch included) may download for remote path attachments in total.
htmlBytesMarketingMax100 KBGmail clips HTML above about 102 KB; marketing is blocked above this, transactional warned.
htmlBytesWarn100 KB
attachmentsPerEmail20
trackedLinksPerEmail500Links rewritten for click tracking per email, in document order; later links stay untracked.
attachmentBytesMax25 MBStored attachments (uploaded through a presigned URL).
inlineAttachmentBytesMax4 MBBase64 inside a JSON request body, which stops at 6 MB.
inlineImportBytesMax4 MB
requestBodyBytesMax6 MB
uploadUrlTtlSeconds900 secondsPresigned upload URLs for attachments and imports.
attachmentFilenameMax255
storedAttachmentTtlDays30 daysStored (reusable) attachments are purged after this many days without use.
tagsPerEmail50Caller tags are stored and returned in events; only the platform's own tags go to SES.
tagLengthMax256
customHeadersMax50
headerNameMax128
headerValueMax2,000
headersBytesMax8 KB
batchSize100
idempotencyKeyMax256
idempotencyWindowHours24 hours
scheduleMaxDaysAhead30 days
templateVariablesMax100
templateVariableKeyMax64
templateHtmlBytesMax1 MB
templateNameMax100
templateAliasMax100A template's alias: lowercase letters, digits, hyphens and underscores.
templateVersionsKept50
documentBlocksMax200The block document (hosted templates and broadcasts): blocks in a document and in one of its columns, the document's width, and the sizes a block may set, all in pixels.
columnBlocksMax20
documentWidthMin320
documentWidthMax800
imageWidthMin16
imageWidthMax1,200
spacerHeightMin4
spacerHeightMax200
blockPaddingMax80
apiRateLimitPerSecondDefault10Per API key: requests per one-second window, hard limit (no separate burst allowance).
apiRateLimitPerSecondMax100Ceiling a project may configure for any of its keys.
linksRateLimitPerMinute120Recipient pages (links.): requests per minute per client address.
dailySendCapDefault10,000Per project per UTC day, live mode. Raised per project in settings.
contentRetentionDays30 daysContent (bodies, attachments, raw inbound) in S3.
metadataRetentionDays395 daysEmails, events, received messages, finished runs, DMARC reports and the audit log: 13 months, so year-over-year reports work.
apiRequestLogRetentionDays30 days
presignedUrlTtlSeconds3,600 seconds
outboundRedirectsMax3Redirects followed by outbound requests to caller-supplied URLs; each target is re-checked.
outboundResponseBytesMax64 KBResponse bytes kept from outbound requests (webhook responses are stored truncated).
remoteAttachmentTimeoutMs15,000 msRemote attachment downloads (path attachments): one deadline for every download of a request, a batch included, so the request ends well inside the API function's 30 seconds.
webhookEndpointsPerEnvironment20
webhookDescriptionMax200A webhook endpoint's description, as its owner writes it.
webhookTimeoutMs15,000 ms
webhookRetryDays3 days
webhookMaxAttempts20
webhookRetryDelaysSeconds5 seconds, 300 seconds, 1,800 seconds, 7,200 seconds, 18,000 seconds, 36,000 secondsThe wait before each retry of a failed delivery, in seconds: after the first failure, the second, and so on; the last repeats until webhookRetryDays from the delivery's creation (12 attempts in all) or webhookMaxAttempts.
webhookAutoDisableDays3 daysConsecutive days of only failures before an endpoint is disabled automatically.
webhookToleranceSeconds300 secondsSignature timestamp tolerance, matching svix.
webhookInboundContentBytesMax256 KBParsed inbound content carried inside the email.received webhook.
inboundMessageBytesMax40 MBSES receiving refuses larger messages.
inboundAttachmentsMax100Attachments kept per received message; the rest are dropped and the message says so.
inboundHeaderBytesMax256 KBHeader bytes across every part of a received message (a line counts for at least 64).
inboundMimePartsMax1,000MIME parts in a received message, nested messages included.
inboundMimeDepthMax32Multipart nesting depth of a received message.
inboundNestedMessagesDepthMax3Attached messages (message/rfc822) parsed inline; deeper ones stay attachments.
inboundAddressesMax1,000Addresses read from From, To, Cc and Bcc, nested messages included; each list keeps at most recipientsPerField.
inboundDataUriBytesMax2 MBInline images embedded as data URIs in html (html_format=data_uri); larger ones stay cid:.
inboundForwardHopsMax3Platform forwarding hops (counted from X-Minket-Forwarded headers) before a loop is assumed.
inboundRoutesPerDomain100Routing rules per receiving domain.
inboundLocalPartMax64The local part a routing rule matches, the part before the @ (RFC 5321's limit).
inboundForwardAddressesPerProject50Forwarding destinations per project (each confirmed by its owner).
inboundForwardConfirmTtlHours72 hoursA forwarding confirmation request waits this long for its owner's reply.
dmarcReportBytesMax1 MBDMARC aggregate reports: the attachment as received, and after decompression.
dmarcReportDecompressedBytesMax10 MB
dmarcReportAttachmentsMax3Report attachments read from one message.
dmarcXmlElementsMax200,000XML elements and nesting depth in one report; <record> rows read from it.
dmarcXmlDepthMax16
dmarcReportRecordsMax10,000
dmarcReportSourcesKept200Sending sources kept per stored report, largest counts first.
headerRetentionDays30 daysSubjects and custom headers are cleared with the content; addresses stay for the metadata period.
pageSizeDefault20
pageSizeMax100
metricsPeriodsMax10,000Email metrics: periods one range may span with period as a dimension.
metricsFilterIdsMax100Email metrics: ids per domain_id, email_id or broadcast_id filter.
metricsRowsMax10,000Email metrics: rows one breakdown may answer; past it, shorten the range or filter.
orgNameMax32Organization names, so a name fits one line of the console's switcher.
projectNameMax32
slugMax50
keyNameMax100
automationNameMax200Automation names; a duplicate is named <name> (copy), cut to fit.
broadcastNameMax200Broadcast names; a duplicate is named <name> (copy), cut to fit.
domainNameMax253
domainsPerProject50
environmentsPerProject5
membersPerOrg50
invitationTtlDays14 daysAn invitation is accepted on the invitee's first sign-in within this many days.
contactsPerProject1,000,000
importRowsMax100,000
importFileBytesMax50 MB
importColumnsMax100CSV imports: columns per row and characters per field; longer rows or fields fail the file.
importFieldMax1,000
importRowErrorsMax100Per-row errors kept on an import (the counts include every failed row).
exportRowsMax200,000Contacts in one synchronous CSV export; filter by segment or status for larger audiences.
propertiesPerProject100
propertyKeyMax50
propertyValueMax1,000
segmentRulesMax50
segmentNameMax100Segment names: shown whole in the console's segment register and as a broadcast's audience.
topicsPerProject50
topicNameMax100Topic names, and the name the preference page shows in their place (public_name).
topicDescriptionMax500A topic's description, under its name on the preference page.
sunsetAfterDays365 daysContacts with no open or click in this many days are sunset (left out of broadcasts).
sunsetAfterDaysMin30 daysThe range a project may configure for its sunset period.
sunsetAfterDaysMax730 days
doubleOptInTtlHours72 hours
broadcastThrottlePerMinuteDefault600Each broadcast sends at most its throttle_per_minute, this by default; every broadcast from one domain draws on that domain's per-minute budget.
broadcastSesRateShare50%The share of the sending rate broadcasts may use, so transactional mail always has room.
broadcastAbSamplePercentMax50%
broadcastAbWindowMinutesMax1,440 minutes
broadcastTestRecipientsMax5
automationStepsMax100
automationWaitMaxDays90 days
automationRunsPerContactPerDay50One contact enters one automation at most this often per day (runaway guard).
automationVersionsKept50
automationRunStepsMax500Steps one run may execute; a run past it fails (runaway guard: loops through waits).
automationChainDepthMax3Runs started by events of another automation's run, at most this deep (loop guard).
automationEventPayloadBytesMax16 KBA custom event's payload as stored with the runs it starts (JSON bytes).
eventDefinitionsPerProject200Custom event definitions per project.
eventSchemaFieldsMax50Fields in one custom event definition's schema.
dnsCheckIntervalMinutes60 minutesHow often a domain that is not verified yet is checked again.
dnsCheckVerifiedIntervalMinutes360 minutesHow often a verified domain is checked again.
dnsRecordPendingHours72 hoursA missing record stays pending this long after the domain was added, then failed (SES's own window).
integrationTimeoutMs10,000 msCalls to the Cloudflare API, Google Postmaster Tools, seed IMAP servers, OAuth token endpoints, and the test login before an SMTP or IMAP mailbox is saved.
cloudflareZonesMax500Zones read from one Cloudflare connection.
domainConnectTimeoutMs5,000 msEach Domain Connect request to a DNS provider (its settings, whether it has a template): the domain page waits for them, so they give up sooner than other integrations.
domainConnectCacheSeconds300 secondsWhat a zone's Domain Connect discovery found is reused this long (per function).
smtpCredentialsPerOrg20SMTP credentials an organization can hold at once.
smtpCredentialNameMax100An SMTP credential's name, the client it is for ("Supabase auth").
seedTestIntervalDays7 daysScheduled inbox-placement tests run this often per verified domain.
seedCheckDelayMinutes10 minutesPlacement is read this long after the seed messages were sent.
seedCheckGiveUpHours24 hoursA seed message not found by then is recorded as missing.
eventsFeedLagSeconds5 secondsEvents younger than this are left out of the GET /v1/events feed so a tail never skips a late commit.
recipientTokenTtlDays400 daysSigned recipient-page tokens (unsubscribe, preferences) stay valid this long.
emailShareHoursMax48 hoursA shared email's link lasts this long at most, and by default.
sessionDays30 daysSign-in and accounts. Sessions last sessionDays absolutely and sessionIdleDays without use; email codes are six digits valid signInCodeMinutes.
sessionIdleDays14 days
signInCodeMinutes10 minutes
signInCodeAttemptsMax5
signInCodesPerEmailPer15Minutes3 minutes
signInStartsPerAddressPerHour20
organizationsPerUserMax3Organizations one person may own through sign-up (platform administrators are exempt).
sandboxDailyQuotaDefault100
sandboxMonthlyQuotaDefault3,000
quotaMax10,000,000The highest daily or monthly quota an organization may be given.
mailboxesPerProject50Connected mailboxes (Gmail, Microsoft, SMTP) per project.
oauthStateTtlSeconds600 secondsAn OAuth connect flow must come back within this many seconds; its state is single use.
oauthClientIdMax500A project's own OAuth client, its id and its secret as the provider issued them.
oauthClientSecretMax1,000
mailboxSendTimeoutMs15,000 msOne request or SMTP session of a mailbox send, connection included (the Sent copy over IMAP has its own). A token refresh and the one retry after a 401 still fit the send worker's one-minute timeout; a send cut short there stays in flight and is never repeated.
gmailMessageBytesMax25 MBWhat Gmail sends in one message (its upload endpoint takes 35 MB; delivery stops at 25).
graphMessageBytesMax3 MBMicrosoft Graph takes 4 MB per sendMail request, so about 3 MB of MIME before base64.
mailServerResponseBytesMax64 KBBytes read from an SMTP or IMAP server in one session (replies only, never mail).

Updated