Enviar botões
curl --request POST \
--url https://cloud.datafyapi.com.br/ig/me/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"recipient": {
"id": "1000000000000001"
},
"message": {
"attachment": {
"type": "template",
"payload": {
"template_type": "generic",
"elements": [
{
"title": "Plano Pro",
"subtitle": "Tudo liberado",
"buttons": [
{
"type": "postback",
"title": "Quero assinar",
"payload": "ASSINAR_PRO"
},
{
"type": "web_url",
"title": "Ver site",
"url": "https://exemplo.com"
}
]
}
]
}
}
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
recipient: {id: '1000000000000001'},
message: {
attachment: {
type: 'template',
payload: {
template_type: 'generic',
elements: [
{
title: 'Plano Pro',
subtitle: 'Tudo liberado',
buttons: [
{type: 'postback', title: 'Quero assinar', payload: 'ASSINAR_PRO'},
{type: 'web_url', title: 'Ver site', url: 'https://exemplo.com'}
]
}
]
}
}
}
})
};
fetch('https://cloud.datafyapi.com.br/ig/me/messages', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://cloud.datafyapi.com.br/ig/me/messages"
payload = {
"recipient": { "id": "1000000000000001" },
"message": { "attachment": {
"type": "template",
"payload": {
"template_type": "generic",
"elements": [
{
"title": "Plano Pro",
"subtitle": "Tudo liberado",
"buttons": [
{
"type": "postback",
"title": "Quero assinar",
"payload": "ASSINAR_PRO"
},
{
"type": "web_url",
"title": "Ver site",
"url": "https://exemplo.com"
}
]
}
]
}
} }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"recipient_id": "1000000000000001",
"message_id": "aWdfZAG1faXRlbTo......"
}{
"error": {
"message": "Não foi possível encontrar o usuário solicitado.",
"type": "IGApiException",
"code": 100,
"error_subcode": 2534014,
"fbtrace_id": "AbCdEfGhIjK"
}
}{
"statusCode": 401,
"message": "Token inválido ou não encontrado."
}{
"statusCode": 402,
"message": "Assinatura inativa (status: canceled). Ative sua assinatura no painel para voltar a usar a API."
}Mensagens
Enviar botões
Envie um cartão com até três botões que permanecem na conversa.
POST
/
ig
/
me
/
messages
Enviar botões
curl --request POST \
--url https://cloud.datafyapi.com.br/ig/me/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"recipient": {
"id": "1000000000000001"
},
"message": {
"attachment": {
"type": "template",
"payload": {
"template_type": "generic",
"elements": [
{
"title": "Plano Pro",
"subtitle": "Tudo liberado",
"buttons": [
{
"type": "postback",
"title": "Quero assinar",
"payload": "ASSINAR_PRO"
},
{
"type": "web_url",
"title": "Ver site",
"url": "https://exemplo.com"
}
]
}
]
}
}
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
recipient: {id: '1000000000000001'},
message: {
attachment: {
type: 'template',
payload: {
template_type: 'generic',
elements: [
{
title: 'Plano Pro',
subtitle: 'Tudo liberado',
buttons: [
{type: 'postback', title: 'Quero assinar', payload: 'ASSINAR_PRO'},
{type: 'web_url', title: 'Ver site', url: 'https://exemplo.com'}
]
}
]
}
}
}
})
};
fetch('https://cloud.datafyapi.com.br/ig/me/messages', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://cloud.datafyapi.com.br/ig/me/messages"
payload = {
"recipient": { "id": "1000000000000001" },
"message": { "attachment": {
"type": "template",
"payload": {
"template_type": "generic",
"elements": [
{
"title": "Plano Pro",
"subtitle": "Tudo liberado",
"buttons": [
{
"type": "postback",
"title": "Quero assinar",
"payload": "ASSINAR_PRO"
},
{
"type": "web_url",
"title": "Ver site",
"url": "https://exemplo.com"
}
]
}
]
}
} }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"recipient_id": "1000000000000001",
"message_id": "aWdfZAG1faXRlbTo......"
}{
"error": {
"message": "Não foi possível encontrar o usuário solicitado.",
"type": "IGApiException",
"code": 100,
"error_subcode": 2534014,
"fbtrace_id": "AbCdEfGhIjK"
}
}{
"statusCode": 401,
"message": "Token inválido ou não encontrado."
}{
"statusCode": 402,
"message": "Assinatura inativa (status: canceled). Ative sua assinatura no painel para voltar a usar a API."
}O cartão fica fixo na conversa e os botões continuam clicáveis depois do primeiro toque. É a forma indicada para ofertas e menus que a pessoa pode consultar de novo.
Até 3 botões por cartão. Acima disso a Meta recusa:
Um clique em
Essa é a diferença prática em relação às respostas rápidas, que chegam dentro de uma mensagem. Sua integração precisa tratar os dois caminhos para montar um fluxo encadeado.
{
"error": {
"message": "Limite de botões de modelos genéricos excedido. O número máximo de botões permitidos para modelos genéricos é 3",
"code": 100,
"error_subcode": 2018343
}
}
Tipos de botão
| Tipo | O que faz | Gera evento |
|---|---|---|
postback | Devolve o payload para o seu webhook, sem tirar a pessoa do Instagram | Sim |
web_url | Abre o endereço informado em url | Não |
web_url não chega para a sua integração. Para medir o clique, use um link com parâmetros próprios ou um redirecionador.
Os campos
payload e url são exclusivos. Um botão postback aceita apenas payload; um botão web_url aceita apenas url. Enviar os dois no mesmo botão é recusado:{
"error": {
"message": "Invalid message data for IG Generic templates",
"type": "IGApiException",
"code": 100,
"error_subcode": 2018340
}
}
Retorno no webhook
O clique em umpostback chega como um evento separado, sem o campo message:
"postback": {
"mid": "aWdfZAG1faXRlbTo...",
"title": "Quero assinar",
"payload": "ASSINAR_PRO"
}
Autorizações
Token do canal do Instagram, gerado no painel da Datafy. Formato: sk_live_xxx.
Corpo
application/json
Resposta
Aceito pela Meta. Não confirma a entrega.