We are making changes to the WhatsApp Business Platform pricing model. See Pricing Updates on the WhatsApp Business Platform.
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.
Você precisará do seguinte:
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.
Envie uma solicitação POST ao ponto de extremidade WhatsApp Business Account > Message Templates para criar um modelo.
POST /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates
{ "name": "<NAME>", "category": "<CATEGORY>", "allow_category_change": <ALLOW_CATEGORY_CHANGE>, "language": "<LANGUAGE>", "components": [<COMPONENTS>] }
Espaço reservado | Descrição | Exemplo de valor |
---|---|---|
String | Obrigatório. O nome do modelo. Máximo de 512 caracteres. |
|
Enumeração | Obrigatório. A categoria do modelo. Consulte Categorias de modelo abaixo. |
|
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. |
|
Enumeração | Obrigatório. O código de localidade e idioma do modelo. |
|
String | Opcional. O nome exato do modelo da Biblioteca de Modelos de Utilidade. Aprenda a criar modelos usando a Biblioteca de Modelos de Utilidade. |
|
Matriz de objetos | Obrigatório. Componentes que fazem parte do modelo. Consulte Componentes do modelo abaixo. | Consulte Componentes do modelo abaixo. |
Espaço reservado | Descrição | Exemplo de valor |
---|---|---|
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. |
|
Enumeração | O tipo de botão. QUICK_REPLY, URL, PHONE_NUMBER, OTP, MPM, CATALOG, FLOW, VOICE_CALL, APP Obrigatório. |
|
String | O número de telefone para o botão. Opcional |
|
Objeto JSON | Consulte os parâmetros de URL do objeto JSON Opcional | |
booliano | Se o usuário aceitou ou não os termos de toque zero. Opcional |
|
Enumeração | O tipo de senha descartável. COPY_CODE, ONE_TAP, ZERO_TAP Opcional |
|
Matriz de objetos JSON | Consulte os parâmetros de objeto JSON de app compatíveis com Opcional |
Espaço reservado | Descrição | Exemplo de valor |
---|---|---|
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. | |
booliano | Valor booliano para adicionar informações ao modelo sobre como entrar em contato com a empresa pelo número de telefone. Opcional |
|
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 |
|
booliano | Valor booliano para adicionar informações ao modelo para não compartilhar códigos de autenticação com ninguém. Opcional |
|
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 |
|
int64 | Valor inteiro para adicionar informações ao modelo sobre quando o código expirará. Opcional |
|
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.
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.
Quando você envia uma solicitação de criação de modelo, validamos imediatamente a categoria usando nossas diretrizes de categorização de modelos.
status
de PENDING
. Isso significa que o modelo passará por um processo de análise.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:
É 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.
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.
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.
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:
status
é PENDING
).status
é REJECTED
).status
é APPROVED
). Isso só acontecerá em modelos de autenticação com botões de senha descartável.{ "id": "<ID>", "status": "<STATUS>", "category": "<CATEGORY>" }
Espaço reservado | Descrição | Exemplo de valor |
---|---|---|
| O ID do modelo. |
|
|
| |
| A categoria do modelo designada por você ou atribuída por nós. |
|
Veja um exemplo de solicitação para criar um modelo de promoção sazonal com os seguintes componentes:
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"
}
]
}
]
}'
{ "id": "572279198452421", "status": "PENDING", "category": "MARKETING" }
Use a API de Nuvem ou a API Local para enviar um modelo em uma mensagem.
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.
Autenticação | Utilidade | Marketing | |
---|---|---|---|
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 |
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.
message_send_ttl_seconds
30
a 900
segundos (30 s a 15 min) 30
a 43200
segundos (30 s a 12 horas)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.
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.
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.
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.
GET /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates ?fields=<FIELDS> &limit=<LIMIT>
Espaço reservado | Descrição | Exemplo de valor |
---|---|---|
Lista separada por vírgulas | Opcional. A lista de campos de modelo que você quer que sejam retornados. |
|
Número inteiro | Opcional. O número máximo de modelos que você quer que sejam retornados em cada página de resultados. |
|
curl 'https://graph.facebook.com/v21.0
/102290129340398/message_templates?fields=name,status&limit=3' \
-H 'Authorization: Bearer EAAJB...'
{
"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"
}
}
É 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...'
{ "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" } ] }
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
.
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" }
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.
APPROVED
, REJECTED
ou PAUSED
.category
ou os components
de um modelo.category
de um modelo aprovado.POST /<WHATSAPP_MESSAGE_TEMPLATE_ID>
{ "category": "<CATEGORY>", "components": [<COMPONENTS>] }
Espaço reservado | Descrição | Exemplo de valor |
---|---|---|
String | Obrigatório se a propriedade dos componentes for omitida. A categoria do modelo. |
|
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 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 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 caso a solicitação seja bem-sucedida:
{ "success": true }
Use o ponto de extremidade WhatsApp Business Account > Message Templates para excluir um modelo por nome ou ID.
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.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.
DELETE /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates ?name=<NAME>
curl -X DELETE 'https://graph.facebook.com/v16.0/102290129340398/message_templates?name=order_confirmation' \ -H 'Authorization: Bearer EAAJB...'
{ "success": true }
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.
DELETE /<WHATSAPP_BUSINESS_ACCOUNT_ID>/message_templates ?hsm_id=<HSM_ID>, &name=<NAME>
curl -X DELETE 'https://graph.facebook.com/v21.0
/102290129340398/message_templates?hsm_id=1407680676729941&name=order_confirmation' \
-H 'Authorization: Bearer EAAJB...'
{ "success": true }