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.
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
- Save the current time at the start of a run.
- Query from your last completed checkpoint with an overlap longer than a normal polling run. Keep the filters unchanged while paging.
- Follow
next_cursoruntil it isnull. Upsert every result byid, usingupdated_atto discard older duplicates from the overlap. - 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_startThe 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.
