--- title: "Telephony Integration" description: "Connect voice agents with telephony providers for inbound and outbound calls" --- ## Overview Dograh AI's telephony integration system provides a unified interface for connecting with various telephony providers. This abstraction layer allows you to easily switch between providers without changing your application logic. ## Supported Providers Industry-leading cloud communications platform with global reach High-quality voice with 16kHz audio and excellent international coverage Build your own telephony provider integration ## Architecture The telephony integration system uses a provider abstraction pattern that ensures consistency across different services: ```python # All providers implement this interface class TelephonyProvider(ABC): async def initiate_call(to_number: str, webhook_url: str, workflow_run_id: Optional[int] = None, **kwargs) async def get_call_status(call_id: str) -> Dict[str, Any] async def get_available_phone_numbers() -> List[str] def validate_config() -> bool async def verify_webhook_signature(url: str, params: Dict, signature: str) -> bool async def get_webhook_response(workflow_id: int, user_id: int, workflow_run_id: int) -> str async def get_call_cost(call_id: str) -> Dict[str, Any] ``` ## Configuration Dograh AI uses database configuration for all telephony providers. Configure providers through the web interface: 1. Navigate to **Settings** → **Integrations** → **Telephony** 2. Select your provider 3. Enter credentials 4. Test connection ## Common Features The telephony integration in Dograh AI supports: - **Outbound Calls**: Initiate calls to any phone number - **Call Status Tracking**: Monitor call lifecycle events (initiated, ringing, answered, completed, failed) - **WebSocket Streaming**: Real-time audio streaming for voice agents - **Webhook Authentication**: Secure webhook signature verification ## Code Usage Here's how to use the telephony provider in your code: ```python from api.services.telephony.factory import get_telephony_provider # Get provider based on organization configuration provider = await get_telephony_provider(organization_id) # Initiate a call result = await provider.initiate_call( to_number="+1234567890", webhook_url="https://your-domain.com/webhook", workflow_run_id=123 ) # Check call status status = await provider.get_call_status(result["call_id"]) # Get call cost after completion cost_info = await provider.get_call_cost(result["call_id"]) ``` ## API Endpoints The telephony system exposes these unified endpoints: | Endpoint | Method | Description | |----------|---------|-------------| | `/api/v1/telephony/initiate-call` | POST | Start an outbound call | | `/api/v1/telephony/status-callback/{id}` | POST | Receive call status updates | | `/api/v1/telephony/webhook/{id}` | GET/POST | Handle initial webhook | | `/api/v1/telephony/ws/{id}` | WebSocket | Real-time audio streaming | ## Implementation Status - **Twilio**: ✅ Fully implemented and tested - **Vonage**: ✅ Fully implemented with 16kHz audio support - **Custom Providers**: The abstraction layer supports adding new providers by implementing the `TelephonyProvider` interface - **API Endpoints**: All telephony operations use the unified `/api/v1/telephony/*` endpoints: - `/api/v1/telephony/initiate-call` - Start outbound calls - `/api/v1/telephony/status-callback/{id}` - Receive call status updates - `/api/v1/telephony/webhook/{workflow_id}/{user_id}/{workflow_run_id}` - Initial call webhook - `/api/v1/telephony/ws/{workflow_id}/{user_id}/{workflow_run_id}` - WebSocket for audio streaming ## Troubleshooting - Verify credentials are correctly configured - Check phone number format (must include country code) - Ensure webhook URLs are publicly accessible - Review provider-specific error logs - Check network bandwidth and latency - Verify audio codec compatibility - Review WebSocket connection stability - Ensure proper audio format: - Twilio: 8kHz μ-law (MULAW) - Vonage: 16kHz Linear PCM - Confirm auth tokens match between provider and configuration - Verify webhook URL matches exactly (including parameters) - Check for proxy or load balancer modifications ## Next Steps - [Set up your first telephony provider](/integrations/telephony/twilio) - [Build a custom provider integration](/integrations/telephony/custom) - [Configure webhooks and callbacks](/integrations/telephony/webhooks)