Skip to main content
Submit, fetch, list, update, and delete WhatsApp message templates for a WhatsApp Business Account (WABA) linked to your Plivo account. See the WhatsAppTemplate object for the resource schema. Templates start in PENDING; Meta reviews them asynchronously and emits status events that Plivo forwards to your configured WABA webhook URL.
Use this API to manage WhatsApp templates programmatically as an alternative to the WhatsApp Manager UI. All operations are scoped to a single WABA identified by waba_id. API Endpoint
Find your waba_id in the Plivo console under Messaging > WhatsApp Business Account.
Authentication All endpoints use HTTP Basic Auth. Use your Plivo auth_id as the username and auth_token as the password. Find these on the Plivo console. Asynchronous review When you create or update a template, Meta reviews it asynchronously. The template’s status moves from PENDING to APPROVED, REJECTED, PAUSED, or DISABLED over time. Meta emits an event for each transition, which Plivo forwards to the webhook URL configured for your WABA. You can also call Get a Template or List Templates at any time to fetch the current status.

The WhatsAppTemplate Object

Attributes

string
Meta-issued template ID. Use this in path parameters for Get, Update, and Delete.
string
snake_case template name, unique per WABA. Allowed characters: a-z, 0-9, underscore.
string
BCP-47 language code. Examples: en, en_US, es_MX.
string
Template category. Values: MARKETING, UTILITY, AUTHENTICATION.
string
Current Meta-assigned status. Values: PENDING, APPROVED, REJECTED, PAUSED, DISABLED.
object
Quality metric assigned by Meta. When present, contains a single field score with values GREEN, YELLOW, RED, or UNKNOWN. May be null or absent for templates in PENDING status — check for the field before reading quality_score.score.
string
Reason for rejection assigned by Meta. Returned as NONE for templates that have not been rejected. Possible values when status is REJECTED: ABUSIVE_CONTENT, INVALID_FORMAT, PROMOTIONAL, TAG_CONTENT_MISMATCH, INCORRECT_CATEGORY, SCAM.
array
Ordered list of template sections. See Component object below.

Component Object

Each item in components is a TemplateComponent:
string
Component type. Values: HEADER, BODY, FOOTER, BUTTONS, CAROUSEL.
string
Header format. Only meaningful when type is HEADER. Values: TEXT, IMAGE, VIDEO, DOCUMENT, LOCATION.
string
Text content for BODY, FOOTER, and text-format HEADER. Use {{1}}, {{2}} for positional placeholders, or named placeholders like {{customer_name}} paired with example.body_text_named_params.
object
Sample values Meta uses during review. Pick the variant matching your component:
  • header_text — array of sample strings for a TEXT header with placeholders.
  • header_handle — array of media handles from Meta’s resumable-upload API for IMAGE, VIDEO, or DOCUMENT headers.
  • header_text_named_params — array of { param_name, example } for a TEXT header that uses {{name}} style placeholders.
  • body_text — array of example sets for positional {{1}}, {{2}} placeholders. The outer array contains one or more example sets; each inner array contains one sample value per placeholder, in order.
  • body_text_named_params — array of { param_name, example } for a body that uses {{name}} style placeholders.
array
Only meaningful when type is BUTTONS. Each button has type (QUICK_REPLY, PHONE_NUMBER, URL, OTP, COPY_CODE), text, and optionally phone_number, url, or example.
array
Only meaningful when type is CAROUSEL. Each card has its own components array (at minimum a HEADER and a BODY).

Example Object


Create a Template

Submit a new template to Meta via the bound WABA. The new template starts in PENDING. Meta reviews it asynchronously and emits a status event that Plivo forwards to your configured WABA webhook URL. Create returns an action confirmation envelope (api_id, template_id, template_status, etc.) — not the full template object. Call Get a Template to fetch components and other fields.

Arguments

string
required
snake_case template name, unique per WABA. After you delete a template, Meta enforces a 30-day cooldown before the same name can be reused.
string
required
BCP-47 language code (for example, en_US).
string
required
Values: MARKETING, UTILITY, AUTHENTICATION.
array
required
Non-empty array of components. At least one BODY component is required; HEADER, FOOTER, BUTTONS, and CAROUSEL are optional. See Component object.
boolean
When true, Meta is allowed to switch the template’s category during review (for example, UTILITY to MARKETING) instead of rejecting the submission for mismatched content. Defaults to false, in which case Meta typically rejects templates whose content doesn’t match the requested category.

Example — Text-only marketing template

Example — Body with named parameters

Example — Image header with media handle

Upload your media via Meta’s resumable-upload API and pass the returned handle in header_handle.
Meta requires a CAROUSEL component to contain between 2 and 10 cards.

Response


List Templates

Retrieve a paginated list of templates for a WABA. List returns a summary projection of each template — call Get a Template to fetch components, quality_score, and rejected_reason.

Query Parameters

string
Substring filter on template name.
integer
The number of results per page. The maximum number of results that can be fetched is 20. Defaults to 20.
integer
The number of value items by which the results should be offset. Defaults to 0. Read more about offset-based pagination.

Example

Response


Get a Template

Retrieve the current state of a single template, including its components.

Example

Response


Update a Template

Submit an update to an existing template. The body shape is identical to Create. The template typically transitions back to PENDING while Meta re-reviews; the resulting APPROVED or REJECTED status is delivered to your configured WABA webhook URL.

Arguments

Same as Create a Template.

Example

Response


Delete a Template

Remove a template from the WABA via Meta. This operation cannot be undone — to reuse the same template name later, you may need to wait out Meta’s name-reuse cooldown.
Both template_id (path) and name (query) are required. Meta’s Graph API needs both to delete a specific language variant. Calls missing ?name= are rejected with a 400.

Query Parameters

string
required
The template’s name (the same value you sent on Create or received on List).

Example

Response


HTTP Status Codes

For the canonical error envelope and common error codes, see the Messaging API Response page.