Pagination

List endpoints are cursor-based.

Pass limit (default 25, max 100) and starting_after=<resourceId> to page forward:

Bash
curl "https://api.genaya.com/v1/clients?limit=50&starting_after=abc123" \
  -H "Authorization: Bearer gny_live_xxx"

List responses wrap the items and tell you whether more remain:

JSON
{
  "object": "list",
  "data": [ { "id": "...", "object": "client" } ],
  "has_more": true,
  "next_cursor": "abc123"
}

Keep requesting with starting_after=next_cursor until has_more is false. Lists are returned in a stable order; sort client-side on createdAt if you need chronological order.

Polling for changes

The main list endpoints (appointments, clients, contacts, invoices, estimates, expenses, tasks, reminders, and leads) also accept updated_since - an ISO 8601 date or timestamp that returns only records updated on or after that time, ordered by updatedAt ASCENDING so a poller pages forward and resumes its next poll from the newest updatedAt it has seen. It is mutually exclusive with the from/to created-date window (and with any schedule window) - combining them returns 400 with code conflicting_filters.

Bash
curl "https://api.genaya.com/v1/clients?updated_since=2026-08-01T00:00:00Z" \
  -H "Authorization: Bearer gny_live_xxx"

Records that have never been written since change tracking shipped have no updatedAt yet and are absent from this window until something touches them - for a full sync, walk the plain list once, then use updated_since for incremental polls. For push instead of poll, see Webhooks.