Prerequisites
Voice features require a connected Twilio integration to provision phone
numbers and place calls. Follow the Connect an Integration
guide to set up Twilio first. You’ll also need at least one registered phone
number (covered below).
Choose a voice
Browse the available voices and audition them with their preview URLs:GET /v1/voice/tts-models and GET /v1/voice/stt-models. Once you’ve chosen a voice_id, create a pipeline config.
Create a voice pipeline config
A voice pipeline config controls how your assistant sounds — which voice it uses, the STT engine, language, and the opening greeting. Attach it to exactly one owner: an assistant (agent_id), a team_id, or a persona_id.
Response
The greeting fields (
first_speaker, mode, text) are returned nested under first_speaking_config — they live on the assistant’s revision. For a reusable config you can share across assistants, use /v1/voice/saved-configs and link it with PUT /v1/voice/assistants/{agent_id}/voice-config-source.
Tune call behavior
Interruptions, silence handling, voicemail detection, DTMF, and background audio are configured on call-settings, separate from the pipeline config. Each owner has its own call-settings resource:GET/PATCH /v1/assistants/{agent_id}/revisions/{revision_id}/call-settingsGET/PATCH /v1/teams/{team_id}/call-settingsGET/PATCH /v1/personas/{persona_id}/call-settings
interruptions_enabled (and thresholds like interruption_min_words), silence_timeout_ms / silence_reminder_count, voicemail_detection_mode (off or leave_message), dtmf_enabled, background_audio_preset, recording_enabled, and transcription_storage_enabled.
Audio recording and privacy
Whether call audio is retained — and in what form — is an organization-wide setting on the privacy config, distinct from the per-assistantrecording_enabled capture toggle. Set it with PUT /v1/privacy/config:
Fetch a time-limited playback URL for a stored recording with
GET /v1/voice/recordings/{recording_id}/playback-url. See Privacy & Data Protection for the full PII and retention model.
Register a phone number
To receive or place calls on a real number, register it with Feather and bind it to an assistant.1
Register the phone number
vendor_mode: "byo" means Bring Your Own — the number is already provisioned in your Twilio account. The response returns the phone number id with status: "active".2
Bind an assistant to the number
Create an inbound channel so calls to this number route to your assistant automatically.Your number now routes directly to the assistant. Call it to test.
Place an outbound call
Programmatically dial a customer from a registered number.Response
session_id to look up the transcript and evaluation results after the call ends. You can pause, resume, or cancel outbound dispatch with POST /v1/voice/outbound/pause · /resume · /cancel, and restrict calling to business hours with GET/PUT /v1/voice/call-window.
Start a web call (browser testing)
Test your voice assistant in a browser without a phone number. Feather creates a LiveKit room and returns credentials for the LiveKit client SDK.Response
Warm call transfer
A warm transfer puts the customer on a brief hold, dials a human supervisor in the background, briefs them, and then bridges the two together — so the operator is never caught off guard.1
Register a bridge number
Bridge numbers are the dedicated lines Feather uses to conference the two parties. Import one at the org level using its Twilio SID.
2
Define a transfer destination
Configure the destination as a
call_transfer tool (POST /v1/tools with tool_type: "call_transfer") with a static E.164 destination or a dynamic destination resolved from an API tool. Attach it to your assistant revision like any other tool.3
Let the assistant transfer in-call
When a transfer is warranted, the assistant triggers it in-call via the
transfer_call platform tool or a workflow handoff node. In warm mode, Feather holds the caller, dials the supervisor on the bridge line, plays an AI briefing they can accept or decline, and then conferences both parties. Inspect what happened with GET /v1/voice/warm-transfer/{conversation_id}/transfer-detail.If the supervisor leg never connects, the attempt lands in the failed-transfer
inbox (
GET /v1/hitl/failed-transfers) so you can follow up.Next steps
Privacy & data protection
Configure PII scrubbing, audio-retention policies, and data retention.
Voice API reference
Full reference for voice config, calling, recordings, and warm transfer.