We are making changes to the WhatsApp Business Platform pricing model. See Pricing Updates on the WhatsApp Business Platform.

Criar e gerenciar modelos

Os modelos são usados para enviar modelos de mensagem com a API de Nuvem (hospedada pela Meta) ou a API Local. A API de Nuvem usa aprendizado de máquina para analisar os modelos e os parâmetros variáveis e a fim de proteger a segurança e a integridade dos serviços. Durante essa análise, nenhuma informação é compartilhada com o WhatsApp.

Eles podem ser criados usando a API de Gerenciamento do WhatsApp Business ou o Gerenciador de Negócios do WhatsApp. O número de modelos que uma conta do WhatsApp Business pode ter é determinado pela empresa principal. Caso a conta principal não tenha sido verificada, cada uma das contas do WhatsApp Business pode ter 250 modelos. Entretanto, se a conta principal tiver sido verificada e pelo menos uma das contas tiver um número de telefone comercial com um nome de exibição aprovado, cada conta do WhatsApp Business poderá ter até 6.000 modelos.

Antes de começar

Você precisará do seguinte:

  • Um token de acesso de usuário do sistema vinculado à empresa.
  • A identificação da conta do WhatsApp Business da empresa.
  • O nome de usuário do ativo de mídia cujos documentos e arquivos de imagem ou vídeo serão usados no modelo de mídia. Para obter o nome de usuário, carregue o ativo de mídia por meio da API de Carregamento Retomável.

Limitações

  • O campo de nome do modelo de mensagem tem um limite de 512 caracteres.
  • O campo de conteúdo do modelo de mensagem tem um limite de 1.024 caracteres.
  • Os modelos podem ser editados apenas quando estiverem no estado Aprovado, Rejeitado ou Pausado. É possível editar cada modelo de mensagem somente uma vez por dia, até 10 vezes por mês.
  • As contas do WhatsApp Business podem criar apenas 100 modelos de mensagem por hora.
  • Os modelos que forem compostos por 4 ou mais botões, ou 1 botão de resposta rápida e 1 ou mais botões de outro tipo, não poderão ser visualizados no WhatsApp para computador. Os usuários do WhatsApp que receberem um desses modelos serão solicitados a abrir a mensagem no smartphone.

Localização

Ao criar um modelo de mensagem, você pode adicionar um idioma específico. Esses modelos serão contabilizados no seu limite. Forneça traduções consistentes. Consulte Por que estou recebendo erros do tipo "estrutura indisponível" no meu retorno de chamada? para ver mais informações.

Como criar modelos

Envie uma solicitação POST ao ponto de extremidade WhatsApp Business Account > Message Templates para criar um modelo.

Sintaxe da solicitação

POST /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates

Corpo da publicação

{
  "name": "<NAME>",
  "category": "<CATEGORY>",
  "allow_category_change": <ALLOW_CATEGORY_CHANGE>,
  "language": "<LANGUAGE>",
  "components": [<COMPONENTS>]
}

Propriedades do corpo

Espaço reservadoDescriçãoExemplo de valor

<NAME>

String

Obrigatório.


O nome do modelo.

Máximo de 512 caracteres.

order_confirmation

<CATEGORY>

Enumeração

Obrigatório.


A categoria do modelo.

Consulte Categorias de modelo abaixo.

UTILITY

<ALLOW_CATEGORY_CHANGE>

Booliano

Opcional.


Defina como "true" para permitir a atribuição automática de categoria. Se esse valor for omitido, o modelo poderá ser rejeitado por categorização incorreta.

true

<LANGUAGE>

Enumeração

Obrigatório.


O código de localidade e idioma do modelo.

en_US

<LIBRARY_TEMPLATE_NAME>

String

Opcional.


O nome exato do modelo da Biblioteca de Modelos de Utilidade.

Aprenda a criar modelos usando a Biblioteca de Modelos de Utilidade.

delivery_update_1

<COMPONENTS>

Matriz de objetos

Obrigatório.


Componentes que fazem parte do modelo.

Consulte Componentes do modelo abaixo.

Consulte Componentes do modelo abaixo.

Espaço reservadoDescriçãoExemplo de valor

