string
required
Documentation Index
Fetch the complete documentation index at: /llms.txt
Use this file to discover all available pages before exploring further.
The only thing you may send outside the 24-hour window.
channels:read; creating and deleting take channels:write.GET /api/v1/partner/tenants/{ref}/templates/?limit=100
data[] with each template’s name, status,
category, language, components and, when it was refused,
rejected_reason.
Pass phone_number_id when a merchant holds numbers on more than one WhatsApp
Business Account: templates belong to the WABA, not to the merchant.
curl -X POST https://api.impellabs.tech/api/v1/partner/tenants/merchant_8812/templates/ \
-H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
-d '{
"name": "order_update",
"category": "UTILITY",
"language": "en_US",
"body_text": "Hi {{1}}, your order {{2}} has shipped.",
"example_body_params": ["Priya", "#10241"],
"footer_text": "Moti Creations"
}'
UTILITY, MARKETING or AUTHENTICATION. This is what you are billed on,
and Meta re-categorises templates it thinks are miscategorised — a marketing
message dressed as a utility one gets moved, and priced accordingly.{{1}} upward. Every one of them needs a matching
entry in example_body_params or Meta rejects the template outright.PENDING.
A template Meta refuses at submission comes back 400 carrying their
validation error verbatim rather than a flattened one, because their message
names the component that was wrong.
channel_rejected naming the template.{
"type": "template.status_changed",
"tenant_ref": "merchant_8812",
"data": { "object": {
"name": "order_update",
"language": "en_US",
"status": "APPROVED",
"category": "UTILITY",
"rejected_reason": ""
} }
}
status is APPROVED, REJECTED, PAUSED or DISABLED. A template can move
after approval: Meta pauses one whose recipients repeatedly block or report
the sender, and disables it if that continues. Treat PAUSED as a signal about
the message, not a glitch — it means people did not want it.
Store the status against your own copy and check it before scheduling, rather
than listing templates on every send.
{ "type": "template", "template_name": "order_update", "lang": "en_US",
"body_params": ["Priya", "#10241"] }
{{1}}, {{2}} order. See
Conversations and
messaging a number with no thread.
DELETE /api/v1/partner/tenants/{ref}/templates/{name}/
Mirror the status, do not poll for it
template.status_changed. Listing templates before every send costs a Graph
call per broadcast and tells you nothing new between approvals.Categorise honestly
UTILITY is cheaper than MARKETING, which is why every platform sees
merchants labelling promotions as order updates. Meta re-categorises, bills the
corrected category, and a merchant whose templates keep being moved attracts
quality review. Label it as what it is.Expect the window, design around it
