call-requests:write scope.
Create a call request
201 response returns the call request with every contact pending:
The fields that matter
purpose— why these contacts are being called (recall_reminder,treatment_follow_up,appointment_confirmation,reactivation, …). Passed to the voice agent (as thecallPurposedynamic variable) so it can frame the conversation.context— free-text context (up to 5,000 characters) applied to every contact in the request, passed to the agent as thecallContextdynamic variable. Purpose and context are the only way to influence call content; prompts and agent internals are not exposed.window— optional constraints, interpreted in the practice’s timezone. Calls always stay inside the practice’s configured calling hours; your window can only narrow them. Omit it to use the defaults (09:00–20:00, Monday–Friday).start/endare absolute ISO 8601 datetimes: dialing never begins beforestart, and contacts still pending whenendpasses are markedskipped.contacts[].external_ref— your stable ID for the contact. It is echoed asexternal_refon contact progress and ascontact_external_refincall.completedwebhook payloads, so you can correlate results without exchanging PHI.contacts[].phone— E.164 format (+18015550142). Duplicate numbers (after normalization) are rejected with400 duplicate_contacts.
Consent
By submitting a contact you attest, per your partner agreement, that the contact has given prior express consent to receive this call at that number (TCPA and applicable state law). Do not submit contacts from purchased lists or anyone who has opted out. See the go-live checklist.Track progress
Poll
pending → calling → completed | failed (or skipped if the window expires or attempts are exhausted), with automatic retries for unanswered attempts. Once a contact has a call_id, fetch the call for its summary and (scope permitting) transcript.
GET /practices/{practiceId}/call-requests lists your requests for a practice, newest first, with limit/offset pagination and aggregate counts per request (no per-contact detail).
Or subscribe
Prefer webhooks over polling:call.completed fires per contact as calls finish (carrying your contact_external_ref), and call_request.completed fires once when the whole batch is terminal. See Receiving call outcomes.
Quotas and backpressure
Quotas are enforced before anything is queued — a rejected request dials no one:
Batch sensibly: one call request with 50 contacts beats 50 single-contact requests — it consumes one bulk-bucket slot and gives you a single
call_request.completed event to reconcile against.