Get the (almost) daily changelog
  1. Enhanced Artifact Plans: All Artifact Plans now support the following properties:
  • loggingEnabled - Toggle to enable call logs
  • loggingPath - Custom path for call log uploads
  • structuredOutputs - Toggle for structured output extraction
  1. Enhanced Artifact Management: You can now extract structured data during calls with the new structuredOutputs property in Artifact.

  2. Improved Cost Analysis: You can now view detailed call costs with new fields in Analysis Cost Breakdown:

  • structuredOutput - Cost for structured output evaluation
  • structuredOutputPromptTokens - Prompt tokens for structured output
  • structuredOutputCompletionTokens - Completion tokens for structured output
  1. Phone Number Hooks: You can now configure hooks for call ending events with the new Call Ending hook for phone numbers and exclude events to exclude from the hook with the relevant filter
  1. Handoff Tool and Dynamic Agent Routing: You can now hand off conversations when building multi-agent systems with Assistant.model.tools[type=handoff]. Supported destinations include:
  • Assistant Destinations: Directly hand off to a specific assistant by assistantId or assistantName.
  • Dynamic Destinations: Route handoffs dynamically via a webhook to your server, which can determine the destination assistant in real time. Custom parameters such as customer intent, sentiment, or area code can be passed to the webhook for advanced routing logic.
  • Multiple Destinations: Support for both single handoff destination per tool with multiple tools (recommended for OpenAI) and multiple handoff destinations with one tool (recommended for Anthropic).

You can read more about how to configure the handoff tool in the API Reference

  1. Context Engineering for Handoffs: When handing off a conversation, you can now control what context is passed to the next assistant:
  1. Message Metadata: Tool Messages, Assistant Messages, and Developer Messages objects now support an optional metadata field, allowing you to attach arbitrary metadata to messages for downstream processing or analytics.

  2. Pagination Meta Enhancement: You can now reference itemsBeyondRetention boolean in paginated responses to indicate if additional items exist beyond the retention window.

New: Call Metrics & Artifact Improvements

You can now access detailed call performance metrics and structured output IDs directly from your call artifacts.

Turn Latencies
Each conversation turn’s latency
Call.artifact.performanceMetrics.turnLatencies
Model Latency (avg)
Average time for the model to generate a response
Call.artifact.performanceMetrics.modelLatencyAverage
Voice Latency (avg)
Average time to synthesize voice
Call.artifact.performanceMetrics.voiceLatencyAverage
Transcriber Latency (avg)
Average time to transcribe voice
Call.artifact.performanceMetrics.transcriberLatencyAverage
Endpointing Latency (avg)
Time to detect end of a conversation turn
Call.artifact.performanceMetrics.endpointingLatencyAverage
Turn Latency (avg)
Average latency to complete a conversation turn
Call.artifact.performanceMetrics.turnLatencyAverage
Structured Output IDs & Results
Track and extract structured outputs from your calls
  • During call: Access array of output IDs
    Call.artifactPlan.structuredOutputIds

  • After call: Extracted outputs are stored here
    Call.artifact.structuredOutputs

These improvements help you monitor, debug, and analyze your calls with greater detail.

New: Smarter Conditions & Security Filters

  1. New Condition & Filter Types: You can now use the following new condition and filter types to build more robust rejection plans and security filter plans:
  • MessageTarget: Target specific messages by role and position for conditions using Assistant.hooks.do[type=tool].tool.rejectionPlan.conditions[type=regex].target.
  • GroupCondition: Combine multiple conditions using AND/OR logic, with support for recursive nesting using Assistant.hooks.do[type=tool].tool.rejectionPlan.conditions[type=group].
  • RegexCondition: Flexible pattern matching, with full support for JavaScript regex and negation using Assistant.hooks.do[type=tool].tool.rejectionPlan.conditions[type=regex].
  • LiquidCondition: Use Liquid templates for complex, context-aware logic using Assistant.hooks.do[type=tool].tool.rejectionPlan.conditions[type=liquid].
  • Security Filters: New filter types for RCE, XSS, SSRF, SQL injection, prompt injection, and regex-based filtering using Assistant.compliancePlan.securityFilterPlan.filters.
  1. Tool Rejection Plans: You can now use Assistant.hooks.do[type=tool].tool.rejectionPlan in all tool calls to prevent accidental tool execution, enforce confirmation steps, and build more robust conversation flows. This helps you to define complex logic for when a tool call should be rejected, enhancing both safety and call experience. Rejection plans can be built using regex conditions, Liquid templates, or logical groups (AND/OR). For example, you can prevent an endCall tool from executing unless the user says goodbye, or block a transfer if the user is actually asking a question.

Example:

1{
2 "conditions": [
3 {
4 "type": "regex",
5 "regex": "(?i)\\b(bye|goodbye|farewell|see you later|take care)\\b",
6 "target": { "position": -1, "role": "user" },
7 "negate": true
8 }
9 ]
10}
  1. Security Filter Plans for Transcripts and Messages: You can now use Assistant.compliancePlan.securityFilterPlan to define how transcripts and messages are filtered against threats like SQL injection, XSS, prompt injection, and more. Choose between sanitize, reject, or replace when threats are detected, and specify custom replacement text. User messages and transcript objects now include:
  • isFiltered: Indicates if content was filtered for security.
  • detectedThreats: Lists detected threats.
  • originalMessage / originalTranscript: Preserves original content if filtering occurred.

