A queue that holds the line
Traffic spikes and quiet capacity are our problem. Messages wait in order and go out as soon as there is room.
WhatsApp Business API
One HTTP call puts a message in front of your customer on WhatsApp. We queue it, retry it up to 3 times, and hand back a delivery state you can act on โ sent, delivered, read.
Templates & free text ยท Automatic retries ยท Read receipts
/api/v1/messages
202
{
"to": "+919140327455",
"template": { "name": "verification_code" },
"clientRef": "signup-8842"
}
A message that fails goes back in the queue and is tried again. Your code sends once.
Send your own reference and a repeated request returns the original message, never a duplicate.
Every message carries a state and a timestamp, from accepted through to delivered and read.
How it works
Issue a key from the dashboard and scope it to send, read, or both. Keys are shown once and revocable at any time.
A recipient and a template โ or free text, inside the 24-hour window. You get a 202 and an id back immediately.
Fetch the id to see where it got to, or watch the whole stream in the dashboard with failure reasons attached.
// Send an OTP and keep the id.
const res = await fetch("https://smsgateway.swiftcoder.in/api/v1/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.WA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "+919140327455",
template: {
name: "verification_code",
components: [{ type: "body", parameters: [{ type: "text", text: code }] }],
},
clientRef: `signup-${user.id}`,
}),
});
const { id, status } = await res.json();
Prefer Python, PHP or plain cURL? Every endpoint is written up in the API reference.
What you get
Traffic spikes and quiet capacity are our problem. Messages wait in order and go out as soon as there is room.
Attach your own clientRef. A timed-out request can be replayed without sending a second message.
Queued, sent, delivered, read, failed โ with WhatsApp's own error code attached when something goes wrong.
Send an approved template by name with its parameters, and open a conversation with anyone โ not just people who wrote first.
Up to 500 messages per request, each validated on its own. One bad number never rejects the batch.
Separate keys per service, each limited to sending or reading, revocable the moment one leaks.
Daily volume, success rate, and the failure reasons ranked โ plus one-click retry on anything that didn't make it.
Where it's used
Sign-in and verification on the app your customer already has open.
Dispatched, out for delivery, arriving now โ sent as they happen.
Appointments, payment due dates, and anything your system needs acknowledged.
Pricing
No seat licences and no monthly minimum. Start free, and the rate falls as volume rises.
โน0 to begin
For a side project or a proof of concept.
โน0.18 per message
For a product with real customers.
Talk to us
For high volume and custom terms.
Questions
A 202 means we've accepted the message, not that it has arrived.
Watch the state: delivered means it reached their phone, and
that is the point most integrations should treat as success.
read depends on a setting the recipient controls, so plenty of
messages that were read never report it.
Free text only reaches someone who messaged you in the last 24 hours โ that is WhatsApp's rule, not ours. To start a conversation, send an approved template instead. Most notification traffic is templates.
No. A transient failure โ a rate limit, a moment when WhatsApp is unreachable โ is requeued and tried again up to 3 times. A permanent refusal fails straight away rather than burning retries on an answer that will not change.
Send a clientRef and replay it. The same reference returns the
original message rather than sending a second one, so a retry can never
message the same person twice.
Errors return a stable code and a plain-language message, and a failed
message keeps both lastError and WhatsApp's own numeric code.
The dashboard ranks failure reasons so you can see a pattern rather than
one-off noise.
curl away.