Skip to content

Rate limits, paging and sizes

  • 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.

Lists page by cursor, newest first:

Terminal window
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:

Terminal window
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 413 before it is read.
  • A body must be sent with a Content-Length header, or it is refused with 411. Every common HTTP client sends one.
  • A batch holds up to 100 emails.
  • Attachments are capped per plan.

Every timestamp is an ISO 8601 string in UTC, such as 2026-09-25T08:14:03.000Z.