Pages
Every list answers in the same shape:
{
"items": [ … ],
"next_cursor": "azoxMjg4",
"total": 212
}
per_pagesets the page size (1–100, default 25).- Pass
next_cursorascursorto get the next page.nullmeans this was the last page. - A cursor is opaque: do not build or change it.
totalis the number of matches over all pages. Only the first page (withoutcursor) has it; later pages givenull, 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.
