/v1/templatesstableList WhatsApp templates
- Needs
- Read your data
(mcp:read) - Plan
- Any plan with API access
- Limits
- 300 a minute per key
- Undo
- Nothing to undo: this only reads.
Lists your WhatsApp message templates with their review status, newest first. Only APPROVED templates can be sent.
Try it
Query (7)
Only this review status.
Only this category.
Language code, e.g. `en_US`.
Name contains.
Templates of the WhatsApp account behind this channel.
How many items per page (1–100).
The `next_cursor` from the previous page. Cursors expire after 24 hours.
This only reads. It uses your real data and changes nothing.
Code and response
curl -X GET 'https://mcp.wa-api.cloud/v1/templates?status=APPROVED' \ -H "Authorization: Bearer $API_KEY"
The code reads your key from $API_KEY.
Parameters
| Field | Type | What it is |
|---|---|---|
| status | string · query | Only this review status.one of: APPROVED, PENDING, REJECTED, PAUSED, DISABLED, IN_APPEAL, ARCHIVED, PENDING_DELETION, DELETED |
| category | string · query | Only this category.one of: MARKETING, UTILITY, AUTHENTICATION |
| language | string · query | Language code, e.g. en_US.0–20 characters |
| search | string · query | Name contains.0–100 characters |
| channel_id | string · query | Templates of the WhatsApp account behind this channel.0–64 charactersSigned in? Pick one from your data with “My data”. |
| limit | integer · query | How many items per page (1–100).1–100 · default 25 |
| cursor | string · query | The next_cursor from the previous page. Cursors expire after 24 hours.1–2048 characters |
Headers
| Field | Type | What it is |
|---|---|---|
| Authorizationrequired | header | Bearer $API_KEY — your API key. |
| Api-Version | header | The API version to use, e.g. 2026-10-01. Default: the version your key is pinned to.one of: 2026-10-01 · pattern ^\d{4}-\d{2}-\d{2}$ |
Response 200
A page of templates.
| Field | Type | What it is |
|---|---|---|
| datarequired | array of object | |
| idrequired | string | |
| namerequired | string | |
| languagerequired | string or null | |
| categoryrequired | string or null | |
| sub_categoryrequired | string or null | |
| statusrequired | string or null | Meta review status: APPROVED, PENDING, REJECTED, PAUSED, DISABLED, IN_APPEAL, ARCHIVED … |
| rejection_reasonrequired | string or null | Meta's reason when REJECTED/PAUSED (verbatim), else null. |
| body_previewrequired | string or null | |
| variable_countrequired | number | Body variables to supply when sending. |
| header_formatrequired | string or null | |
| updated_atrequired | string or null | |
| totalrequired | number | Matches before the language filter. |
| next_cursorrequired | string or null | Pass as "cursor" to get the next page; null when there are no more results. |
Errors
Errors are application/problem+json. Branch on code.
| Status | Code | When |
|---|---|---|
| 400 | invalid_input | A field is missing or has the wrong format. |
| 401 | unauthenticated | The Authorization header is missing, the key is unknown, expired or revoked. |
| 403 | entitlement_required | The workspace's plan does not include API access ( |
| 403 | insufficient_scope | The key does not have the permission this operation needs. |
| 429 | rate_limited | The key or workspace went over its rate limit. Wait for |
| 503 | upstream_unavailable | A service behind the API is briefly unavailable. Safe to retry with backoff. |
Examples
Approved templates
Response 200
{
"data": [
{
"id": "9120",
"name": "order_shipped",
"language": "en_US",
"category": "UTILITY",
"status": "APPROVED",
"rejection_reason": null,
"body_preview": "Hi {{1}}, your order {{2}} is on its way. Track it here: {{3}}",
"variable_count": 3,
"header_format": null,
"updated_at": "2026-09-12T10:00:00Z",
"sub_category": null
}
],
"next_cursor": null,
"total": 1
}Operation path
The same operation is also at POST /v1/ops/messaging_list_templates, with every field in the JSON body.