AI-powered cold calling platform. SaaS multi-tenant + turnkey deployment.
VoxPilot automates outbound cold calling using AI voice agents. Each tenant gets their own workspace with campaigns, prospect lists, call scripts, and analytics. The bot handles the entire call flow — greeting, qualification, pitch, objection handling, and closing — with natural conversation and real-time interruption handling.
- Multi-tenant SaaS — sign up, configure providers, run campaigns
- 3 telephony providers — Telnyx ($0.005/min), Twilio, Plivo
- 3 LLM providers — Ollama (local/free), OpenAI, Anthropic
- 2 STT providers — Whisper (local/free), Deepgram (cloud)
- 2 TTS providers — XTTS (local/free), ElevenLabs (cloud)
- Campaign management — scheduling, pacing, retry logic, concurrent call limits
- Prospect qualification — weighted scoring with configurable criteria
- Objection handling — pattern-matched responses, customizable per script
- Conversation stages — Greeting → Qualification → Pitch → Objection Handling → Closing
- Real-time interruption handling — bot stops talking when caller speaks
- Call analytics — success rates, duration, outcomes, objection tracking
- CSV prospect import — bulk upload lead lists
- API-first — full REST API with JWT + API key auth
cp .env.example .env
# Edit .env with your secrets and provider keys
docker compose up -dThis starts: API server (:8000), Celery worker, PostgreSQL, Redis.
# Prerequisites: Python 3.10+, PostgreSQL, Redis
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
# Start PostgreSQL and Redis (or use Docker for just those)
docker compose up -d postgres redis
# Run migrations
alembic upgrade head
# Start API server
uvicorn voxpilot.main:app --reload --port 8000
# Start worker (in another terminal)
celery -A voxpilot.worker.celery_app worker -l infocurl -X POST http://localhost:8000/api/v1/auth/signup \
-H "Content-Type: application/json" \
-d '{"email": "you@company.com", "password": "secure123", "full_name": "Your Name", "company_name": "Acme Inc"}'Returns access_token — use as Authorization: Bearer <token> for all subsequent requests.
curl -X POST http://localhost:8000/api/v1/tenants/me/provider-configs \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"provider_type": "telephony", "provider_name": "telnyx", "config": {"api_key": "your-telnyx-key"}}'curl -X POST http://localhost:8000/api/v1/scripts/ \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Solar Sales Q2",
"system_prompt": "You are Alex, a professional solar energy consultant...",
"greeting_message": "Hi! This is Alex from Green Energy Solutions."
}'curl -X POST http://localhost:8000/api/v1/campaigns/ \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Q2 Solar Push", "script_id": "<script-id>", "caller_id": "+15551234567"}'curl -X POST http://localhost:8000/api/v1/prospects/import \
-H "Authorization: Bearer $TOKEN" \
-F "file=@prospects.csv" \
-F "campaign_id=<campaign-id>"CSV format: phone_number,first_name,last_name,email,company,timezone
curl -X POST http://localhost:8000/api/v1/campaigns/<campaign-id>/start \
-H "Authorization: Bearer $TOKEN"curl http://localhost:8000/api/v1/analytics/overview?days=30 \
-H "Authorization: Bearer $TOKEN"| Method | Path | Description |
|---|---|---|
| POST | /api/v1/auth/signup | Create tenant + user |
| POST | /api/v1/auth/login | Get JWT tokens |
| POST | /api/v1/auth/api-keys | Create API key |
| GET/PATCH | /api/v1/tenants/me | Tenant profile |
| POST | /api/v1/tenants/me/provider-configs | Configure providers |
| CRUD | /api/v1/scripts/ | Call scripts |
| CRUD | /api/v1/campaigns/ | Campaigns |
| POST | /api/v1/campaigns/{id}/start | Start campaign |
| CRUD | /api/v1/prospects/ | Prospects |
| POST | /api/v1/prospects/import | CSV import |
| POST | /api/v1/calls/initiate | Ad-hoc call |
| GET | /api/v1/calls/{id}/transcript | Call transcript |
| GET | /api/v1/analytics/overview | Tenant analytics |
| GET | /api/v1/analytics/campaigns/{id} | Campaign analytics |
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Telnyx │ │ Twilio │ │ Plivo │
│ Twilio │────▶│ Webhooks │────▶│ WebSocket │
│ Plivo │ │ /webhooks/* │ │ /ws/{id} │
└──────────────┘ └──────┬───────┘ └──────┬───────┘
│ │
┌──────▼─────────────────────▼──────┐
│ BotEngine │
│ ┌─────────────────────────────┐ │
│ │ Pipecat Pipeline │ │
│ │ STT → ConversationMgr → │ │
│ │ LLM → TTS → Interruption │ │
│ └─────────────────────────────┘ │
└──────────────┬──────────────────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
┌──────▼──────┐ ┌───────▼──────┐ ┌───────▼──────┐
│ PostgreSQL │ │ Redis │ │ Celery │
│ (tenants, │ │ (rate limit │ │ (campaign │
│ calls...) │ │ + broker) │ │ dialer) │
└─────────────┘ └──────────────┘ └──────────────┘
| Type | Provider | Cost | Notes |
|---|---|---|---|
| Telephony | Telnyx | $0.005/min | Recommended |
| Telephony | Twilio | $0.02+/min | Higher cost |
| Telephony | Plivo | ~$0.01/min | Mid-range |
| LLM | Ollama | Free | Local, requires GPU |
| LLM | OpenAI | ~$0.01/call | GPT-4.1 |
| LLM | Anthropic | ~$0.01/call | Claude Sonnet |
| STT | Whisper | Free | Local |
| STT | Deepgram | $0.0043/min | Cloud, low latency |
| TTS | XTTS | Free | Local |
| TTS | ElevenLabs | $0.18/1K chars | Premium voices |
Minimum (all local): ~$5-20/month (telephony only) Cloud stack: ~$50-100/month for 1000 calls
- XMTP messaging channel (post-call follow-up)
- Dashboard web UI
- CRM integrations (HubSpot, Salesforce)
- A/B testing for scripts
- Call recording + playback
- Webhook notifications for call outcomes
- Multi-language support
MIT