CherryMail
Skip to documentation
Developersv1
Search the CherryMail developer documentation
Developers/API fundamentals
API fundamentals

Limits & errors

Handle retries safely, preserve message identity, and build predictable integrations.

Request limits

Every plan is eligible when integrations are enabled. Existing account storage, sending, and resource limits continue to apply.

LimitMaximum
Per credential120 requests / minute
Per account600 requests / minute
List page100 items
Request body / readable message10 MiB
Text and HTML1,000,000 characters each
Attachments10 files, 5 MiB decoded total
Recipients20 combined To, Cc, and Bcc

Inspect rate-limit headers and honor Retry-After on a 429 response. Use IMAP for reading messages larger than 10 MiB.

Cursor pagination

Resource lists return an opaque next_cursor. Pass that exact value as the next request’s cursor query parameter. Do not decode or construct cursors yourself.

Message lists use numeric nextCursor and return uidValidity. Keep both values when continuing a message listing. The default page size is 25, with a maximum of 100.

Make retries safe

Mutation requests require an Idempotency-Key: 8–128 letters, digits, underscores, periods, or hyphens. Use a different key for each intentional action; repeat the same key with an identical request after an interruption.

Idempotency header
Idempotency-Key: order-confirmation-1042

Reusing a key with different input returns a conflict. Creation and change responses include a durable operation ID for progress checks.

Do not automatically resend an uncertain submission
An ambiguous SMTP outcome may already have been accepted. Inspect the send receipt before deciding what to do. Submitting again with a new key can produce duplicate email.

Preserve message identity

A message reference combines mailbox ID, folder, uidValidity, and uid. Preserve all four. A stale reference returns 409; list the folder again rather than reusing the UID against a changed mailbox state.

Message deletion moves email to Trash by default. Permanent deletion requires permanent: true. Use the deletion endpoint to move to Trash; the move endpoint cannot bypass deletion permissions.

Handle errors consistently

Example error envelope
{
  "error": {
    "code": "forbidden",
    "message": "Insufficient permission.",
    "request_id": "example-request-id"
  }
}
StatusMeaning
400Invalid input or missing idempotency key.
401Missing, expired, or revoked credential.
403Insufficient permission, wrong credential purpose, or missing mailbox grant.
404Resource not found or unavailable to this integration.
409Resource conflict, stale UID, or conflicting idempotency input.
413Request or message exceeds the supported size.
429Rate limited. Honor Retry-After.
503Integrations disabled or an upstream service unavailable.

Include error.request_id when contacting support. An uncertain send result must be treated as potentially accepted.

Next upReceive signed webhooks