Core concepts

Pagination

.md

Offset-based pagination for list endpoints, and the exceptions to the standard shape.

Most list endpoints use offset-based pagination with the limit and offset query parameters and return the items in data plus a pagination object.

ParameterDefaultDescription
limit50 (20 on some endpoints, see below)Maximum number of items to return. Capped at 100.
offset0Number of items to skip.
terminal
Bash
01curl 'https://api.tickos.dev/v1/tickets?limit=20&offset=40' \
02 -H 'Authorization: Bearer sk_your_api_key'
UTF-8 · LF · Bashtickos.dev

List response

response.json
JSON
01{
02 "data": [{ "id": "...", "subject": "..." }],
03 "pagination": {
04 "limit": 20,
05 "offset": 40,
06 "total": 128
07 }
08}
UTF-8 · LF · JSONtickos.dev

total is the number of items matching your filters, so there are more pages while offset + limit < total.

Endpoints that follow this standard shape (limit default 50): GET /v1/tickets, GET /v1/tickets/{id}/messages, GET /v1/customers, GET /v1/contact-groups and GET /v1/contact-groups/{id}/members.

Endpoints with a different shape

Some list endpoints use a different default, a different collection key or no pagination at all:

EndpointParamsResponse shape
GET /v1/inboxespage (default 1), limit (default 50){ data, pagination: { page, limit, total, pages } }
GET /v1/campaignslimit (default 20), offset{ campaigns, pagination: { total, limit, offset } }
GET /v1/campaigns/unsubscribedlimit (default 50), offset{ unsubscribed, pagination: { total, limit, offset } }
GET /v1/surveyslimit (default 50), offset{ surveys, pagination: { limit, offset, total } }
GET /v1/changeloglimit (default 20), offset{ data, pagination: { limit, offset, total } }
GET /v1/automationslimit (default 20), offset{ data, pagination: { limit, offset, total } }
GET /v1/automations/{id}/enrollmentslimit (default 20), offset{ data, count, limit, offset }
GET /v1/emails/scheduledlimit (default 50), offset{ data, total, limit, offset }
GET /v1/connectionsNone (returns all){ data, meta: { total } }
GET /v1/keysNone (returns all){ data, meta: { total } }
GET /v1/tagsNone (returns all; optional inbox_id filter){ data, count }
GET /v1/usersNone (returns all){ data, count }
GET /v1/tickets/{id}/tagsNone (returns all){ data, count }
GET /v1/messages/{id}/attachmentsNone (returns all){ attachments, count }
For incremental syncs, use updated_after (ISO 8601) on GET /v1/tickets and created_after on GET /v1/tickets/{id}/messages instead of walking every page.