<LIBRARY_TEMPLATE_BUTTON_INPUTS>

Objeto JSON

Opcional.


Dados opcionais durante a criação de um modelo da biblioteca de modelos. Estes são campos opcionais no componente do botão.


Observação: para modelos de utilidade que contêm botões, esta propriedade é obrigatória.

Saiba como criar modelos usando a Biblioteca de Modelos

“[ {'type': 'URL', 'url': {'base_url' : 'https://www.example.com/{{1}}', 'url_suffix_example' : 'https://www.example.com/demo'}}, {type: 'PHONE_NUMBER', 'phone_number': '+16315551010'} ]"

type

Enumeração

O tipo de botão.

QUICK_REPLY, URL, PHONE_NUMBER, OTP, MPM, CATALOG, FLOW, VOICE_CALL, APP

Obrigatório.

OTP

phone_number

String

O número de telefone para o botão.

Opcional

"+13057652345"

url

Objeto JSON

Consulte os parâmetros de URL do objeto JSON base_url e url_suffix_exampleaqui.

Opcional

zero_tap_terms_accepted

booliano

Se o usuário aceitou ou não os termos de toque zero.

Opcional

TRUE

otp_type

Enumeração

O tipo de senha descartável.

COPY_CODE, ONE_TAP, ZERO_TAP

Opcional

TRUE

supported_apps

Matriz de objetos JSON

Consulte os parâmetros de objeto JSON de app compatíveis com package_name e signature_hashaqui.

Opcional

Espaço reservadoDescriçãoExemplo de valor

<LIBRARY_TEMPLATE_BODY_INPUTS>

Objeto JSON

Opcional.


Dados opcionais durante a criação de um modelo da biblioteca de modelos. Estes são campos opcionais no componente do botão.


Saiba como criar modelos usando a Biblioteca de Modelos

add_contact_number

booliano

Valor booliano para adicionar informações ao modelo sobre como entrar em contato com a empresa pelo número de telefone.

Opcional

TRUE

add_learn_more_link

booliano

Valor booliano para adicionar mais informações ao modelo com um link de URL.

Não tem ampla disponibilidade e será ignorado se não estiver disponível.

Opcional

TRUE

add_security_recommendation

booliano

Valor booliano para adicionar informações ao modelo para não compartilhar códigos de autenticação com ninguém.

Opcional

TRUE

add_track_package_link

booliano

Valor booliano para adicionar informações ao modelo para rastrear pacotes de veiculação.

Não tem ampla disponibilidade e será ignorado se não estiver disponível.

Opcional

TRUE

code_expiration_minutes

int64

Valor inteiro para adicionar informações ao modelo sobre quando o código expirará.

Opcional

5

Categorias de modelo

Os modelos precisam ser categorizados usando uma das categorias a seguir. As categorias influenciam no preço, e a opção definida por você será validada no momento da criação do modelo.

  • AUTHENTICATION
  • MARKETING
  • UTILITY

Consulte o documento Categorização de modelos para determinar qual categoria usar ao criar um modelo.

Componentes do modelo

Conforme as necessidades da empresa, os modelos podem incluir texto, mídia e componentes interativos. Consulte a lista com todas as possibilidades de componentes e os respectivos requisitos, além de amostras e exemplos de consulta em Componentes do modelo.

Ao criar um modelo, defina os componentes atribuindo uma matriz de objetos à propriedade "components" no corpo da solicitação.

Por exemplo, esta matriz contém um componente de corpo com texto contendo duas variáveis e exemplos de valores, um componente de botão de número de telefone e um componente de botão de URL:

[
  {
    "type": "BODY",
    "text": "Thank you for your order, {{1}}! Your confirmation number is {{2}}. If you have any questions, please use the buttons below to contact support. Thank you for being a customer!",
    "example": {
      "body_text": [
        [
          "Pablo","860198-230332"
        ]
      ]
    }
  },
  {
    "type": "BUTTONS",
    "buttons": [
      {
        "type": "PHONE_NUMBER",
        "text": "Call",
        "phone_number": "15550051310"
      },
      {
        "type": "URL",
        "text": "Contact Support",
        "url": "https://www.luckyshrub.com/support"
      }
    ]
  }
]

