Integrations & API
Sending messages via API (advanced)
5 minutes read time Difficulty: advanced
Advanced API messaging
Send complex messages with media headers, buttons, and template parameters via the API.
Template with image header
{
"to": "+919876543210",
"type": "template",
"template": {
"name": "order_shipped",
"language": "en",
"components": [
{
"type": "header",
"parameters": [
{ "type": "image", "image": { "link": "https://example.com/tracking-map.jpg" } }
]
},
{
"type": "body",
"parameters": [
{ "type": "text", "text": "John" },
{ "type": "text", "text": "ORD-789" },
{ "type": "text", "text": "May 30, 2026" }
]
}
]
}
}
Template with URL button variable
{
"to": "+919876543210",
"type": "template",
"template": {
"name": "track_order",
"language": "en",
"components": [
{
"type": "body",
"parameters": [
{ "type": "text", "text": "ORD-789" }
]
},
{
"type": "button",
"sub_type": "url",
"index": 0,
"parameters": [
{ "type": "text", "text": "ORD-789" }
]
}
]
}
}
Handling API responses
Success
{
"data": {
"message_id": "wamid.HBgLOTE5ODc2...",
"status": "sent"
}
}
Failure
{
"message": "Template 'xyz' not found or not approved",
"status": "error"
}
Webhook for delivery updates
After sending, receive delivery updates via webhook:
- Set up a webhook for
message.deliveredandmessage.read - Match by
message_idto track each message
Tips
- Validate before sending — Check template exists and is approved
- Match parameter count — Must match template exactly
- Use HTTPS for media URLs — HTTP links are rejected
- Handle errors — Implement retry for 429/500, don't retry 400
Related Articles
Was this guide helpful?
Your feedback helps us make these guides better for everyone.