🎤 New Gladia Transcription Provider Support

  1. Custom vocabulary support: Enable a custom vocabulary with Gladia using Assistant.transcriber[provider="GladiaTranscriber"].customVocabularyEnabled. You can also specify simple strings or detailed objects with fields for value, language, intensity, and alternative pronunciations using Assistant.transcriber[provider="GladiaTranscriber"].customVocabularyConfig - letting you fine-tune recognition of domain-specific terms.

  2. Endpointing & Speech Threshold: Configure endpointing time (wait time before considering speech ended) and speech sensitivity, enabling more accurate and responsive transcription with Assistant.transcriber[provider="GladiaTranscriber"].endpointing and Assistant.transcriber[provider="GladiaTranscriber"].speechThreshold.

  3. Prosody & Audio Enhancer: Optionally enable prosody (for transcribing non-verbal cues like laughter) and audio enhancement for improved accuracy with Assistant.transcriber[provider="GladiaTranscriber"].prosodyEnabled and Assistant.transcriber[provider="GladiaTranscriber"].audioEnhancerEnabled.

  4. Flexible Language Detection: Choose between manual and automatic language detection modes with Assistant.transcriber[provider="GladiaTranscriber"].languageDetectionMode.

  5. Confidence Thresholds & Hints: Discard low-confidence transcripts and provide context hints for improved accuracy with Assistant.transcriber[provider="GladiaTranscriber"].confidenceThreshold and Assistant.transcriber[provider="GladiaTranscriber"].hints.

💳 Subscription Updates

RBAC

Role-based access control (RBAC):
Enable RBAC for your subscription using Subscription.rbacEnabled.

Call & Chat Retention

Retention settings:
Configure how long calls and chats are stored with Subscription.callRetentionDays and Subscription.chatRetentionDays.

Minutes Included Reset Frequency

Reset frequency:
Set how often included minutes reset using Subscription.minutesIncludedResetFrequency.

New Features & Enhancements

  1. Enhanced Call Artifacts: You can now store detailed information about call workflows and outcomes using Artifact objects. Key properties include:
    • nodes: History of workflow nodes executed during the call.
    • messages: All messages spoken during the call.
    • logUrl: New! Direct URL to detailed call logs for debugging.
    • pcapUrl: Packet capture URL for phone calls (provider: vapi or byo-phone-number).
    • recording: Recording URL (requires assistant.artifactPlan.recordingEnabled).
    • transcript: Convenient full call transcript.
    • variableValues: Final workflow variable states.
    • messagesOpenAIFormatted: Spoken messages, formatted for OpenAI.

recordingUrl, videoRecordingUrl, stereoRecordingUrl, and videoRecordingStartDelaySeconds are now deprecated in favor of the new recording and related properties within the Artifact object.

  1. Improved Azure Speech Segmentation Tuning: You can now fine-tune speech segmentation in your Azure Speech Transcriber using segmentationStrategy, segmentationMaximumTimeMs, and segmentationSilenceTimeoutMs properties for better transcription control. This applies to both Azure Speech Transcriber and Fallback Azure Speech Transcriber.

The segmentationMaxTimeMs property in AzureSpeechTranscriber has been replaced by segmentationMaximumTimeMs for consistency.

Deprecations

Assistant & Related Objects

messagePlan and backgroundDenoisingEnabled are now part of Assistant.backgroundSpeechDenoisingPlan instead of Assistant and AssistantOverrides directly.

Org

stripeCustomerId is now part of Subscription instead of Org.

AzureSpeechTranscriber

segmentationMaxTimeMs property has been renamed to segmentationMaximumTimeMs for consistency.

  1. Artifact Logging: You can now access call logs directly through the new logUrl property in the Artifact schema, providing a direct URL to call logs for each workflow execution to aid in debugging and compliance.

  2. Azure Speech Transcriber Segmentation: You can now fine-tune speech segmentation in AzureSpeechTranscriber using segmentationStrategy, segmentationMaximumTimeMs, and segmentationSilenceTimeoutMs properties for better transcription control.

Breaking Changes

The following changes may require updates to your existing integrations:

  1. Minimax Voice Provider Integration and Error Handling: You can now use MinimaxVoice as a voice provider in your assistants and workflows, with support for Minimax credentials for seamless authentication and integration. Additionally, calls can now terminate with Minimax-specific error reasons such as pipeline-error-minimax-voice-failed and call.in-progress.error-vapifault-minimax-voice-failed. This gives you access to customizable voice characteristics like pitch, speed, and emotion for more natural-sounding conversations.

  2. AssemblyAI Transcriber Updates: The AssemblyAITranscriber configuration has been simplified:

    • The enableUniversalStreamingApi property has been removed.
    • The formatTurns property now defaults to true and no longer depends on the universal streaming API setting.
    • Several properties have updated descriptions and defaults, with references to the deprecated universal streaming API removed.
  3. Enhanced Chat and Session Events: New message types have been added for handling chat and session events: chat.created, chat.deleted, session.created, session.updated, and session.deleted. These events are available in both ClientMessage and ServerMessage objects, giving you better control over interactive conversations.

  4. Expanded API Request Tool Capabilities: The ApiRequestTool now supports PUT, PATCH, and DELETE HTTP methods alongside the existing GET and POST methods. This enables your tools to perform full CRUD operations on external APIs.

  5. Targeted Call Analysis: You can now specify outcomeIds in your AnalysisPlan to calculate specific outcomes during call analysis. This allows for more focused analytics based on your defined metrics and KPIs.

  1. Custom headers for custom LLM models: You can now add custom headers to both Custom LLM Models and Workflow Custom Models (including in assistants, squads, and workflows). This lets you send custom HTTP headers—such as for authentication or extra metadata—when Vapi calls your custom LLM API. The headers property overrides default headers (except Authorization, which should be set via your custom-llm credential).