Consulte a lista com todas as possibilidades de componentes e os respectivos requisitos, além de amostras e exemplos de consulta em Componentes do modelo.

Observe que os modelos categorizados como AUTHENTICATION têm requisitos únicos de componente. Consulte Modelos de autenticação com botões de senha descartável.

Validação de categoria

Quando você envia uma solicitação de criação de modelo, validamos imediatamente a categoria usando nossas diretrizes de categorização de modelos.

  • Se concordarmos com a categoria escolhida por você, criaremos o modelo com um status de PENDING. Isso significa que o modelo passará por um processo de análise.
  • Se não concordarmos com a escolha de categoria, criaremos o modelo com um status de REJECTED e dispararemos um webhook de atualização de status do modelo de mensagem com o reason definido como INCORRECT_CATEGORY. Recomendamos que você detecte esse webhook para identificar modelos rejeitados ou solicite o campo rejected_reason em modelos recém-criados, que terão o valor TAG_CONTENT_MISMATCH.

Em ambos os casos, o status inicial do modelo é retornado como parte da resposta da API.

Caso o status do seu modelo tenha sido definido como REJECTED na validação de categoria, você terá várias opções:

Categorização automática

É possível incluir a propriedade allow_category_change na sua solicitação para que atribuamos automaticamente uma categoria com base no conteúdo do seu modelo e nas nossas diretrizes de categorização. Isso pode evitar que o status do seu modelo seja imediatamente definido como REJECTED devido à categorização incorreta.

Só é possível solicitar a categorização automática no momento da criação do modelo.

Análise do modelo

Os modelos com um status de PENDING passarão por um processo de análise. Analisaremos o conteúdo de cada modelo recém-criado ou editado para garantir que ele siga nossas diretrizes e políticas de conteúdo. Com base no resultado desse processo, alteraremos automaticamente o status do modelo para APPROVED ou REJECTED, o que disparará um webhook de atualização de status do modelo de mensagem.

Status do modelo

Após a conclusão dos processos de validação de categoria e de análise do modelo, definiremos o status do modelo como um destes valores:

  • APPROVED: o modelo foi aprovado no processo de análise e pode ser enviado em mensagens de modelo.
  • PENDING: o modelo foi aprovado na validação de categoria e está passando pelo processo de análise.
  • REJECTED: o modelo não foi aprovado na validação de categoria nem no processo de análise. Você pode solicitar o campo "rejected_reason" no modelo para saber o motivo.

Consulte a referência do ponto de extremidade WhatsApp Message Template para ver todos os campos e status possíveis.

Resposta

Se a solicitação for bem-sucedida, a API responderá com o ID, o status e a categoria do modelo recém-criado. Há três resultados possíveis:

  • Concordamos com a categoria escolhida por você, e agora o modelo está passando pelo processo de análise (o status é PENDING).
  • Discordamos da categoria escolhida por você (o status é REJECTED).
  • Aprovamos automaticamente o modelo (o status é APPROVED). Isso só acontecerá em modelos de autenticação com botões de senha descartável.
{
    "id": "<ID>",
    "status": "<STATUS>",
    "category": "<CATEGORY>"
}

Propriedades da resposta

Espaço reservadoDescriçãoExemplo de valor

<ID>

O ID do modelo.

572279198452421

<STATUS>

O status do modelo.

PENDING

<CATEGORY>

A categoria do modelo designada por você ou atribuída por nós.

MARKETING

Exemplo de solicitação

Veja um exemplo de solicitação para criar um modelo de promoção sazonal com os seguintes componentes:

  • Um cabeçalho com texto
  • Um corpo com texto
  • Um rodapé
  • Dois botões de resposta rápida

Veja mais exemplos aqui.

