curl -X POST "https://app.autocalls.ai/api/user/whatsapp/voice/request" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sender_id": 12,
"recipient_phone": "+40711222333",
"recipient_name": "Ana Pop"
}'
const response = await fetch(
'https://app.autocalls.ai/api/user/whatsapp/voice/request',
{
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
sender_id: 12,
recipient_phone: '+40711222333',
recipient_name: 'Ana Pop',
}),
}
);
console.log(await response.json());
import requests
response = requests.post(
'https://app.autocalls.ai/api/user/whatsapp/voice/request',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
json={
'sender_id': 12,
'recipient_phone': '+40711222333',
'recipient_name': 'Ana Pop',
},
)
print(response.json())
{
"success": true,
"sender_id": 12,
"customer_phone": "+40711222333",
"conversation_id": "9c2e1d4a-6b8f-4c11-9a0e-1f2d3c4b5a67",
"status": "pending",
"can_call": false,
"can_request": false,
"session_open": true,
"expires_at": null,
"requested_at": "2026-08-15T10:15:00+00:00"
}
{
"success": false,
"error": "This contact has not messaged you in the last 24 hours. Send a regular template first and wait for their reply, then ask to call.",
"error_code": "SESSION_CLOSED"
}
WhatsApp
Request call permission
Send a WhatsApp Voice Call Request (Ask to call) to a customer
POST
/
user
/
whatsapp
/
voice
/
request
curl -X POST "https://app.autocalls.ai/api/user/whatsapp/voice/request" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sender_id": 12,
"recipient_phone": "+40711222333",
"recipient_name": "Ana Pop"
}'
const response = await fetch(
'https://app.autocalls.ai/api/user/whatsapp/voice/request',
{
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
sender_id: 12,
recipient_phone: '+40711222333',
recipient_name: 'Ana Pop',
}),
}
);
console.log(await response.json());
import requests
response = requests.post(
'https://app.autocalls.ai/api/user/whatsapp/voice/request',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
json={
'sender_id': 12,
'recipient_phone': '+40711222333',
'recipient_name': 'Ana Pop',
},
)
print(response.json())
{
"success": true,
"sender_id": 12,
"customer_phone": "+40711222333",
"conversation_id": "9c2e1d4a-6b8f-4c11-9a0e-1f2d3c4b5a67",
"status": "pending",
"can_call": false,
"can_request": false,
"session_open": true,
"expires_at": null,
"requested_at": "2026-08-15T10:15:00+00:00"
}
{
"success": false,
"error": "This contact has not messaged you in the last 24 hours. Send a regular template first and wait for their reply, then ask to call.",
"error_code": "SESSION_CLOSED"
}
Sends the sender’s approved Voice Call Request template so the customer can Allow or Decline WhatsApp calls.
This endpoint will not send the request if the 24-hour chat window is closed. That protects your WhatsApp quota: a request sent to a brand-new number is not delivered, but still counts as your one ask for the day.
Rate-limited to 5 requests per minute, 20 per hour, and 50 per day per user. WhatsApp typically allows 1 ask per contact every 24 hours and 2 per week. Those WhatsApp counters reset after a connected call.
Request Body
Optional Voice Call Request template ID. If omitted, the sender’s approved voice-call template is used.
Response Fields
Same shape as Get call permission, plussuccess.
Error codes
| HTTP | error_code | Meaning |
|---|---|---|
| 404 | SENDER_NOT_FOUND | Sender missing or not yours |
| 422 | INVALID_PHONE | Phone is not valid E.164 |
| 422 | VOICE_DISABLED | Calling is not enabled on this sender |
| 422 | TEMPLATE_NOT_FOUND | No approved Voice Call Request template |
| 422 | SESSION_CLOSED | Customer has not messaged you in the last 24 hours |
| 422 | REQUEST_LIMIT | Already asked in the last 24 hours (and no connected call reset the counter), weekly cap reached, or they already granted |
| 422 | REGION_NOT_SUPPORTED | WhatsApp does not allow business-initiated calls from this sender’s country (US, CA, EG, VN, NG, TR) |
| 422 | SEND_FAILED | WhatsApp rejected the send |
| 429 | — | API rate limit |
curl -X POST "https://app.autocalls.ai/api/user/whatsapp/voice/request" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sender_id": 12,
"recipient_phone": "+40711222333",
"recipient_name": "Ana Pop"
}'
const response = await fetch(
'https://app.autocalls.ai/api/user/whatsapp/voice/request',
{
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
sender_id: 12,
recipient_phone: '+40711222333',
recipient_name: 'Ana Pop',
}),
}
);
console.log(await response.json());
import requests
response = requests.post(
'https://app.autocalls.ai/api/user/whatsapp/voice/request',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
json={
'sender_id': 12,
'recipient_phone': '+40711222333',
'recipient_name': 'Ana Pop',
},
)
print(response.json())
{
"success": true,
"sender_id": 12,
"customer_phone": "+40711222333",
"conversation_id": "9c2e1d4a-6b8f-4c11-9a0e-1f2d3c4b5a67",
"status": "pending",
"can_call": false,
"can_request": false,
"session_open": true,
"expires_at": null,
"requested_at": "2026-08-15T10:15:00+00:00"
}
{
"success": false,
"error": "This contact has not messaged you in the last 24 hours. Send a regular template first and wait for their reply, then ask to call.",
"error_code": "SESSION_CLOSED"
}
Recommended flow
- Send a regular template if there is no open chat
- Wait for the customer to reply (or poll session status)
- Call this endpoint
- Listen for
call_permission_grantedon the voice webhook - Place the call

