Getting started

Pagination and polling

How lists come back in pages, and how to fetch only what changed since your last call.

Pages

Every list answers in the same shape:

{
  "items": [ … ],
  "next_cursor": "azoxMjg4",
  "total": 212
}
  • per_page sets the page size (1–100, default 25).
  • Pass next_cursor as cursor to get the next page. null means this was the last page.
  • A cursor is opaque: do not build or change it.
  • total is the number of matches over all pages. Only the first page (without cursor) has it; later pages give null, because counting is a query of its own.
curl -u "user:app password" -G https://your-site.example/wp-json/kwazi/v1/contacts \
  -d per_page=100 -d cursor=azoxMjg4

Polling: what changed since …

Polling is the alternative to webhooks when the other side cannot receive them. Remember the moment of your last poll and ask what changed since then:

List Filter
GET /contacts updated_since
GET /organizations updated_since
GET /appointments updated_since
GET /submissions created_since (a submission does not change after it is sent)
GET /audit-log newest first with a cursor

Times are ISO 8601 in UTC, e.g. 2026-10-15T08:00:00Z. A record changed exactly at that moment is included, so you may receive it twice: use its id to recognise it.

curl -u "user:app password" -G https://your-site.example/wp-json/kwazi/v1/appointments \
  -d updated_since=2026-10-15T08:00:00Z -d per_page=100

Without updated_since, GET /appointments lists a period (from, to, local days, at most 62) or one contact (contact) in one page, by start time.

Tip: poll every few minutes at most; for instant updates use webhooks.

Still stuck?

A real person answers, in plain words. Use the help form, or ask on the WordPress forum.

Ask us a question