curl 'https://graph.facebook.com/v21.0/102290129340398/message_templates' \
-H 'Authorization: Bearer EAAJB...' \
-H 'Content-Type: application/json' \
-d '
{
  "name": "seasonal_promotion",
  "language": "en_US",
  "category": "MARKETING",
  "components": [
    {
      "type": "HEADER",
      "format": "TEXT",
      "text": "Our {{1}} is on!",
      "example": {
        "header_text": [
          "Summer Sale"
        ]
      }
    },
    {
      "type": "BODY",
      "text": "Shop now through {{1}} and use code {{2}} to get {{3}} off of all merchandise.",
      "example": {
        "body_text": [
          [
            "the end of August","25OFF","25%"
          ]
        ]
      }
    },
    {
      "type": "FOOTER",
      "text": "Use the buttons below to manage your marketing subscriptions"
    },
    {
      "type":"BUTTONS",
      "buttons": [
        {
          "type": "QUICK_REPLY",
          "text": "Unsubscribe from Promos"
        },
        {
          "type":"QUICK_REPLY",
          "text": "Unsubscribe from All"
        }
      ]
    }
  ]
}'

Exemplo de resposta

{
    "id": "572279198452421",
    "status": "PENDING",
    "category": "MARKETING"
}

Como enviar modelos

Use a API de Nuvem ou a API Local para enviar um modelo em uma mensagem.

Tempo de vida (TTL): personalização, padrões, valores mín./máx. e compatibilidade.

Se não conseguirmos entregar uma mensagem a um usuário do WhatsApp, faremos novas tentativas de entrega por um período conhecido como tempo de vida (TTL, pelas iniciais em inglês) ou período de validade da mensagem.

Você pode personalizar o TTL padrão de modelos de autenticação, utilidade e marketing.

Recomendamos definir um TTL para todos os modelos de autenticação, de preferência igual ou inferior ao tempo de expiração do código, para que os clientes só recebam uma mensagem enquanto ainda for possível usar o código.

Tabela de padrões, valores mín./máx. e compatibilidade

AutenticaçãoUtilidadeMarketing

TTL padrão

10 minutos

30 dias

30 dias

Compatibilidade

API de Nuvem + API Local

Somente API de Nuvem

API de Mensagens de Marketing (MM) Lite

Intervalo personalizável

De 30 segundos a 15 minutos

De 30 segundos a 12 horas

De 12 horas a 30 dias

Como personalizar o TTL para seu modelo

Modelos de autenticação criados antes de 23 de outubro de 2024 têm TTL padrão de 30 dias.

Para definir um TTL personalizado em um modelo de autenticação, utilidade ou marketing, inclua e defina o valor da propriedade message_send_ttl_seconds na chamada a POST /<PHONE_NUMBER_ID>/messages.

O TTL pode ser personalizado em incrementos de 1 segundo.

Valores válidos para a propriedade message_send_ttl_seconds

  • Modelos de autenticação: 30 a 900 segundos (30 s a 15 min)
  • Modelos de utilidade: 30 a 43200 segundos (30 s a 12 horas)
  • Modelos de marketing: 43200 a 2592000 (12 horas a 30 dias)

Para modelos de autenticação e utilidade, você pode definir o valor da propriedade message_send_ttl_seconds como -1. Isso definirá um TTL personalizado de 30 dias.

Quando o TTL é excedido: mensagens descartadas

As mensagens que não puderem ser entregues dentro do TTL padrão ou personalizado serão descartadas.

Se você não receber um webhook de mensagem entregue antes da expiração do tempo de vida, presuma que a mensagem foi descartada.

Se você enviar uma mensagem e houver uma falha na entrega, poderá ocorrer um atraso no recebimento do webhook. Por isso, é recomendável incorporar um buffer antes de presumir o descarte.

Boas práticas para modelos de marketing

Botão para desativação de marketing

Recomendamos incluir um botão de resposta rápida em mensagens categorizadas como MARKETING para que os usuários possam cancelar com facilidade o recebimento de mensagens de marketing. Assim, os clientes terão a opção de desativar essas mensagens sem precisar bloquear sua empresa. Como resultado, será possível dimensionar o volume de mensagens com mais rapidez. Consulte este artigo para ver mais informações sobre os benefícios do botão para desativação em modelos de marketing.

Sua empresa deve realizar as ações necessárias com o objetivo de parar de enviar mensagens de marketing a clientes que desativaram o recebimento delas. Caso isso não seja feito, a taxa de bloqueio e a pontuação de qualidade serão impactadas negativamente.

