Release log
Major Skysay 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.
27 October 2026
AI agents can check phone-number coverage
- Attach the built-in
get_phone_number_coveragetool and an AI agent can answer questions about the countries Skysay supports phone numbers in during a call. - Read Skysay phone-number coverage during a conversation
No Eleven Realtime minutes without a conversation
- An Eleven Realtime call whose ElevenLabs conversation never starts is not charged any Eleven Realtime minutes, and a voice that cannot be prepared fails within seconds instead of holding the line.
- Eleven Realtime
Estonian and Finnish phone menus
- Phone menu navigation now also works in Estonian and Finnish menus, on a best-effort basis; a keypad value is not given in them yet.
- Phone menu navigation: languages
The OpenAPI spec lists only customer operations
/openapi.jsonnow publishes the 220 operations customers call and leaves out internal routes; no route changed behaviour.- OpenAPI · API reference
Phone menus hear the line's language
- On a call with no keypad value to enter, phone menu navigation hears menus and people in any language Deepgram's multilingual mode covers, and a key choice cut off by a menu that keeps talking is asked again once the line is quiet.
- Phone menu navigation
Duplicated AI agents keep their saved settings
- Duplicating an AI agent copies its saved settings exactly as saved, even ones today's defaults would set differently. Duplicate a saved configuration
26 October 2026
Eleven Realtime is available to every workspace
- Eleven Realtime is now a conversation engine any AI agent can choose, billed at a flat $0.15 per connected minute, with the ElevenLabs voices in the voice library.
- Conversation engines · Voice library
Workflow agents reply sooner
- A workflow agent passes on the caller's words as soon as speech recognition finishes, and reuses its connection for each line, so its replies start about a second sooner.
- Agent workflows
Phone menus in every transcribed language
- Phone menu navigation works in every language the agent's transcribers cover, instead of a fixed list of menu languages.
- Phone menu navigation
Simulations Lab says why a voice test can't start
- When a Simulations Lab voice test can't start, the lab now explains why.
- Simulations Lab
Workflow calls no longer end over a line that never played
- A repeat of an unheard workflow line now counts toward the limit only if it actually began playing; a caller saying "Hello?" while the agent is still preparing its reply no longer ends the call.
- A caller who keeps talking over lines that did play still ends with
ended_reasonworkflow_line_undelivered, so a recording on the line is not answered forever. - When a workflow line is not delivered
Workflow agents follow the navigation hint in phone menus
- A workflow agent that reaches a phone menu now chooses with the call's
navigation_hint, as other agents already did, instead of choosing without it. - Phone menu navigation
Simulated test calls are not summarized
- A simulated test call, such as one placed with
POST /v1/web-calls, gets askippedsummary withreasonno_conversation, because its transcript is sample text rather than anything said. - Read it
Campaign results you can filter, export and act on
- The campaign page has four contact tabs and a Result column that shows each contact's answers to your AI agent's result fields, read from their last call.
- Click a call outcome or a result answer to show only those contacts; Export CSV then downloads exactly the rows the table shows.
- From the review inbox you can add a number to your do-not-call register in one step.
- On the campaign page · Export results · Review inbox
Test a draft campaign with one call, and delete campaigns
- Call one contact now on a draft places one real, billed call to a contact from its list, with the campaign's AI agent, caller ID and that contact's own values; through the API it is
POST /v1/campaigns/{campaign_id}/test-call. - You can delete a campaign that can no longer place calls; its calls, recordings, transcripts and billing records stay, and your do-not-call register is unchanged.
- Test call on a draft · Delete a campaign
A clearer campaign wizard and Calls page
- The wizard's Import check shows, before launch, how many contacts are on your do-not-call register and which of the list's languages the AI agent has not published.
- Retries start from a preset (sales, collections or single attempt), with one line per outcome saying how many attempts it gets.
- The Calls page filters by campaign, and a call that has not been dialed yet can be cancelled from its detail with Cancel call.
- Launch a campaign · Filter calls by campaign · Cancel a call that has not been dialed
Ask steps take the route you wrote for the reply
- On a workflow Ask step, a reply such as "I've already paid" now takes the route you wrote for it, instead of being treated as a dispute.
- The dispute, hardship, callback and human-request interrupts are weighed against the step's own routes as one choice; wrong party, cease contact and language change still take priority over any route.
- The canvas
Workflow calls end truthfully when a line is not heard
- If the caller keeps speaking over a step whose line they never heard in full, the step is spoken again at most twice, and the third time the workflow stops instead of repeating the line.
- These calls, and GPT-Live 1 calls whose line was not said in full, end with
ended_reasonworkflow_line_undeliveredand afailedworkflow, never as if the caller hung up. - When a workflow line is not delivered
Skysay in Italian
- The website and workspace are available in Italian: choose Italiano in the language selector or open the Italian homepage directly.
- Italian customer notification emails follow the account's saved locale, and the homepage offers its three public demos in Italian.
- Website language and public demos
24 October 2026
Workflow calls report a listener failure truthfully
- When a workflow agent's speech listener fails while the caller is on the line, the call now ends with
ended_reasonlistener_unavailableinstead of reading as if the caller hung up. - The workflow still shows as
incomplete, and anything the caller said that the listener never delivered is missing from the transcript, so check the recording before calling the contact again. - When a workflow's listener fails
A free AI summary of every call
- After a call's transcript is stored, Skysay writes a short AI summary: what happened, whether a follow-up is needed, whether the agent's goal was met, and the other party's sentiment.
- Summaries are on for every AI agent and free; you can turn them off for one AI agent in its After the call section.
- Read them on the Calls page or through
GET /v1/calls/{call_id}/summary; every field is an AI estimate, and Skysay never acts on it. - Call summaries · After the call
Spoken workflows keep every word the caller says
- A spoken workflow call no longer drops caller audio when its listener falls behind: up to 10 seconds is held and delivered in order.
- If the backlog would pass 10 seconds, the call ends as a capacity failure instead of carrying on with missing speech.
- Spoken workflow calls
23 October 2026
GPT-Live workflow lines count only when spoken in full
- A GPT-Live 1 workflow line now counts as spoken only once the caller has heard all of it; if the model pauses mid-line, Skysay waits up to 3 seconds for the rest.
- A line the engine does not finish before the end of the workflow ends the call as a workflow failure, so the caller never moves past a question they did not hear.
- An unfinished closing line still ends the call as
agent_completedwith the recorded outcome and is left out of the transcript. - How the lines are spoken
GPT-Live confirmation read-backs speak only the request
- A GPT-Live agent asking the caller to confirm an action now speaks the read-back itself, never the instructions around it.
- A refusal such as "no, thanks" is always taken as a no, never as a neutral goodbye.
- What the caller experiences
Agents confirm business actions before they run
- Bookings, messages and callback requests are writes: the agent reads back exactly what will change and acts only after the caller says yes.
- A no, silence, a hang-up or a second unclear reply never approves a write, and changed details need a new read-back.
- An answer counts only once the caller has heard the read-back, so an "okay" while it is still playing approves nothing.
- A yes or no spoken in pieces or followed by "thank you, goodbye" is understood correctly, and after a decline the agent says truthfully whether anything was saved.
- Confirming business actions · What the caller experiences
Email alert when an incoming call cannot be funded
- When an incoming call is refused for lack of available purchased funds, Skysay emails the workspace's verified active owners.
- The email shows available and reserved funds at the attempt and links to Billing; it never includes the caller's number, audio or a transcript.
- At most one alert is sent per workspace in 24 hours, and none if the funds would now cover the call.
- Incoming calls blocked by insufficient funds
22 October 2026
Duplicate and delete AI agents
- Use Actions in the AI agents list, its details panel or the AI agent editor to Duplicate AI agent or Delete AI agent….
- A copy is independent, stopped and unpublished, with its own connection and signing secret; numbers, routes, campaigns and call history are not copied.
- Deletion first lists what still uses the AI agent, such as a number, route or unfinished campaign; calls, transcripts and billing records are kept.
- Through the API, use
POST /v1/agents/{agent_id}/duplicate,GET /v1/agents/{agent_id}/deletion-checkandDELETE /v1/agents/{agent_id}, or the matching MCP tools. - Duplicate and delete AI agents · API and MCP
Faster number-rules sync and exact activation checklist totals
- A self-hosted gateway's number-rules sync now costs the same three database reads however many numbers the workspace holds.
- A number with a broken provider-account or end-user link is now routed instead of failing the whole number-rules document.
GET /v1/activation-statenow reads counts instead of whole lists, so long SMS threads no longer slow it down.- Every
metricsvalue is now an exact total;number_requestspreviously stopped at 100. - Credentials for a self-hosted gateway · Activation checklist
A dropped Gemini Live connection is no longer billed while it closes
- When a Gemini Live connection drops mid-call, billing now stops as soon as the drop is detected, not up to about 10 seconds later when the connection finishes closing.
- A connection that fails while it is still being opened is still billed until it closes.
- Billing
21 October 2026
Azure realtime listener on spoken workflows hears callers again
- Spoken workflows using the Azure realtime listener were refusing the caller's first turn, so the call ended before the workflow could continue.
- The listener now returns the caller's words again, in English and in Sinhala, for a workflow that listens for one language.
- Which voices and listeners a spoken workflow accepts
Protected call variables on GPT-Live workflows
- A GPT-Live agent with a published workflow can now hold protected call variables, as a Cascade workflow already could.
- The live session only speaks the lines the workflow releases, so a protected value reaches the caller only after the confirming step.
- A GPT-Live or Gemini Live agent without a workflow, and any Gemini Live agent, still refuses protected variables with
PROTECTED_FIELD_ON_LIVE_ENGINE. - Protected variables · Agent workflows
Spoken workflows accept every language their listener and voice support
- A spoken workflow call is now accepted in every language Skysay lists for its listener and voice, and GPT-Live 1 workflows in every language.
- Languages Skysay has run end to end carry a Tested by Skysay badge in the workspace; the badge marks a language, it is never a requirement.
- Through the API,
GET /v1/agent-catalogreturns each workflow listener's and voice'slanguagesandtested_languages. - Which voices and listeners a spoken workflow accepts · Choose how the workflow hears callers
Workflow listeners and GPT-Live lines are charged the seconds Skysay measures
- Deepgram Nova-3, Azure and Soniox listeners, the Soniox voice and GPT-Live 1 workflow lines report no usage of their own, so they are now charged at the seconds Skysay measures.
- Lines charged this way are marked Measured by Skysay in the call's cost breakdown.
- A spoken workflow call now settles when it ends and releases the rest of its hold straight away; a call whose sources measured nothing is not charged.
- Workflow billing · A call has ended but funds are still reserved
One Voice and Tuning setup for calls and workflows
- An agent's listener is now set once, under Voice → Transcriber, and its interruption sensitivity under Tuning → Turn-taking; ordinary calls and workflows share them.
- A workflow's Publish view shows the saved listener, languages, credential source and timing; publishing freezes a copy, so later edits never change a published version or a call in progress.
- OpenAI GPT-Live Transcribe is a new English workflow listener on Skysay-managed credentials, billed by the audio seconds OpenAI reports.
- Through the API, send
voice_setuptoPATCH /v1/agents/{agent_id}/voice-stackwithexpected_voice_setup_revision; a stale revision returns409. - Voice and turn-taking · Configure shared input through the API
Workflows run the agent's knowledge base, calendar and Integration actions
- A workflow's read tool steps can search the AI agent's knowledge base, check calendar availability and run Integration actions that only read data.
- A workflow can book an appointment: the booking is read back to the caller and confirmed before it is made, on Cascade and GPT-Live alike.
- Webhook tools, and Integration actions that change data, still cannot run inside a workflow.
- Tools on a workflow call · Book an appointment
Workflow transfer steps put the caller through to a person
- A Transfer step dials the number in the AI agent's Transfer to a human tool and rings it for up to 25 seconds.
- When the person answers, the caller is connected and the workflow ends as
transferred; if nobody answers or the line is busy, the step's failure route runs. - Browser Talk tests, Chat and Simulations never dial, so use a Phone test to try a transfer.
- Transfer steps · Transfer to a human
Interrupted ElevenLabs and Gemini replies are charged what was sent or reported
- An ElevenLabs reply the caller interrupts is charged the characters already sent to ElevenLabs, as Cartesia, Fish Audio and Azure replies already were.
- Gemini voices are charged the tokens Google reported for each reply; an interrupted reply is charged what had been reported when it stopped, never an estimate.
- A reply the provider rejects, or that is lost to a connection failure, is not charged.
- Speech that is interrupted or refused
An OpenAI connector profile that calls without wallet top-ups
https://api.skysay.ai/mcp/openaikeeps calling enabled but never lists or runscreate_wallet_topup, and refuseswallet:writeat consent.- Each call still needs your approval of its caller, recipient, purpose and expected cost, and normal number readiness and destination policy apply.
- OpenAI connector: calling without wallet top-ups
20 October 2026
Spoken workflows with a listener you choose, and GPT-Live 1 in English
- In a workflow's publish panel, Voice input sets the listener that hears callers: Deepgram Nova-3, Azure AI Speech real-time transcription or Soniox Real-time v5, for the languages each is tested for.
- A GPT-Live 1 agent can now run a published workflow in English, speaking each line in its own wording while the workflow still decides the next step.
- A published workflow keeps its listener: AI generation never chooses it, and a draft with no
voice_inputcannot publish over a version that has one (400). - Azure and GPT-Live run on Skysay-managed credentials only, and Gemini Live still cannot run a spoken workflow.
- Spoken workflow calls · Accepted voices and listeners · Workflows on GPT-Live 1
Interrupted speech is charged from what the voice provider received
- For Cartesia, Fish Audio and Azure voices, a reply the caller interrupts, or that Skysay stops at the end of the call, is charged the text already sent to the voice.
- A reply the voice provider rejects, or loses to a connection failure or timeout, is not charged; when Skysay retries it, only the attempt that succeeds is charged.
- The unit is characters for Cartesia and Azure and UTF-8 bytes for Fish Audio.
- Speech that is interrupted or refused
Gemini Live is billed for the time the call is connected
- A hosted agent on Gemini Live is billed for the time the call is connected to the engine, at $0.023 per minute, including silence.
- While the engine reconnects after a dropped connection, nothing is billed.
- Billing
Transcript permission when an AI client keeps asking you to reconnect
- On a full MCP connection, the consent screen offers Transcripts (
recordings:read) unticked when the app did not ask for it; leaving it unticked grants no content access. - If a transcript request keeps asking you to reconnect, check that the consent screen shows the intended workspace and tick Transcripts before approving.
- Approved access carries over only for the same user, workspace, OAuth client and resource; the read-only connector still offers no transcripts or recordings.
- Permissions, consent and reconnecting
Faster Voices browsing
- Browsing and filtering the voice catalog under Voices is faster.
- Voice library
Imported numbers show the carrier's country flag
- An imported number now shows the flag of the country its carrier reports, including in the Numbers → Import a number screens.
- Import a number you own
Maintenance window on 20 October
- Skysay was in a planned maintenance window from 17:05 to 18:15 UTC on 20 October, about 70 minutes, while workflows were upgraded for spoken calls.
- Spoken workflow calls
19 October 2026
Calendar bookings are read back before they are made
- An AI agent with calendar tools reads the whole booking back in one sentence and books only after a clear, explicit yes.
- An unclear answer gets one "is that a yes?"; any change to the details, or moving on to another slot, means a new read-back.
- Silence, a no or a hang-up never books, and Skysay refuses a booking that arrives within a few seconds of its read-back.
- During a conversation
See what runs on each call
- Tools → What runs on calls shows which tools, knowledge base search, calendar tools and phone menu navigation an AI agent gets on each engine and kind of call.
- When something does not run, its row says why, and a tool an engine cannot run is left out of that call instead of stopping it.
- What runs on calls
Connect and fund a workspace through MCP
- Connect a supported AI client through Skysay's existing email or social sign-in, then choose its workspace and permissions.
- After you grant payment permission,
create_wallet_topupreturns a Stripe checkout link or accepts an approved token from a compatible wallet. - Each top-up still needs your approval of its exact amount and currency; phone numbers, calls and SMS use purchased funds.
- Connect Grok Bot · MCP permissions · Add funds through MCP
Phone menu navigation is on by default for every AI agent
- Every AI agent now answers automated phone menus and waits on hold on its outbound calls, without being switched on; turn it off per AI agent under Tools.
- An AI agent you turned off stays off through every later save, and the editor shows one checkbox, ticked unless you untick it.
- Agents on GPT-Live, or set only to Estonian or Finnish, save and publish normally, show why they don't navigate yet, and place their calls without it.
- Hold defaults to 600 seconds and menus to 180; inbound calls are unchanged.
- Phone menu navigation · Turn it off or change its limits · Which agents can use it
A menu read in pieces is answered as one menu
- When a phone menu pauses mid-sentence, for example "To hear these options again," then "press nine", the agent keeps the pieces of that menu together.
- It presses a key only once the menu has finished, choosing among all of the menu's options; this can add a few seconds before the key is sent.
- What the agent does
18 October 2026
UAE mobile numbers on request
- Phone numbers → Get a number → United Arab Emirates now offers a Mobile row marked On request, for businesses only.
- Nothing is charged when you request it; Skysay orders the number by hand, usually in about 15 business days, and asks you for a UAE business address and registration certificate.
- When the number is enabled, the setup fee and the first month ($360.00 in total) are charged from your purchased wallet funds; if the wallet cannot cover it, the number is not enabled.
- Numbers offered on request
A cancelled hang-up no longer leaves a quiet line open
- When the caller speaks during the agent's goodbye and the hang-up is cancelled, the call keeps going and the usual silence check-in applies, on phone calls and browser tests.
- After 30 seconds of quiet the agent asks whether the caller is still there and ends the call 15 seconds later if nobody answers; workflow agents end after 45 seconds of quiet.
- The standing call-ending instruction now tells every agent that a cancelled hang-up is not the end: listen, answer, and end again only when the caller needs nothing else.
- Speaking again during a goodbye · The standing call-ending instruction
See when the agent asked to close a call, and what actually happened
- Calls shows closing receipts separately from the ending: a closing request accepted, a request cancelled because the caller spoke, the close committed, and the close command sent.
- A successful
end_calltool row means the request ran, not that the other person was disconnected; the receipts show the difference. GET /v1/calls/{call_id}/observabilityreturns the same receipts.- Closing requests are not disconnections
AI agents navigate phone menus and wait on hold
- On outbound calls, a Cascade or Gemini Live agent presses keys or answers spoken menus, waits in hold queues and declines callback offers.
- Turn it on under Tools → Navigate phone menus and wait on hold, or with
navigationonPATCH /v1/agents/{agent_id}/voice-stack; hold defaults to 600 seconds and menus to 180. - Menus are navigated in English, German, French, Spanish, Italian, Dutch, Portuguese, Russian and Polish; GPT-Live agents and Estonian or Finnish menus are not supported.
- Pass a
navigation_hintincall_contextto say which options to choose; a call that runs out of menu or hold time ends withivr_timeout. - Phone menu navigation · Turn it on · How these calls end
Connect a DIDWW number you already own
- In Numbers → Import a number, paste one DIDWW API key, pick a number you own and connect it to a published AI agent for incoming calls, outgoing calls or both.
- Skysay creates dedicated SIP trunks and sets credentials, destination and caller ID itself; you keep the number and your DIDWW account, and nothing is ported.
- Skysay shows the number's current DIDWW route and asks you to confirm before changing it; DIDWW still controls verification, outbound permissions and balance.
- Import a number you own · DIDWW: connect with one API key
Calendar booking preview: an AI agent books an appointment the caller confirms
- Connect Google Calendar, Calendly or Cal.com in Integrations → Calendar booking, and an AI agent can check free times and book one appointment the caller confirms.
- Choose a writable calendar or a Calendly or Cal.com event type, the appointment length and the timezone; tokens stay encrypted on the server and never reach the agent.
- This is a preview: each provider needs its own real-account proof, and only providers the platform has configured offer Connect.
- Calendar booking · Connect and select a destination
14 October 2026
Choose an exact number by area code or region
POST /v1/available-numbers/searchandGET /v1/available-numberstake optionalarea_codeandregionfilters, and each row says where the number is.- In Phone numbers → Get a number, the checkout dialog has area code and state fields and offers Refresh list once the list is a few minutes old.
- A number you picked can still be bought after its list snapshot expires; Skysay checks it with the carrier again before ordering.
- Choose an exact number
Carrier requirements are validated before you pay for a regulated number
- For a number that needs registration, Phone numbers shows five steps, from verification details to the number becoming active.
- Skysay approval and a carrier requirement check must both pass before the request asks you to add funds; the check is not the carrier's final approval.
- Workspace owners get an email after the required carrier proofs are submitted for review.
- Validate requirements before funding the purchase
See why a call failed and who acts on it
- Finished calls carry a failure label in one of three layers: telephony, audio and media, or AI agent behaviour, each naming who acts.
- Filter the Calls page by layer or label; campaign pages and each AI agent's overview break failures down the same way.
- Labels apply to calls made from this release on; earlier calls are not labelled.
- Why calls fail · Finding failed calls
Know why an outbound call was refused before dialling
- A call refused before it dials carries a
refusalobject onPOST /v1/calls,GET /v1/calls/{call_id},GET /v1/callsand the MCP call tools. POST /v1/policies/authorize-outboundand theauthorize_outboundMCP tool check both pre-dial gates in order and name the one that refused instage.- Why a call was refused before dialling · Check before you call
Calls no longer sit silent when the agent's opening fails
- If the AI agent's opening fails before anything is heard, Skysay asks for it once more when that cannot repeat or overlap anything.
- If the opening still never reaches the caller, the call ends with
ended_reasonagent_unresponsiveinstead of leaving both sides in silence. - The campaign wizard shows How calls open for the chosen AI agent and warns when a call could start with both sides waiting.
- When the opening never reaches the caller · Create and launch
Phone calls wait through mid-sentence pauses
- On phone calls the AI agent holds longer before replying, so a pause after a name, before a number or mid-message no longer ends the caller's turn.
- Browser tests keep their shorter waits; the agent's voice settings list the seconds behind each preset for its language.
- How long the agent waits
New numbers answer with the right AI agent
- An activated number gets a number rule at once: the AI agent you named, otherwise your only active AI agent, otherwise do not answer.
- A confirmed purchase in a market where Skysay cannot carry incoming calls is refused with 409
inbound_coverage_missing; nothing is created or charged. - Who a new number answers with · Numbers Skysay cannot carry yet
Connect AI assistants with exactly the permissions you choose
- The MCP consent screen shows each permission as a checkbox, including Place calls, and grants exactly what is ticked.
- Connecting the same app again keeps the permissions you already allowed, so tokens issued earlier keep working.
- New MCP tools read contact lists and contacts:
list_contact_lists,get_contact_listandlist_contacts. - Permissions, consent and reconnecting · Contacts tools
Contact time zones accept common spellings
- A contact's or campaign's
time_zoneis matched to the IANA zone it names, soUS/Easternis stored asAmerica/New_Yorkinstead of being refused. - Add contact offers a searchable time zone list and From the phone number; a refused contact keeps the form open with the reason.
- Contact lists · A list's contacts
Know why a number can't send SMS
- Skysay says whether SMS is stopped platform-wide or by the number itself.
send_smsrefuses with 400 and a reason naming the number before anything is stored or charged, and the workspace marks the number as unable to send.- When a number can't send
12 October 2026
Retry a stalled GPT-Live reply once
- GPT-Live calls with
end_callenabled can request one recovery reply when caller input reaches the engine but the engine stops responding. - The model can answer a continuing question or request a hang-up; recovery respects caller and tool activity and keeps the original timeout.
- Recovery is a safety net, not a guarantee that a model responds or ends the call.
- When the agent stops answering
Continue speaking during a Standard agent's goodbye
- When Skysay detects you speaking during a Standard agent's pending goodbye, it cancels that ending and keeps caller input open.
- A later ending needs a fresh
end_callrequest; the canceled request cannot disconnect the continued conversation. - This depends on speech detection, not the word "no"; missed speech and safety limits can still allow the call to end.
- Speaking again during a goodbye · Call-ending limits
Preserve consecutive Standard agent replies in new transcripts
- Consecutive recorded Standard agent replies remain separate transcript entries, even when the caller has not spoken between them.
- Interrupted replies may contain words not heard in full; check playback evidence and the recording before treating text as delivered speech.
- This applies to newly recorded calls; existing transcripts are not repaired by this release.
- What a recording contains
8 October 2026
Recording waveform colours show who was speaking
- The recording waveform in Calls shows audio from the AI side in teal and audio from the other side in purple.
- The colours come from the recorded audio channels themselves, so missing or late captions no longer change them; background sound and echo carry their channel's colour.
- When the source cannot be verified, the waveform stays neutral and says Audio source colors are unavailable.
- Play a recording in Calls
Recover a silent GPT-Live opening after reconnecting
- GPT-Live 1 can retry an initial opening once if its model connection restarts before any response begins, within the existing ten-second start timeout.
- Caller speech, a generated response, tool activity or changed context prevents this recovery; later replies and tool actions are not replayed.
- This applies automatically to agent-first and callee-first openings; no agent setting or API option is required.
- GPT-Live recovery and call evidence
Number requests link to the verification you complete later
- Submitting verification links the request Complete verification started from, and your workspace's other open requests for the same country, number type and business or personal type.
- When more than one verification profile could apply, Skysay does not choose; support links the request.
- Approval moves linked requests to their next check in the same step instead of leaving them at
awaiting_verification. - Where a number request waits
More reliable transcript translation
- Translation requests no longer fail because Skysay rejected a valid translation response from the language model; earlier requests that failed this way can be requested again.
- Temporary provider failures are retried automatically up to three times; a translation that still fails releases its reserved funds and is not charged.
- Translations whose output changes numbers or breaks language checks are refused rather than saved; the original transcript stays readable.
- Translate a transcript · Translation charges
7 October 2026
Recover funds reserved by ended calls
- Ended hosted calls retry delivery of measured usage, settle at their original prices, and return unused reserved funds.
- If trustworthy usage is still unavailable after 24 hours, automatic recovery returns the reservation without charging; active calls keep their reservations.
- Purchased and promotional funds keep their original type, and a late usage report cannot charge a reservation already returned by recovery.
- Ended-call reservations · Usage and ledger
Keep audio when live captions are missing
- Live-call speech keeps its recorded audio when the engine omits a caption, and a known caption gap marks the transcript as partial.
- Late captions are handled more reliably; missing words are never invented, and some provider captions can still be unavailable.
- Read call evidence · Listen turn by turn
Translate older transcripts when needed
- Use Translate or the translation API for any accessible, completed call with retained transcript text, including calls made before translation was introduced; retained SMS supports the same explicit request.
- See the maximum price before requesting a translation; reuse an existing translation without another charge.
- Older conversations remain unchanged until you request a translation; this does not enable automatic translation or start a historical backfill.
- Translate a transcript · Translation API
Read transcripts in another language
- Open a new call’s transcript and choose Original, Translation, or Both; request a missing translation with Translate and see its maximum price first.
- In an AI agent’s Languages settings, enable automatic translation for up to six languages; it is off by default and runs after calls end.
- Calls and agent-associated SMS use your usual balance: $0.02 per 1,000 eligible words per target, with a $0.01 minimum; historical conversations stay unchanged.
- Translate a transcript · Translation charges
5 October 2026
Choose who speaks first on outbound calls
- In Identity, choose whether the agent speaks first or listens at pickup; the silent wait defaults to two seconds.
- The same opening settings apply to Standard, GPT-Live 1 and Gemini Live; ongoing speech holds the opening until the person finishes.
- Live engines retain pickup speech for their first response, and caller speech can cancel a pending hangup so the conversation continues.
- Standard reads a fixed First message as written; live engines follow its instruction, with no guarantee of exact wording.
- Opening settings · Conversation engines
Resume a number request after payment or verification
- Phone numbers shows each request’s status and next action, including Add funds when payment is needed and Complete verification when required.
- Add funds and Complete verification preserve the selected request through Billing and verification; completing either step does not claim the number is active.
- Number request status · Adding funds
4 October 2026
Bounded pages for REST and MCP clients
- Seventeen REST collections now return named item arrays and pagination; existing clients must update their readers before treating a collection as complete.
- Four MCP read tools return size-budgeted results, and collection tools support cursor paging rather than returning an entire growing workspace.
GET /v1/agent-endpointsrequires an explicitlimit; follownext_cursorwhilehas_moreis true, and refuse malformed or incomplete pages.- REST list pages and migration · MCP paging
A new MCP protocol version alongside existing clients
- The hosted
/mcpand/mcp/read-onlyendpoints accept MCP2026-07-28alongside existing handshake-based clients. - A supplied, unapproved
Originnow receives403before authentication; server-side clients without that header keep the existing OAuth discovery response. - MCP protocol and transport
Customer onboarding keeps operator review data private
- Customer onboarding responses no longer expose operators' internal review notes or reviewer identities.
- Operator review screens retain their review data, while customer list, detail and verification views use a customer-safe projection.
- Customer REST operations
3 October 2026
Sign in with the six-digit code emailed to you
- Skysay sign-in now runs on a new account system; enter your email at Skysay sign-in and use the six-digit code we send you.
- Browser sessions from before this update ended, so everyone signs in again once; your existing account and workspaces carry over.
- Sign into your workspace
2 October 2026
Running hosted calls renew their credit reservation
- Component-metered hosted calls try to reserve another five minutes before their funded time runs out, using the call's original prices and exchange rate.
- Configured automatic recharge can help only when the additional reservation is confirmed before the deadline; the existing maximum call duration still applies.
- A connected call that runs out of funded time remains
completedwithended_reason: "funding_exhausted"; final charges still use actual component usage. - Funding a running call · Call ending reasons
Browser tests report startup failures instead of staying live
- Agent browser tests now show a startup failure when the voice worker cannot begin the session, instead of remaining connected without an answer.
- These attempts end with
browser_startup_failed, release their unused reservation, and leave the test controls ready for another attempt. - Test an agent · Read call evidence
1 October 2026
Compare saved voice settings in the Agents list
- Compare saved transcription, language and speech models, or native voice-engine settings, directly in your Agents list.
- Search models and providers, filter by engine, and open agent details while keeping your place in the list.
- Saved settings can differ from the published configuration used for calls.
- Manage agents in the workspace
OAuth and a read-only MCP endpoint
- The hosted MCP service now advertises OAuth discovery and uses Skysay sign-in to request workspace-scoped access.
/mcp/read-onlyexposes workspace overview, agent list and detail, phone numbers, and call metadata; it cannot place calls, send messages, or change workspace records.- Connect with OAuth · Read-only connector
30 September 2026
Catalog additions no longer require publishing your agents again
- Adding a voice or model to the catalog leaves existing published agents ready to call, with their saved selections and prompts unchanged.
- Queued calls keep their reserved configuration; an unavailable or invalid selection still needs correcting before it can run.
- Catalog updates and published agents
Calls held for review are explicitly refused without a wallet reservation
- A single outbound call held as
needs_reviewis never dialled and now emitscall.failedwith failure stageoutbound_authorization. - It reserves no wallet funds and does not count toward your voice spend cap, but still counts toward call-count limits.
- Cancel the held request to clear it, or submit a new request with a known relationship or explicit authorization naming who approved it and why.
- A call held for review · API reference
29 September 2026
Nothing adds a number to your do-not-call register automatically
- A workflow's cease-contact interrupt and an AI agent's Record the call outcome tool now record that the caller asked not to be contacted, for you to review; they no longer add the number to your do-not-call register.
- Only you add numbers, on the Contacts page, by CSV, or through the API or MCP; the numbers you add are still honoured on every outbound path, and entries added automatically before this change keep their source.
- In a campaign, a workflow's cease contact still finishes that contact when it is the last request the caller made.
- A reply to a spoken line that leads straight to a branch is now one choice between that branch's routes and the dispute, hardship, callback and human-request interrupts, so a route you wrote for the reply is taken when it fits better.
- Do-not-call · Do-not-call register · Workflow routing
A call says where its workflow ended
GET /v1/calls/{call_id}, MCPget_call, and thecall.completedandcall.failedwebhooks carryworkflow: the last outcome step reached, whether the workflow issettled, and every interrupt it took, ininterrupts.workflowisnullfor a call that ran no workflow; theGET /v1/callslist does not include it.- To act on a caller who asked not to be contacted, check that
interruptscontains"cease_contact"rather than matching a step id or label. - A campaign contact's
workflow_interruptis now the most recent interrupt the workflow took. - Where a call's workflow ended
A caller who spoke without a caption is marked in the transcript
- On GPT-Live and Gemini Live calls, when the other party spoke and the engine answered without a caption, the Calls transcript shows a "Spoke — no transcript" line where their turn would be.
get_call_transcriptkeepsturnsandtextto captioned speech and adds aneventslist with these moments; the transcript stream places them between turns under their owntype.- Post-call extraction reads a
[spoke, no transcript]line at that point, andturns,text, the stream and extraction all read in the order the Calls workspace shows. - When the other party spoke but has no transcript · What reaches the API and post-call analysis
ElevenLabs v4 Turbo is a choosable voice model
- ElevenLabs v4 Turbo (
eleven_v4_turbo) can be chosen as cascade text-to-speech for English, Spanish, French, German, Italian, Portuguese, Dutch, Russian, Swedish and Estonian. - It is the default for none of them, so existing agents keep their saved voice model.
- It takes stability and similarity only, and costs $0.050 per 1,000 characters.
- ElevenLabs v4 Turbo · Delivery profiles
28 September 2026
Call variables: give each call its own data
- Declare an agent's variables once, write them into its greeting, workflow lines, instructions and SMS templates as
{{name}}, and each call fills in its own values. - Values come from
call_contextonPOST /v1/calls, from a campaign's contact-list columns, from an inbound caller lookup, or fromtest_valuesin Talk and Chat tests. - A
protectedvalue on a workflow agent is said only after the caller shows they are the right person; live engines cannot protect values. - An agent's SMS templates are sent during a call or with
POST /v1/agents/{agent_id}/messages; free text stays allowed unless the agent is templates-only. - Call variables · SMS templates · What changes for existing integrations
Scheduled maintenance windows answer 503 platform_maintenance
- During a short scheduled maintenance window, placing calls, sending SMS, starting tests and changing agents answer
503with"error": "platform_maintenance",retry_after_secondsand aRetry-Afterheader. - Queued outbound calls wait for the window to close instead of failing, and reading anything keeps working.
- A refused request changed nothing, so retrying it after the window is safe; MCP tools are refused the same way.
- Maintenance windows
An edit to an AI agent takes effect on its next call
- An edit to an agent's prompt, greeting, language or voice stack through
PATCH /v1/agents/{agent_id}now publishes the agent in the same step. - Before, such an edit to an already published agent was stored while calls kept running the last published version until the next publish from the editor.
- An edit that cannot be published, such as a greeting its voice cannot speak, is refused and nothing changes; calls already under way keep what they started with.
- Changing an agent later
MCP tool results carry the REST error body, and content needs its scope
- A refused MCP tool call carries the same body the REST route returns, as
structuredContent.error.body, such as the issues a refused config names. - Tool results carry
structuredContentandisError, and every tool lists its required scopes under_meta. - SMS text needs
sms:readand simulation conversation content needsrecordings:readwherever it appears; tools stay callable at their base scope and omit those fields. - Subscribing a webhook to
sms.receivedorcall.extraction.ready, or changing a webhook address, needs the matching content scope. - When a tool call is refused · Content fields · Migration for custom MCP clients
On outbound calls the person says hello first
- On outbound calls on the Standard engine, the agent waits for the person to answer and finish their hello before it speaks.
- After two seconds of silence the agent speaks its opening; a plain hello gets the opening as written, and anything else is answered first.
- Inbound calls, GPT-Live 1 and Gemini Live, workflow calls and browser tests keep the agent speaking first, and there is no setting to change.
- Who speaks first
GPT-Live calls show who spoke when
- On GPT-Live calls, the other person's turns are matched to their speech, so matched turns get speaker colours in the recording player and their own clip.
- A turn that cannot be matched to one stretch of speech stays grey rather than playing someone else's words.
- On Gemini Live calls the other person's turns stay grey for now, because that engine transcribes only after the person stops.
- Play a recording in Calls
A Contacts page for your lists, one person, and the do-not-call register
- Contacts, under Tools & Operations, has three tabs: Lists, All contacts to find one person across every list, and Do-not-call.
- Open a list to search and filter its contacts, add, edit or delete one, append rows from a CSV, and see each contact's latest campaign outcome.
- When a campaign uses the list, the page previews what its AI agent will say to the selected contact, rendered with that contact's values.
- Contacts · Preview
Rename, delete and export a contact list
- Rename a list and the campaigns that use it keep using it; over the API,
PATCH /v1/contact-lists/{contact_list_id}does the same. - Delete list is refused while a campaign that is launching, scheduled, running or paused uses the list, and the page names those campaigns.
- Export downloads the list as a CSV that Import CSV reads back as the same contacts, custom values and consent basis included.
- A contact's consent basis, Existing customer or Explicit consent, is set when you add or edit it, or mapped from a column on import.
- Deleting a list · The API
A call stays open while the engine hears the caller
- The rule that ends an answered call after 20 seconds with nobody speaking now counts the caller as heard by voice, by transcript, or by the engine's own detection.
- On GPT-Live 1 and Gemini Live agents the engine's captions of the caller count, and on Gemini Live the engine starting a reply of its own counts too.
- When a call ends automatically
27 September 2026
A recording player you can seek anywhere
- The recording player in Calls is one waveform you can click, drag or tap anywhere to jump to that moment, even before the audio has started.
- The bars are coloured by who is speaking, the AI agent or the other person, and hovering shows the time, the speaker and the first words.
- A speed button switches between 1×, 1.5× and 2×, and the player shows when a recording is loading or did not load, with Try again.
- Existing recordings were recomputed at the new waveform detail, so older calls show the same player.
- Play a recording in Calls
US, Canadian and UK numbers no longer ask for verification
- Number requests in markets where the carrier registers no end user now go straight to purchase once confirmed and funded. Before, US and Canadian local and toll-free, UK local, mobile, national and toll-free, Brazilian local and mobile, and Dutch and Ukrainian mobile numbers were wrongly sent to verification. The pricing page already showed them as instant.
- A market counts as needing no registration only when every number group the carrier sells there says so; anything the carrier leaves unmarked goes to Skysay review instead.
- The number you chose is checked with the carrier again when it is ordered, however long the request waited. A changed price comes back to you to confirm, and nothing is charged until you do.
- Read the requirement first · Where a number request waits
26 September 2026
Usage history, the full ledger and CSV export in Billing
- Billing → Usage and ledger charts spend for the last 30 or 90 days or 12 or 24 months, grouped into calls, SMS, numbers, recording storage and other charges.
- Select a bar to open that day's or month's entries; call spend is split into the phone line and the AI agent, which always add up to the call spend.
- The ledger lists every wallet entry, filters by type and date, and Export CSV downloads exactly the entries shown.
- Usage history and the ledger
Build and run Simulations Lab suites in the workspace
- A suite's page in Simulations Lab now edits every scenario type the API supports: Scripted, AI caller · chat and AI caller · voice.
- Pass rules & budget sets the pass rate, spend limit per run, retention, draft or published agent, and the baseline run.
- On a run, Cancel run, Rerun failed and Save as regression act without the API; Duplicate suite copies a suite at revision 1.
- Authoring in the workspace · Reruns and regressions
Edit a webhook endpoint's events and URL in place
- In Webhooks, choose Edit on an endpoint to change which events it receives or move it to a new URL, without deleting it and registering a new one.
- Editing keeps the endpoint's signing secret, so your signature check keeps working.
- Over the API, the events and the URL are separate calls:
PATCH /v1/agent-endpoints/{id}for the events, andPATCH /v1/agents/{id}withwebhook_urlfor the URL. - Change an endpoint's events or URL
A faster Voices page with clearer filter names
- The Voices page loads faster, on the first page and when you page through the catalog.
- The filters now read Style (how the voice sounds and speaks) and Good for (what the voice is made for), grouped under Voice character, and the price column reads Price / min.
- Search the catalog
25 September 2026
Outgoing calls wait for a free agent line instead of failing
- When every agent line is in a call as an outgoing call is about to be dialled, Skysay no longer dials it; the call waits in its queue for a free line.
- Waiting spends none of the call's attempts, and your do-not-call register, the campaign's state and the calling window are checked again when it is dialled.
- If no line frees for about ten minutes, the call ends
outbound_capacity_unavailable: it was never dialled and nothing is charged. - Failure reasons · Campaign retries
Agents are instructed to end a call only after a goodbye, a "nothing else", or the wrong person
- The standing call-ending instruction now tells agents to end a call only once the caller says goodbye, confirms they need nothing else, or says they are not the person you are calling.
- Agents are also told to say so and stay on the line when they cannot help, rather than end the call while the caller is still explaining.
- This is an instruction to the model, not a guarantee: an agent can still end a call earlier, and the call still ends when the caller hangs up or it reaches its maximum length.
- The standing call-ending instruction
Gemini 2.5 Flash TTS is retired; English keeps ElevenLabs Flash
- Google Gemini TTS (Flash, preview) is no longer offered for new selections, because it sends each reply as one clip and callers wait about three seconds before hearing anything.
- Agents that already use it keep running, with a warning naming Google Gemini TTS (Flash 3.1, preview) as the replacement.
- Adding a language whose default is Gemini Flash-Lite, such as Polish or Hindi, no longer moves English off ElevenLabs Flash; that language gets Flash-Lite as its own voice.
- Retired voice models · Shared settings and optional overrides
The Voices page opens on All voices
- The Voices page opens on All voices, listing text-to-speech voices first and then the conversation engines; the other two views narrow it to one kind.
- A language with a single stated accent is one Accent entry named for the language, and each filter and row fact carries an icon.
- Search the catalog
Gemini 3.8 Flash-Lite TTS and 55 more call languages
- Gemini 3.8 Flash-Lite TTS (
gemini-3.8-flash-lite-tts) is a new streaming voice option with the same 30 Gemini prebuilt voices, in every call language Skysay runs. - Agents can now take calls in 69 languages; for the 55 added languages, Gemini 3.8 Flash-Lite TTS is the voice.
- It is priced from the full Google price from the start, about $0.051 a minute at the reserve estimate, so the price does not change in January.
- Existing agents keep their saved model and default voices; nothing moves an agent onto Flash-Lite.
- Gemini 3.8 Flash-Lite TTS · Call languages
An agent that stops answering ends as agent_unresponsive
- A call whose agent went quiet while its engine stayed connected now ends with
ended_reasonagent_unresponsiveandreason_detailmodel_unresponsive. model_session_lostnow means only that the conversation engine reported a failure.- A reply the agent held back rather than talk over the caller counts as an answer, so a caller who talks in short bursts is never ended this way.
- Earlier calls reported this ending as
model_session_lostwith the samereason_detail; count that pair asagent_unresponsive. - When the agent stops answering
Incoming calls hear busy when every agent line is in a call
- An incoming call that arrives while every agent line is already in a call now hears a busy signal straight away, instead of ringing with nobody to answer.
- The call is recorded once as failed with
inbound_capacity_reached, and nothing is charged. - A number's rule
fallbackdoes not apply to these calls yet, so they are not forwarded. - Failure reasons
GPT-Live and Gemini Live openings are spoken before the engine listens
- While the opening plays, the engine no longer hears the line, so hold music, an announcement or a quick "hello?" cannot draw a reply before the greeting is said.
- Without an opening message, the engine's own greeting asks for the person by first name only and states no amount, reference or other account detail.
- Skysay keeps listening throughout, so answer detection and the call recording are unaffected.
- Voices, language, and opening
Language following follows a person, not a recording
- After the opening, the agent is told to switch language only when a person speaks to it in another language in a full sentence, or asks it to.
- Music, recordings, announcements and background voices should not change its language; this is best effort, not a lock.
- How language following works
GPT-Live transcripts record every line the agent spoke
- Every line a GPT-Live agent spoke is now a transcript turn, including lines spoken while the caller was still talking, placed where its audio started.
- If a call ends while the caller is speaking, their last words are kept with
metadata.text_statusfinalized_at_close. - Transcripts of GPT-Live calls
Multilingual agents start from defaults that speak every language
- An agent whose voice stack is not saved yet is shown defaults chosen for all of its languages, and the first publish stores the shown transcriber and model.
- English plus Estonian keeps
eleven_flash_v2_5for English and getseleven_v3as Estonian's own voice; you can still chooseeleven_v3for both. - Shared settings and optional overrides
A voice stack missing a voice names the language
- Publishing a voice stack with a language that has no voice now answers
400with a message such as "Choose a voice for German." pluslanguage,reasonandblockers. - Branch on
reasonor theblockerscodes rather than the message, which can change between releases. - A voice selection must name an exact voice · Errors
Clearer filters on the Voices page
- The Voices page filters by voice age, uses, and sound and delivery, lists accents by language, and groups providers with their models.
- Age, uses and sound come only from what each provider states; voices with no stated accent are shown only if you include them.
- Search the catalog
Simulations Lab reports an attempt with no real-time evidence as an error
- A real-time attempt whose room produced no evidence is now an error, never a pass, even when its offline checks passed.
- Its
error_codeiscaller_delivery_failedwhen the synthetic caller joined but could not deliver its lines, andrealtime_evidence_missingotherwise. - Reading verdicts
24 September 2026
Every Soniox and Fish Audio voice in the Voice Library can be published
- Soniox
tts-rt-v2and Fish Audios2-provoices listed in the Voice library now publish on an agent; before, only a few built-in voices of each could, and any other was refused at publish as not runnable. - Agents that already use a Soniox or Fish Audio voice keep working and need no change.
- Choose a voice for an agent
Recordings show the real length of calls longer than 15 minutes
- A call recording's duration now reports its real length; before, every recording longer than 15 minutes showed 900 seconds.
- Call results and the talk time on the Calls page read the same corrected value.
- What a recording contains
A short "no" in a workflow call is understood as an answer
- A caller who answered a workflow's balance line with a plain "no" could have the call end on the fallback farewell ("Sorry, I'm having trouble continuing this call"), and a short Sinhala "no" (නෑ.) could be taken as a wrong-party denial, which stops the call.
- A reply to a Tell / Say line is now judged together with that line as the caller heard it, including the approved figures it stated, so a "no" to "Have you already paid it?" takes the workflow's own route for an unpaid balance.
- Only that one line is added: the workflow's other steps, the caller's earlier replies and case fields the line does not state never reach the decision model, and the figures are included only when that model runs on the same provider as the agent's own model. An explicit denial — "this isn't him", a different name — still ends the call as a wrong party.
- Published workflows need no change and no republish.
- Agent workflows
Recordings and transcripts are kept for long calls
- Recordings, transcripts and call evidence are now stored for calls of any length up to the maximum call length; before, calls longer than about 8.7 minutes kept none.
- A failed store is retried automatically for about five hours, so the ready events can arrive hours after
call.completed, each still delivered once. - A final failure is recorded as
call.artifacts.failedin the call's event log; no webhook is sent for it and billing is unaffected. - When a recording arrives late, or not at all
Voicemail detection watches outbound calls
- Each outbound call now records whether a voicemail box answered, and the evidence behind that verdict, alongside the call.
- Detection only watches for now: the call, its
answer_classification,ended_reason, webhooks and campaign results are unchanged. - The four per-agent settings under
answer_detection.voicemail, including per-language messages for Leave a message, can be saved today and act once they are released. - Voicemail detection · What happens on a call today
Inbound calls to an agent that could not run are rejected before connecting
- An inbound call to a number whose agent has a published voice setup the voice agent could not run is now rejected before the caller is connected, with nothing reserved.
- It appears in Calls as an inbound attempt rejected before connection; before, the call was answered and then ended before any audio.
- Inbound attempts rejected before connection
GPT-Live and Gemini Live agents on the homepage demo
- The homepage demo now offers every active agent in the Skysay demo workspace whatever its conversation engine; GPT-Live and Gemini Live agents were left out before.
- A voice-to-voice agent appears once, in its own language, and follows the visitor's language inside the session; the demo's session length and daily limits are unchanged.
- On the homepage demo
POST /v1/calls no longer needs a country
countryis optional onPOST /v1/calls; Skysay derives the destination country fromto_phone_number, and requests that still send it stay valid.- Start one call
Every agent with end_call now follows the same call-ending rules
- Every agent with
end_callenabled receives one standing instruction after your own prompt: once it has said goodbye, it answers at most once more and then ends the call. - When the agent is calling a specific person and whoever answers says they are not that person, it apologises once, shares nothing about the matter and ends the call.
- Skysay lets the goodbye finish playing before hanging up, and waits at most about 15 seconds for it.
- The instruction cannot be switched off for an agent with
end_call; turningend_calloff is how you opt out. The check-in when both sides go quiet is still in observation and does not yet change calls. - How a call ends · The standing call-ending instruction
23 September 2026
Replies held by background noise start within 1.5 seconds on English calls
- On hosted English calls transcribed by Deepgram, a reply held because the caller seemed to start talking now starts after at most 1.5 seconds when no words are recognized, instead of eight.
- A caller who says a word still gets the full wait, and the caller's words still interrupt the reply as usual; continued noise does not.
- Other languages and transcribers keep the eight-second limit, and this is not a setting.
- When the caller seems to start talking before a reply
Hang up a live call from Calls or the API
- A call that is still dialing, ringing or connected shows a Hang up button in its detail on the Calls page; any workspace member can use it after confirming.
POST /v1/calls/{call_id}/hangupwith thecalls:writescope does the same: it answers202, the worker ends the media session, and the call ends withhangup_requested.- Repeating the request returns the original one; after three failed teardowns it is refused, and a call that is still queued is refused with
409: cancel it instead. - End a live call from Calls · End a live call
POST /v1/calls refuses an agent that could not take the call
POST /v1/callsnow answers400withrealtime_config_not_runnablewhen the agent's published voice setup could not run the call, naming each blocker's code.- No call is created, no wallet balance is reserved and no job is queued; before, such a request was accepted and the call ended before it had any audio.
- A multilingual agent is checked in every published language, and a campaign finishes such a contact as
agent_not_runnableinstead of dialling it. - An agent that could not take the call is refused
A call whose AI agent stops answering is ended instead of staying open
- A conversation engine can stop answering mid-call without reporting anything — a provider outage leaves the connection open and silent — and such a call used to stay up, with the caller talking to nobody, until it reached its maximum length.
- After the caller finishes speaking, the agent now has 20 seconds of quiet line to produce a reply, a tool call or the end of the call; the caller's own speech is subtracted, so nobody is cut off mid-sentence.
- The call reports
ended_reasonmodel_session_lostwith a newreason_detailmodel_unresponsive, which is what tells it apart from the same reason reached because the engine reported its own failure. The list of ended reasons is unchanged. - Anything the caller can hear from the agent clears the bound, so it never runs while the agent is audibly replying, while one of its tools is running, before the caller has said anything, or on a call whose replies come from a workflow; set
voice_polish.model_unresponsive.secondsonPATCH /v1/agents/{agent_id}/voice-stackto any value from 10 to 120, or0to switch it off. - Post-call results · Voice behaviour
Voice library: provider and model columns, and faster pages
- The Voice library table gains Provider and Model columns; a voice offered on two text-to-speech models lists both, each with its own price and first-audio time.
- All, Live and Text to speech filters separate voice-to-voice voices from text-to-speech voices, with a short note on what an agent of each kind can run.
- The Voice library and the new-agent Voice step load several times faster; the voices, totals and filters they return are unchanged.
- Voice library · Conversation engines
22 September 2026
Transfer a call to a person, and find callbacks on Calls
- An agent with
transfer_to_humanenabled now dials its saved destination into the live call once; the person who answers hears a short introduction, then the agent stays quiet. - The AI model is only told the transfer is connecting and never sees the destination number; if nobody answers, or the caller hangs up while it rings, the agent comes back.
- When a transfer cannot connect, or the caller asks to be called back, the agent saves one callback on the call with the caller's name, the reason and a number it read back to them.
- Calls has a Callback requested filter, and the open call shows the name, number, reason and the number the transfer was offered to. The callback is not sent by text or email yet.
- Transfer to a human · Tool reference
Calls on Gemini Live are no longer refused before they start
- Every call on a Gemini Live agent was refused before it started, with a
400naming an unsupported TTS billing unit; inbound calls, outbound calls and Talk to this draft now were all affected. - Those calls are now admitted and billed on the engine's call-duration meter, the same way as GPT-Live 1 calls.
- Conversation engines · Name the language of a Gemini Live call
Calls are no longer refused while the voice service warms up
- Preparing a new call's voice session no longer makes the voice service report itself as full, so a call arriving at that moment is no longer refused and answered with silence.
- The voice service now admits calls by how many it is already running, not by a momentary processor reading; there is nothing to configure.
- Read call evidence
The AI agent says it could not understand, instead of going silent
- A Standard agent whose caller says something the transcriber produces no words for — most often a language the agent is not listening for — now speaks one short line in its own language saying it could not understand and naming the languages it can help in, then keeps listening.
- It is spoken only after the caller stops talking, so it never interrupts, and at most twice per call; it never ends or transfers the call.
- On for every Standard agent, and skipped on an agent with follow the caller enabled, where a language switch answers instead. GPT-Live 1 and agent workflows are unaffected: the first has no separate transcription step, and the second decides every turn itself.
- Send
voice_polish.unrecognised_speech.enabled: falseonPATCH /v1/agents/{agent_id}/voice-stackto switch it off, orphraseandmax_per_callto change the wording and the limit. - When the AI agent cannot understand the caller · Follow the caller
Name the language of a GPT-Live 1 or Gemini Live call
- An outbound call on a voice-to-voice engine now accepts
runtime_config.languageand opens in that language; before this, only the agent's saved language was allowed and any other language was refused. - These engines have one voice for every language, so there is no language profile to publish first: any language Skysay supports is accepted as given.
- A campaign on such an agent now dials its contacts in their own language instead of ending them
pre_dial_failedwithlanguage_not_published. - A language Skysay does not support is still refused before the call is placed, and agents whose engine picks voice and transcription per language are unchanged.
- Resolve the language before each call · Campaign languages · GPT-Live 1 languages
Outbound call billing runs from call placement
- Billed call duration for an outbound call runs from the moment the call is placed, not from the answer, and includes the ringing time before it.
- Billing and browser credit · What you are billed
17 September 2026
Follow the caller on workflow agents
- An agent that runs a workflow can now publish Follow the caller: on stable transcriber evidence of another published language, or a caller's request through the workflow's
language_changeinterrupt, the voice and reply language switch and the run continues from its current step, which is spoken again in the new language. - Publishing a workflow renders every spoken line into each of the agent's other selected languages, placeholders and approved figures intact, and stores them with the version; adding a language to the agent later generates that language's lines automatically as a new version.
- A step the switch interrupted is spoken again in the new language, the run is never advanced by the switch, and usage is billed per language segment as on a free-form call.
- Every workflow turn's call evidence now shows where the turn's time went: state load, the decision model call, reply composition and transport, as separate measured spans.
- Follow mode on an agent that runs a workflow · Agent workflows · Read call evidence
A call the media worker fails to start is ended by the platform, not left silent
- When Skysay's media worker fails after a call is admitted and before it reports that media started, the platform now hangs up the phone leg, closes the room and records one
call.failedresult withtechnical_failure.failure_reason_codeworker_entry_failedandfailure_stageworker_entry. - The wallet reservation is released and nothing is charged; previously such a call stayed
dialingwith no result while the person who answered heard silence. - No setting and no override: a call that never delivered media is never continued. The reason is published on the call resource, in
GET /v1/call-resultsand on thecall.failedwebhook. - Read call evidence
Choose every language an AI agent answers in while you create it
- The new-agent Identity step now asks for languages rather than a language: the first opens the call, and the rest are added as chips beside it.
- The Voice step then offers only the voices and transcription that cover every language you picked, so a multilingual agent can be published without changing its stack afterwards.
- Follow the caller starts on for an agent created with two or more languages whose chosen transcriber declares it can listen for all of them at once; otherwise it starts off. Existing agents, and any language you add later in the editor, are unchanged — there it stays off until you enable and publish it.
- The Agents list names every language an agent answers in instead of only the one that opens the call, and an agent whose languages were never chosen explicitly still shows the language it has.
- GPT-Live 1 is unaffected: it has no language setting, so it shows the opening language only.
- Create a multilingual agent · Follow the caller · GPT-Live language following
16 September 2026
An agent listens for every language it is configured for
- An agent on Azure AI Speech or Google Chirp 2 now listens for all of its selected languages at once, with no setting to enable and nothing to publish.
- Speech in another selected language is transcribed as that language instead of being written into the call language's script, which used to make the agent answer a question nobody asked.
- The reply language is unchanged, and this is not automatic language switching: in Choose before the call the agent still answers in the language that call was published in.
- An agent with one selected language is unaffected, as is one on Deepgram Nova-3 or Soniox, and an agent with more languages than its transcriber can compare at once keeps listening for the language its call is in.
- Language qualification · Speaking several languages versus listening for them
Sinhala transcription moves to Google Chirp 2; the older Google V1 model is retired
- Sinhala agents transcribe with Google Chirp 2 only. The older Google V1 model (
command_and_search) is removed from the transcriber catalogue and can no longer be selected; it returned no transcript at all for many callers on noisy lines, which showed up as an agent that never replied. - An agent that still stored the old model is refused before media with a clear reason rather than silently re-routed; re-select Chirp 2 in the agent editor.
- Pricing history for calls that used the old model is unchanged.
- Language qualification · Transcribers and voices
Outbound calls always listen to the person who answered
- The agent's audio input is now bound by name to the answered phone leg, so a call can no longer play its opening and then hear nothing while the other party talks.
- Every answered call records whether that binding succeeded and how many caller audio frames arrived in the first seconds, visible in the call's evidence, so a silent call can be told apart from a caller who said nothing.
- No setting changes and no call is ended by this; it only affects what the agent hears.
- Read call evidence
An agent can be told to end a call nobody is on
answer_detection.non_human_audiogainsend_call: the agent stops speaking and the call is ended withno_human_after_answerwhen only a tone is heard after pickup, or when the far end holds the line for twenty seconds without ever pausing long enough for anybody to reply.- A person stops it by pausing, which also brings the agent's voice back; the call is not restarted and they are not greeted again.
shadowstays the default and changes nothing a caller experiences.end_callis opt-in per agent, in the Answer detection card of the agent editor or through the voice-stack API.- A call ended this way is excluded from connect rate and talk time, takes the
no_answercampaign disposition so the contact is dialled again, and keepstermination_causeconnected, because that field describes the transport. - Answer detection · Why a call ended
15 September 2026
GPT-Live 1 calls also listen for the other party's captions
- On a GPT-Live 1 agent, the engine's own live captions of the other party now count as caller speech for the no-answer hang-up rule, alongside voice activity detection.
- A talking customer on a GPT-Live call is no longer disconnected because the audio-only detector missed them.
- Cascade agents are unaffected; they still detect speech from audio only.
- Read call evidence
GPT-Live 1 speaks its opening exactly as written
- The GPT-Live 1 opening message is now spoken exactly as written, in its own language and script, instead of being paraphrased.
- Automatic language following starts only after that opening has been spoken.
- A per-call opening set through the Calls API replaces the saved opening for that call.
- Conversation engines · Which languages the voice agent follows
Every answered call now says what answered it
- A call carries
answer_classification(human,non_human_audio,silentorunknown) andreason_detail(caller_tune,hold_musicorno_audio) on the call resource, in call group results and in thecall.completedwebhook. ended_reasongainsno_human_after_answerfor a call ended because only music or tones were heard after pickup.- A call that ends that way will be excluded from connect rate and talk time and will take the
no_answerdisposition, so the contact is dialled again; itstermination_causestaysconnected, because that field describes the transport. - The per-agent setting
answer_detection.non_human_audiochoosesshadow, which records the verdict on every answered call and changes nothing, oroff, which collects nothing; unlike the other tuning settings an explicit choice is stored, so it survives a later change to the platform default.end_call, which acts on the verdict, followed the next day. - Detection needs a pause to call something a person, so a recorded announcement or a menu prompt reads as a person and is left alone.
- Answer detection · Why a call ended
Workspace polish: voice descriptions and asking for an integration
- A long voice description in the Voice Library now clamps to one line with a Show more / Show less link, so rows stay aligned for comparison.
- The Voice Library no longer carries a standing note about a provider's search window; the incomplete-results note that already appears with a limited result set covers it.
- The Integrations page, with or without an integration connected, ends its systems list with Need another integration? Message us.
- Search the catalog · Integrations
Interruption presets apply in every language
interruption_sensitivity(balanced,low,high) now applies on hosted phone calls in every language, not only English;balancedstays the default and changes nothing.- The preset sets the interruption threshold (500/750/150 ms) and the end-of-turn hold: 200/520/260 ms in a language with the turn detector, 800/1100/600 ms in every other language.
- An explicit
min_speech_msorsilence_hold_msstill takes precedence over the preset for its own setting. barge_in_speech_rmsis deprecated: it is still accepted and returned, but the runtime does not apply it.- Interruptions and barge-in
The Agents workspace, rebuilt
- The Agents page is a table: one row per AI agent with its status, number, calls today and the one thing to do next.
- An agent reads as Needs a voice, Ready to test, Tested, Number activating or Live, and the same word appears in the editor.
- Creating an AI agent is three steps — Start, Identity, Voice — with presets, bring-your-own, and GPT-Live 1 offered as one engine.
- The editor groups its sections as Agent, Uses, Conversation, Ship and Advanced; Overview lists what is left to do and what blocks publishing, and Publish changes shows exactly which fields changed before it writes.
- Wire an agent · Acknowledgements · Conversation engines
Explicit interruption thresholds down to 150 ms on phone calls
- An explicit
min_speech_mson a hosted phone call is now honoured down to 150 ms in every language; a value below 150 ms is raised to 150 ms. - An agent that sets no value keeps the 500 ms default.
interruption_sensitivitypresets applied to English agents only at first release; later the same day they were extended to every language (see below). - A wordless burst that clears the threshold pauses the reply for up to a second and resumes if nothing was said.
- Interruptions and barge-in
14 September 2026
New API keys start with sky_
- API keys you create from now on start with
sky_; gateway tokens issued to a self-hosted gateway start withskygw_. - Keys and tokens issued earlier (
tai_,tapi_,tgw_) keep working unchanged, and are still masked in logs and error reports; rotate them when convenient. - Authentication · API keys and scopes
The openphonex.com addresses are retired
- openphonex.com, www.openphonex.com and api.openphonex.com no longer serve the platform; requests to the website addresses redirect to skysay.ai, and API requests must use api.skysay.ai.
- Response and webhook headers now carry the Skysay name:
X-Skysay-Signature,X-Skysay-Event-Id,X-Skysay-Call-Id,X-Skysay-Row-CountandX-Skysay-Truncated. Update any code that reads the earlier spellings; the guides show the names the API sends today. - Existing API keys keep working, and the environment variable names are the ones the guides show today.
- Quickstart · Authentication
OpenPhonex is now Skysay
- The product, workspace and documentation now live at skysay.ai, and the API answers at api.skysay.ai; the new Skysay logo, app icons and share cards are live across the site.
- The openphonex.com and api.openphonex.com addresses keep working and serve the same service, so nothing you have configured stops today.
- API header names, environment variable names and your existing API keys are unchanged; the guides show the names the API accepts today.
- Quickstart · Authentication
Calls the agent ended itself are settled
- A call the agent ended on its own is now closed by the platform and reported as ended, instead of staying active until the worker restarted.
- Billing for such a call is finalised when the call is settled, rather than left open until a worker restarted.
- Webhooks · Read call evidence
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 Skysay 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 Skysay 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 Skysay 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 Skysay'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.
- Skysay 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, Skysay 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
- Skysay 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 Skysay 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. Skysay 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 Skysay 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 Skysay 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 Skysay 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
- Skysay 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 Skysay; 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.
- Skysay 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.
- Skysay 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