Skip to main content
On this page

Every search answers with a list:

json
{
  "object": "list",
  "data": [{ "object": "encounter", "id": "e7j3p5s9d1f4g6h8k2l0m3nb" }],
  "hasMore": true,
  "nextCursor": "WyIyMDI2LTEwLTAxIDA3OjAwOjAwIiwiZTdqM3A1czkiXQ"
}

Ask for the next page

A list that pages answers 50 records at a time. Set limit for a different page size, up to 100. While hasMore is true, send nextCursor back as cursor, with the same filters:

shell
curl "https://dashboard.practor.app/api/v1/encounters?patientId=k3v9x2m8q1w7e4r6t0y5u2ia&cursor=WyIyMDI2LTEwLTAxIDA3OjAwOjAwIiwiZTdqM3A1czkiXQ" \
  -H "Authorization: Bearer $PRACTOR_API_KEY"

Stop when hasMore is false; nextCursor is then null. Treat the cursor as an opaque string: send it exactly as it came. A cursor Practor didn't send is refused with a 400 whose code is invalid_cursor.

A cursor marks the last record of the page, so a record added while you page doesn't shift or repeat the pages after it.

A search that doesn't page, such as finding a patient by externalId, answers everything at once with hasMore set to false.

Everything that changed since you last looked

To keep your system in step with the practice's invoices, search with updatedSince:

shell
curl "https://dashboard.practor.app/api/v1/invoices?updatedSince=2026-10-01T00:00:00Z" \
  -H "Authorization: Bearer $PRACTOR_API_KEY"

Results come oldest change first. Page to the end, then store the updatedAt of the last invoice you received and use it next time. For changes as they happen, use webhooks and keep this search as the catch-up.