/v1/templates/{template_id}betaGet a template
- 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.
Returns one template in full: header, body with each {{n}} variable and its sample, footer, buttons and review status. Read this before sending, to know how many variables to pass.
Try it
This only reads. It uses your real data and changes nothing.
Code and response
curl -X GET 'https://mcp.wa-api.cloud/v1/templates/9120' \ -H "Authorization: Bearer $API_KEY"
The code reads your key from $API_KEY.
Parameters
| Field | Type | What it is |
|---|---|---|
| template_idrequired | string | integer · path | The template id.Signed in? Pick one from your data with “My data”. |
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
The template.
| Field | Type | What it is |
|---|---|---|
| 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 | |
| headerrequired | object or null | |
| formatrequired | string or null | |
| textrequired | string or null | |
| variablesrequired | array of object | |
| indexrequired | number | 1-based position ({{index}}). |
| samplerequired | string or null | |
| media_samplerequired | string or null | |
| bodyrequired | object or null | |
| textrequired | string or null | |
| variablesrequired | array of object | |
| indexrequired | number | 1-based position ({{index}}). |
| samplerequired | string or null | |
| footerrequired | string or null | |
| buttonsrequired | array of object | |
| indexrequired | number | |
| typerequired | string | |
| textrequired | string or null | |
| urlrequired | string or null | |
| dynamic_urlrequired | boolean | true when the URL ends with {{1}}: a suffix is required when sending. |
| url_examplerequired | string or null | |
| phone_numberrequired | string or null | |
| coupon_coderequired | string or null | |
| flow_idrequired | string or null | |
| carousel_cardsrequired | number | |
| limited_time_offerrequired | object or null | |
| textrequired | string or null | |
| has_expirationrequired | boolean | |
| meta_errorsrequired | any or null | Last Meta error payload stored for this template, if any. |
| created_atrequired | string or null |
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. |
| 404 | not_found | No template with this id. |
| 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
The order-shipped template
Response 200
{
"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",
"header": null,
"body": {
"text": "Hi {{1}}, your order {{2}} is on its way. Track it here: {{3}}",
"variables": [
{
"index": 1,
"sample": "Jane"
},
{
"index": 2,
"sample": "#1001"
},
{
"index": 3,
"sample": "https://track.example.com/1001"
}
]
},
"footer": "Reply STOP to opt out",
"buttons": [],
"created_at": "2026-09-01T09:00:00Z",
"sub_category": null,
"carousel_cards": 0,
"limited_time_offer": null,
"meta_errors": null
}Operation path
The same operation is also at POST /v1/ops/messaging_get_template, with every field in the JSON body.