Шаблоны сообщений

Создать официальный шаблон WABA через Gateway API — POST /templates/. name в нижнем регистре [a-z0-9_], body_text обязателен, header_text/footer_text по желанию; channel_id здесь в теле (маршрут плоский). Ответ всегда PENDING: вердикт Meta (APPROVED/REJECTED) приходит асинхронно — в потоке templates или следующим GET /templates/:

curl -X POST https://dialogs.tehprof.kz/api/v1/gw/templates/ \
  -H "Authorization: Bearer gw_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "channel_id": 32,
    "name": "order_shipped",
    "language": "ru",
    "category": "UTILITY",
    "body_text": "Заказ {{1}} отправлен, курьер {{2}}.",
    "footer_text": "TehProf.kz"
  }'

201 { "template_id": "123", "status": "PENDING" }

Список шаблонов — GET /templates/?channel_id=. Из синхронизированного зеркала, без живого вызова Meta. status у каждого: APPROVED | PENDING | REJECTED | PAUSED | DISABLED — слать через template можно только APPROVED:

curl "https://dialogs.tehprof.kz/api/v1/gw/templates/?channel_id=32" \
  -H "Authorization: Bearer gw_xxx"

{
  "templates": [
    {
      "template_id": "123",
      "name": "order_shipped",
      "language": "ru",
      "status": "APPROVED",
      "category": "UTILITY",
      "rejection_reason": "",
      "quality_rating": "GREEN",
      "components": [ { "type": "BODY", "text": "Заказ {{1}} отправлен, курьер {{2}}." } ]
    }
  ]
}

Правка шаблона — PATCH /templates/<id>/. Ловушка: components у Meta заменяются ЦЕЛИКОМ. Правка без body_text (один header_text/footer_text) молча ничего не меняет, а body_text без header/footer СОТРЁТ существующие HEADER и FOOTER. Правило: правишь текст — шли все три текстовых поля разом. name и language неизменяемы; правка перезапускает ревью, вердикт придёт в поток templates. channel_id в теле:

curl -X PATCH https://dialogs.tehprof.kz/api/v1/gw/templates/123/ \
  -H "Authorization: Bearer gw_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "channel_id": 32,
    "body_text": "Заказ {{1}} доставлен.",
    "header_text": "TehProf.kz",
    "footer_text": "Спасибо"
  }'

200 { "template_id": "123", "status": "APPROVED" }

Удаление — DELETE /templates/<id>/?channel_id=. Внимание: здесь channel_id в query, а не в теле (в отличие от PATCH). Ответ 204 без тела. Имя удалённого APPROVED-шаблона занято 30 дней — «удалить и создать заново» не способ правки, для этого PATCH:

curl -X DELETE "https://dialogs.tehprof.kz/api/v1/gw/templates/123/?channel_id=32" \
  -H "Authorization: Bearer gw_xxx"

204 No Content

Здоровье шаблона — GET /templates/<id>/health/?channel_id=. Живой pre-flight у Meta: шаблон может провалиться ПОСЛЕ ответа 201 (например, у WABA нет оплаты), поэтому спрашивайте здоровье ДО отправки, а не судите по коду. can_send: available | limited | blocked; когда не available, reasons несёт текст ошибки и решение по каждой сущности (номер, WABA, бизнес, приложение, шаблон):

curl "https://dialogs.tehprof.kz/api/v1/gw/templates/123/health/?channel_id=32" \
  -H "Authorization: Bearer gw_xxx"

200 {
  "can_send": "blocked",
  "reasons": [
    {
      "code": "141006",
      "description": "There is an error with the payment method...",
      "solution": "Add a new payment method to the account.",
      "entity": "WABA"
    }
  ]
}