Criar template

POST /inbox/cloud/templates

Cria o template na conta da Meta (a WABA da inbox), no formato dela: a Meta revisa e o status sai PENDING (ou já APPROVED/REJECTED). Acompanhe pelo GET /inbox/cloud/templates; só o aprovado pode ser enviado (type: "template" no POST /messages). Vale também com o token da Kapso.

Regras da Meta: name só com letras minúsculas, números e _ (até 512); o mesmo nome no mesmo idioma já existente é recusado; até 100 templates criados por hora; até 250 por conta (6.000 com a empresa verificada). Template com variável pede o example no componente. Editar não existe: apague e crie de novo (aprovado e apagado, o nome fica bloqueado por 30 dias).

Exige o waba_id informado em POST /inbox/cloud. A recusa da Meta sai como 502 meta_error, com o texto dela.

Autenticação

[
  {
    "token": []
  }
]
{
  "token": {
    "name": "token",
    "type": "apiKey",
    "in": "header"
  }
}

Corpo da requisição

{
  "required": true,
  "content": {
    "application/json": {
      "schema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "language",
          "category",
          "components"
        ],
        "properties": {
          "name": {
            "type": "string",
            "pattern": "^[a-z0-9_]{1,512}
quot;
, "description": "Nome do template: letras minúsculas, números e `_`, até 512.", "example": "pedido_confirmado" }, "language": { "type": "string", "minLength": 1, "description": "Idioma (`pt_BR`, `en_US`...).", "example": "pt_BR" }, "category": { "type": "string", "enum": [ "MARKETING", "UTILITY", "AUTHENTICATION" ], "description": "Categoria na Meta, em maiúsculas." }, "components": { "type": "array", "minItems": 1, "items": { "type": "object", "additionalProperties": true }, "description": "Componentes no formato da Meta (`HEADER`, `BODY`, `FOOTER`, `BUTTONS`), repassados como vieram. O `BODY` é obrigatório na Meta." }, "parameter_format": { "type": "string", "enum": [ "positional", "named" ], "description": "Variáveis por posição (`{{1}}`, o padrão da Meta) ou por nome (`{{nome}}`)." } } }, "example": { "name": "pedido_confirmado", "language": "pt_BR", "category": "UTILITY", "components": [ { "type": "BODY", "text": "Olá {{1}}, seu pedido {{2}} foi confirmado.", "example": { "body_text": [ [ "Ana", "1234" ] ] } } ] } } } }

Respostas

{
  "201": {
    "description": "Template enviado para a revisão da Meta.",
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "required": [
            "id",
            "name",
            "language",
            "status",
            "category"
          ],
          "properties": {
            "id": {
              "type": "string",
              "description": "Id do template na Meta (o `id` do `DELETE`)."
            },
            "name": {
              "type": "string"
            },
            "language": {
              "type": "string"
            },
            "status": {
              "type": "string",
              "description": "Status na Meta (`PENDING`, `APPROVED`, `REJECTED`).",
              "example": "PENDING"
            },
            "category": {
              "type": "string",
              "description": "Categoria que a Meta aceitou.",
              "example": "UTILITY"
            }
          }
        },
        "example": {
          "id": "594425479261596",
          "name": "pedido_confirmado",
          "language": "pt_BR",
          "status": "PENDING",
          "category": "UTILITY"
        }
      }
    }
  },
  "400": {
    "description": "A inbox não tem `waba_id` (conecte de novo pelo `POST /inbox/cloud` informando o `waba_id`) ou o pedido é inválido.",
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/OrkesioError"
        },
        "example": {
          "error": "invalid_request",
          "message": "name: só letras minúsculas, números e _ (até 512)."
        }
      }
    }
  },
  "401": {
    "description": "Token de autenticação inválido"
  },
  "429": {
    "$ref": "#/components/responses/RateLimited"
  },
  "500": {
    "$ref": "#/components/responses/InternalError"
  },
  "501": {
    "$ref": "#/components/responses/CloudUnsupported"
  },
  "502": {
    "description": "A Meta recusou (nome repetido, componente inválido, limite) ou não respondeu (`meta_error`); o motivo da Meta vem em `message`.",
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/OrkesioError"
        },
        "example": {
          "error": "meta_error",
          "message": "meta: (#100) Invalid parameter: Content in This Language Already Exists"
        }
      }
    }
  }
}

Estado: Prévia

Compatibilidade de canais

CanalCompatívelObservação
WhatsApp (Web)NãoSó na API oficial.
WhatsApp (API oficial)Sim
InstagramNãoModelos só existem no WhatsApp.
MessengerNãoModelos só existem no WhatsApp.
TelegramNãoModelos só existem no WhatsApp.

Eventos que esta rota gera

Nenhum. Esta rota não gera evento no webhook (nem em GET /events): o resultado vem só na resposta.

