The Concept
Retell AI vs Bland AI vs Vapi
| Factor | Retell AI | Bland AI | Vapi |
|---|
| Management level | Fully managed | Fully managed | BYO-stack |
| LLM | Included | Included | BYO (your key) |
| TTS | Included | Included | BYO (your key) |
| Telephony | Included | Included | BYO (your Twilio) |
| Custom LLM | Optional (bring your own) | Limited | Required |
| Cost/min | $0.07-0.12 | $0.09-0.15 | $0.05 + providers |
| Best for | Enterprise, white-label | Quick deployment | Cost control |
| Customization | High (custom LLM, webhooks) | Medium | High |
What's the key difference between Retell AI and Vapi?
Retell AI is fully managed (LLM + TTS + telephony all included), while Vapi is BYO-stack (you provide your own LLM, TTS, and phone number)
Retell AI
import requests
def create_retell_agent():
"""Create a Retell AI voice agent."""
response = requests.post(
"https://api.retellai.com/create-agent",
headers={"Authorization": f"Bearer {RETELL_API_KEY}"},
json={
"agent_name": "DeVenture Airlines Agent",
"voice_model": "eleven_labs",
"voice_id": "rachel",
"llm_model": "gpt-4o-mini",
"system_prompt": "You are a DeVenture Airlines voice agent. Keep responses to 1-3 sentences.",
"general_prompt": {
"task_description": "Help customers book flights and check flight status",
"conversation_flow": [
{"role": "system", "content": "Greet the customer"},
{"role": "system", "content": "Ask how you can help"},
{"role": "system", "content": "Process the request"},
{"role": "system", "content": "Confirm and close"}
]
},
"begin_message": "Hi, thanks for calling DeVenture Airlines. How can I help you?",
"end_message": "Thank you for calling DeVenture Airlines. Have a great day!",
"retell_llm_dynamic_variables": {
"company_name": "DeVenture Airlines",
"support_hours": "24/7"
}
}
)
return response.json()
Retell AI Custom LLM
For enterprise, Retell supports custom LLM endpoints:
{
"llm_model": "custom",
"llm_endpoint": "https://your-server.com/llm",
"system_prompt": "You are a voice agent...",
}
Your endpoint receives conversation context and returns the next response:
@app.post("/llm")
async def custom_llm(request):
"""Custom LLM endpoint for Retell AI."""
data = await request.json()
messages = data["messages"]
# Use any LLM you want (Claude, local model, etc.)
response = await call_your_llm(messages)
return {"response": response}
Bland AI
def create_bland_agent():
"""Create a Bland AI voice agent."""
response = requests.post(
"https://api.bland.ai/v1/calls",
headers={"Authorization": f"Bearer {BLAND_API_KEY}"},
json={
"phone_number": "+1234567890",
"pathway_id": "your-pathway-id", # or use prompt
"prompt": "You are a DeVenture Airlines voice agent. Help customers book flights.",
"voice": "josh",
"model": "gpt-4o-mini",
"first_sentence": "Hi, this is DeVenture Airlines calling about your booking.",
"wait_for_user": True,
"max_duration": 12, # minutes
}
)
return response.json()
Bland AI Pathways
Bland AI uses "pathways" — pre-built conversation flows:
| Pathway | Purpose |
|---|
| Customer Support | Handle support calls with escalation |
| Appointment Scheduling | Book/reschedule appointments |
| Survey | Conduct surveys with branching questions |
| Sales Outreach | Cold calls with qualification |
| Custom | Define your own flow |
Bland Pathway Flow
Retell vs Bland: When to Choose
| Your Need | Choose | Why |
|---|
| Enterprise, white-label | Retell | Custom LLM, more control |
| Quick deployment | Bland | Pathways, simpler API |
| Custom conversation flow | Retell | Webhooks + custom LLM |
| Pre-built flows | Bland | Pathways ready to use |
| Cost-sensitive | Retell | Slightly cheaper ($0.07 vs $0.09) |
| Analytics dashboard | Both | Both have good dashboards |