Como obter modelos

Envie uma solicitação GET ao ponto de extremidade de WhatsApp Business Account > Message Templates para obter uma lista dos modelos de propriedade de uma conta do WhatsApp Business.

Sintaxe da solicitação

GET /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates
  ?fields=<FIELDS>
  &limit=<LIMIT>

Parâmetros da string de consulta

Espaço reservadoDescriçãoExemplo de valor

<FIELDS>

Lista separada por vírgulas

Opcional.


A lista de campos de modelo que você quer que sejam retornados.

name,status

<LIMIT>

Número inteiro

Opcional.


O número máximo de modelos que você quer que sejam retornados em cada página de resultados.

10

Exemplo de solicitação

curl 'https://graph.facebook.com/v21.0/102290129340398/message_templates?fields=name,status&limit=3' \
-H 'Authorization: Bearer EAAJB...'

Exemplo de resposta

{
  "data": [
    {
      "name": "seasonal_promotion_text_only",
      "status": "APPROVED",
      "id": "564750795574598"
    },
    {
      "name": "seasonal_promotion_video",
      "status": "PENDING",
      "id": "1252715608684590"
    },
    {
      "name": "seasonal_promotion_image_header",
      "status": "PENDING",
      "id": "1372429296936443"
    }
  ],
  "paging": {
    "cursors": {
      "before": "MAZDZD",
      "after": "MgZDZD"
    },
    "next": "https://graph.facebook.com/v21.0/102290129340398/message_templates?fields=name%2Cstatus&limit=3&after=MgZDZD"
  }
}

Exemplo de resposta (modelos rejeitados)

É possível fazer com que somente modelos com um valor de campo específico sejam retornados ao incluir o campo e o valor desejado na solicitação. Por exemplo, inclua status=REJECTED para obter somente modelos rejeitados.

curl 'https://graph.facebook.com/v21.0/104996122399160/message_templates?fields=name,status&status=REJECTED' \
-H 'Authorization: Bearer EAAJB...'

Exemplo de resposta

{
  "data": [
    {
      "name": "seasonal_promotion_text_only_v4",
      "status": "REJECTED",
      "id": "564750795574598"
    },
    {
      "name": "discount_qualifier",
      "status": "REJECTED",
      "id": "163917509772674"
    },
    {
      "name": "limited_time_offer_tuscan_getaway_2023",
      "status": "REJECTED",
      "id": "202389039167147"
    },
    {
      "name": "2023_mar_promo_2",
      "status": "REJECTED",
      "id": "1116034925734553"
    },
    {
      "name": "2023_mar_promo",
      "status": "REJECTED",
      "id": "952600926095321"
    }
  ]
}

Recuperar o namespace de um modelo

O namespace do modelo de mensagem é obrigatório para enviar mensagens com modelos.

Para receber esse namespace, envie uma solicitação GET para o ponto de extremidade /{whatsapp-business-account-ID} e inclua o campo message_template_namespace.

Exemplo de solicitação

Texto formatado para facilitar a leitura.
curl -i -X GET "https://graph.facebook.com/v21.0/{whatsapp-business-account-ID}
  ?fields=message_template_namespace
  &access_token={system-user-access-token}"

Se a solicitação for bem-sucedida, um objeto JSON com a identificação da conta do WhatsApp Business e o namespace será retornado:

{
    "id": "1972385232742141",
    "message_template_namespace": "12abcdefghijk_34lmnop" 
}

Editar modelos

Envie uma solicitação POST ao ponto de extremidade de modelo de mensagem do WhatsApp para editar um modelo. Também é possível editar um modelo manualmente usando o painel Gerenciador do WhatsApp > Ferramentas da conta > Modelos de mensagem.

Limitações

  • É possível editar somente os modelos com status APPROVED, REJECTED ou PAUSED.
  • É possível editar somente a category ou os components de um modelo.
  • Não é possível editar a category de um modelo aprovado.
  • Os modelos aprovados podem ser editados até 10 vezes dentro de 30 dias ou uma vez dentro de 24 horas. Não há restrição para o número de edições de modelos rejeitados ou pausados.
  • Depois de editar um modelo aprovado ou pausado, ele será aprovado automaticamente, a não ser que seja reprovado na análise do modelo.

