Skip to Content
REST APIPagination, Limits & Errors

Pagination, Limits & Errors

Cursor pagination

The API uses opaque cursor pagination — no page numbers or offsets. This is stable even as new data arrives.

FieldMeaning
limitItems per page — 1200, default 50.
cursorOpaque token; omit on the first call.
nextCursorPass this back for the next page.
hasMorefalse means you’ve reached the end.

Results are ordered newest-first (createdAt desc, or clickedAt for clicks). The cursor encodes the last item’s timestamp + id, so paging is consistent.

Rate limits

Limits are per API key over a rolling 60-second window. The default per-minute budget depends on the owner’s plan:

PlanRequests / minute
Free / Starter60
Pro600
Scale6,000
White-label600

Every API-key response carries rate-limit headers:

HeaderMeaning
X-RateLimit-LimitYour per-minute limit
X-RateLimit-RemainingRequests left in the window
X-RateLimit-ResetUnix epoch (seconds) when the window resets

When you exceed the limit you get 429 with a Retry-After header and:

{ "error": "rate_limited", "limit": 600, "retryAfterSeconds": 12 }

Because the limit is keyed to the API key, you can split heavy workloads across multiple keys. Interactive dashboard (cookie) sessions are not rate-limited by this mechanism.

Error model

Errors are JSON with a stable, snake_case error code and an appropriate HTTP status.

StatusWhen
400Business validation (e.g. invalid_group_by, unknown_fields)
401Missing/invalid/expired/revoked key
403insufficient_scope — valid key without the needed scope
404not_found — nonexistent or not-owned resource
422Schema validation error (with a details field)
429rate_limited
5xxServer error (logged + captured)

Example:

{ "error": "insufficient_scope", "required": "read:conversions" }

Note the distinction: a 400 is a business validation error (your group_by value isn’t allowed), while a 422 is a schema validation error (a parameter is the wrong type). Both are safe to surface to your code as “fix the request.”

Next