To initiate outbound calls, you first need to configure your Daily rooms to allow dial-out by setting enable_dialout in dailyRoomProperties. Then, include the target phone number(s) in the request body of {service}/start.

In this example, we use the dialout_settings array to pass one or more phone numbers for the bot to dial. Each object in the array must include a phoneNumber and can optionally specify a callerId to control the outbound caller ID.

If no callerId is provided, a random phone number will be used to make the call. To specify the caller ID, use the phone number’s id as the callerId.

curl --request POST \
--url https://api.pipecat.daily.co/v1/public/{service}/start \
--header 'Authorization: Bearer $API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    'createDailyRoom': true,
    'dailyRoomProperties': {
        'enable_dialout': true,
        'exp': 1742353929
    },
    'body': {
        'dialout_settings': \
        [{'phoneNumber': '+1TARGET', 'callerId': 'UUID_OF_PURCHASED_NUM'}]
    }
}

The API_KEY here is Pipcat Cloud’s public API key, typically begins with “pk_…”

The bot should begin dialing out as soon as the call state transitions to the joined state.

Unlike dial-in scenarios where the bot typically speaks first, dial-out calls may require the bot to wait for the remote user to speak. In these cases, you can start listening for the remote user when the on_dialout_answered event fires.

This is also a good point to initiate voicemail detection—for example, by analyzing the remote user’s audio to determine if the call has reached a voicemail.

@transport.event_handler("on_call_state_updated")
async def on_call_state_updated(transport, state):
    if state == "joined" and dialout_settings:
        await start_dialout(transport, dialout_settings)

@transport.event_handler("on_dialout_answered")
    async def on_dialout_answered(transport, data):
        # the bot will wait for the user to speak before responding
        await rtvi.set_bot_ready()

Examples of dialout_settings

Here are various configurations you can use in the dialout_settings array:

"dialout_settings": [
  { 
    "sipUri": "sip:+1xxxx@domain.sip.twilio.com" 
  }
]

Next Steps

After configuring your dial-out functionality, you can implement a Pipecat bot to handle the call interactions:

Dial-in/Dial-out Bot Example

Complete example of a Pipecat bot implementation that handles both incoming (dial-in) and outgoing (dial-out) calls with voicemail detection