List message templates
GET/api/v1/templates
scope
templates:readThe account’s WhatsApp templates as synced from Meta, alphabetically. Only APPROVED templates can be sent or broadcast. Not paginated.
Query parameters
| Name | Type | Description |
|---|---|---|
statusoptional | string | Filter by Meta status, e.g. APPROVED |
languageoptional | string | Filter by language code, e.g. en_US |
Request
curl "https://your-crm.example.com/api/v1/templates?status=APPROVED" \
-H "Authorization: Bearer $RAABTA_API_KEY"Response · 200 OK
{
"data": [
{
"id": "f6a7b8c9-d0e1-4f2a-8b3c-4d5e6f7a8b9c",
"name": "appointment_reminder",
"language": "en_US",
"category": "Utility",
"status": "APPROVED",
"header_type": "text",
"header_content": "Reminder for {{1}}",
"body_text": "Hi {{1}}, your appointment is on {{2}} at {{3}}. Reply STOP to opt out.",
"footer_text": "Acme Clinic",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "Confirm"
}
],
"params": [
{
"key": "1",
"source": "field",
"value": "name"
},
{
"key": "2",
"source": "static",
"value": ""
},
{
"key": "3",
"source": "static",
"value": ""
}
],
"quality_score": "GREEN",
"created_at": "2026-08-01T09:00:00.000Z",
"updated_at": "2026-08-15T09:00:00.000Z"
}
]
}Response
Wrapped in { data: … }| Name | Type | Description |
|---|---|---|
idrequired | string (uuid) | UUID |
namerequired | string | The name Meta knows the template by — what you pass when sending |
languagerequired | string | null | Language code, e.g. en_US |
categoryrequired | string | Marketing | Utility | Authentication |
statusrequired | string | null | Meta approval status: APPROVED | PENDING | REJECTED | DRAFT … |
header_typerequired | string | null | text | image | video | document, or null for no header |
header_contentrequired | string | null | Header text (may contain {{1}}) or the sample media |
body_textrequired | string | Body with {{n}} placeholders |
footer_textrequired | string | null | Small print under the body, when the template has one |
buttonsrequired | map<string, any>[] | null | Button definitions as configured |
paramsrequired | map<string, any>[] | null | What fills each {{n}} at send time, when a mapping was configured |
quality_scorerequired | string | null | GREEN | YELLOW | RED as reported by Meta |
created_atrequired | string (date-time) | ISO 8601 timestamp |
updated_atrequired | string (date-time) | null |
Errors
| Status | Code | When |
|---|---|---|
| 400 | bad_request | The request could not be parsed: malformed JSON, an invalid cursor, or a query parameter of the wrong shape. |
| 400 | validation_error | The body or query failed validation. `details` lists each failing field with a `path` and a `message`. |
| 401 | unauthorized | No usable API key: the Authorization header is missing or malformed, or the key is unknown, revoked or expired. The three are deliberately indistinguishable. |
| 403 | forbidden | The key is valid but lacks the scope this endpoint requires, or the request came from an address outside the key’s IP allowlist. The message says which. |
| 403 | account_suspended | The account this key belongs to is suspended. Rotating the key will not help; contact support. |
| 429 | rate_limited | The per-key budget, or the per-IP budget for failed authentication, is exhausted. Honour `Retry-After` before retrying. |
| 500 | internal | Something failed on our side. Safe to retry with the same Idempotency-Key; quote `request_id` if it persists. |