# Route Voicemails with Python and Telnyx AI

> Source: <https://dev.to/sonam_50a41a4ced7e6b4f3fa/route-voicemails-with-python-and-telnyx-ai-39n1>
> Published: 2026-07-30 18:18:05+00:00

I built a small Flask example that turns voicemail into a routing workflow.

Code:

[https://github.com/team-telnyx/telnyx-code-examples/tree/main/voicemail-smart-router-python](https://github.com/team-telnyx/telnyx-code-examples/tree/main/voicemail-smart-router-python)

The app accepts either:

For audio, it transcribes the voicemail first. Then it uses Telnyx AI Inference to classify the message and decide where it should go.

The app classifies voicemails into:

`urgent`

`billing`

`support`

`sales`

`spam`

`routine`

Each category maps to a route:

``` php
urgent  -> Slack alert
billing -> email
support -> ticket queue
sales   -> CRM lead
spam    -> blocklist + archive
routine -> daily digest
git clone https://github.com/team-telnyx/telnyx-code-examples.git
cd telnyx-code-examples/voicemail-smart-router-python
cp .env.example .env
pip install -r requirements.txt
python app.py
```

Configure `.env`

:

```
TELNYX_API_KEY=your_telnyx_api_key
AI_MODEL=zai-org/GLM-5.2
FALLBACK_MODEL=meta-llama/Llama-3.3-70B-Instruct
HOST=127.0.0.1
```

Optional Slack webhook for urgent messages:

```
SLACK_WEBHOOK=https://hooks.slack.com/...
curl -X POST http://localhost:5000/voicemails/transcript \
  -H "Content-Type: application/json" \
  -d '{
    "transcript": "This is an emergency. Our production system is down and we need help immediately.",
    "caller_number": "+17177247292"
  }'
```

Example response:

```
{
  "category": "urgent",
  "confidence": 1.0,
  "priority": "high",
  "reason": "The caller reports a production system outage requiring immediate attention.",
  "suggested_action": "Escalate immediately to the on-call engineering team.",
  "route": "slack",
  "routed_to": "#oncall-alerts",
  "routing_status": "delivered"
}
curl -X POST http://localhost:5000/voicemails/process \
  -F "file=@voicemail.wav" \
  -F "caller_number=+17177247292"
```

For audio, the app calls:

```
POST /v2/ai/audio/transcriptions
```

using:

```
distil-whisper/distil-large-v2
```

Then it calls:

```
POST /v2/ai/chat/completions
```

to classify the transcript.

`POST /voicemails/transcript`

`POST /voicemails/process`

`GET /voicemails`

`GET /voicemails/<id>`

`GET /routes`

`GET /health`

This sample uses in-memory storage and a simple routing map.

For production, I would add:

The useful pattern is not just classification. It is classification plus action. The model turns a voicemail into structured intent, and the application routes it to the right workflow.

Resources:
