# Streaming and AI Bots

> Three ways to put your own AI voice bot on an Indian phone number with Edesy - Media Streams (raw audio), Conversation Relay (text only) or SIP.

Source: https://edesy.in/docs/voice-api/streaming

Edesy gives you three ways to connect your own AI voice bot to calls on Indian numbers. **Media Streams** sends raw call audio to your WebSocket and plays back what you send. **Conversation Relay** sends your bot text and speaks its text replies, with Edesy running speech recognition, speech synthesis, barge-in and DTMF. **SIP** hands the call to a SIP-based agent platform such as LiveKit Cloud, Vapi, Retell or Bolna.

| | Media Streams | Conversation Relay | SIP |
|---|---|---|---|
| Your bot receives | Raw L16 PCM audio | Transcribed text | A SIP call with RTP audio |
| Who runs STT, TTS, VAD, barge-in | You | Edesy | Your agent platform |
| Best for | Pipecat or custom audio pipelines | An LLM bot with no audio code | LiveKit, Vapi, Retell, Bolna, Dograh, any SIP endpoint |
| Docs | [Media Streams](https://edesy.in/docs/voice-api/streaming/media-streams) | [Conversation Relay](https://edesy.in/docs/voice-api/streaming/conversation-relay) | [SIP for AI voice agents](https://edesy.in/docs/sip-trunk-for-ai-voice-agents) |

Not sure which to pick? See [SIP, Stream or Relay?](https://edesy.in/docs/voice-api/streaming/choosing-sip-stream-or-relay).

## Setting it up

- **Inbound:** point a number at your bot once with [Inbound Routing](https://edesy.in/docs/voice-api/phone-numbers/inbound-routing). Every call to the number reaches the bot.
- **Outbound (Media Streams):** send `stream_url` on [`POST /v1/calls`](https://edesy.in/docs/voice-api/calls/make-a-call). The same bot code handles both directions.
- **Preflight:** test your endpoint from the Edesy network before any call with `POST /v1/stream-test` (Media Streams) or `POST /v1/relay-test` (Conversation Relay).
- **Debugging:** `GET /v1/calls/{CallSid}/events` records whether Edesy reached your bot (`call.stream.connected` / `call.stream.failed`, `call.relay.connected` / `call.relay.failed`) and why not.
