Templates are created and approved in the dashboard. The public API only
consumes them to send — it does not create or edit them.
How a template is resolved
1
Identify the template by name
A template is identified by its
template_name — the same name you see in
the dashboard and report to Meta.2
Specify the language if needed
If the same name is approved in several languages, add
language (Meta
lower_UPPER format, e.g. en_US) to pick which one to send. If it exists
in only one language, it is optional.3
Verify it is approved
Only templates with status
APPROVED can be sent. One in PENDING or
REJECTED is not sendable.Template components
When sending a template you fill in its dynamic parts:body_variables
The body placeholders (
{{1}}, {{2}}, …). Array of objects
{ index, value }.header
The header: text, or media via
file_uuid.button_parameters
Parameters for dynamic buttons (e.g. the suffix of a URL button).
Sending a template
A typical send, with two variables in the body:Test templates for tester conversations
The dashboard lets you create test templates (status: FAKE) from the
Tester module without going through Meta’s approval. They exist so operators
and integrators can test flows against tester conversations without waiting
for Meta review.
Sending rules via the public API:
- Tester conversation (
is_tester: trueinGET /conversations) — you can send both APPROVED templates and FAKE templates. The send replicates the real flow but does not hit Meta (wamidreturns""). - Real conversation (
is_tester: false) — only APPROVED templates. If you try to send a FAKE template or a template withis_tester: trueto a real conversation, the API responds withTEMPLATE_FAKE_REQUIRES_TESTER_CONVERSATION(422).
GET /templates and GET /templates/{name}/{language})
does not include FAKE templates — only real APPROVED ones. If you need the
name of a FAKE template to send it, ask the operator.
Next steps
Send messages
Sending templates, text, media, and quick replies.
Conversations
The 24-hour window and the state of a conversation.