Send text template
An approved template with no media header — body placeholders only.
The simplest template send. Supply the template name, the language it was approved in, and one value per {{n}} placeholder in its body. If the template was approved with a text header that itself contains a placeholder, add headerParams too. For an image, video or document header, see Send media template.
Body parameters
| Field | Type | Required | Description |
|---|---|---|---|
| to | string | Required | Recipient number in international format, digits only — 919876543210, not +91 98765 43210. |
| type | string | Required | Must be template. |
| template.name | string | Required | Exact approved template name, from Settings → WhatsApp templates. |
| template.language | string | Required | The locale the template was approved in, e.g. en, en_US, hi. Must match exactly — WhatsApp looks up a template by name and language, so the wrong code fails even when the name is right. |
| template.bodyParams | string[] | optional | Values for the body's {{1}}, {{2}}... placeholders, in order. |
| template.headerParams | string[] | optional | Values for {{1}} in a TEXT header. Only needed when the header actually has a placeholder — a static text header takes nothing. |
| template.buttonParams | object[] | optional | Values for buttons that carry one — see Buttons below. |
Example request
A template approved as Hi {{1}}, your order {{2}} is confirmed.
curl -X POST 'https://api.bigradar.io/api/public/v1/messages' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"to": "919876543210",
"type": "template",
"template": {
"name": "order_confirmation",
"language": "en",
"bodyParams": ["Mohit", "#4521"]
}
}'Text header
A text header with its own {{1}} takes a separate array — headerParams — because header and body placeholders are numbered independently. Both restart at {{1}}.
curl -X POST 'https://api.bigradar.io/api/public/v1/messages' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"to": "919876543210",
"type": "template",
"template": {
"name": "appointment_reminder",
"language": "en",
"headerParams": ["Tuesday"],
"bodyParams": ["Mohit", "4:30 PM"]
}
}'Buttons
index counts every button in the approved template from 0, including the static ones you send nothing for. A dynamic URL button takes only the segment that replaces {{1}}, never the whole link.
| Field | Type | Required | Description |
|---|---|---|---|
| URL (dynamic) | text | Required | Approved as https://shop.com/order/{{1}}. Send only the part that replaces {{1}} — not the whole link. |
| COPY_CODE | couponCode | Required | The coupon code the customer copies, e.g. SAVE20. |
| QUICK_REPLY | payload | optional | Optional. Omit it and the payload you receive back is the button's own text. |
| URL (static) · PHONE_NUMBER | — | optional | Nothing to send. The value is baked into the approved template, and a parameter here is rejected. |
curl -X POST 'https://api.bigradar.io/api/public/v1/messages' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"to": "919876543210",
"type": "template",
"template": {
"name": "order_confirmation",
"language": "en",
"bodyParams": ["Mohit", "#4521"],
"buttonParams": [
{ "index": 0, "text": "4521" },
{ "index": 1, "payload": "track_order" }
]
}
}'Response · 200
{
"success": true,
"message": "Template message sent successfully",
"data": {
"message_id": "wamid.HBgM...",
"conversation_id": "a1b2c3d4-...",
"to": "919876543210",
"status": "queued",
"timestamp": "2026-06-25T12:30:45Z"
}
}Errors
| Code | Status | Means |
|---|---|---|
| template_not_found | 404 | No template with that name on this workspace. Check spelling and case. |
| template_not_approved | 409 | The template exists but Meta has not approved it yet. |
| missing_template_params | 400 | Fewer values than the template has placeholders. The message names the count. |
| whatsapp_not_connected | 409 | No WhatsApp Business account is connected. Connect one in the dashboard. |
| unexpected_header_param | 400 | You sent header fields for a template that has no header. |
| invalid_button_param | 400 | An index with no button at it, or a button that takes no value. |