Notable changes to Dial — new capabilities, improvements, and fixes. Filter by tag, or subscribe via RSS.
August 14, 2026
Changed
Self-Hosted mode is approved per account
Self-Hosted mode hands live calls to a server Dial doesn’t run, so new accounts now request access before they can point calls at one. Accounts already using Self-Hosted are unaffected — they keep it, and nothing about their configuration changes.
August 9, 2026
Added
Creating an account requires a verified phone number
An account is created only once both an email address and a phone number are verified. When the email is new, POST /v1/auth/verify returns a registrationId and no account — continue from there:
POST /v1/auth/register-numbertexts a code to the number that will own the accountPOST /v1/auth/verify-numbersubmits that code and returns the account and its API key
August 3, 2026
Added
Attach an opt-in screenshot to a 10DLC registration
Carrier reviewers approve a registration much faster when they can see the consent screen your messageFlow describes. Submit 10DLC registration now takes an optional screenshot — send the body as multipart/form-data with a data part holding the usual JSON and one optInImage file part (max 2 MB; JPEG, PNG, WebP, or GIF). Dial hosts the image and puts it in front of reviewers; the response’s optInImageUrl shows exactly what they see. On a resubmission, leaving the file out keeps the stored screenshot, and sending "optInImage": null inside campaign removes it.
August 2, 2026
Added
Share an account with your team
An account owner can invite teammates by email so a team works from the same phone numbers. Each member signs in with their own address, holds their own API key on the same account, and shares its numbers, messages, calls and contacts; usage bills to the account’s balance. Members can do everything the owner can except delete the account.
July 30, 2026
Changed
A sole proprietor 10DLC registration now gives a vertical
POST /api/v1/numbers/{id}/10dlc requires a new vertical on the brand when kind is
sole_proprietor — the trade the brand operates in. The carrier registry asks for it on every sole
proprietor brand, and the earlier form didn’t collect it.
July 29, 2026
Added
Register a US number for 10DLC
US carriers block outbound SMS and MMS sent from an unregistered 10-digit number to a US phone number. You can now register a number for 10DLC through the API and lift that block:
POST /api/v1/numbers/{id}/10dlcsubmits the registration —application/jsoncarryingkind(sole_proprietororbusiness), abrand(who is registering) and acampaign(what you send, and how people opted in). It costs $25.00 one-time per number, drawn from your credit balance; resubmitting after a rejection is free.GET /api/v1/numbers/{id}/10dlcreturns the brand, the campaign, and where the registration stands.- Phone numbers carry a new
tenDlcobject reporting where the registration stands:not_registered,in_review,with_carrier,approved, orrejected(with areasonsaying exactly what to change). It’snullwhen 10DLC doesn’t apply — a non-US number, a number with theimessagecapability, or an account that isn’t pay-as-you-go and has no registration yet.
July 27, 2026
Added
Free-account limits on the account object
GET /api/v1/account now returns a limits object — maxCallDurationSeconds and maxConcurrentCalls — for accounts that have never added credit and never subscribed, and null for accounts that have paid. Read it instead of hardcoding the values.
July 21, 2026
Added
Free-account call limits
Accounts that have never added credit and never subscribed now run with two guardrails: every call is hard-capped at 5 minutes (regardless of any configured maxCallDurationSeconds), and at most 2 calls can be in progress at once, inbound and outbound combined. An outbound call over the concurrency limit is rejected with a new 429 error (code call_limit_reached); an inbound call over the limit is declined. Both limits lift permanently the first time you add credit or start a subscription. See Free accounts.
July 9, 2026
Added
Self-Hosted audio mode — bring your whole voice stack
Self-Hosted mode gains a second variant: audio ("type": "audio"). Dial pipes the raw call audio to your WebSocket server, full duplex, over the new Self-hosted audio protocol — you bring the entire voice pipeline: a speech-to-speech model (OpenAI Realtime, Gemini Live, …) or your own STT → LLM → TTS chain. The existing bring-your-own-LLM variant is unchanged and now documented as the Self-hosted LLM protocol.
July 7, 2026
Added
Typing indicators
Set a typing indicator — POST /api/v1/typing with {toNumber, value, fromNumber} shows (or clears) a typing indicator on the recipient’s device, as if someone were composing from your number. iMessage numbers display it; standard (SMS) numbers have no typing concept and silently no-op, so you can call it unconditionally before a send. Delivering a message or reaction from the same number clears the indicator natively — start again after a send if you’re still composing. Free of charge.
July 6, 2026
Added
Live call lifecycle events — call.status_changed
A new account event, call.status_changed, fires the moment a call moves through its lifecycle — Queued → Ringing → In-Progress → Terminated — so you can react while a call is happening instead of learning about it only when it ends. Each event carries the state entered (status {state, label}), the state left (previousState), and — on termination — the terminationType (completed, busy, no-answer, failed, canceled), mirroring the status object the calls API already returns.
July 5, 2026
Added
Voice messages
A single audio attachment sent from an iMessage number is now delivered as a native voice message — playable inline in the recipient’s thread, not a file to download. Pass forceAudioFile: true on Send a message to opt back into a regular file attachment. body is now optional whenever media is attached, so media-only sends work. In the CLI: dial message --media <url> with --force-audio-file to opt out.
June 7, 2026
Changed
Call language is now optional — auto-detected from the phone number
language on Make a call is no longer required. When omitted, Dial detects the language from the phone number’s country prefix — the destination number for outbound calls, the caller’s number for inbound calls — and the voice agent handles both that language and en-US. Pass an explicit language to pin the call to a single language, exactly as before.
May 27, 2026
New
Unified event stream across SDKs
Every SDK now exposes the same new_events_connection() / newEventsConnection() API for consuming your account’s live event stream — inbound messages, completed calls, and more — with the same loop in every language.