On this page

Poll interviews, page through updates, and reconcile cancellations.

Synchronize interview changes

Litmus does not provide scheduling webhooks. Poll GET /api/v1/interviews with an API key that has interviews:read. Store each interview by its id.

bash
curl --fail-with-body --get https://litmushiring.com/api/v1/interviews \
  -H "Authorization: Bearer $LITMUS_API_KEY" \
  --data-urlencode "updated_since=2026-10-20T00:00:00Z" \
  --data-urlencode "include_canceled=true" \
  --data-urlencode "limit=100"

The response contains interviews and an opaque next_cursor. Canceled interviews are included by default. Keep include_canceled=true explicit in an integration so a future reader can see that cancellations matter.

Polling loop

  1. Save the current time at the start of a run.
  2. Query from your last completed checkpoint with an overlap longer than a normal polling run. Keep the filters unchanged while paging.
  3. Follow next_cursor until it is null. Upsert every result by id, using updated_at to discard older duplicates from the overlap.
  4. Advance the checkpoint to the run's start time only after every page has been processed successfully.
run_start = now()
since = last_completed_checkpoint - overlap
cursor = null
do:
    page = GET /interviews?updated_since=since&include_canceled=true&limit=100&cursor=cursor
    upsert each page.interviews by id
    cursor = page.next_cursor
while cursor is not null
last_completed_checkpoint = run_start

The list is ordered by stored scheduled_start_at, then ID; the cursor is based on that order, not on updated_at. The overlap and ID-based upsert help reconcile writes that occur while pages are read. This is not a snapshot or an exactly-once change feed. For important bookings, also re-read the saved interview ID after a write or around its scheduled time.

updated_since sees stored writes such as booking, reassignment, and cancellation. completed and expired can become true when time passes without changing updated_at, so they may not appear in an incremental poll. Re-read interviews last seen as scheduled or pending when their relevant time window passes. An indefinite interview has no clock-based end.

Keep the interview ID, last observed status and updated_at, and the last completed checkpoint in durable storage. For externally scheduled sessions, also store your own appointment ID and the candidate_link when it is returned; the link is not available from later reads.

See List interviews for filters and response fields, and Errors and retries for recovery.

    Synchronize interview changes · Litmus docs