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.
September 2026
-
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 Whisper on your own 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.