Changelog
Notable changes to the VoiceDock platform, API, and documentation.
Notable, user-facing changes to the VoiceDock platform and API, newest first. Dates reflect public availability.
October 2026
-
New: ElevenLabs Realtime. A new realtime provider,
llm_config.provider: elevenlabs_realtime, with two models:eleven_realtime_v1_max(the default) andeleven_realtime_v1_mini. Speech recognition, the conversation and an ElevenLabs voice run behind one connection, and any voice from your ElevenLabs voice library works.turn_detection.eagerness(low,mediumorhigh) sets how soon the model decides the caller has finished. On VoiceDock's platform keys you are billed the cost ElevenLabs reports for each conversation (minutes plus model tokens) plus €0,07 per minute orchestration; on your own ElevenLabs key you pay only the orchestration fee. The summary and analysis after the call run on an OpenAI text model. See ElevenLabs Realtime. -
Change: the post-call analysis on the Google Vertex route now runs on Gemini 3.5 Flash Lite. For assistants on Google's Vertex route, the summary and structured analysis after the call move from
gemini-2.5-flash-lite, which Google has retired on Vertex, togemini-3.5-flash-litein Google's EU multi-region. Processing stays within the EU. You do not need to change anything;postcall_llm_configstill lets you choose another model. -
Removed: Generate QA in the dashboard. The button on the assistant page that wrote a document of test calls to place and score by hand is gone. Arena now places those calls for you and gives every criterion a verdict. A document you downloaded earlier keeps working. Nothing changes in the API.
-
New (beta): Arena, test calls over the phone line. Arena calls your assistant the way your callers reach it. A test caller plays a persona with a goal and can be steered by a timeline of events: background noise, a voice in the room, an interruption on a given turn, a silence, key presses or a hang-up. After the call every criterion gets a verdict with its evidence. You group test cases in a suite, run them on demand, compare a run with an earlier one, and set up a routine that runs on a schedule or after a change to the assistant, with a monthly budget and an event when a result gets worse. Test calls are real calls and are billed like your other calls, on both legs; an attempt with a criterion that a model judges costs one credit on top. Arena is in beta and available on every account, under Arena in the dashboard. Nothing changes for an assistant you do not test. See Arena.
-
New: Grok Voice 3.0.
grok-voice-3.0is a new model underllm_config.provider: xai_realtime, at the same rate asgrok-voice-think-fast-2.0($0.08 per minute) and with the same voices and settings. New assistants on this provider start on 3.0. Assistants ongrok-voice-think-fast-2.0keep running on that model until you switch them; xAI has marked 2.0 as deprecated, without an end date. -
New: Deepgram Flux Multilingual, speech recognition that decides when the caller is done. A new model under
stt_config.provider: deepgram:flux-general-multi. Where Nova-3 transcribes and the platform decides from pauses when the caller has finished, Flux decides that itself. It recognises ten languages: Dutch, English, German, French, Spanish, Italian, Portuguese, Russian, Japanese and Hindi. Withlanguage: multiit detects the language itself. Two new fields tune it:eot_threshold(0.5 to 0.9, default 0.7) sets how sure Flux must be that the turn is over;eager_eot_threshold(0.3 to 0.9, off by default) lets the assistant start preparing a reply when the turn is probably over.
The Nova-3 settings (
smart_format,endpointing,numerals,filler_words,utterance_end_ms,no_delay) do not exist on Flux. Saving one of them with Flux returns a400that names the field, and so does a Flux field on Nova-3 or a language Flux does not support.With Flux,
speech_config.turn_taking.endpointing_min_delaycounts from Flux's own end-of-turn signal, so its default there is 0.1 seconds. Audio stays in the EU, as with Nova-3. It is billed at $0.0078 per minute, plus the standard €0,07 per minute orchestration fee. Nothing changes for assistants on Nova-3, which stays the default. See Assistants. -
Fixed: a call that is refused before it is answered now ends after the message. When the platform refused a call, for example because of a configuration error or a failing assistant-request, the caller heard the error message and then silence until they hung up. The call now ends right after the message, on inbound, outbound and web calls. Nothing changes for calls that are answered normally.
-
Fixed:
recording_consentis now saved when you create an assistant.POST /assistantsignored the field, so an assistant created withrecording_consentset did not ask for consent until it was saved a second time. It is now saved on creation. Assistants created earlier through the API: check the field, or set it again withPATCH /assistants/{id}. -
Fixed: a web call with
assistant_overrideuses your greeting. On a web call,first_messageinassistant_overridewas ignored on some models and the saved greeting was used instead. It now applies, as on phone calls. -
Fixed: the post-call analysis of a web call is included in its usage. On web calls the summary and structured analysis ran but were left out of the call's cost, unlike phone calls. They are now billed the same way: at the analysis model's rate on the platform key, and estimated on your own key.
-
Change: tool names must be unique. Saving an assistant with two tools of the same name, or a webhook tool named like a built-in tool (
end_call,transfer_call), returns a400that names the tool. Such an assistant used to be accepted and then refused every call. If you get this error, rename one of the tools. -
Change: silence handling with its own sentences no longer adds the
end_calltool. Withautonomous_silence_handlingswitched on, the platform addedend_callto the assistant's tools on every inbound call. Whenspeech_config.silencehas its ownmessagesorfinal_message, the platform speaks the last attempt and hangs up itself, so the tool is not needed there, and an assistant that should end calls only on its closing phrases could not keep the tool out without switching silence handling off. The tool is now only added when the assistant writes its own silence prompts. Assistants that listend_callin their tools are unaffected. If your assistant has its own silence sentences and should still be able to end a call itself, addend_callto its tools. See Autonomous Silence Handling. -
Fixed: an assistant's
max_duration_secondsnow also ends inbound calls. On an inbound call the limit only came from the assistant-request response, so a call to an assistant without that webhook kept running past the duration set on the assistant. Inbound calls now use the value from the assistant-request when it sends one, and otherwise the value on the assistant. An assistant without a value uses the documented default of 1800 seconds (30 minutes), on inbound and outbound calls. Nothing changes if your assistant-request already returnsmax_duration_seconds. -
Dashboard: a new assistant page. An assistant now opens on its configuration. Under Model and voice, speech recognition, language model, voice and speaking behaviour each have a card with the current choice (two cards on a speech-to-speech model). The detailed settings, the test call, tools and MCP servers open in a panel on the right, so you can change a setting and try it without leaving the page. Conversation, After the call and Privacy and notifications start collapsed, with a one-line summary of what is set. A setting that depends on a switch, such as the silence or voicemail options, sits directly under that switch and only shows when it is on. Nothing changes in how your assistants are stored or in the API.
-
Fixed: a test call from the dashboard uses the changes you have not saved yet. It used to run on the last saved version of the assistant, so a change you wanted to try only took effect after saving. The test call now runs on what is in the form, and keeps running when you open another panel.
-
Fixed: saving an assistant in the dashboard no longer removes its Grok voice. The dashboard did not recognise an xAI Grok voice (
tts_config.provider: xai) when it opened an assistant, so saving that assistant cleared its voice. Changes through the API were not affected. If you saved an assistant with a Grok voice in the dashboard, check under Voice that it is still set. -
Dashboard: sentence case, and the Dutch dashboard says "je". Buttons and labels are written in sentence case in both languages, for example "Add number". The Dutch interface now addresses you informally. Example sentences your assistant can say to callers, such as the sample greeting and the transfer and hold lines, keep their wording.
-
New: WhatsApp calling on your VoiceDock number. WhatsApp users can now call your number from the chat with your business, by tapping the call button, and your assistant answers as it does a phone call. You set it up with your own Meta app and WhatsApp Business Account: add and register the number, turn on calling over SIP to VoiceDock, and give VoiceDock the SIP password Meta generates, with
PUT /numbers/{id}/whatsappor in the dashboard under Numbers → your number → WhatsApp calling.GETshows when it is active, usually within a minute, andDELETEturns it off. The password is stored encrypted and never returned. Calls and webhooks carry a new field,channel, with the valuephone,whatsapporweb, so you can tell WhatsApp calls apart; on call records from before this change it isnull. A WhatsApp call cannot be transferred: Meta does not allow the phone network on any part of the call, so the transfer tool, transfer nodes and thetransfercommand are refused on it and the assistant offers to take a message instead. Meta does not charge for calls that WhatsApp users place; on VoiceDock they are billed like any other call, without a telephony charge. WhatsApp calling is available on up to 10 numbers per organization; contact support for more. Nothing changes for numbers without it. See WhatsApp calling. -
Fixed: the summary and analysis of a call on a speech-to-speech model are written in the language of the call. On an assistant that runs
google_realtime,openai_liveorxai_realtime, the call summary and the structured analysis took their language fromstt_config.language, a block these models do not use. When that block was empty, a phone call was summarised in Dutch. An assistant created throughPOST /v1/assistantswithout anstt_configalso got a Dutch speech-to-text block it never asked for. As a result, an English call could end with a Dutch summary. On a speech-to-speech model the summary and the analysis now follow the language of the conversation, andPOST /v1/assistantsleavesstt_configempty for these models. Pipeline assistants are unchanged: their summary follows the language of their speech-to-text model, andmultistill means the language of the conversation. -
Fixed: calls from a withheld number now reach your webhooks and the summary email. When a caller hid their number, the platform handled the call as if it came from an internal extension: the call was answered and logged, but no
status-updateorend-of-call-reportwebhook was sent and no summary email went out. These calls now trigger the same webhooks and email as any other call, withcustomer.numberset tonull, as on web calls, and the email shows the caller as "Withheld number". If your receiver readscustomer.number, make sure it acceptsnull. Calls from internal extensions are still not reported. -
Removed: the
localprovider. The valuelocalforstt_config.provider,llm_config.providerandtts_config.provider, which ran speech recognition, a language model and voices on our own servers, has been removed from the platform, and the dashboard no longer offers it. Assistants on a realtime model are not affected: they do not usestt_configortts_config, and alocalvalue left there is ignored as before. A pipeline assistant that still nameslocal, or that leaves out a provider, is now rejected before the call is answered, with the reason in the call log; choose a provider from Assistants instead. On a realtime assistant with recording consent, the consent message is now spoken in the VoiceDock voice.GET /voices, which listed the voices of that provider, now returns an empty list and is deprecated, andhas_local_models_accesson the account and organization responses is deprecated and alwaysfalse. Calls made before this change show their usage of the former provider without a model name. -
Fixed: analysis templates with optional fields on Google models. A field that may be empty, written as
"type": ["string", "null"]or asanyOfwith anulloption, made the post-call analysis fail when it ran on a Google model, and the call then had no analysis. These fields now work on every analysis model, in nested objects and lists too, and come back asnullwhen the call does not provide them. A schema written for OpenAI's strict mode, with"additionalProperties": false, can be used as is. Templates without such fields are unchanged. See Analysis templates. -
Fixed: the publish dialog no longer warns about a call failure that cannot happen. On a realtime (speech-to-speech) model, turn taking, pronunciation replacements and the closing sentence do not apply, and the dashboard leaves them out when saving. The publish dialog still said that publishing them would make the platform refuse every call, and told you to clear them, while those fields were hidden on that model. It now says which settings are not saved and why, and calls come in as usual. A value left over from a pipeline model is shown greyed out under Conversation and Speech behaviour, with a Clear button.
-
Fixed: changing
notification_emailthrough the API now also changes where the report goes. An assistant has two fields for its end-of-call report: the legacynotification_emailand the listnotification_emails. APATCHwith onlynotification_emailchanged that field and left the list on the previous address, so the report kept going there. The two are now always saved together: send onlynotification_emailand the list becomes that one address; send onlynotification_emailsandnotification_emailbecomes its first address; send both and they are merged. This applies toPATCH /assistants/{id}and to creating an assistant, which now also acceptsnotification_emails.notification_emailsis in the update and create schemas, so the MCP server offers it. More than five addresses in total returns a400that names the field. -
Dashboard: the Developer page shows how to connect an AI assistant. Under Developer you now find the address of the VoiceDock MCP server and the Claude Code command, both ready to copy, with the steps for Claude and for Cursor and other clients. The API key now sits under REST API on the same page; the key itself, and how you reveal, copy or regenerate it, are unchanged. See MCP Server.
-
New: Voxtral Realtime, streaming speech recognition from Mistral. A second model under
stt_config.provider: mistral:voxtral-mini-transcribe-realtime-2602. Wherevoxtral-mini-latesttranscribes each turn once the caller has finished speaking, Voxtral Realtime transcribes while the caller is still talking. It recognises the language by itself and follows the caller when they switch language mid-call, so it takes nolanguage; a language you set is not used by this model. It runs on the platform key or on your own Mistral key, and you pick it in the dashboard or withstt_config.model. It is billed at $0.006 per minute of audio, plus the standard €0,07 per minute orchestration fee. Nothing changes for assistants onvoxtral-mini-latest, which remains the default for this provider. See Assistants. -
Fixed: Mistral speech recognition with the language set to multilingual. With
stt_config.provider: mistralandlanguage: multi, the assistant did not understand the caller. Mistral now recognises the language of each turn by itself, which is whatmultimeans. The same applies when no language is set: that used to fall back to English and now recognises the language as well. Assistants with a fixed language, such asnloren, are unchanged. -
New (beta): the VoiceDock voice. VoiceDock now has a voice of its own, available as a beta on every account. It runs on our own GPU servers in the EU, so the text your assistant speaks is not sent to a third-party speech provider, and there is no key to set up. Select it with
tts_config.provider: voicedock, modelvoicedock-1and voicevoicedock, or pick VoiceDock (beta) as the voice in the dashboard. It starts speaking within a fraction of a second and follows the language of each reply, keeping the same voice in Dutch, English, German and French, solanguagedoes not need to be set. It has no tuning fields. It is billed at $15 per million characters plus the standard €0,07 per minute orchestration fee. As a beta it may still change based on what we hear from you; when it leaves the beta your configuration stays exactly as it is. Nothing changes for assistants on other voices. See Assistants. -
New: MCP servers — an assistant can use the tools of your own systems during a call. Add an MCP server to your organization once and attach it to any assistant: while the caller waits, the assistant can search a mailbox, look up an order or check a calendar, using the tools the server offers over the Model Context Protocol. You add a server with
POST /mcp-serversor in the dashboard under MCP servers, where you also see the tools it offers right now and which assistants use it. You attach it with a tool of typemcpinllm_config.toolsand name the tools the assistant may use inallowed_tools, at most 25 per server and five servers per assistant, so a tool the server adds later never reaches your callers until you list it. The platform authenticates with the headers you set, such as an API key or a bearer token. Their values are stored encrypted, never returned, and only ever sent to the host you entered: pointing a server at another host requires setting the headers again. For a token that belongs to the caller, returnmcp_headersfrom your assistant-request webhook; those headers are used for that call only and are not stored. The platform connects to the server before a call is answered. Withrequired: true, the default, a call is rejected when the server cannot be reached, with the reason in the call log; withrequired: falseit goes ahead without that server's tools. Each tool call appears in the call log with its server, tool, duration and outcome, without its arguments or result. Nothing changes for assistants that do not use it. See MCP Servers. -
New: ElevenLabs Eleven v4 and Eleven v4 Turbo. Two new voice models under
tts_config.provider: elevenlabs.eleven_v4_turbois built for conversations: the low-latency variant of ElevenLabs' newest generation, and the one to use on a phone line.eleven_v4is ElevenLabs' highest-quality model, for assistants where expressiveness matters more than response time. Both read the tone of a reply and deliver it, keep the character of the voice, speak more than 90 languages including Dutch, and follow audio tags such as[reassuring]or[whispering]that your assistant writes into its replies. They run on the platform key or on your own ElevenLabs key, with any voice from your ElevenLabs library, and you pick them in the dashboard or withtts_config.model. The v4 models takestabilityandapply_text_normalization; saving one of the other ElevenLabs fields on them returns a400that names the field. The same now holds foreleven_v3, which reaches ElevenLabs the same way and never used those fields: the dashboard no longer shows them for it, the API refuses them, and they have been removed from the assistants that still carried them, so nothing about how those assistants sound changes. Nothing changes for assistants on other models, and the default model stayseleven_flash_v2_5. Billing follows the standard rule: characters at cost on the platform key, plus the €0,07 per minute orchestration fee. See ElevenLabs Eleven v4. -
Change: the MCP server works with all your organisations, and every call names the one it runs in. A connection made by signing in used to follow the organisation selected in the dashboard, so switching organisations there also moved every connected assistant, without it being told. It now reaches every organisation your account is a member of, independently of the dashboard. The new tool
listOrganizationslists them, and every tool takes an optionalorganization_idthat selects the organisation for that call. If your account belongs to one organisation, nothing changes. If it belongs to more than one, passorganization_idon every call: a call without it returnsorganization_requiredwith the list of your organisations, and nothing is read or changed. Results from a signed-in connection now carry the organisation they came from, with the API response underresult. Membership is checked on every call. Connections that use an API key are unchanged, including the shape of their responses. See MCP Server.
September 2026
-
New: closing phrases — end the call on a sentence you choose. List the sentences your assistant uses to say goodbye in
speech_config.end_call_phrases, or in the dashboard under Conversation → Hang up after these sentences. When one of the assistant's turns ends with one of them, the platform ends the call itself once the sentence has been spoken, the same way as theend_calltool, and the call is logged asagent_hangup. Only the end of a turn counts, capitals and punctuation are ignored, and nothing happens before the caller has spoken or during a transfer. Up to five sentences of at most 100 characters, each with at least two letters or digits; a list outside those limits is refused with a400that names the sentence. It works on pipeline and speech-to-speech assistants alike, and nothing changes for assistants that do not use it. See Closing Phrases. -
Change: managed numbers are now assigned by us, on request. A managed number could be picked up from our pool straight away, in onboarding and under Numbers. It is now a request: leave your details under Numbers → Request a number and we assign one and let you know. The same place is where you ask for help connecting a number you already have with your own carrier. Managed numbers are unchanged in what they do — no SIP setup, inbound calls only, meant for testing and setting up your assistant — and every managed number already on an account stays exactly as it is, with its assistant, its transfer trunk and its webhooks. Going live with real callers has always meant connecting your own number over a SIP trunk, and that path is untouched and still self-service. One rule is now enforced where it was not before: a number from our pool cannot be registered as your own.
POST /numberswith such a number is refused with a403that says so, and the dashboard says the same when you type one under Add number. Registering a number you hold with your own carrier is unaffected. See Phone Numbers. -
Webhook secrets: write your own, reuse them, and one consistent format. The secret field on an assistant and on a phone number was read-only, so a secret could only be generated in place and never typed or pasted — which meant a secret generated on an assistant could not be put on its number or on the organisation. All three fields now accept a secret you supply, in the dashboard and through the API, and the same secret may be used at as many levels and on as many assistants as you like. Newly generated secrets all look the same:
whsec_followed by 64 hexadecimal characters. Supplied secrets are checked when you save — 16 to 256 visible characters, no whitespace — and are used verbatim as the HMAC key, so nothing about a secret's shape affects how signatures are computed. Existing secrets are left exactly as they are, whatever their length or shape, so every receiver keeps verifying as it does today. -
Change: a webhook's URL and its secret now always come from the same level. A secret can be set on the assistant, on the number and on the organisation, and the assistant wins over the number, which wins over the organisation. Until now the URL and the secret each fell back through that stack on their own, so an assistant with its own URL but no secret of its own had its requests sent to its URL and signed with the organisation's secret — a key the receiver at that URL had no reason to hold. The level that supplies the URL now also supplies the secret. If that level has no secret, the request is sent unsigned, with no
X-Webhook-Signatureheader, and the reason is recorded on the call; no secret is borrowed from another level. If you set a URL on an assistant, set its secret there too. The dashboard now names, under the field, which level supplies the secret for that assistant. See Webhook Security. -
Removed: three Grok Realtime model names.
grok-voice-think-fast-1.0,grok-voice-latestandgrok-realtime-v1are no longer offered underllm_config.provider: xai_realtime. xAI serves its current speech model on that endpoint whichever of these names is sent, so an assistant configured on one of them has in practice been runninggrok-voice-think-fast-2.0already; the names described a choice that the provider no longer honours. Assistants on those names are moved togrok-voice-think-fast-2.0, which sounds and behaves the same as what they were getting, and are billed at that model's rate of $0.08 per minute.grok-voice-think-fast-2.0is unchanged and remains the default for this provider. -
No longer offered:
gpt-4.1-nanoandgpt-5-nano. OpenAI has announced shutdown dates for both — 23 October 2026 and 11 December 2026 — so they are no longer shown when you pick a model for a conversation or for the post-call analysis. They keep working until OpenAI switches them off, and an assistant already configured on one of them is untouched and keeps running. If you use either, move to another model before its date;gpt-5.6-lunaandgpt-5.4-miniare the nearest equivalents. -
Deprecated: the Chats endpoints.
POST /chats,GET /chats,GET /chats/contextandDELETE /chats/{id}are marked deprecated and will be removed on or after 5 January 2027. They store messages and nothing else: they do not generate a reply, they do not run your assistant, and no other part of the platform reads what you put there. The assistant reply you store is one your own application already produced, so what the endpoints offer is a database you have to authenticate to rather than a capability you gain. Keep your messages in your own storage instead. To give a voice call the history of an earlier chat, return that history as system context in your response to the assistant-request webhook, which already reaches you on every inbound call and is the supported way to shape a call before it is answered. Nothing stops working today: the endpoints keep responding until they are removed, and your existing messages stay reachable until then. They are also still listed by the MCP server, which builds its tools from the published API, until the endpoints themselves are gone. -
New: choose the model that writes your summary and analysis. After every call a text model writes the summary and fills the structured analysis, and until now the platform picked it for you. The new
postcall_llm_configblock lets you choose: any text provider on the platform — OpenAI, xAI, Mistral or Google — with its own model list, and you are not tied to the provider that runs the conversation. Set it when the analysis leaves fields empty on difficult calls, when the end-of-call report arrives later than you want (the report waits for this model), or when you need to record which model receives your call content. It runs on your own key for that provider when your account has one and on the platform key otherwise, billed like every other model. Choose a provider you have no key for while no platform key is available, and the summary and analysis are skipped with the reason on the call rather than falling back to a model you did not pick. Nothing changes unless you set the block: assistants without it keep the model they have today. The olderllm_config.analysis_modelfield still works and is now documented as deprecated; it is free text, so a name the provider does not recognise is only discovered at the end of a call, whilepostcall_llm_configis checked when you save and wins when both are set. See Call Analysis. -
New: transcribe the recording again after a speech-to-speech call. On an assistant that runs
google_realtime,openai_liveorxai_realtime, the transcript comes from the voice model and is written while the model is listening: it starts when speech is detected, so the first syllables of an answer can be missing, and a single word can come out in another language. The summary, the structured analysis and the end-of-call report all read that text. The newpostcall_stt_configblock transcribes the recording once the call ends and uses that transcript instead, for all four. Two providers, both the batch route of a model already on the platform: ElevenLabsscribe_v2and Deepgramnova-3. It runs on your own key when your account has one for that provider and on the platform key otherwise, billed like every other model. Only the caller's side is replaced; what the assistant said is the text the model itself spoke and is kept. Nothing changes unless you set the block: assistants without it keep the transcript they have today, and it is rejected on a pipeline assistant, where the speech-to-text model you chose already produced the transcript. The step runs while the call is being torn down, so the report arrives when it always did; if the transcription fails, times out, or the two speakers cannot be told apart, the model's own transcript is used and the reason is recorded on the call. Calls that were transferred are left alone, because the recording continues after the assistant has left. See Call Analysis. -
Withdrawn: Gemini 3.8 Live Extended Thinking.
gemini-3.8-live-extended-thinkingis no longer offered underllm_config.provider: google_realtime. Google requires this model to be given a thinking level when the Live session opens, which the platform does not set on the realtime route, so we have taken the model out rather than carry a setting that applies to a single model.gemini-3.8-liveis unchanged and remains the generally available Gemini Live model; assistants running on it, or on any other model, are untouched. An assistant still configured on the withdrawn name is refused before the call is picked up, the same as any unknown model, withconfig_errorin its call log. -
Removed: the n8n workflow generator. The button beside a function tool that produced importable n8n workflow JSON is gone, along with its documentation. It generated workflows for n8n as that product stood earlier this year and was not kept current, so what came out needed reworking before it would run. Nothing else changes: your tools, their webhooks and everything already running in n8n are untouched, and the tool configuration itself is unchanged. If you want a webhook tool wired into a workflow, build it in n8n directly against the tool-calls webhook, which is documented and stable.
-
The prompt generator writes for the model your assistant runs on. Until now it wrote the same prompt for every model, so an assistant on a speech-to-speech model could be handed rules that do nothing there: how to spell something out for a separate text-to-speech step that such a model does not have, or when to allow an interruption, which on those models the platform decides rather than the prompt. The generator now follows the model family behind the assistant — a pipeline, Gemini Live, GPT-Live or Grok Realtime — and writes only the rules that apply to it. On GPT-Live it also asks how the conversation should flow, because that model decides its own turns. This applies wherever the generator runs: the assistant page, managed onboarding and demo recordings. A prompt you generated earlier is untouched; generate it again to get the version for its model. A request for a model we cannot place is refused before any credits are taken, instead of after.
-
Node.js SDK 2.0. The
hmsovereignpackage follows the current API. SIP trunks, tool templates, analysis templates, domains and campaigns send and return the fields the API uses, workflows andorganizations.update()are included, and the type definitions cover the current providers, including OpenAI GPT-Live. Path parameters are encoded, only requests that are safe to repeat are retried, and errors keep the details the API returns. The SDK requires Node.js 22 or later. This is a major version with breaking changes, listed in the SDK changelog. See Node.js SDK. -
New: Gemini 3.8 Live and Gemini 3.8 Live Extended Thinking. Two models under
llm_config.provider: google_realtime:gemini-3.8-livefor low-latency conversation, andgemini-3.8-live-extended-thinkingwhen the model needs to reason while it keeps talking. They are Google's first generally available Live models, where 3.1 Flash Live is a preview. Both run on the Gemini API with your own Google key or on ours, take the same thirty voices as the other Gemini Live models, and detect and switch language mid-conversation. They are served on Google's global endpoint, which means no EU data residency: an organization that needs its calls processed in the EU stays ongemini-live-2.5-flash-native-audiothrough Vertex AI, which is unchanged. Nothing moves on its own — existing assistants keep the model they have, and the default for new ones is unchanged. Billing follows the standard rule: audio and text tokens at cost, plus the €0,07 per minute orchestration fee. See Provider pricing. -
New: an Analytics page in the dashboard. Directly under Calls, it shows how your calls go over a period you choose: 7, 30 or 90 days, 12 months, or a range of your own of up to two years. At the top: the number of calls, compared with the same stretch of time just before it; how many were answered and how many were transferred; how many did not start or failed; the talk minutes; and the median duration of answered calls. Below that: calls per day, or per week for longer periods, split by outcome; the end reasons behind each outcome; when people call, as an average per week for each weekday and hour; how long answered calls lasted; and a breakdown per phone number and per channel. You can filter by channel and by number. Days and hours follow your browser's time zone, which the page names under the filters. Outcomes are grouped from the end reason that is also sent in the end-of-call report, so the page uses the same values you receive per call. Talk minutes are call duration, not billed minutes; what you are charged stays on the Usage page. A day or week that is not over yet is drawn lighter, so the current week does not look like a drop.
-
New: you set your own retention period. How long we keep a call is now yours to decide, per organization, in the dashboard under Settings or with
PATCH /organizations. Two periods, because the two kinds of data carry different risk:content_retention_dayscovers the transcript, summary, analysis and recording (30, 90, 180 or 365 days), andmetadata_retention_dayscovers the caller's number, the campaign link and the call events (30, 90, 180, 365 or 730 days). Content cannot be kept longer than metadata, since a transcript usually repeats the number. Until now a shorter period meant asking us and us running a statement by hand, which left no record of who changed what; every change now carries the old value, the new value, who made it and which way it came in. Shortening destroys data and cannot be undone, so the dashboard first tells you how many calls the next nightly run will touch. Nothing changes for anyone who does not touch the setting: every organization keeps the periods it already had. See Privacy & compliance. -
Correction:
caller_phonewas marked as always present. The specification listed it as a required field on a call, while the nightly cleanup erases the number once it passes the metadata retention period — so a client generated from this specification could refuse a perfectly valid older call. It is now nullable and no longer required, and the field says when it is empty. The platform did not change; the specification was wrong. -
Correction: the privacy page said call metadata is "always stored". It was written when the retention period was ours to set and effectively fixed, and it read as though the caller's number stayed on file indefinitely. Metadata is kept for the period your organization sets, after which the identifying fields are erased and the call record remains for billing. The page now says that, and describes both periods.
-
New: OpenAI GPT-Live as a realtime provider.
llm_config.provider: openai_livewith modelgpt-live-1, OpenAI's full-duplex voice model: it listens while it speaks and decides its own turns. Reasoning and tool calls go to a backend model through the OpenAI Responses API, set withdelegation.model(gpt-5.6-lunafor now), with an optionaldelegation.instructionsfor that model alone; leave it out and the backend model receives the system prompt. Five voices,marinby default. Runs on platform keys or on your own OpenAI key. Billing follows the standard rule: the voice session at $0.05 per minute and the backend model's tokens, both at cost, plus the €0,07 per minute orchestration fee. See OpenAI GPT-Live. -
Your own keys: calls now show an estimate of what the providers charge you. In the call details, under the costs we bill, a separate block lists what each component on your own key cost at its provider, such as OpenAI, Deepgram or ElevenLabs. It uses the same prices as our billing, without our margin, converted to euros, and it is never added to what we charge: you pay those providers directly. The block has been in the dashboard since 3 September but stayed empty, because the calculation behind it only shipped with this release. A component we have no price for says so instead of showing €0.
-
Fix: realtime calls billed per minute showed 0 tokens in the usage panel. OpenAI GPT-Live and xAI Grok are billed per minute, by the second, and report no tokens. Their calls showed "0 tokens", next to speech-to-text and text-to-speech cards taken from the assistant's configuration that do not run on a speech-to-speech call. The panel now shows the call duration in seconds, with the estimated cost when the call ran on your own key, and no speech-to-text or text-to-speech card. GPT-Live's backend model keeps its own card with its tokens.
-
Documented: an
assistant_idfrom your assistant-request webhook must belong to your organization. Nothing changed in how calls are handled; the specification now says what already happened. Anassistant_idthat does not exist, is not a UUID, or belongs to another organization rejects the call: the caller hears the error audio, and the call is logged with statusrejected, end reasonconfig_errorand the error "Hybrid agent not found or does not belong to this organization". -
A tool name the model provider refuses is now rejected up front, with the reason. A tool name must start with a letter or an underscore and contain only letters, digits, underscores and dashes, at most 64 characters: the rule every offered provider accepts. Until now a name such as
booking_confirmed?was saved without complaint, and every call on that assistant ended the moment it started, with only "internal error" in the call log. Creating or updating an assistant or a tool template with such a name now returns a400that names the field; publishing it from the dashboard is refused with the same message; and an assistant that still carries one is rejected before pickup, with that message in its call log and the error audio played. The published pattern for a tool template'snamesaid snake_case only. That was never enforced, and it is now the rule above. -
A complete Google pipeline in the EU, with no key of your own. Three new entries run on the platform's Vertex AI service account with EU data residency: Google Cloud Speech-to-Text (
stt_config.provider: google, modelchirp_3), Gemini as a text model (llm_config.provider: google,gemini-3.5-flash-liteby default, plusgemini-3.5-flash,gemini-2.5-flash-liteandgemini-2.5-flash), and Chirp 3 HD as a voice (tts_config.provider: googlewithmodel: chirp-3-hd, the same thirty voices as Gemini TTS, with newlanguageandspeaking_ratefields). There is no key to enter and no bring-your-own-key variant; the platform picks the Google location per model, so there is no location field either. Billing follows the standard rule with no exceptions: the model at cost, per token for the language model, per minute of streaming audio for speech-to-text and per character for text-to-speech, plus the €0,07 per minute orchestration fee. See Provider pricing and BYOK setup. -
Vertex AI Live is priced like every other model. Google Gemini realtime on the EU data-residency tier (
gemini-live-2.5-flash-native-audio) used to carry a single all-in rate of €0,25 per minute, separate from how everything else is billed. From this release it runs on the standard rule: audio tokens at cost, plus the €0,07 per minute orchestration fee, exactly like Gemini 3.1 Live on platform keys. On the usage we see today that comes to roughly €0,14 per minute instead of €0,25, so nobody pays more. Calls made before the change keep the rate they were billed under. See Billing. -
Built-in tool types are snake_case only, and a wrong spelling now tells you so.
llm_config.tools[].typeacceptsend_callandtransfer_call. The camelCase spellingsendCallandtransferCallwere listed as aliases, but only part of the platform honoured them: the assistant-request webhook already refused them, the tool-templates endpoint quietly rewrote them, and an inbound call on an assistant that stored one crashed while the call was being set up. The caller heard silence and then the line dropped, and the call log said only "internal error". Creating or updating an assistant or a tool template with a camelCase type now returns a400that names the field and the spelling to use; a call on an assistant that still carries one is rejected before pickup, with that same message in its log and the error audio played. Assistants that useend_callandtransfer_callare unaffected. -
Fix: an unexpected error during call setup left the caller in silence. When something failed that the platform had not anticipated, the call ended and the log said "internal error", but no error audio was played, so the caller heard nothing and then a dropped line. That path now plays the same error audio as a configuration rejection, on inbound, outbound and web calls. If the audio itself cannot be played, the call log says so.
-
Fix: two lines in a workflow reached nobody on a realtime assistant. A tool node's hold line and a transfer node's announcement are both written down and both shown in the builder, and until now neither reached a caller on a speech-to-speech assistant. The hold line was skipped outright, so the caller heard the whole webhook round trip as silence; the announcement fell back to two seconds of nothing and then a transfer with no warning at all. There is no text-to-speech step on such an assistant to hand a line to, so the platform now puts your line in that step's instructions, opens a turn and waits for the model to speak it. That means the caller hears the model's rendering of your line rather than your line itself, and in the caller's language when that differs. It also means silence remains possible: if the model produces nothing, we log it and carry on, so the webhook is still called and the transfer still goes through. Treat the field on a realtime assistant as the wording you intend, not as a guarantee. Pipeline assistants speak both lines word for word, as before. See Workflow definitions.
-
Workflow definitions are now checked against the platform catalog when you save them. A misspelled model name, an unknown provider, an unknown recognition language, an unknown voice for a provider whose voices we enumerate, or a realtime model set on a single step used to save with a
201and then reject calls at the step that carried it, which for a step deep in a graph could be days later. All of those now come back as a400naming the node and the field. Aspeech_configblock on a node is refused there too: speech settings belong to the assistant, and on a node the field never did anything. Definitions saved before this check are untouched and keep running; the engine ignores a node'sspeech_configfor the whole call. What still cannot be judged on write is the assistant the workflow will run on, so per-step overrides that do not suit it keep rejecting fail-closed at call start. See Workflows. -
Fix: a transition the caller talked over could freeze a workflow for the rest of the call. If a caller spoke during a hand-over, the step change was dropped on purpose and expected to be retried — but our own guard against overlapping transitions stayed closed, so every retry, to any step, was refused and the conversation stayed on the step it was on until the caller hung up. The guard now opens again when a transition does not go through.
-
Fix: an unwritten "Transferring you now." on transitions without a line. A transition without its own
messagefell back to a hard-coded English sentence, which was most audible on global steps ("back to reception") because those never carry one. A transition without amessagenow hands over silently, which is what the field's description always implied. Transitions that do carry amessageare unchanged. -
Fix: an End node and a fixed closing line produced two goodbyes. An assistant with
speech_config.end_call_messagerunning a workflow that ends on an End node said goodbye twice, once from the step and once from the assistant. The assistant's fixed line now wins and the End node hangs up without speaking its own. -
MCP: a field can now be emptied. Over MCP, leaving a parameter out and passing it as empty look identical, so
workflow_id: nullnever reached the API and a phone number could not be detached from its workflow — which in turn madedeleteWorkflowreturn409forever, with detaching as the remedy it named. Tools whose endpoint has nullable fields now carry aclear_fieldsparameter: list the field names to empty out. The same dead end existed foragent_idandtransfer_trunk_id. See MCP Server. -
MCP: the workflow graph contract travels with the tool again.
definitionreached MCP clients as an untyped object, so every node type, field rule, id pattern and example from the specification was lost in translation and guessing was the only strategy. The tool description now carries a summary of the shape, including the worked example from the reference. -
Correction: the MCP server does not stay in sync automatically. This page said no action is needed when the API changes. In reality the tool list is built when the server starts and stays fixed for the life of that process, so a newly released endpoint reaches your client only after we restart the server. The page now says so, and the troubleshooting section no longer sends you looking on your own side for something that is on ours.
-
Workflows in the Node SDK.
client.workflowscovers all five workflow endpoints, and phone numbers acceptworkflow_idon create and on update. On update it also acceptsworkflow_id: nullto detach, which is the way out of the409that deleting an attached workflow returns. See the Node.js SDK. -
Correction: the silence-handling page had the wrong first check and called the timings fixed. It said the first prompt comes after 7 seconds; the platform waits 3, and has for months. It also said the timings could not be changed, while
speech_config.silencehas carried them per assistant since 29 August. Both are corrected, and the page now describes the fixed sentences that replace the model-written prompts. Nothing changed in the platform; the page was wrong. See Autonomous silence handling.
August 2026
-
New:
speech_config, a block for how your assistant speaks. Six settings that were platform-wide constants until now, and are yours per assistant. Turn-taking decides how long the assistant waits before it answers and how easily a caller can interrupt it, which is the single biggest lever on how a conversation feels. Pronunciation takes a list of literal replacements, so a brand name or product code the voice keeps mangling can be spelled the way it should sound; it works on every text-to-speech provider. Background audio plays a quiet office, city, forest or crowded-room ambience under the call so the line does not feel dead while the assistant is listening. Silence replaces the model-written "are you still there" with sentences you wrote yourself, and lets you set how long it waits and how often it tries before ending the call.end_call_messageis spoken just before the assistant hangs up of its own accord.first_message_outboundis a separate opening line for outbound calls. Everything is optional and leaving a field out changes nothing: there is no new default that alters an assistant already running. Available on assistants, onassistant_overrideand on transient assistants in the assistant-request webhook. See the Assistants API. -
Not every speech setting applies to a realtime assistant, and the ones that do not are now refused instead of ignored.
turn_taking,pronunciationandend_call_messageonly work on a pipeline assistant (speech recognition, then a text model, then text-to-speech). A speech-to-speech model does its own turn-taking, speaks without a text-to-speech step, and cannot be asked for a fresh line at the moment it hangs up. Sending one of those fields to a realtime assistant now rejects the call before it is answered, with the offending field named in your logs and a note on where the setting does belong. We chose that over quietly dropping it: the failure mode we wanted to avoid is a setting that appears saved, changes nothing audible, and leaves nobody able to explain why. If you want a fixed closing line on a realtime assistant, put it in your system prompt.background_audio,silenceandfirst_message_outboundwork on both kinds. -
New: a token ceiling on OpenAI assistants.
llm_config.max_completion_tokenscaps how long a single spoken reply can get. On a phone line a model that decides to explain something thoroughly is a worse experience than one that stops, and until now the only lever was the prompt. It is offered on OpenAI only. Mistral and xAI text models accept the field on paper, but we could not confirm they honour it, and a ceiling that is silently ignored is worse than no ceiling. -
More of what the speech engine already supported is now in the API. Deepgram assistants can set
numerals,smart_format,endpointing,filler_words,no_delayandutterance_end_ms; ElevenLabs assistants can setlanguage,apply_text_normalizationandapply_language_text_normalization.numeralsis the useful one for most: it writes numbers as digits in the transcript, which matters if your callers read out order numbers, licence plates or phone numbers.numerals,smart_format,endpointing,filler_wordsandlanguagewere working in the platform all along and simply had no way in through the API or the dashboard.no_delay,apply_text_normalizationandapply_language_text_normalizationwere accepted and saved before the engine read them; from the orchestrator release that accompanies this one the engine acts on them, so an assistant that already carries a value gets it applied from its next call. At the time of writing that is three assistants withno_delay: true, which is also the engine default, so nothing audible changes for anyone. A value of the wrong type on one of these three fields (a string where a boolean is expected, or a text normalization outsideauto,onandoff) is rejected before pickup with the field named in the call log, rather than silently ignored.utterance_end_msis accepted and saved but not acted on yet; that follows in a separate release. -
Fix:
notification_emailsandrecording_consentaccepted a change and did nothing. APATCHon an assistant with either field returned200and left the value untouched, because neither was on the list of fields the endpoint applies. Both fields exist, are read on every call, and are in use. They now save. A check in our build compares that list against the specification so a field cannot go missing again without something turning red. -
Fix: Deepgram key terms were sent under a name Deepgram deprecated, and could not be switched off. Key terms still worked, but every call logged a deprecation warning we were not seeing. Separately,
filler_wordscould be switched on but never off: the value only travelled when it wastrue, while the underlying default is alreadytrue. Both are corrected. There was also a branch for weighted keywords that could never run on the models we offer and would have raised an error mid-conversation if it had; it is gone. -
Fix: an ElevenLabs assistant with only a speed setting failed the call. Setting
speedwithout also settingstabilityandsimilarity_boostraised an error while the call was being set up, which reached the caller as a generic failure. The combination is now refused before the call is answered, with a reason that names the missing fields. -
Change: a Gladia assistant now uses the language you selected.
languageis a required field on every speech recognition provider, but the Gladia integration only read the separatelanguageslist and ignored the single value, so a Gladia assistant fell back to automatic language detection no matter what you picked. It now honours the selection. If your Gladia assistant has a specific language set and you were relying on automatic detection, choosemultiinstead, which is the explicit setting for that. -
Fix: assistants said "the call has been ended" out loud before hanging up. When the assistant ended a call itself, the internal confirmation from that action was handed back to the model, which had nothing to add, fell back on its instructions and read the confirmation aloud, translated into the language of the conversation. It is now suppressed. This has been in the platform for a while and only became audible on assistants with their own closing line, because the call used to end before the model could speak again.
-
The assistant object in webhook payloads is the same on every kind of call. It carried nine fields on inbound calls, eight on outbound and six on web calls, while the specification described eleven.
business_name,max_duration_seconds,gdpr_mode,silence_timeout_secondsand the newspeech_configare now present on all three, so a webhook receiver no longer has to know which kind of call it is looking at. Existing fields keep their names and values. -
Fix: call summaries and analysis stopped working for Google assistants on 26 August, and are working again the same day. Google closed
gemini-2.5-flash-liteto projects that were not already using it, which is the model we used to write your call summary and fill in your structured analysis fields. From that moment, assistants running on the Gemini API got neither: the summary read "No conversation recorded." and the analysis fields stayed empty, on calls where the conversation had gone perfectly well. Nothing in the dashboard marked it as a failure, which is the part we like least about it. Summaries now run ongemini-3.5-flash-liteand everything works again. Calls made during the outage keep their transcript and recording, but their summary and analysis cannot be recovered. If that affects a call you need, contact us. Assistants on Vertex AI were not affected. -
Fix: Grok Realtime calls lost their connection around the forty second mark. Every xAI Realtime conversation running longer than roughly forty seconds dropped its connection at least once, discarded the sentence the assistant was speaking and resent the entire conversation so far. Callers heard a clipped sentence and the assistant briefly lost the thread. The cause was ours, not xAI's: our own adapter added a keepalive that the underlying connection does not have, and then timed that keepalive out on a connection that was perfectly healthy. Verified after the fix on a 67 second call: no disconnect, no reconnect, nothing lost. Nothing to change on your side.
-
New models across five providers. OpenAI
gpt-5.6-luna,gpt-5.6-terraandgpt-5.6-sol; xAIgrok-4.3; Mistralministral-3b-latest,ministral-8b-latestandministral-14b-latest; Inworldinworld-tts-2andinworld-tts-2-flash; Deepgramnova-3-general. ElevenLabs Scribe now has its own entry for speech recognition, and Google text-to-speech offers all thirty voices instead of eight. If you build on the Gemini API rather than Vertex,gemini-2.5-flash-native-audio-preview-12-2025is now accepted; it is a real Google model name and was being rejected. See Provider pricing. -
Reasoning effort is fixed for the newest OpenAI and xAI text models, and that is deliberate. OpenAI documents that from GPT-5.4 onward, Chat Completions does not support tool calling with any reasoning effort other than
none. Assistants use tools and the GPT-5.6 family defaults tomedium, which would leave an assistant unable to call any of its tools. We pin the value for the models this applies to, and a value you set on those models is ignored with a note in your logs instead of silently breaking the call. The realtime thinking step on xAI Grok is a genuine choice and is unchanged. -
Models that no longer exist have been removed from the menu.
gpt-5.3-chat-latestwas shut down by OpenAI on 10 August. Seven xAI text models were retired on 15 May, and since then their names quietly resolved to grok-4.3 and were billed at grok-4.3 rates.ministral-8b-2410was switched off by Mistral at the end of last year.codestral-latestand the Google voicePerseusare gone as well, the latter because it does not exist at Google and never did. We checked every one against live configurations first: no assistant was running on any of them, so nothing needed migrating. Names that assistants are using, such asgpt-4o-miniand the Inworld 1.5 voices, keep working and are simply no longer offered for new assistants. -
Two defaults changed for new assistants. xAI Realtime now starts on
grok-voice-think-fast-2.0instead of 1.0, which xAI labels deprecated in its own price list. This costs more, $0.08 per minute against $0.05, passed through at cost. We would rather have you start on a current model than on a cheaper one being phased out. Inworld now starts oninworld-tts-2, at exactly the same price per character as the model it replaces. Existing assistants are untouched in both cases. -
Fix: a call where the voice failed is no longer recorded as a normal hangup. If text-to-speech refuses mid-call, the assistant produces its reply but the caller hears nothing of it. Such a call used to be written away as
user_hangupwith an empty error field, indistinguishable from a caller who simply lost interest. The reason now appears in the call's error field. The status staysendedso the call is still billed and still counted. -
Fix: callers were told a number was not linked when in fact our database was failing. A failed configuration lookup and a genuinely unknown number produced the same result, so a timeout or a database error made the caller hear that their number is not connected to a VoiceDock account. The two are now separate: a lookup failure gets the general error message and its own reason code, and it now reaches our alerting instead of being filed away as a customer configuration problem.
-
Fix: assistants on Mistral got no call summary. The post-call summary and analysis silently produced nothing for Mistral assistants, and a failed attempt left no trace to explain why. Both are fixed, and a failure is now readable.
-
Fix: a deactivated phone number could come back within a minute. The job that keeps inbound routing in step with your numbers ignored the active flag, so a number you had switched off was put back on the inbound allowlist on its next run. It now respects the flag, and it pages through your numbers instead of reading only the first page.
-
Fix: a broken local speech recognition server now ends the call instead of listening to nothing. For assistants running speech recognition on self-hosted infrastructure, a server returning errors was indistinguishable from a caller saying nothing, so the call stayed open in silence until it timed out. It now fails closed, with the reason on the call record.
-
Several safeguards that could fail quietly no longer can. The silence watchdog, the web call limit, the concurrent call cap, the fallback that plays an error message when a provider fails, and the dispatch of an asynchronous tool result could each stop working without any sign. In some cases the effect was a limit falling open when the database was unreachable, in others a call that simply stayed on the line. Each of these now fails visibly. Alongside them: a call control command finishes its work even when the announcement to the caller fails, recordings and rooms are cleaned up after an abnormal end to an inbound call, and the final lines of a call log are no longer lost to the shutdown that follows them.
-
tts_configon assistants: required for pipeline providers, ignored for realtime. A realtime provider handles speech itself, so leaving outstt_configandtts_configthere is normal and is now explicitly allowed by the specification. For a text model both blocks are required. That was already the behaviour, but the reference described it the other way round in two places. The rule is now generated from the provider list, so it cannot drift again. See the Assistants API. -
Correction: provider costs were billed about 4.6% too high, and are now converted at the daily ECB rate. Model usage is priced by providers in dollars and passed through to you in euros, which means a conversion rate. That rate was updated by hand and had stood still for 55 days, so every provider cost on your invoice during that period was converted at a stale rate and came out roughly 4.6% too high. It is now fetched from the European Central Bank every day and needs no maintenance. If something on an invoice still looks inconsistent to you, get in touch and we will look at it with you.
-
A managed phone number that was switched off now asks for balance before it comes back on, and charges the monthly fee. Until now a number that we deactivated for insufficient balance could be switched straight back on from the dashboard, which meant the month went unpaid. Turning it back on now requires enough balance to cover the monthly fee and charges that fee immediately, at most once per calendar month per number. If the monthly job already charged you this month, switching the number back on costs nothing extra. Numbers on your own SIP trunk have no monthly fee and are unaffected. See Billing.
-
You now hear about it before a number goes off, and again when it does. Three signals where there were none. Around the 25th of the month you get an email if your balance will not cover the numbers you have on the first, with the amount, the shortfall and the numbers listed. If a number is deactivated anyway, you get a second email at that moment explaining why and what to do. A failed charge is also written to your transaction history as its own line, so the billing page can show the reason a line went quiet instead of leaving an unexplained gap. The line moves no credits; the amount that could not be charged is recorded with it.
-
SIP over TLS is now available. Signalling to our platform can run over TLS on port 5061, next to the existing port 5060. If your carrier supports it, get in touch and we will move your trunk across. Media encryption (SRTP) on the trunk leg is not enabled by default and existing trunks are unchanged, so nothing changes for a line that works today. Browser-to-platform calls were already encrypted and are unchanged.
-
Retention now also covers chats and campaign leads. Your retention window already applied to calls, transcripts, recordings and analyses. It now covers chat conversations and the personal data on campaign leads as well, on the same schedule. Nothing to configure. See Privacy and compliance.
-
The API reference now matches the API. Twelve places where the documentation described something other than what the platform does, which matters more than usual here because the MCP server builds its tools from this specification. The workflow endpoints were missing entirely and are now documented, all five of them, including the rules a definition has to satisfy.
POST /v1/byok/configwas documented as aGETthat does not exist. A schema reference in the outbound-call request pointed at a type that had never been created. The analysis-template endpoints advertisedlimitandoffsetparameters that did nothing and described response envelopes that did not match. There is now a check in our build that fails if the specification and the routes drift apart again. -
max_duration_secondsis validated on assistants. The field went into the database unchecked, which meant a value in milliseconds or a typo was accepted and only surfaced later. It is now rejected unless it is a whole positive number of seconds at or below the platform ceiling of twelve hours. Existing assistants are unaffected. -
Fix: amounts in the dashboard follow the language you use. Euro amounts and counts appeared with a decimal point in the Dutch interface and, in a couple of places, with a comma in the English one. Sometimes both notations sat on the same page, over money. All amounts now use the separator of your interface language.
July 2026
- Grok Voice Think Fast 2.0 is available for xAI Realtime assistants. xAI's newest speech-to-speech model can now be selected on any assistant using xAI Realtime. It is backwards compatible with the 1.0 settings, so your voice and turn-taking configuration carries over unchanged and only the model name differs. It is not the default, and existing assistants keep running 1.0 until you change them yourself. The reason is price: 2.0 costs $0.08 per minute against $0.05 for 1.0, and because provider usage is passed through at cost, that difference lands on your invoice. xAI reports improvements in reasoning, transcription accuracy and time to first audio; those are their published figures, not our measurements. One thing worth knowing if you use the rolling
grok-voice-latestalias: xAI moves it from 1.0 to 2.0 on 5 August 2026, which changes both the model and the per-minute price without any action on your side. Pin an explicit model name if you would rather decide that moment yourself. See xAI Grok integration. - Speech recognition moved to Deepgram's EU endpoint, and out of model training. All Deepgram speech-to-text now runs against
api.eu.deepgram.comwith the Model Improvement Program switched off, so call audio stays in the EU and is never used to train their models or shared with third parties for benchmarking. This is a platform default, deliberately not configurable per assistant: an account should not be able to move its callers outside the EU or into a training set by accident. Nothing to change on your side, and no price difference. See Privacy and compliance. - Retention windows are now enforced automatically. Your configured retention period is applied every night: transcripts, summaries and analyses are stripped and recordings are deleted from storage once a call passes the window, with phone numbers and call events following a separate, longer window. Until now the setting described an intention; it is now the mechanism. Existing calls are covered as well. See Privacy and compliance.
- Turn-taking settings for xAI Grok Realtime. Three fields on the assistant let you tune when Grok decides the caller has stopped speaking: silence before end of turn, speech threshold, and lead-in audio. Leave a field empty and the provider default applies, so existing assistants behave exactly as before. Configure it under Language Model in the dashboard, or set
llm_config.turn_detectionthrough the API. See xAI Grok integration. - Interruption detection now runs on our own infrastructure. Deciding whether a sound is a real interruption or just a listener saying "mm-hm" previously called a hosted service on every interruption, which added an external dependency to the live call path and carried a request ceiling. That work now happens locally. No configuration and no behaviour change to tune; it removes a moving part from the path a call depends on.
- Fix: telephony lines on your own SIP trunk no longer show a carrier. Calls on a bring-your-own trunk listed our carrier and its tariff class in the cost breakdown, even though the leg was never priced by us and never billed. Those lines now correctly show no provider and no tariff class. Managed numbers are unchanged. See Billing.
- Fix: parts of the dashboard showed Dutch text in the English interface. The advanced turn-taking panels for xAI Grok Realtime and Gemini Live were not translated.
- Automatic failover — our first stable release (1.0). VoiceDock now runs active-passive: a warm standby mirrors production continuously and takes over automatically if the primary stops responding, typically within about 90 seconds and with nothing to change on your side. We verified it end to end on production with a controlled outage — a real inbound call was answered on the standby with recording, analysis and billing intact. If a failover ever happens, we are paged automatically.
- Sign in to the MCP server with your account (OAuth 2.1). Connect Claude, Claude Code, Cursor, or any MCP client to the MCP server with just the URL — no API key to copy. Your client opens a browser, you log in with your VoiceDock account and approve access on a consent screen, and it works against your organization. A raw API key still works as a bearer token for CI and scripts.
- Multiple recipients and action buttons for end-of-call reports. Send the post-call report email to up to five addresses per assistant, and choose which buttons the email shows — an "Open in dashboard" link, a direct "Listen to recording" button, both, or neither. Configure it on the assistant in the dashboard. See Call analysis.
- Itemized telephony costs on managed numbers. Calls on platform-managed phone numbers now meter the phone legs as a provider cost at carrier list rates, itemized per call in the cost breakdown next to model usage, on top of the unchanged €0,07/min orchestration fee. A transferred call shows the inbound line and the outbound leg to the destination as separate lines; unanswered transfer attempts cost nothing. On a transferred call the per-minute rate stops at the moment the transfer connects, so the human-to-human part of the conversation carries telephony cost only, with no model usage and no orchestration fee. Numbers on your own SIP trunk are exempt, exactly like BYOK for models. See Billing.
- No-answer handling for call transfers. Transfers can now wait for the destination to actually answer before connecting the caller (
wait_for_answeron the transfer tool). If nobody picks up within the configurable timeout — or the line is busy — the assistant stays with the caller and can take a message, try one of the configurable backup numbers (fallback_destinations, tried in order), or end the call politely. Existing transfers are unchanged: without the flag, transfers connect immediately as before. See Call Transfers. - Workflows (Beta). Build multi-step call flows on a visual canvas: conversation steps with their own instructions — and optionally their own model, voice, text-to-speech or speech-recognition settings — background tool calls that always run, guaranteed human transfers and clean endings. Global steps such as "back to reception" are reachable from anywhere without drawing lines. One assistant keeps supplying the defaults and call settings; the workflow drives inbound calls on the numbers it is attached to. Attach a workflow to a phone number in the dashboard or via the API. See Workflows and the Workflows API.
- Webhooks per phone number. A webhook can now be set directly on a phone number, alongside per-assistant and account-wide webhooks. For each event, VoiceDock delivers to exactly one endpoint, with precedence assistant → phone number → account: a number's webhook is used when its assigned assistant has none, and takes precedence over the account webhook. See Webhooks overview.
June 2026
- Developer logs. A new Logs page in the dashboard shows what happens on each call — when it starts and ends, and the errors that stop a call, such as an unknown model or an invalid tool definition. Scoped to your own organization, so you can debug an assistant without opening a support ticket.
- More natural call endings. Assistants now finish their closing line cleanly before hanging up, with no mid-sentence cut-off or trailing silence, including on realtime speech-to-speech models.
- End-of-call reports for platform-key assistants. Assistants running on platform-provided keys (without BYOK) now also receive a post-call summary and structured analysis, just like BYOK assistants. See Call analysis.
- Usage-based, at-cost pricing. You pay for actual model usage at cost, plus a flat €0.07 per minute orchestration fee. Vertex AI Live is a flat €0.25 per minute, all-in. See Billing.
- Bring-your-own-key (BYOK) is now optional. Assistants work out of the box on platform-provided keys; add your own provider keys only if you want to. See BYOK setup.
May 2026
- Documentation and full API reference launched — complete guides plus an interactive REST API reference. Start at the Quickstart.
- xAI Grok for realtime voice — low-latency realtime speech, plus a Grok text-to-speech option. See xAI Grok integration.
- Branded end-of-call report emails — per-organization branding, an "Open in dashboard" link, and a recording hint.
- Configurable call duration up to 30 minutes per assistant (
max_duration_seconds). See Assistants.
April 2026
- Google Gemini Live added as a realtime speech-to-speech provider, including a Vertex AI option. See Provider pricing.
- Google Gemini text-to-speech added as a provider.
- Email notifications for web calls.
March 2026
- Official Node.js / TypeScript SDK released — install
hmsovereignfrom npm. See Node SDK. - MCP server for the platform, hosted at
mcp.hmsovereign.com. See MCP server. - Recording consent flow (DTMF) — callers can be asked to press 1 to consent before any processing begins. See Privacy & compliance.
- More providers — Mistral (Voxtral) speech-to-text and Inworld text-to-speech.
- Improved multilingual turn detection and interruption handling.
February 2026
- More provider options — Mistral and xAI Grok as text models, Gladia and ElevenLabs Scribe as speech-to-text.
- GDPR mode for per-assistant data-retention control. See Privacy & compliance.
- Configurable silence timeout with a faster default.
January 2026
- Web calls — browser-based WebRTC calls, with a public embeddable web-calls API and whitelabel support. See Web calls.
- Call recording with signed URLs for secure access.
- Voicemail detection and a configurable voicemail message. See Voicemail detection.
- Autonomous silence handling — recurring prompts when a caller goes quiet. See Autonomous silence handling.
- Outbound campaigns — campaign tracking for outbound calls. See Campaigns.
- Assistants can speak while running a tool, with async tool results fed back into the conversation. See Custom tools.
- Richer webhook events — deterministic end reasons, call timestamps, and phone-number and direction fields.
- Real-time sync webhook API, replacing polling.
- Free local voices for text-to-speech.
- Prompt template variables such as
{{ now }}.
December 2025
- Public API foundations — assistants, calls, and phone numbers as first-class resources, with agent configuration separated from phone numbers.
- Webhooks — assistant-request (pre-call config override), status-update, tool-calls (function calling), and end-of-call-report with full transcript. See Webhooks.
- Live Call Control API — inject context, speak, transfer, or end a call mid-conversation.
- Built-in call control — LLM-controlled
end_calland call transfer. See Call transfers. - Outbound call API.
- Post-call structured analysis. See Call analysis.
- Bring-your-own-key (BYOK) providers and SIP trunk support. See SIP trunks.
- xAI Grok realtime speech-to-speech provider.
- Whitelabel support — child organizations, per-organization email domains, and branded summaries. See Whitelabel.
- Usage-based billing in credits, at a flat €0.07 per minute.
- Multilingual emails and call summaries.