Antes e depois (uazapi → Orkesio)

Rota nova: não tem equivalente na uazapi.

  • Não existe na uazapi: a API oficial do WhatsApp é só da Orkesio.

#/components/schemas/OrkesioError

{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Código estável do erro, em inglês e `snake_case`. Os de uso geral: `invalid_request` (400): pedido inválido: JSON malformado, campo desconhecido ou valor fora do permitido (o detalhe em `message`; o campo em `field`, quando é um só); `unauthorized` (401): `token` ou `admintoken` ausente ou inválido; `forbidden` (403): o token não pode fazer isso (no servidor de demonstração, por exemplo); `not_admin` (403): o WhatsApp recusou por falta de permissão no grupo ou na newsletter; `account_restricted` (403): o WhatsApp restringiu a conta de iniciar conversas novas (mandar para quem já conversa continua valendo; até quando, em `GET /inbox/limits`); `new_chat_limit` (403): a conta atingiu a cota do WhatsApp de conversas novas neste ciclo (veja `GET /inbox/limits`); os dois também no `error` de `OrkesioMessage` e de `message.status`, e não adianta repetir o envio; `payment_required` (403): na API oficial, a Meta recusou o envio por um problema no pagamento da conta do WhatsApp Business (erro 131042 da Meta); acerte a forma de pagamento no gerenciador da Meta, porque repetir não adianta; também no `error` de `OrkesioMessage` e de `message.status`; `whatsapp_rejected` (400): o WhatsApp recusou a mudança pedida (o campo, em `field`, quando é um só); `not_found` (404): o recurso não existe nesta inbox; `conflict` (409): o recurso já existe ou mudou (id em uso, inbox de outro canal); `inbox_not_paired` (409): a inbox ainda não conectou um número; `payload_too_large` (413): o corpo passou do limite; `canceled` e `expired`: só no `error` de `OrkesioMessage` e de `message.status` (envio cancelado antes de sair, ou que passou do prazo na fila); `rate_limited` (429): muitos pedidos; espere o `Retry-After`; `internal_error` (500): falha inesperada na api; tente de novo; `send_failed` (500): o envio falhou (o motivo em `message`); também no `error` de `OrkesioMessage` e de `message.status`; `unsupported_for_channel` (501): o canal da inbox não atende esta rota ou este tipo de mensagem; `meta_error` (502): a Meta recusou ou não respondeu; `disconnected` (503): a inbox está desconectada (sem sessão do WhatsApp, ou token do canal oficial vencido); `unavailable` (503 ou 504): o WhatsApp não respondeu a tempo, ou algo em andamento impede agora; tente de novo. Cada rota lista os códigos próprios dela (`outside_window`, `number_invalid`, `flow_invalid`...). A lista pode crescer: trate código desconhecido pelo status HTTP."
    },
    "message": {
      "type": "string",
      "description": "Descrição para pessoas (às vezes o texto do WhatsApp ou da Meta). Não compare o texto: use `error`."
    },
    "field": {
      "type": "string",
      "description": "O campo do pedido que causou o erro, quando é um só (por exemplo, o campo que o WhatsApp recusou num `PATCH`)."
    }
  },
  "required": [
    "error",
    "message"
  ],
  "additionalProperties": true,
  "description": "O objeto de erro da Orkesio, o mesmo em todo lugar: o corpo das respostas de erro e o `error` de `OrkesioMessage`, `message.status` e `message.failed`. Algumas rotas juntam campos próprios (`request_id`, `errors`...)."
}

#/components/responses/RateLimited

{
  "description": "`rate_limited`: passou do limite de chamadas desta inbox (ou do admin); espere o tempo do header `Retry-After` e tente de novo.",
  "headers": {
    "Retry-After": {
      "description": "Segundos até poder chamar de novo.",
      "schema": {
        "type": "integer",
        "minimum": 1
      }
    }
  },
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/OrkesioError"
      },
      "example": {
        "error": "rate_limited",
        "message": "Muitas requisições."
      }
    }
  }
}

#/components/responses/InternalError

{
  "description": "`internal_error`: falha inesperada na api (no banco, por exemplo); tente de novo.",
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/OrkesioError"
      },
      "example": {
        "error": "internal_error",
        "message": "Falha inesperada."
      }
    }
  }
}

#/components/responses/CloudUnsupported

{
  "description": "`unsupported_for_channel`: o canal da inbox não atende esta rota (rota só do WhatsApp Web numa inbox oficial, ou rota da API oficial numa inbox do WhatsApp Web). O canal está em `Inbox.channel`.",
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/OrkesioError"
      },
      "example": {
        "error": "unsupported_for_channel",
        "message": "Esta rota não está disponível no canal da inbox."
      }
    }
  }
}

Guias relacionados

Visão geral · O que funciona em cada canal · O que muda da uazapi