Bidirectional Streams
Bring your own bot.
Bring your own bot.
We answer
the phone.
Every call becomes a WebSocket. Speak the Twilio Media Streams protocol and your Pipecat bot runs unchanged.
CallerAny phone, any carrier
SIP · RTP
your number · SIP trunk
FonosterTelephony + streams
AudioRaw frames, mark, clear
SpeechSTT, TTS, turn events
ControlDTMF, transfer, hang up
WebSocket
wss://bot.acme.com/ws
Your botPipecat, Autopilot, your code
→↓start callSid=CA7f…
→↓media inbound · μ-law
←↑media payload=…
←↑mark reply-1
→↓dtmf 5
Speaks what your bot already speaks
- Pipecat
- Twilio Media Streams
- Autopilot
- Python
- TypeScript
Twilio Media Streams compatible
Your Pipecat bot. Unchanged.
Fonoster speaks the protocol your bot already uses. Point a number at it and take the call.
phone
WebSocket · protocol: twilio
bot
- start callSid=CA7f…
- media "Hi, I need to reschedule"
- media "Sure, which day works?"
- mark reply-1
- media "Actually—"
- clear
- mark reply-1
- dtmf 5
Zero code changes
Keep your serializer and pipeline. Only the number changes.
Barge-in that works
clear and mark behave exactly as your bot expects.
Hang up from the bot
auto_hang_up works through a Twilio-compatible endpoint.
Quickstart
Point a number
Point a number
at a URL.
An app is a WebSocket URL and a protocol. Create it, then point a number at it. Calls open a socket to your bot.
$ fonoster applications:create \
--name support-bot \
--url wss://bot.acme.com/ws \
--flavor twilio # or native
✔ Application created: 7f3c9a…
$ fonoster sipnet:numbers:update 2b81e4…
? Application support-bot
? Ready? Yes
✔ Done!
Grows with every call.
Scale without rewrites
Your first call or your busiest day. Same app, same code.
Built for real-time
Audio takes the shortest path from the caller to your bot.
Calls stay up
Upgrade and scale out without dropping live calls.