Skip to main content
Use this endpoint to submit a new WhatsApp message template for Meta approval. Templates are reusable message layouts (body, header, footer, buttons) that must be approved before they can be sent to recipients via the Send Template Message API.

Endpoint

Send this request as multipart/form-data. Pass the template JSON in a data form field and the WhatsApp Business Account ID in a waba_id form field.

Headers

string
required
API key generated for the TUC (telecom user connection) associated with the sending WhatsApp phone number. Example: 7pvxoA4c.
string
application/json

Request body (multipart/form-data)

string
required
JSON-encoded string containing the template payload (name, category, language, components, etc. — see below). Sent as a form field, not raw JSON.
string
required
WhatsApp Business Account ID the template is created under.
string
Free-text string.

Common fields inside data

Every template category shares this envelope:
string
required
Unique template name in the Meta Cloud API. Should be descriptive of the template’s purpose (e.g. zero_tap_authentication_temp_3).
string
required
Template category: AUTHENTICATION, UTILITY, or MARKETING.
string
required
Template language code per ISO (e.g. en_US).
array
required
Array of component objects — combinations of HEADER, BODY, FOOTER, BUTTONS, LIMITED_TIME_OFFER, and CAROUSEL, depending on template type. See the tabs below.
string
Determines how body/header variables are referenced. POSITIONAL (default, e.g. {{1}}) or NAMED (e.g. {{customer_name}}).
integer
Time-to-live for the message in seconds. Range varies by category: Authentication 30 seconds–15 minutes; Utility 30 seconds–12 hours; Marketing/LTO/Carousel 12 hours–30 days (30-day maximum applies only for MM Lite).
string
Only used for ORDER_STATUS and ORDER_DETAILS utility templates — see those tabs.

cURL

Media headers accept either "example": {"media_id": "..."} (generated via the Media Upload API) or "example": {"url": "..."} for a remote file.

Response

integer
HTTP-style status code. 200 on success.
object
Wrapper object for the result message.

Template types

Used for OTP delivery. Reference: Meta authentication templates.Components: BODY (optional, add_security_recommendation), FOOTER (optional, code_expiration_minutes), BUTTONS (required — one OTP button).
boolean
Adds a security note below the OTP message (recommended). Set on the BODY component.
integer
OTP code validity in minutes. Set on the FOOTER component; required only if the OTP has an expiry.
string
required
ZERO_TAP, ONE_TAP, or COPY_CODE.
string
required
Button label, e.g. "Copy Code".
string
Autofill button label. Used with ONE_TAP / ZERO_TAP.
string
Android app package identifier the OTP is generated for. Required for ONE_TAP / ZERO_TAP (recommended).
string
Base64 or URL-encoded app signature hash used to verify app integrity. Required for ONE_TAP / ZERO_TAP (recommended).
boolean
Only for ZERO_TAP.
Example — Zero Tap AutoFill (with expiry)
An Authentication payload can also use a shorter OTP button shape:

Next steps

  • If your template uses a media header, upload the file first via Media Upload to obtain a media_id.
  • After submission, poll Fetch Template to confirm the template reaches Approved status before sending it.
  • Send the approved template via Send Template Message.