Things you’ll need
- An active Daily developer account with API key
- At least one phone number purchased through Daily (covered below)
- For local development: ngrok to expose your bot to the Internet
Dial-in Example
Complete dial-in implementation with the Pipecat development runner
Dial-out Example
Outbound calling with Daily PSTN integration
Cold Transfer Example
Cold transfer implementation for advanced call routing
Phone Number Management
Before setting up dial-in or dial-out, you’ll need to purchase phone numbers through Daily.Daily Phone Numbers Guide
Complete guide to searching, purchasing, and managing phone numbers with
Daily’s REST API
Dial-in
Dial-in allows users to call your phone number and connect directly to your Pipecat bot.How It Works
Here’s the sequence of events when someone calls your Daily phone number:- Daily receives an incoming call to your phone number
- Daily calls your webhook endpoint
- The webhook creates a Daily room with SIP configuration
- The webhook starts your bot with the room details and caller information
- The caller is put on hold with music
- The bot joins the Daily room and signals readiness
- Daily forwards the call to the Daily room
- The caller and bot are connected for the conversation
Local Development
The Pipecat development runner provides built-in webhook handling for Daily PSTN dial-in, eliminating the need for a separate webhook server.1. Run your bot with dial-in support
/daily-dialin-webhook endpoint.
2. Expose your bot to the internet
https://abc123.ngrok.io).
3. Configure your Daily phone number
Set your phone number’sroom_creation_api webhook to:
Daily Dial-in Config API
Instructions for configuring the webhook URL for your phone number
Create pinless dial-in config
Configure your Pipecat bot for dial-in
The bot receives dial-in information throughRunnerArguments containing:
room_url: Daily room URL for the calltoken: Daily room token for authenticationbody: ContainsDailyDialinRequestwith call details
bot.py
Complete Bot Implementation
See the full bot.py with argument handling, transport setup, and pipeline
configuration
Customize Your Bot with Caller Information
Use the caller’s phone number to personalize the conversation:Run the Example
Complete Setup Instructions
See the full README with step-by-step setup, environment variables, and
troubleshooting tips
Dial-out
Dial-out allows your bot to initiate calls to phone numbers. Unlike dial-in, your bot starts the call rather than waiting for incoming calls.How It Works
Here’s the sequence of events for dial-out calls:- Your application triggers a dial-out (via API call or user action)
- Server creates a Daily room with dial-out capabilities enabled
- Bot joins the Daily room and sets up the pipeline
- Bot initiates the dial-out call to the target phone number
- Daily connects the call to the phone number
- The recipient answers and is connected to your bot
- The bot handles the conversation with the called party
Set up your server for dial-out
The dial-out server is simpler than dial-in since you’re initiating calls rather than receiving webhooks. Your server needs to:- Create Daily rooms with dial-out enabled
- Start bot processes with the target phone number
- Handle API requests to trigger outbound calls
Complete Server Implementation
See the full FastAPI server code with room creation and dial-out triggering
Configure your Pipecat bot for dial-out
The dial-out bot receives the target phone number and creates a transport without dial-in settings: Bot Entry Point: Thebot() method receives RunnerArguments containing:
room_url: Daily room URL for the calltoken: Daily room token for authenticationphone_number: Target phone number to call
DailyTransport:
bot.py
Complete Bot Implementation
See the full bot.py with dial-out configuration and pipeline setup
Run the Example
To test dial-out functionality:- Start your server: Run your FastAPI server
- Trigger a call: Make an API request to start a dial-out call
- Answer your phone: The bot will call the specified number
- Talk to your bot: Have a conversation with your AI agent
Complete Setup Instructions
See the full README with step-by-step setup, API usage, and configuration
details
Call Transfers
Daily supports cold transfers, allowing you to transfer an active call to another phone number. The bot can initiate a transfer and then leave the call, connecting the caller directly to the transfer destination.How Call Transfers Work
- Bot receives transfer request (via function call or user input)
- Bot informs the caller about the transfer
- Bot initiates SIP call transfer to the destination number
- Daily connects the transfer to the destination
- Bot leaves the call (cold transfer)
- Caller and destination continue the conversation
Implementing Call Transfers
Call transfers are typically implemented as LLM function calls that your bot can invoke:bot.py
Handling Transfer Events
Your bot should handle transfer-related events to manage the call flow:bot.py
Complete Transfer Implementation
See the full call transfer example with LLM function calls, event handling,
and error management
Deployment
Pipecat Cloud
For production deployment without managing your own infrastructure, use Pipecat Cloud. Pipecat Cloud handles all webhook infrastructure, room creation, and bot scaling automatically.Daily Dial-in on Pipecat Cloud
Complete guide for deploying dial-in bots with automatic webhook handling
Daily Dial-out on Pipecat Cloud
Complete guide for deploying dial-out bots with caller ID management
Self-Hosted Deployment
For self-hosted production deployment, ensure your servers are:- Publicly accessible with HTTPS
- Able to handle concurrent requests
- Properly configured with your Daily API credentials
Next Steps
- Explore the complete examples for full implementations
- Learn about Daily’s SIP integration for more advanced telephony scenarios
- Check out Daily’s REST API documentation for additional configuration options