Simple outbound announcement flow using Vapi.
Perfect for:
- loyalty/reward reminders
- appointment reminders
- billing notifications
- delivery alerts
- pharmacy pickup notifications
The customer does not need to speak.
The flow:
- Start outbound call
- Play announcement
- Automatically hang up after playback finishes
Create outbound call
↓
Get monitor.controlUrl from response
↓
Send "say" control message
↓
endCallAfterSpoken: true
↓
Call automatically ends
curl 'https://api.vapi.ai/call' \
-H 'authorization: Bearer YOUR_API_KEY' \
-H 'content-type: application/json' \
--data-raw '{
"assistantId": "YOUR_ASSISTANT_ID",
"customer": {
"number": "+12345678913"
},
"phoneNumberId": "YOUR_PHONE_NUMBER_ID"
}'{
"id": "7420f27a-30fd-4f49-a995-5549ae7cc00d",
"assistantId": "5b0a4a08-133c-4146-9315-0984f8c6be80",
"phoneNumberId": "42b4b25d-031e-4786-857f-63b346c9580f",
"type": "outboundPhoneCall",
"createdAt": "2024-09-10T11:14:12.339Z",
"updatedAt": "2024-09-10T11:14:12.339Z",
"customer": {
"number": "+12345678913"
},
"status": "queued",
"monitor": {
"listenUrl": "wss://aws-us-west-2-production1-phone-call-websocket.vapi.ai/7420f27a-30fd-4f49-a995-5549ae7cc00d/transport",
"controlUrl": "https://aws-us-west-2-production1-phone-call-websocket.vapi.ai/7420f27a-30fd-4f49-a995-5549ae7cc00d/control"
}
}Use:
monitor.controlUrl
for the next step.
curl -X POST 'CONTROL_URL_FROM_PREVIOUS_RESPONSE' \
-H 'content-type: application/json' \
--data-raw '{
"type": "say",
"content": "Hello, you currently have 100 unused points within our supermarket rewards program. Please redeem them soon. Thank you, goodbye.",
"endCallAfterSpoken": true
}'The call will:
- play the announcement
- automatically hang up afterward
- never wait for customer input
No conversational flow required.
This is much cleaner than building a full conversational assistant when you only need:
- one-way announcements
- reminders
- notifications
Benefits:
- lower latency
- lower cost
- no transcription needed
- no interruption handling
- CRM-friendly
- automation-friendly
Works well with:
- n8n
- Make.com
- Zapier
- GoHighLevel
- HubSpot
- custom CRMs
Sometimes the call is not fully connected immediately after creation.
Adding a small delay improves reliability:
2–5 second delay
before sending the control request.
Example dynamic message:
Hello John, you currently have 143 unused points. Please redeem them before expiration. Thank you, goodbye.
Perfect for:
- loyalty systems
- clinics
- insurance reminders
- payment alerts
Webhook / CRM Trigger
↓
Create Vapi Call
↓
Wait 3 Seconds
↓
POST monitor.controlUrl
↓
Auto Hangup
- Use
monitor.controlUrldynamically from each call response - Do NOT hardcode websocket/control URLs
endCallAfterSpoken: trueautomatically terminates the call
- https://docs.vapi.ai/calls/call-features
- https://docs.vapi.ai/calls/voicemail-detection
- https://docs.vapi.ai/calls/customer-join-timeout
Built after watching multiple people accidentally turn a 20-second supermarket announcement into a distributed AI orchestration platform.
An industry tradition.