Templates
Pre-approved messages you can send at any time — including outside the 24-hour reply window.
A WhatsApp template is approved by Meta before you can send it. That approval fixes its shape: whether it has a header and of what kind, how many {{1}} placeholders its body carries, and which of its buttons take a value at send time. Your request supplies the values for those slots — nothing more.
Pick your template type
All three use the same endpoint, POST /api/public/v1/messages with type: "template". They differ only in what the header needs.
How validation works
What you must send is decided by the template, not declared by you. We read your approved template first and check your request against it — so a missing image or a short parameter list is refused here, with a message naming the field, rather than being forwarded to Meta and coming back as (#132000) parameter count mismatch, which names nothing and arrives after the fact.
Nothing is sent to WhatsApp until every check passes, so a rejected request never costs you a message.
Read what a template needs
Rather than hardcoding template names and guessing parameter counts, ask the API. Each row states its header format, the request field that satisfies it, how many body values it takes, and its buttons — and sendable tells you upfront whether it can be sent at all.
curl 'https://api.bigradar.io/api/public/v1/templates' \
-H 'Authorization: Bearer YOUR_API_KEY'{
"templates": [
{
"name": "order_shipped",
"language": "en",
"status": "APPROVED",
"headerFormat": "IMAGE",
"headerField": "headerImage",
"bodyParamCount": 2,
"buttons": [
{ "index": 0, "type": "URL", "paramField": "text", "required": true }
],
"cards": null,
"sendable": true
}
],
"count": 1
}Buttons
Only buttons carrying a runtime value need an entry in buttonParams. indexis the button's position in the approved template, starting at 0 and counting every button — not only the ones taking a value. The same rules apply to buttons inside a carousel card, where the index is scoped to that card.
| 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. |
Common errors
Every failure returns a JSON body with a stable code, a human message, and — where one field is at fault — the field to fix and a hint. Branch on code; the message wording may improve over time.
| 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. |