Release log
Major OpenPhonex releases, with links to the features and guides you can use today.
Major product updates, newest first. Follow the links in each entry to configure or use the feature.
The initial roundup covers 18–31 August 2026. Dates are in UTC and follow verified production deployments, not pull-request merge dates. For features released across several services, an entry uses the date by which the required services were confirmed deployed.
13 September 2026
GPT-Live 1 voices in the Voice Library
- Browse all 14 GPT-Live 1 voices in the Voice Library's new Multilingual group, with OpenAI's own presentation, gender, regional influence and Natural/Generated labels.
- Play starts a short real GPT-Live session so you can hear a voice before choosing it; previews are cached and never billed to your workspace.
- Use switches an agent straight to that voice from the Voice Library.
- Language following is automatic and not configurable per voice; see the dated results from testing all 14 voices across seven languages, including where Sinhala still needs care.
- Voice Library · Which languages the voice agent follows · We ran GPT-Live-1 through 107 calls in seven languages
Session replay is on, masked so it cannot capture what customers typed or said
- Product analytics now includes session replay, masked so text, typed values, phone numbers, recordings and message bodies are never captured in the clear.
- Replay records nothing until you accept analytics, and stops immediately if you decline or withdraw consent later.
- The privacy policy describes exactly what replay captures and what it blocks, effective September 14, 2026.
- Privacy policy
12 September 2026
Faster number browsing and outbound pricing
- Phone numbers loads market availability and starting prices faster, while retaining the same prices and availability rules.
- Outbound pricing lookups are faster too, with the same destination matching and billing rules.
- Phone numbers and pricing
GPT-Live 1 conversation engine
- Choose GPT-Live 1 under an agent's Conversation engine to listen and speak at the same time, with a separate backend model for tools.
- Standard remains the default. GPT-Live browser tests use the Published snapshot, and phone or browser workflow runs still require Standard.
- GPT-Live call duration and backend tool-model tokens are billed separately; Standard speech-to-text is not charged on this path.
- Conversation engines · Voice billing
Inbound pricing follows the number's capacity plan
- Inbound rates now come from the number's verified capacity plan. Existing eligible numbers retain their rate.
- The Numbers page explains when a capacity combination is unsupported or its carrier evidence needs refreshing.
- Inbound pricing and capacity
Inbound numbers can activate while outbound setup retries
- A carrier-ready number can receive calls while outbound caller-ID setup is still pending or retrying.
- The Numbers page shows outbound setup separately, and outgoing calls remain blocked until that setup succeeds.
- Number availability and activation
Number purchases check the carrier's zero-channel offer
- Managed number orders now require a confirmed zero-channel offer belonging to the selected number group, so an offer with bundled channels cannot silently replace it.
- Markets with bundled channels or missing carrier evidence stay visible with an explanation; an unrecognized availability reason reads Temporarily unavailable.
- Number availability and activation
Calls disconnect before billing settlement finishes
- Ending a voice call now disconnects the phone leg before settlement work runs, so a slow billing operation does not leave the caller on a silent line.
- Call evidence and billing
11 September 2026
A call's technical details now show the carrier leg, not just the recording
- Calls carried by the OpenPhonex SIP bridge now show the bridge's own counters for the leg between the bridge and the carrier, alongside the existing recording telemetry, so a call that sounded off on the phone can be checked without a packet capture.
- New rows in the Calls page Technical details: Carrier → SIP bridge, SIP bridge → carrier, Room → SIP bridge, SIP mixer, and a separate Carrier reception (RTCP) row. A counter the bridge did not report is always absent rather than shown as zero, and a leg the capture never saw reads as not captured, never as clean.
GET /v1/calls/{call_id}/observabilityreturns the same projection undermedia_evidence.sip_call_statistics, plus the carrier's own reception report as the separatemedia_evidence.carrier_reception.- Carrier-leg call quality
Downloaded call recordings balance a quiet caller against the agent
- The full-call recording download now balances caller and agent speech using each track's own speech-bearing sections, so a quiet participant is easier to hear without amplifying silence or a noise-only track.
- Timing and transcript turn boundaries are unchanged, and the separately stored caller and agent tracks remain the unmodified source evidence.
- What a recording contains
10 September 2026
The Phone numbers page is a table, and Overview opens with what needs you
- Phone numbers is now one table with a selected-number panel, a Routes to column for every number, and Voice and SMS capability chips that each explain themselves on hover, with a review mark on Business SMS.
- Getting a number browses by country first, with number-type and feature filters, shows the carrier's monthly price where it lists one and "Quote at review" where it does not, and charges nothing until you confirm the exact price; a request in flight shows three steps: submitted, in review, assigned.
- Overview leads with one status line that always matches the checklist below it, a Needs you list of everything blocking you, each with the control that clears it, and a Going live checklist that disappears once you're live.
- The activity chart compares each window's calls with the period before it, Recent calls now reads exactly like the Calls page, and
GET /v1/calls/statswindows reportansweredandfailedcounts too. - What a call-stats window counts · Bring your own agent
A purchased number's activation status now reflects the current reading
- A purchased number's activation status text now always reflects the current carrier and platform reading, instead of repeating a blocker's sentence after that blocker has cleared.
- Where a number request waits
The workspace gets one consistent design, and a call's telemetry moves into the call record
- Voices, Billing, API keys, Calls, Campaigns, Knowledge bases, and every other workspace page now share one consistent look for sections, badges, statuses, and empty states.
- A call's timing and cost evidence — latency, cost, and which figures are measured versus estimated — now lives on the Performance tab of that call's record in Calls.
- The old
/calls/performancepage is gone; visiting it, with or without acall_id, redirects straight to the call's Performance tab, so existing links and bookmarks keep working. - The API keys page's new Connect an AI assistant card lets you create a scoped key and copy a ready-made MCP server entry to paste into your assistant's settings.
- Where a call's telemetry lives · Connect from the workspace
Inbound calls are priced in every standard metered market, not just two
- Eligible managed numbers on the carrier's standard metered capacity plan now have an inbound rate in 60 countries. The catalogue previously held rows for the
+1and+372prefixes only. - A call OpenPhonex cannot price is refused at admission and reports
carrier_rate_missing, shown in the workspace as "Pricing is unavailable for this number". Numbers the new rates cover no longer meet that blocker. - A number the carrier delivers with its own included or dedicated channels stays outside the plan and has no metered rate, so its incoming calls are still refused.
GET /v1/numbers/{number_id}/activationreports that. - Outbound and SMS prices are untouched: this release replaced the inbound rates only.
- The inbound rate the quote is based on · Inbound attempts rejected before connection
A wrong party and a cease contact are now two different outcomes
- The payment-reminder starter template routes a wrong party and a request not to be contacted to two separate outcome steps,
wrong_party_stopandcease_contact_stop, where both used to land on onestop_and_suppressstep labelled "Wrong party or cease contact — immediate stop". Each label states its own consequence now: both stop the call, a cease contact also adds the number to your do-not-call register and a wrong party leaves it where it was. The dispute and hardship labels lost the word "suppress" for the same reason — neither ever registered anything either. - Campaign exports and the contacts page follow the labels:
workflow_outcomeandworkflow_outcome_labelcarry the new step id and the new wording. Campaign dispositions do not change — a wrong party is stillconnected_wrong_partyand a cease contact stilldo_not_call— and the workspace still renders runs recorded against the oldstop_and_suppressid as it did before. - Validation now refuses three drafts it used to accept: one pointing both interrupts at a single outcome step, one letting anything other than the cease-contact interrupt reach the cease-contact outcome, and one carrying a starter-template label that claims the opposite of what the route landing on it does.
- Any draft whose two interrupts named one existing step was split for you on this release — one from the earlier starter template and one you wired yourself alike, bar a draft with no step for the new outcome to end on, which is left as it was. The shared step keeps its id, every other route into it and any label you wrote yourself; published versions are untouched. The repair is a write, so a client holding a
base_revisionfrom before the release gets one409on its firstPATCH /v1/agents/{agent_id}/workflowor publish after it, with the current draft in the409body undercurrent. - Wrong party and cease contact · Do-not-call register
Nothing promises a 48-hour carrier review that never started
- The
headlineonGET /v1/end-users/{end_user_profile_id}/registration-statusno longer reads "Registration usually completes within ~48h, often faster". It counts how many of that profile's number registrations OpenPhonex has actually submitted to the carrier, and is empty when none is — including for every profile before its first number order. The old sentence appeared whenever OpenPhonex's own checks were incomplete, which never established that anything had been sent. - That headline is also empty while the profile is rejected or needs more information, because that is what needs your attention instead. The per-number
headlineonGET /v1/numbers/{number_id}/activationreports the same submission for one number and adds the published activation time for that market when there is one — passed through, never composed, and described as the market's figure rather than as something the carrier said about your request. next_actionon that same endpoint no longer tells you to wait for carrier approval on a number nothing was ever sent for. A blocking item still speaks first; with nothing blocking the number it is one of three sentences now — submitted and awaiting the carrier, not submitted yet, or a registration that exists but is not showing as open.activation_estimateonGET /v1/numbers/requirementsis not always a duration and must be checked before it is shown as one. It holds the carrier's published activation time where registration is required and that market publishes one, and is now empty where it publishes none — Estonia among them — instead of substituting "~48h, usually faster". The other two values,instant_after_payment_and_policy_checksandmanual_review, are routing states, not times.- How long a regulated number takes to activate
A reviewer can put a contact back in the queue
- Resolving a campaign review accepts
requeue_contact: true, for when you disagree with the outcome and want the contact called again. The commonest case is a wrong party: that verdict comes from one reading of one caller reply and it closes the contact. Resolving dials nobody — the contact becomes due and the next dispatch decides, applying every rule it normally does. - A requeue can be refused, and the refusal comes back on the
200body rather than only in the audit trail:requeue_requested,contact_requeuedandrequeue_refused_reason, which is one ofdo_not_call_register,contact_phone_unknownorcampaign_run_not_dispatchable. A refusal is still a successful resolution — the note and the audit event are recorded either way — and arequeue_contactthat is not a boolean answers400. - A contact a dispatcher has already re-claimed comes back
contact_requeued: falsewith an emptyrequeue_refused_reason: nothing was declined by policy, that contact is simply already back in the queue. A reviewer cannot undo an opt-out, and an opt-out that lands while a resolution is being decided now refuses the requeue as well, where it could previously put that contact back in the queue as if the opt-out had not happened. - A call classified as a wrong party now records a
call.wrong_party_signalsevent, readable onGET /v1/calls/{call_id}/eventsand never delivered to a webhook endpoint. It carriesroute_id,from_step_id,turn_index,utterance_charactersandutterance_words— the size of the caller's reply, never its text.turn_indexis-1when the turn count could not be read, never0, because0is a real turn index. - Review inbox · Do-not-call register ·
call.wrong_party_signals
Voice settings are saved by the voice-stack route, and refused elsewhere
- Sending
turn_taking,voice_polish,audio_environment,follow_caller,languagesorlanguage_profilestoPATCH /v1/agents/{agent_id}now returns400naming the route that does save them. Until this release the same request returned200and discarded the setting, so a limit you believed was saved was not and the call ran on the platform default. - The MCP
update_agenttool is the same route and behaves the same way. If you have code setting one of these through it that appears to succeed, it has never taken effect — move it toPATCH /v1/agents/{agent_id}/voice-stackor theset_agent_voice_stacktool. - Unrelated extra fields your client happens to send are still accepted and ignored, as before. Only these six recognised-but-misplaced names are refused.
PATCH /v1/agents/{agent_id}/voice-stackalso returns400if you send a TTS provider and model with novoice_idwhere that provider has voices to choose from; such a save previously returned200and stored a stack with no voice, and the call then failed before the caller heard anything. Editing an older agent whose stored voice predates the rule still resolves the provider's own default.- Voice settings belong to the voice-stack route · A voice selection must name an exact voice
A call whose media session disappears now says so
ended_reasongains one value,media_session_lost, for a call whose media session went away underneath it — the room was removed, or the connection carrying the audio failed — so nobody hung up, no limit fired and the agent did not finish.- It reports what was observed rather than guessing at a cause. If someone had just asked to end that call it is still not reported as
hangup_requested; the hangup request is answered separately and says the call was already gone. - Calls that ended this way previously carried no reason at all, so a count of reasons over time will show empty values becoming
media_session_lostfrom this release rather than a new kind of ending appearing. - Simulations Lab test calls can report it too, where a synthetic room closes before the synthetic caller's own departure is delivered. A Lab result is judged on its assertions, not on this field.
- Why a call ended · When the media session is lost
A recipient who did not answer is no longer a technical rejection
- An outbound call the recipient never answered is now recorded as
no_answerwith the reservedoutbound_ringing_timeoutreason, where it was previously classified as a technical rejection by the far end. - The misclassification fired whenever the ring deadline passed with no SIP response at all, which is the ordinary shape: on one measured batch 37 of 50 attempts landed in the rejection bucket, making a pilot look like a platform outage and hiding the failures that really were ours.
- No new vocabulary.
outbound_ringing_timeoutand theno_answerterminal status are both already published, and a call is still only reportedno_answerwhen that durable event proves it, so nothing downstream changes. - If you alert on technical-failure rates for outbound campaigns, expect that rate to fall and
no_answerto rise by the same amount from this release. - Verify every delivery
The agent's closing line is played to the end
- When the agent ends the call itself, its closing line is now played to the end before the call is torn down.
- OpenPhonex learns that a line has finished playing slightly before the other party has actually heard it, and hanging up at that moment clipped the last word or two.
- The call is instead held open until the audio going to the caller has fallen quiet. That wait is short and bounded: it gives up after about a second and ends the call anyway, so a closing line that never finishes cannot hold a call open.
- Why a call ended
A Simulations Lab room that delivered nothing no longer reports a pass
- A real-time attempt whose synthetic caller was admitted to the room and then delivered nothing now finalizes as
errorwith the codecaller_delivery_failed. - Such an attempt previously kept the
passits offline evaluation had earned, so a suite reported green for a room in which no audio ever reached your AI agent. - Nothing is newly broken by this: those attempts already delivered nothing, and a suite that starts reporting
caller_delivery_failedis naming a fault it already had. - Like every errored attempt it is excluded from your AI agent's score and counted in
totals.errored_cases, never intotals.failed_cases. - Reading verdicts · Reading results from CI
A record outside your workspace is absent, not forbidden
- Every REST
GETthat names a record by id in its path answers404when that id belongs to another workspace: the same status and the same body an id that never existed gets, so a status code can no longer be used to discover which ids are real in someone else's workspace. Ids that previously answered500for a record that does not exist answer404as well. - On those reads a
403now says something about your credential — a missing scope, or a request that named an organization other than the key's — and never something about the record. - Not every by-id write has moved: the campaign writes and the workflow phone-pin routes answer
404, the rest still answer403, so write your client to treat either as "you cannot act on this record". - The workspace's own campaign exports answer the same way, so the same inference is closed in the browser as well as in the API.
- A resource outside your workspace is absent, not forbidden
Verification documents now reach the carrier
- In markets that require documents, OpenPhonex submits the documents from your approved verification profile to the carrier and reports what it actually did rather than describing a review that had not started.
- That submission shipped earlier but could never run: the worker held the storage configuration and neither storage credential, so it failed reading your documents on every sweep and no verification document reached the carrier in any proof-required market. This is the release in which it began working.
- Nothing is required from you. An affected request is picked up by the next sweep using the documents you already uploaded.
- Where a number request waits
9 September 2026
An ordered regulated number is now presented to the carrier
- OpenPhonex now opens the carrier verification task that names your ordered number and its address; until this shipped a regulated number stayed at
registration_draftand nothing about it was ever sent to the carrier. - The carrier establishes the number's end user by approving that task. There is no separate step that attaches an identity to a number — the carrier exposes no endpoint for one, and the request OpenPhonex used to send was always refused.
GET /v1/numbers/{number_id}/activationno longer reportsattach_identity_to_numberas a blocking item: an item that could never have been cleared and would otherwise have stayed on your list indefinitely.- How the carrier learns who the end user is
Regulated numbers in document-free markets are ordered first
GET /v1/numbers/requirementsreturnscarrier_proof_requirement, one ofnone,requiredorunknown, alongsideregistration_required.- Where it is
nonethe carrier lists no end-user document for that market, so it can never mark your identity verified before the number exists. OpenPhonex orders the number first instead of waiting for a verdict that cannot arrive. - Every other market keeps the previous path: the carrier's verdict is waited for exactly as before, and
unknownis treated asrequired. - Markets with no documents are ordered first
A number request in a metered market now quotes a real inbound price
- In most regulated markets the carrier prices inbound minutes against a shared capacity plan rather than against the number, and before purchase there is no number to price — so these requests previously could not reach a final quote.
- Every managed OpenPhonex number is provisioned onto one standard metered capacity plan, so
quote_summary.source_breakdown.traffic_ratesnow names inbound voice with acustomer_pricetaken from that plan. - That price is what OpenPhonex charges you per inbound minute on that plan. It is not a carrier quotation for your number: what you are billed is derived when a call is admitted, from the activated number's own carrier record.
- The inbound rate the quote is based on
An incoming call rejected before it connects now says why
- An incoming call can reach OpenPhonex and be rejected before your AI agent answers. When the called number identifies your workspace, that attempt now appears in Calls with its time, direction and a customer-readable reason.
- Missing pricing for a managed number reports
carrier_rate_missingrather than looking like a caller who hung up; a rejection at admission reportsinbound_admission_rejected. Repeated delivery of the same carrier call does not create another attempt. - Each number now carries
calling_readinesson the Numbers dashboard: bounded inbound routing and pricing blockers, and destination-dependent outbound configuration. It stays indeterminate where the call-time admission checks were not evaluated — a purchased number is not proof that calls can connect. - Inbound attempts rejected before connection · Check incoming-call configuration
Overview call amounts and spend totals use the settled charge
- For component-metered calls, Recent calls on Overview uses the same wallet billing verdict as Calls: once settlement is available the amount is the settled charge, not the larger amount reserved at admission.
- Released holds show as Released and count as nothing; reservations awaiting usage stay explicitly labelled as reserved; a payment-due result separates the amount paid from the amount outstanding.
- Overview spend totals combine settled charges with still-pending reservations and SMS charges. Released reservations and unpaid balances are not counted as settled spend.
- Calls with no component-billing verdict keep the cost calculation they had, so nothing older is restated.
- Call amounts on Overview
Every automatic ending now records its reason
- A call ended by the platform records
ended_reasonon the call and on its terminal webhook; previously that field was left empty on calls the media worker ended, so the reason existed in the event and never reached the record. - The five reasons are unchanged:
hangup_requested,remote_party_disconnected,max_call_duration_reached,no_caller_speech_after_answerandagent_completed. - A call that has not ended, or that failed before connecting, still reports no reason; failures keep reporting through
technical_failure.failure_reason_codeinstead. - Why a call ended
The maximum length and the silence window are per-agent
- Each agent can now set its own maximum call length and its own after-answer silence window, instead of inheriting one platform value.
- An agent that sets neither keeps the platform defaults, so existing agents are unchanged.
- A call ended by either rule reports the same reasons it always did,
max_call_duration_reachedandno_caller_speech_after_answer, so nothing downstream needs to change. - When a call ends automatically
A call the agent finishes now says so
- A call the agent ends itself — its script reaches a goodbye, or its workflow completes — now reports
ended_reasonagent_completed, where that reason was previously empty. - This is the commonest ending in a scripted workflow, so it closes the largest remaining gap in "why did this call end": before, a conversation that simply finished looked the same as one with no reason recorded at all.
- The four platform endings are unchanged and keep their own reasons;
agent_completedis never reported for a hang-up, a call that hit a limit, or a call that failed before connecting. - Why a call ended · When a call ends automatically
Outbound calls and Simulations Lab runs need nothing installed
- One hosted dialer places every managed outbound call and one hosted runner drives every real-time Simulations Lab session, for every workspace: there is no worker to run, no worker key to install and no gateway deployment to register before
POST /v1/callsworks. - Each job's workspace, project, agent, caller number and destination are read from the call record itself, and every room's metadata and evidence receipts stay bound to the workspace and run that asked for it.
- A workspace that runs its own self-hosted gateway in queue mode keeps dialing through that gateway; what outbound depends on is your outbound authorization, not any setup of your own.
- A gateway token minted without an explicit
scopeslist now carries onlygateways:reportandcalls:authorize;selfhost-bootstrap.shand the workspace's Gateway Tokens action request the full runtime set instead, and tokens that already exist keep the scopes they were stored with. - Hosted workers hold no workspace credential · Deployment modes · Simulations Lab · Outbound authorization
8 September 2026
Calls that end themselves
- OpenPhonex now ends a live call on its own, so a call cannot run unattended against your balance, when: nobody left on the call, 29 minutes reached, or nobody heard for 20 seconds after answer, reported as
remote_party_disconnected,max_call_duration_reachedandno_caller_speech_after_answer. - A caller who leaves is now noticed even when the network never says so: the media server is asked who is on the call every 15 seconds, and a call empty for 15 seconds continuously ends.
- All three values are platform-wide and cannot be set per agent yet. A call ended by a rule is billed exactly like any other completed call, and ends sooner, so it can only cost less.
- An ordinary hang-up by the other party is now reported as
remote_party_disconnectedon the call detail and in thecall.completedandcall.endedwebhooks, where that reason was previously empty. - When a call ends automatically
End a live call, and see why a call ended
POST /v1/calls/{call_id}/hangupasks a call that is already live to hang up; it answers202withhangup_requested_atand never reports the call as ended, because the media session is torn down separately and the call then completes through its ordinary path.- Asking twice returns the original request rather than starting a second teardown, and an unacknowledged request stays visible so a request nothing acted on is something you can see.
- A call still queued for origination is refused with a pointer to
POST /v1/calls/{call_id}/cancel, which remains the right tool before anything dials. - A completed call now carries
ended_reason:remote_party_disconnected,hangup_requested,max_call_duration_reachedorno_caller_speech_after_answer. It is empty on calls that completed before this shipped, and a failed call still reportstechnical_failure.failure_reason_codeinstead. - End a call that is still running · Why a call ended · Customer REST operations
Carrier verification progress reaches your number request on its own
- A business profile whose identity is with the carrier is now re-checked on a schedule instead of only when someone presses Sync, so progress is picked up without anyone watching for it.
- Your number request moves to the state the carrier check actually implies in the same pass, so a request no longer sits on "awaiting verification" while the carrier already has the identity.
- When the carrier verifies the identity, the request continues from there without an operator step.
- Customer REST operations
Post-call extraction runs without being asked twice
- An agent with an active extraction schema now has its calls extracted automatically: the extraction worker is a deployed role, so
call.post_call_extractionwork is claimed as it is queued instead of waiting for someone to run it. call.extraction.readyandcall.extraction.failedwebhooks fire for those calls, so an integration that derives an outcome from them stops seeing silence.- Calls that queued before this release are extracted too, oldest first, as long as their transcript is still retained.
- Extraction remains opt-in per agent, and nothing changes for an agent without a schema.
- Optional post-call extraction · Configure an event endpoint
Transcript confidence is a measurement, or nothing
GET /v1/calls/{call_id}/transcriptreturnsconfidence: nullfor a turn whose speech recogniser reported no confidence, instead of the fixed placeholder every turn used to carry.- Deepgram reports a real per-utterance confidence; Azure does not report one at all, so calls on an Azure recogniser return null for every turn.
- Turn boundaries (
start_ms,end_ms) are now the measured ones. A turn nothing measured has an equal start and end rather than an invented length. - Read call evidence
A longer endpointing hold, and per-agent thresholds in every language
- Agents in a language with no trained turn detector now hold 800 ms after the caller stops speaking before treating the turn as finished, replacing a 200 ms-era default that could end a turn during a mid-sentence pause.
min_speech_msandsilence_hold_msare explicit numbers and now apply in every language, overriding any sensitivity preset and the platform hold.- A
min_speech_msbelow the 500 ms interruption floor is raised to it on a phone call, because shorter bursts of background noise were cutting agents off mid-word. interruption_sensitivityremains English-only, because a preset is a name for a measurement taken on English audio; set the two explicit values instead on an agent in another language.- Interruptions and barge-in
7 September 2026
Simpler workspace capabilities and optional destination restrictions
- Open Capabilities to see available destinations first, followed by channels, effective call limits, and explanations of voice spending, wallet spending and simultaneous calls.
- Add optional country restrictions for outbound calls and SMS; removing them restores only destinations already available to your workspace.
- Request higher limits from the page without changing caps, prices or wallet funds; higher-limit requests still go through operator review.
- Syria is no longer blanket-blocked by OpenPhonex; carrier availability, number rules, pricing checks and other applicable safeguards still apply.
- Destination controls · Workspace limits
Import a campaign contact list from an Excel workbook
- The campaign wizard's contacts step now accepts a CSV or an
.xlsxworkbook; both are read in your browser and post the same rows toPOST /v1/contact-lists, so the two produce identical lists and per-row reports. - Date and number cells arrive as the text the sheet displays, not an Excel serial number or a rounded float — keep an account reference or a phone number in a text-formatted column.
- Every contact list now records a
source(api,csv,xlsx, ormcp) so you can see how its rows arrived. - Contact lists · Build the list
Several obligations per contact, a payment reminder that reads contact variables, per-contact languages
- A contact variable may be a list of flat objects (one debtor, several loans): at most 16 items of 16 keys, string or number values, within the same 4 KB row budget. The workspace wizard groups several CSV rows per phone number into one contact's
obligations(Several rows per phone number). - A conversation workflow speaks a list only through a section you author in a disclosing step (
{{#obligations}} … {{/obligations}}), once per item, in your own words; the all-or-nothing rules extend to lists. - New starter template Payment reminder from contact variables (
payment_reminder_variables): the payment reminder whose one read tool is served from the campaign contact's own variables, with the same verification-before-disclosure gate and no customer endpoint. - Each contact's
languageis the language its calls are made in (the campaign'slanguageis the default); a contact whose language the AI agent does not publish endspre_dial_failedwithskip_reasonlanguage_not_published, and a contact with no language on a multilingual agent endslanguage_required. - Contact lists · Languages · Several obligations on one account
Campaign results with business outcomes, and a review inbox
- The results export (
GET /v1/campaigns/{campaign_id}/export) keeps its columns and appends the last call's business outcome: the workflow outcome and its label, the interrupt that ended the call, the post-call extraction status and oneextraction.<field>column per field of the AI agent's extraction schema, and whether a recording and a transcript exist;GET /v1/campaigns/{campaign_id}/resultsis the same as JSON. - The review inbox lists the attempts whose workflow asked for a person (promise to pay, already paid, dispute, hardship, callback, language request, wrong party) with the call's evidence inline; a reviewer resolves each with a note (
POST /v1/campaigns/{campaign_id}/reviews/{attempt_id}/resolve, audited, one resolution per attempt) and exports the resolved set (GET .../reviews/export). - The workspace shows Review inbox (N) on every campaign; the inbox filters by state, outcome and language, plays the recording, links the transcript and shows the extracted fields.
- Campaigns · Review inbox · Post-call results
Campaigns open to every active workspace
- Campaigns and authorized application batches are part of what every active workspace may do; the per-profile switch
campaigns_allowedand the launch reason codecampaigns_not_in_profileno longer exist. - A call sent with
bulk: true, your own batch label ascampaign_idand auser_authorization.authorized_byis an ordinary authorized call on any active workspace; a batch without an authorizer or with an unknown relationship is still held, and the custom implementation-services profile still sends every launch and batch to an operator (needs_review.custom_always_review). - The campaign wizard's review step previews each launch check — sanctioned destinations, workspace state, voice, your destination allowlist, purpose, consent basis, operator review — and says how many days a list takes under the tighter of your daily call cap and unique-destinations cap.
- The Capabilities page shows a Campaigns row and labels every cap in force, including operator-set spend caps.
- Launch a campaign · Campaigns · Policy & outbound · Authorized application batches
6 September 2026
Capabilities
- The workspace outbound permission record is now called capabilities across the API, the MCP tools and the workspace, with no compatibility aliases:
GET/POST /v1/organizations/{organization_id}/capabilitiesandPOST .../accept-policyreplace theoutbound-permitroutes,get_capabilities/request_capabilitiesreplace the permit tools, the response key iscapabilities, and authorization decisions carrycapabilities_snapshotand the reason codechannel_not_enabled. - Every workspace has exactly one record from the moment it is created (
not_activated), and activation is automatic through both trust doors — an operator approving your business verification, or your first registration-free number — granting the default profile with its caps, the channels your workspace holds, and every destination except sanctioned countries; the states arenot_activated,pending_review,activeandsuspended. - A request must choose its destinations:
all_countries: true, or at least one country code; an unrecognized entry is refused by name. - The Capabilities page in the workspace shows the record, the caps in force, usage and open reviews, and takes requests with a searchable destination picker; calling rules attached by an operator are returned as
calling_ruleswithcalling_rules_active, andmetadata.operational_profileis gone. - Your workspace capabilities · API reference · Tool reference
Destination countries required for the outbound permit
- Requesting or replacing the outbound permit now requires at least one destination country; an empty or unrecognized list is refused instead of authorizing every destination.
- The three outbound permit routes (
GET/POST /v1/organizations/{organization_id}/outbound-permitandPOST .../accept-policy) are documented in the API reference. - Outbound permits · API reference
Outbound permit
- The self-serve outbound permission, formerly called the risk envelope, is renamed across the API, MCP tools, and the workspace, with no compatibility aliases.
- Read or request it at
GET /v1/organizations/{organization_id}/outbound-permit, or through theget_outbound_permit/request_outbound_permitMCP tools. - Request and track your permit from the Onboarding page: choose one or more use-case profiles, the channels you need, and destination countries, then accept the outbound policy.
- Approval is instant once business verification (KYB) is complete; adding the custom implementation-services profile always goes to operator review.
- Request your outbound permit · Tool reference
Delivery and acknowledgements controls in the agent editor
- Delivery profiles and acknowledgements, previously API and MCP only, now have full controls in the agent editor.
- Inside Voice stack, a chooser under each voice offers Provider default and the four delivery profiles, each labelled with what it changes and audible on the same Listen preview a call uses.
- Acknowledgements gets its own section: an on/off switch, up to six phrases of your own, a delay from 0.6 to 3.0 seconds, and a preview in your agent's own voice.
- Both controls stay off or unset for every agent until you change them.
- Choose a delivery profile in the editor · Switch on acknowledgements in the editor
Self-serve outbound campaigns
- Upload a contact list, set calling windows and a retry policy, and launch an agent at your own customers or consented contacts, without an operator.
- The four-step wizard checks column mapping, calling hours and the cost estimate before launch.
- Every campaign call clears the do-not-call register when placed and again when the agent starts talking.
- Cold sales and telemarketing still go through operator review.
- Read Campaigns · Build your do-not-call register
Edit a launched campaign, and export results
- A scheduled or paused campaign can now be edited without cancelling it, in the workspace or through
PATCH /v1/campaigns/{campaign_id}and the MCPupdate_campaigntool. - Editable fields include caller IDs, calling windows, retry policy, concurrency, and end date; the start time is editable only while still scheduled.
- Duplicating a campaign now opens the copy in the wizard instead of a fresh blank draft.
- Export CSV downloads every contact's status, disposition, attempts, and call outcome for a run.
- Edit a campaign · Export campaign results
Campaigns page loading again for every workspace
- Opening Campaigns briefly returned "This page could not be loaded" for every workspace instead of the dashboard.
- The cause was in the workspace shell's page loader, not in campaign data or configuration.
- No campaign, contact list, schedule, or call was affected, and the API, MCP tools, and webhooks kept working throughout.
- The page loads normally again.
- Read Campaigns
Auto multilingual: follow the caller across every supported language
- Auto multilingual in the agent editor now offers All supported languages alongside Selected languages only.
- The API carries the same choice:
follow_caller: {"enabled": true, "scope": "all"}onPATCH /v1/agents/{agent_id}/voice-stackor the MCPset_agent_voice_stacktool. - This resolves every language your selected transcriber and voice actually support, instead of listing them one at a time; leaving
scopeunset keeps an agent's existing selected-languages behavior. - The accepted set still comes from the real call configuration, not every language any provider advertises anywhere.
- A transcriber's simultaneous-candidate limit can still refuse an "all" publish that is too large — choose a smaller set or another transcriber.
- Configure Auto multilingual · Follow the caller across languages
Tool-wait feedback: what a caller hears while a slow tool call runs
voice_polish.tool_waitfills the wait during a slow integration action, knowledge search, or webhook.- Choose
off(default, not stored),sound(a quiet looping keyboard-typing bed, wordless in every language), oracknowledge(a short reviewed phrase in the agent's own voice). - A delay from 0.6 to 3.0 seconds controls how long a tool may run before feedback starts; most tools finish inside it and the caller hears nothing.
- The control lives in the agent editor's Voice & behaviour page, next to Acknowledgements, with Hear the phrase and Hear the typing sound previews.
- The Calls page now shows a Tool waits section on call detail, listing the setting the call ran with and each start, cut, or skip with its reason and offset.
- Turn on tool-wait feedback
5 September 2026
Delivery profiles for agent voices
- An agent's voice can now perform its speech in one of four ways:
natural,lively,calm, orprecise. - Set
voice_polish.deliveryonPATCH /v1/agents/{agent_id}/voice-stack, through the MCPset_agent_voice_stacktool, or per request onPOST /v1/voice-previewsto hear a profile before saving. - Each profile drives one allowlisted control per provider and model, and the preview response reports what was actually applied.
- Leaving
deliveryunset keeps the provider's own defaults, so an agent that never chooses a profile sounds exactly as before. - Fish and Azure voices accept and store a profile but do not change their audio yet.
- Choose a delivery profile · Hear it before you save
Acknowledgements while a slow reply is prepared
- An agent can now say one short phrase in its own voice while a slow answer is still being written, instead of leaving the caller in dead air.
- Enable
voice_polish.acknowledgementsonPATCH /v1/agents/{agent_id}/voice-stackor the MCPset_agent_voice_stacktool, with up to six phrases of your own and a delay of 600 to 3000 ms. - The phrase plays on its own audio track and is cancelled the moment the real reply or the caller starts, at most once per turn and never during a goodbye.
- It is off unless you enable it, is not a transcript line, and a language with no reviewed phrases stays silent rather than falling back to English.
- Turn on acknowledgements · Set the delay and phrases
4 September 2026
Ten numbers and ten simultaneous calls on pay as you go
- PAYG now includes an allowance of 10 billed phone numbers and 10 simultaneous live calls per workspace; number rental and call usage remain separately charged.
- Contact us for higher capacity.
- Numbers, Billing, and number checkout show your billed-number usage and remaining allowance before you order.
- Changing a use-case profile no longer changes your concurrency limit; explicit operator limits, available funds, rate limits, and carrier capacity still apply.
- Check your workspace allowance · Open Phone numbers
3 September 2026
Grant bundles and a scope catalogue for API keys
- A workspace API key's
scopescan now name a grant bundle —all,all-read, orall-write— instead of listing every scope by hand. - A bundle is stored on the key by name and expanded against the live scope catalogue at use time.
- A scope added later is covered automatically, with no need to reissue the key.
- No bundle ever yields an operator-only or specialized-principal scope, and existing keys minted with an explicit scope list are unchanged.
GET /v1/api-keys/scopesreturns each bundle's current expansion, every customer-grantable scope by namespace, and the operator-only scopes no workspace key can hold; the workspace API Keys key-creation dialog reads from the same endpoint.- Mint a key with a grant bundle · Read the grant catalogue
2 September 2026
Actionable technical evidence for failed calls
- Failed calls now carry a bounded, versioned
technical_failureobject in signed lifecycle results,GET /v1/call-results, and the Calls workspace. - It identifies an allowlisted terminal status, reason, and failure stage without exposing raw provider errors, SIP headers, transcripts, phone numbers, credentials, or stack traces.
- OpenPhonex reports
no_answeronly when a durable ringing-timeout event proves it. - Historical or unclassified failures remain explicitly unknown instead of being reinterpreted from call duration or current configuration.
- Read post-call technical evidence · Inspect call evidence
More reliable spoken endings and call evidence
- Affected ElevenLabs v3 dialogue voices now use a streaming synthesis path that preserves the audible decay of final words, instead of the provider websocket path that clipped every turn.
- Other providers and ElevenLabs' regular low-latency websocket remain on their existing transports.
- Terminal farewells now finish their bounded playout and evidence handoff before the worker seals the call, and stored agent clips end at the last audible room audio.
- Room-disconnect teardown is bounded so usage, evidence, lifecycle, and cleanup can finish instead of leaving an otherwise completed call orphaned.
- Choose and preview a voice · Understand call evidence
Multilingual calls continue after a language switch
- An applied language switch now keeps the call's shared simultaneous recognizer attached, so the agent continues hearing the caller after changing its spoken language.
- Applied switches and out-of-set refusals both produce a spoken next turn rather than leaving the caller in silence.
- Structured switch evidence is preserved after the call.
- Configure Follow the caller · Read language-switch evidence
1 September 2026
Audio environments for agents and simulations
- Add an optional version-pinned ambience to an agent's outgoing audio, or give an adaptive-voice simulation a separate caller-side noise condition.
- The five initial environments are quiet office, call centre, cafe, street, and television; Off is the quiet baseline.
- Agent output volume and simulated caller noise level remain independent controls.
- The same catalogue and configuration are available through the public API and MCP, and voice previews preserve your selected language and text while applying the chosen ambience.
- Configure audio environments · Test noisy callers in Simulations Lab
Offline adaptive-voice simulations
- Hosted Simulations Lab can now run the offline adaptive-voice runner for supported agents, generating and transcribing caller audio to test recognition robustness, including the caller-noise environments above.
- Offline adaptive voice now supports both eligible Deepgram-based stacks and an Azure-pinned Speech component.
- Azure tests keep that pinned transcription or synthesis provider, use the selected language's exact locale, and never fall back to another provider.
- This mode still does not prove LiveKit room timing, barge-in behavior, or teardown timing; those require a realtime-room validation path.
- Use Simulations Lab
31 August 2026
Follow the caller across languages
- One agent can use several published languages, with a shared voice and optional language-specific voices and greetings.
- Follow the caller adds controlled switching within that set during supported browser tests and phone calls.
- After call evidence arrives, call details distinguish applied language changes from rejected or failed attempts.
- Follow mode requires a compatible shared transcriber; workflow-bound calls remain fixed-language, and detection and explicit switch requests depend on the configured provider.
- Configure multilingual agents · Read call evidence
Microsoft Azure AI Speech voices
- Azure AI Speech joins the voice providers available in the library.
- Browse its voices and locales, audition text, and select a supported voice for your agent.
- Provider credentials and the selected voice's capabilities still determine availability.
- Explore the Voice Library
Agent configuration and simulation runs through MCP
- MCP clients can configure agents and voice stacks, discover voice choices, and preview voices with the appropriate permissions.
- You can also author simulation suites, preview a run's cost, start supported runs, and read their results; suite execution is now accessible from the agent workspace as well.
- Deterministic and adaptive-chat tests are available.
- Adaptive-voice testing is not enabled in the hosted service at the time of this roundup; check the supported runners returned by the run preview before starting a suite.
- Connect through MCP · Use Simulations Lab
30 August 2026
Pay as you go, with browser-testing credit
- PAYG has no monthly platform subscription.
- Eligible customers receive a one-time USD $5 browser-testing credit, separate from purchased funds.
- Phone calls, SMS, and phone numbers still require purchased funds and incur their applicable charges.
- Understand billing and browser credit
A larger, provider-backed Voice Library
- Browse provider-backed voice inventories with combined language, accent, character, and provider filters; search and pagination let you explore larger catalogs without loading every voice at once.
- A voice is grouped with its supported model choices instead of being repeated for each model.
- Cartesia Sonic 3.6 is among the supported provider choices, and you can audition your own text.
- Provider inventory refreshes retain the previous successful catalog if a refresh fails, a removed voice is not silently replaced on saved agents, and availability depends on the provider and account configuration.
- Browse and audition voices
Published multilingual profiles
- Choose several languages on one agent and select a published starting language for each call.
- Share the agent's instructions, tools, and knowledge while using language-specific greetings and optional voice overrides.
- Calls keep their admitted configuration even if the agent is edited later.
- Set up language profiles
26 August 2026
Simulations Lab: repeatable agent tests
- Create caller scenarios against a pinned agent version and inspect transcripts and rule-based results.
- Use deterministic checks for exact behavior, or adaptive chat for a model-generated caller.
- Simulation-only tool fixtures keep these tests separate from real customer actions.
- Adaptive runs have provider costs and explicit budgets.
- Create a simulation suite
Customer-owned DIDLogic accounts
- Imported, customer-owned DIDLogic accounts can be used with hosted agents while the carrier continues billing the customer directly.
- OpenPhonex bills its applicable agent components without charging that externally billed carrier usage to the workspace wallet again.
- Understand deployment and billing ownership
25 August 2026
Locally initiated calls from self-hosted gateways
- Self-hosted gateways can initiate admitted outbound calls with their deployment-bound credential, without requiring a broad workspace API key.
- Workspace policy, authorization, and billing admission still apply.
- Choose a deployment mode