Scopes
Changing
caller_id, assigning or labelling phone numbers, deleting a call’s recording and transcript, and removing numbers from the do-not-call list additionally need a credential whose owner is a team admin (403 forbidden otherwise). The CRM agent preset in the Developer Portal includes both dialer scopes.
Endpoints
Settings
Defaults apply until a team saves its own.caller_id is the workspace’s default outbound number; it must be one of the numbers the workspace owns and is the only setting a non-admin credential cannot change.
The transcript settings form a chain:
transcribe_calls needs both record_calls and machine_detection on (answering-machine detection is what keeps voicemail out of transcripts), and ai_call_feedback needs transcribe_calls on. A patch that breaks the chain is rejected with 400 invalid_request and a message naming the fix; turning a parent off never silently turns its dependents off, so send them together: { "record_calls": false, "transcribe_calls": false, "ai_call_feedback": false } to stop recording, or { "machine_detection": false, "transcribe_calls": false, "ai_call_feedback": false } to stop detecting answering machines. The reverse holds too: { "transcribe_calls": true, "machine_detection": true } turns transcription on where detection was off.
Outcomes
Every finished call carries one outcome. The system sets the automatic ones from how the call ended; a person (orPATCH /api/v1/dialer/calls/:id) picks a manual one after a conversation. reached outcomes count toward the reach rate in statistics.
Phone numbers and pricing
The Dialer is part of every plan; there is no flat fee. A workspace needs a phone number to call from: an admin buys numbers in Settings → Dialer (also reachable from Billing), and Orbit’s platform phone account buys each one on the workspace’s behalf. The first purchase asks the admin to accept the Dialer terms at/dialer-terms. Numbers and outbound minutes are charged on a separate Orbit Dialer subscription next to the workspace’s plan, on the same card; the first number creates it.
How billing behaves:
- Terms with the first number. The first purchase requires an admin to accept the current Dialer terms (version
2026-10-26); the acceptance is recorded before anything is bought.GET /api/v1/dialer/billingreports intermswhich version was accepted, by whom and when, andterms.currenttells you whether that is still the version in force. - One subscription, created on demand. The first number creates the workspace’s Orbit Dialer subscription with the number and the metered minutes on it; later numbers change the quantity. Releasing a number credits the unused part of the month on the next invoice; releasing the last one leaves the subscription with only its metered items, so nothing more is charged until the next purchase.
- Subscription state.
subscription.statusisnoneuntil the first number, thenactive.past_duemeans Stripe is retrying a failed payment; dialing continues meanwhile.canceling(withcancel_at) only happens when support schedules a cancellation; when it takes effect, or when the subscription ends for non-payment, every number the workspace owns is released. - Dashboard only. Buying and releasing numbers, and accepting the terms, change what the workspace is charged, so none of them has an API endpoint or MCP tool. The API reads the costs (
GET /api/v1/dialer/billing) and the numbers, and can assign and label numbers.
- One number per rep. An admin assigns each number to a team member; that person’s calls go out on it. A rep can hold one active number at a time (
409 conflictotherwise). - The default number. Reps without a number of their own use the workspace default,
caller_idin the settings. The first number a workspace buys becomes the default; if the default is released, the oldest remaining number is used. - Assign and label over the API, buy and release in the dashboard.
GET /api/v1/dialer/numberslists what the workspace owns and who holds what;PATCH /api/v1/dialer/numbers/:idreassigns or relabels. There is noPOSTorDELETEon this resource; a signed-in admin buys and releases from Settings → Dialer. Releasing a paid number credits the unused part of the month on the next invoice. - Costs.
GET /api/v1/dialer/billingreports the active numbers by type and their monthly total, the billable minutes so far this calendar month and their cost, the transcribed minutes billed so far this month and their cost (transcript_minutes), the list prices (prices, withtranscript_minutes_centsfor transcription),feedback(how many calls the AI coach wrote feedback for this month and the AI credits that used, one per call),monthly_total_cents(numbers only; metered usage excluded), thesubscriptionstate and thetermsacceptance. Unanswered calls bill nothing, and neither does a call that was not transcribed.
Call lists are saved views
A call list is nothing more than a saved view of the Contacts table: its filters pick the people, its sort sets the dialing order. Build one withPOST /api/v1/contact-views (or create_contact_view over MCP), list existing ones with GET /api/v1/contact-views, then check what it would dial with GET /api/v1/dialer/call-lists/preview?view_id=. The dialer only calls numbers in the United States; the country comes from the number itself, so a +1 number in Jamaica, the Bahamas or Puerto Rico is outside it. The preview applies the dialer settings and reports who is left out and why:
A session holds at most 500 dialable contacts (
truncated: true when the view has more); the first 2,000 contacts of the view are examined. A person then opens the view on the Dialer page and starts dialing. The API does not start sessions; it can only read them afterwards.
Call scripts
A call script is the text a rep reads during a call. The Dialer page shows it beside the call with the merge fields filled in from the contact being dialed, and highlights the ones it could not fill. Scripts belong to the team; one can be the default, which new sessions start with unless the person picks another when they set up the session (the session’sscript_id records which one).
Merge fields:
{{first_name}}, {{last_name}}, {{full_name}}, {{company}}, {{job_title}}, {{email}}, {{phone}} from the contact, and {{rep_name}} for the person calling.
Transcripts and AI feedback
Withtranscribe_calls on, every recorded conversation (a call a person answered; voicemail and unanswered calls are skipped) is transcribed once it ends, and with ai_call_feedback on the AI coach then writes feedback for the rep. Both land on GET /api/v1/dialer/calls/:id/insights, one record per call; the call itself carries an insights summary with the two statuses so a list can show what is ready. Transcription happens in the background: poll while a status is queued or processing.
feedback has this shape:
score is 1–10 or null when the call was too short to judge; script_adherence.followed is yes, partly, no or no_script; suggested_outcome is one of the outcomes for the rep to compare with what they picked. The whole record is read-only over the API: the background job writes it.
Deleting recordings
DELETE /api/v1/dialer/calls/:id/recording (or delete_call_recording over MCP) removes a call’s media: the audio recording is deleted at the carrier, and the transcript, its sentences and the AI feedback are deleted at the transcription service and from Orbit. The call itself stays, with its numbers, timings, duration_seconds, outcome and notes, so statistics and the contact’s call history are unchanged; its recording_status becomes absent, its insights summary null, and GET /api/v1/dialer/calls/:id/insights answers 404 not_found from then on. The deletion is recorded in the workspace’s audit log and cannot be undone. Admins only (403 forbidden otherwise); 409 conflict when the call has neither a recording nor a transcript.
Deleting a contact also deletes the media of every call made to them, but the two ways of deleting differ when a provider fails. In the dashboard the contact is kept until every call’s media is gone, so the delete can simply be retried. DELETE /api/v1/contacts/:id purges best effort: if the carrier or transcription service fails for a call, the contact is still deleted and that call keeps its recording or transcript, now with contact_id: null. Find such calls with GET /api/v1/dialer/calls and remove their media with this endpoint.
Do-not-call list
The list is keyed by phone number, stored in E.164 and matched by digits, so+1 (555) 010-0100 and 5550100100 are the same entry. Numbers in any format are normalised with the team’s default_country; the response separates added, already_listed and invalid.
- Contacts carrying a listed number are flagged
do_not_calland skipped by every call list; the pre-dial check blocks them even if a list was built earlier. - Email unsubscribes and SMS opt-outs add the contact’s number automatically (
reason:email_unsubscribe,sms_opt_out). The outcomedo_not_callon a call adds it withreason: call_outcome. - Removing a number from this list does not remove the email unsubscribe or SMS opt-out behind it, and the next unsubscribe adds it back.
- Only admins remove numbers; any credential with
dialer:writecan add them.
Responses
Lists return{ "data": [...], "meta": { "total", "page", "per_page", "total_pages" } }; single records return { "data": {...} }. Errors return { "error", "error_description" } with a 4xx or 5xx status, for example 403 forbidden when a non-admin changes caller_id, assigns a number or removes a do-not-call entry, 409 conflict when assigning a number to someone who already holds one or when two callers make different scripts the default at once, 404 not_found for a call that has no insights yet, and 503 unavailable when calling is not configured on the instance.
MCP tools
The same operations as MCP tools
CRM API
Saved contact views and the rest of the CRM