Rate limits, paging and sizes
Rate limits
Section titled “Rate limits”- Reads (
GET) are limited to 300 a minute per API key. - Sends are limited per second by plan, and per day by plan and account age. See Plans and limits.
Past a limit, Duta answers 429 with code: rate_limited or
quota_exceeded. A 429 for rate carries a Retry-After header in seconds.
Wait that long, then retry.
Paging
Section titled “Paging”Lists page by cursor, newest first:
curl "https://api.duta.indra.sh/v1/emails?limit=50" -H "Authorization: Bearer $DUTA_API_KEY"{ "object": "list", "data": [ ... ], "has_more": true, "next": "msg_..." }Pass next as after to get the following page, and stop when has_more is
false:
curl "https://api.duta.indra.sh/v1/emails?limit=50&after=msg_..." -H "Authorization: Bearer $DUTA_API_KEY"limit is 1 to 100, 50 by default. The suppression list takes up to 500, 100
by default. A cursor holds its place even while new rows arrive, so no row is
repeated or skipped. Emails, logs, webhook deliveries and suppressions page this
way. Emails and suppressions include "object": "list" in the response. For
suppressions, after is the email address of the last item. Domains, API keys
and webhook endpoints are short enough to return whole.
GET /v1/emails also accepts q (search) and status filters. GET /v1/logs
accepts q, status and method filters.
- A request body can be up to 14 MB. A larger one is refused with
413before it is read. - A body must be sent with a
Content-Lengthheader, or it is refused with411. Every common HTTP client sends one. - A batch holds up to 100 emails.
- Attachments are capped per plan.
Timestamps
Section titled “Timestamps”Every timestamp is an ISO 8601 string in UTC, such as 2026-09-25T08:14:03.000Z.