Sintaxe da solicitação

POST /<WHATSAPP_MESSAGE_TEMPLATE_ID>

Corpo da publicação

{
  "category": "<CATEGORY>",
  "components": [<COMPONENTS>]
}

Propriedades

Espaço reservadoDescriçãoExemplo de valor

<CATEGORY>

String

Obrigatório se a propriedade dos componentes for omitida.


A categoria do modelo.

AUTHENTICATION

<COMPONENTS>

Matriz

Obrigatório se a propriedade da categoria for omitida.


Uma matriz de objetos de componentes do modelo.

Consulte Exemplo de solicitação (editando componentes) abaixo.

Exemplo de solicitação (editando componentes)

Exemplo de solicitação para alterar o corpo do texto de um modelo de conteúdo de marketing e utilidade para somente conteúdo de marketing:

curl 'https://graph.facebook.com/v21.0/564750795574598' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer EAAJB...' \
-d '
{
  "components": [
    {
      "type": "HEADER",
      "format": "TEXT",
      "text": "Our {{1}} is on!",
      "example": {
        "header_text": [
          "Spring Sale"
        ]
      }
    },
    {
      "type": "BODY",
      "text": "Shop now through {{1}} and use code {{2}} to get {{3}} off of all merchandise.",
      "example": {
        "body_text": [
          [
            "the end of April",
            "25OFF",
            "25%"
          ]
        ]
      }
    },
    {
      "type": "FOOTER",
      "text": "Use the buttons below to manage your marketing subscriptions"
    },
    {
      "type": "BUTTONS",
      "buttons": [
        {
          "type": "QUICK_REPLY",
          "text": "Unsubcribe from Promos"
        },
        {
          "type": "QUICK_REPLY",
          "text": "Unsubscribe from All"
        }
      ]
    }
  ]
}'

Exemplo de solicitação (editando somente a categoria)

Exemplo de solicitação para alterar a categoria de um modelo de UTILITY para MARKETING:

curl 'https://graph.facebook.com/v21.0/1252715608684590' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer EAAJB...' \
-d '
{
  "category": "MARKETING"
}'

Exemplo de resposta

Exemplo de resposta caso a solicitação seja bem-sucedida:

{
  "success": true
}

Excluir modelos

Use o ponto de extremidade WhatsApp Business Account > Message Templates para excluir um modelo por nome ou ID.

Observações

  • Se você excluir um modelo enviado em uma mensagem que ainda não foi entregue (por exemplo, porque o telefone do cliente está desligado), o status do modelo será definido como PENDING_DELETION, e tentaremos entregar a mensagem por 30 dias. Depois disso, você verá um erro de "Estrutura indisponível", e o cliente não receberá a mensagem.
  • Os nomes de modelos aprovados que foram excluídos não poderão ser usados novamente por 30 dias.

Exclusão por nome

Ao excluir um modelo por nome, você removerá todos os modelos com essa nomenclatura. Isso significa que modelos com o mesmo nome, mas idiomas diferentes, também serão excluídos.

Sintaxe da solicitação

DELETE /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates
  ?name=<NAME>

Exemplo de solicitação

curl -X DELETE 'https://graph.facebook.com/v16.0/102290129340398/message_templates?name=order_confirmation' \
-H 'Authorization: Bearer EAAJB...'

Exemplo de resposta

{
  "success": true
}

Exclusão por ID

Para excluir um modelo por ID, inclua a identificação junto com o nome do modelo na sua solicitação. Apenas o modelo com esse ID será excluído.

Sintaxe da solicitação

DELETE /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates
  ?hsm_id=<HSM_ID>,
  &name=<NAME>

Exemplo de solicitação

curl -X DELETE 'https://graph.facebook.com/v21.0/102290129340398/message_templates?hsm_id=1407680676729941&name=order_confirmation' \
-H 'Authorization: Bearer EAAJB...'

Exemplo de resposta

{
  "success": true
}

Próximas etapas