Pagination envelopes, supported list parameters, throttling tiers, and retry behavior.
Most list endpoints return a counting paginator: items in data, page URLs in links, and counts in
meta.
{
"data": [],
"links": {
"first": "https://...",
"last": "https://...",
"prev": null,
"next": "https://..."
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 10,
"per_page": 20,
"to": 20,
"total": 200,
"path": "https://..."
}
}Two endpoints use a different shape:
GET /v1/inboxes/{inbox_id}/tags uses a simple paginator that does not count the full result set.
Its meta omits last_page and total, and adds current_page_url. Follow links.next until it
is null instead of counting pages.POST /v1/search wraps the paginator in { success, data: { conversations: <paginator> } }.| Parameter | Default | Notes |
|---|---|---|
page | 1 | 1-indexed page number. |
per-page | 20 | Items per page. Maximum 100. |
sort | newest | Where supported: newest, oldest, or priority. |
Every API request first passes a global limiter, and a few sensitive routes add a stricter limiter. All limiters are keyed by client IP rather than access token, so a high-traffic single host can hit the limit even when using multiple valid tokens.
| Limiter | Default | Applies to |
|---|---|---|
api.global | 300 requests / 1 minute | Every API endpoint |
api.register | 10 requests / 1 minute | /v1/auth/registration/* |
api.email_verification | 5 requests / 1 minute | /v1/auth/verification/* |
HTTP/1.1 429 Too Many Requests
Retry-After: 47
X-RateLimit-Limit: 5
X-RateLimit-Remaining: 0
Content-Type: application/json
{
"message": "Too Many Attempts."
}Back off using the Retry-After header, do not hammer the endpoint, and consider queueing requests
client-side when you would otherwise approach the limit.
Each limiter reads its max_attempts and decay_minutes from environment variables, defaulting to
the values above:
API_RATE_LIMIT_GLOBAL=300,1
API_RATE_LIMIT_REGISTER=10,1
API_RATE_LIMIT_EMAIL_VERIFICATION=5,1