RaabtaHQ
List message templates

List message templates

GET/api/v1/templates

scope templates:read

The account’s WhatsApp templates as synced from Meta, alphabetically. Only APPROVED templates can be sent or broadcast. Not paginated.

Query parameters

NameTypeDescription
statusoptional
stringFilter by Meta status, e.g. APPROVED
languageoptional
stringFilter 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: … }
NameTypeDescription
idrequired
string (uuid)UUID
namerequired
stringThe name Meta knows the template by — what you pass when sending
languagerequired
string | nullLanguage code, e.g. en_US
categoryrequired
stringMarketing | Utility | Authentication
statusrequired
string | nullMeta approval status: APPROVED | PENDING | REJECTED | DRAFT …
header_typerequired
string | nulltext | image | video | document, or null for no header
header_contentrequired
string | nullHeader text (may contain {{1}}) or the sample media
body_textrequired
stringBody with {{n}} placeholders
footer_textrequired
string | nullSmall print under the body, when the template has one
buttonsrequired
map<string, any>[] | nullButton definitions as configured
paramsrequired
map<string, any>[] | nullWhat fills each {{n}} at send time, when a mapping was configured
quality_scorerequired
string | nullGREEN | YELLOW | RED as reported by Meta
created_atrequired
string (date-time)ISO 8601 timestamp
updated_atrequired
string (date-time) | null

Errors

StatusCodeWhen
400bad_requestThe request could not be parsed: malformed JSON, an invalid cursor, or a query parameter of the wrong shape.
400validation_errorThe body or query failed validation. `details` lists each failing field with a `path` and a `message`.
401unauthorizedNo usable API key: the Authorization header is missing or malformed, or the key is unknown, revoked or expired. The three are deliberately indistinguishable.
403forbiddenThe 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.
403account_suspendedThe account this key belongs to is suspended. Rotating the key will not help; contact support.
429rate_limitedThe per-key budget, or the per-IP budget for failed authentication, is exhausted. Honour `Retry-After` before retrying.
500internalSomething failed on our side. Safe to retry with the same Idempotency-Key; quote `request_id` if it persists.