Send a message after an AI phone call
The highest-value moment for messaging after a voice AI call is the minute it ends: a written confirmation, a payment or booking link, or a follow-up the customer can act on. SendiMessage is the layer that sends it and catches the reply.
This pattern is platform-neutral. Whichever voice AI you run, the shape is the same: the call-ended event reaches your backend, your backend calls POST /send-message, and the customer's reply returns as a signed receive webhook. For platform-specific notes, see the Vapi and Retell AI guides.
What this integration enables
Architecture
- AI voice agentYour voice platform runs the call
- Call endsA call-completed / end-of-call event fires
- Your backendReceives the event and decides whether to text
- SendiMessage APIPOST /send-message queues the follow-up on your line
- Customer receives the messageiMessage where supported, SMS fallback where configured
- Customer repliesThe answer arrives on the same thread
- Signed receive webhookSendiMessage posts the reply to your endpoint
- Your workflow continuesConfirm, reschedule, escalate — inside your application
Example request
// Your application (not SendiMessage) decides what to say.const res = await fetch("https://api.sendimessage.com/v1/send-message", {method: "POST",headers: {"X-API-Key": process.env.SENDIMESSAGE_API_KEY,"X-API-Secret": process.env.SENDIMESSAGE_API_SECRET,"Content-Type": "application/json",// Idempotency-Key derived from your own record id keeps a// retried automation from double-texting the customer."Idempotency-Key": callId,},body: JSON.stringify({ number: customer.phone, content: agentReply }),});const { message_handle } = await res.json(); // store this on your record
Trigger this from your voice platform's call-ended event. The Idempotency-Key (derived from the call id) makes a retried event safe.
Limitations and honest notes
- iMessage delivery is available on supported messaging lines and destinations. Recipients without iMessage receive SMS when fallback is configured — never assume universal iMessage availability.
- Messages are accepted asynchronously — the API returns status QUEUED and final status arrives via webhook or the message endpoints.
- No official SDK for this ecosystem yet — the example uses plain HTTP against the REST API. Official SDKs are published for JavaScript/TypeScript (npm: sendimessage), Python (PyPI: sendimessage), PHP (Composer: sendimessage/sdk), and Go (github.com/sendimessage/sendimessage-go). Every SDK is dependency-free and covers the full public API surface.
- SendiMessage handles messaging only — the voice call, transcription, and model stay on your voice platform.
- Delivery is asynchronous: the send returns 201 QUEUED and the final state arrives via the outbound webhook or GET /v2/messages.
Security considerations
- Send messages only to recipients who expect them. Transactional and operational messaging is the primary use case — unsolicited bulk marketing is not.
- Do not place SendiMessage API credentials directly in browser code. Send requests through your own server route or backend.
- Keep your API key server-side, in environment variables or a secrets manager — never in client code, CRM front-end scripts, or repositories.
- Verify the signature header on every incoming webhook before trusting the event.
- Scope keys per environment and rotate them if they are ever exposed.
Frequently asked questions
Does this work with my voice platform?
Will the follow-up be an iMessage?
Related integrations
Ready to connect Voice AI Post-Call Follow-Up?
Request a messaging line and a SendiMessage integration specialist will review your Voice AI Post-Call Follow-Up workflow and guide the setup.