Back to Help Home
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:

  1. Set up a webhook for message.delivered and message.read
  2. Match by message_id to track each message

Tips

  1. Validate before sending — Check template exists and is approved
  2. Match parameter count — Must match template exactly
  3. Use HTTPS for media URLs — HTTP links are rejected
  4. Handle errors — Implement retry for 429/500, don't retry 400

Was this guide helpful?

Your feedback helps us make these guides better for everyone.