HypeAiIntegraAPI

Documentação da API

API de WhatsApp da HypeAi Integra

Envie e receba mensagens de WhatsApp por uma API REST 100% compatível com a Cloud API da Meta. Sem aprovação de app, sem BSP: gere uma chave, aponte para um número conectado e comece.

Começar

Visão geral

O gateway da HypeAi é um proxy transparente da Cloud API da Meta, organizado por número (phone_number_id). Tudo o que existe na documentação oficial da Meta funciona aqui: você só troca o domínio e o token. Em cima disso, a HypeAi cuida de autenticação por chave, limite de uso, idempotência, rastreamento e erros padronizados.

  • Endpoint canônico de envio: POST /v1/{phone_number_id}/messages.
  • Qualquer outro caminho sob /v1/{phone_number_id}/... é repassado para a Meta.
  • Respostas trazem X-Request-Id e X-Hypeai-Latency-Ms para rastreio.
Já tem conta? Abra o Explorer para montar e testar as chamadas com as suas chaves e os seus números preenchidos.
Endpoint base
https://api.hypeai.com.br/v1/{phone_number_id}/messages

Começar

Autenticação

Toda requisição leva a sua chave no header Authorization, no formato Bearer. As chaves começam com hai_live_ (produção) ou hai_test_ (teste).

  • Crie e gerencie chaves no painel, na aba Desenvolvedor.
  • A chave completa aparece uma única vez, no momento da criação. Guarde num cofre.
  • Ao rotacionar, a chave antiga continua válida por 24h para você migrar sem downtime.
Nunca exponha a chave no front-end nem em repositórios públicos. Se vazar, revogue e gere outra.
Header
Authorization: Bearer hai_live_SEU_TOKEN

Começar

Primeiro envio

Monte a chamada, copie o código (cURL, JavaScript ou Python) e rode no seu terminal, no n8n, Make ou qualquer cliente HTTP. O Explorer gera o código pronto (e, logado, já preenche as suas chaves e números).

Abrir o Explorer interativo no app →

Enviar mensagens

Mensagem de texto

Texto livre. Só funciona dentro da janela de 24h após a última mensagem do contato.

CampoTipoDescrição
to*stringNúmero do destinatário com DDI, só dígitos (ex.: 5511999999999).
type*stringUse "text".
text.body*stringO texto. Até 4096 caracteres.
curl -X POST \
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages" \
  -H "Authorization: Bearer hai_live_SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "messaging_product": "whatsapp",
  "to": "5511999999999",
  "type": "text",
  "text": {
    "body": "Olá! 👋 Sua mensagem via HypeAi Integra.",
    "preview_url": true
  }
}'
const res = await fetch(
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer hai_live_SEU_TOKEN",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      "messaging_product": "whatsapp",
      "to": "5511999999999",
      "type": "text",
      "text": {
        "body": "Olá! 👋 Sua mensagem via HypeAi Integra.",
        "preview_url": true
      }
    }),
  }
);
const data = await res.json();
console.log(res.status, data);
import requests

res = requests.post(
    "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages",
    headers={
        "Authorization": "Bearer hai_live_SEU_TOKEN",
        "Content-Type": "application/json",
    },
    json={
      "messaging_product": "whatsapp",
      "to": "5511999999999",
      "type": "text",
      "text": {
        "body": "Olá! 👋 Sua mensagem via HypeAi Integra.",
        "preview_url": True
      }
    },
)
print(res.status_code, res.json())

Enviar mensagens

Template

Template aprovado é o único jeito de iniciar conversa fora da janela de 24h. Para preencher variáveis, adicione components (veja a referência da Meta).

CampoTipoDescrição
type*stringUse "template".
template.name*stringNome do template aprovado (ex.: hello_world).
template.language.code*stringCódigo do idioma (ex.: pt_BR, en_US).
template.componentsarrayVariáveis do corpo, cabeçalho e botões (opcional).
curl -X POST \
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages" \
  -H "Authorization: Bearer hai_live_SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "messaging_product": "whatsapp",
  "to": "5511999999999",
  "type": "template",
  "template": {
    "name": "hello_world",
    "language": {
      "code": "en_US"
    }
  }
}'
const res = await fetch(
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer hai_live_SEU_TOKEN",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      "messaging_product": "whatsapp",
      "to": "5511999999999",
      "type": "template",
      "template": {
        "name": "hello_world",
        "language": {
          "code": "en_US"
        }
      }
    }),
  }
);
const data = await res.json();
console.log(res.status, data);
import requests

res = requests.post(
    "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages",
    headers={
        "Authorization": "Bearer hai_live_SEU_TOKEN",
        "Content-Type": "application/json",
    },
    json={
      "messaging_product": "whatsapp",
      "to": "5511999999999",
      "type": "template",
      "template": {
        "name": "hello_world",
        "language": {
          "code": "en_US"
        }
      }
    },
)
print(res.status_code, res.json())

Enviar mensagens

Mídia (imagem, vídeo, áudio, documento)

Envie mídia por URL pública (link) ou por media id (id, após o upload; veja Upload de mídia). O exemplo ao lado usa imagem; vídeo, áudio e documento seguem a mesma forma, trocando a chave image por video, audio ou document.

CampoTipoDescrição
type*string"image", "video", "audio" ou "document".
<tipo>.linkstringURL pública do arquivo (ou use id).
<tipo>.idstringID de mídia já enviada à Meta.
<tipo>.captionstringLegenda (imagem, vídeo, documento).
document.filenamestringNome exibido do arquivo.
curl -X POST \
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages" \
  -H "Authorization: Bearer hai_live_SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "messaging_product": "whatsapp",
  "to": "5511999999999",
  "type": "image",
  "image": {
    "link": "https://exemplo.com/foto.jpg"
  }
}'
const res = await fetch(
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer hai_live_SEU_TOKEN",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      "messaging_product": "whatsapp",
      "to": "5511999999999",
      "type": "image",
      "image": {
        "link": "https://exemplo.com/foto.jpg"
      }
    }),
  }
);
const data = await res.json();
console.log(res.status, data);
import requests

res = requests.post(
    "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages",
    headers={
        "Authorization": "Bearer hai_live_SEU_TOKEN",
        "Content-Type": "application/json",
    },
    json={
      "messaging_product": "whatsapp",
      "to": "5511999999999",
      "type": "image",
      "image": {
        "link": "https://exemplo.com/foto.jpg"
      }
    },
)
print(res.status_code, res.json())

Enviar mensagens

Botões e listas

Mensagens interativas (dentro da janela de 24h). Botões: até 3 respostas rápidas. Listas: um menu com seções e itens. O exemplo mostra botões; a lista usa interactive.type: "list" comaction.sections[].rows[].

CampoTipoDescrição
type*stringUse "interactive".
interactive.type*string"button" ou "list".
interactive.body.text*stringTexto principal.
interactive.action.buttons[]arrayBotões (máx. 3): { type:"reply", reply:{ id, title } }.
interactive.action.sections[]arrayPara listas: seções com rows[] (id, title, description?).
curl -X POST \
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages" \
  -H "Authorization: Bearer hai_live_SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "messaging_product": "whatsapp",
  "to": "5511999999999",
  "type": "interactive",
  "interactive": {
    "type": "button",
    "body": {
      "text": "Como podemos ajudar?"
    },
    "action": {
      "buttons": [
        {
          "type": "reply",
          "reply": {
            "id": "btn_1",
            "title": "Falar com vendas"
          }
        },
        {
          "type": "reply",
          "reply": {
            "id": "btn_2",
            "title": "Suporte"
          }
        },
        {
          "type": "reply",
          "reply": {
            "id": "btn_3",
            "title": "Outro assunto"
          }
        }
      ]
    }
  }
}'
const res = await fetch(
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer hai_live_SEU_TOKEN",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      "messaging_product": "whatsapp",
      "to": "5511999999999",
      "type": "interactive",
      "interactive": {
        "type": "button",
        "body": {
          "text": "Como podemos ajudar?"
        },
        "action": {
          "buttons": [
            {
              "type": "reply",
              "reply": {
                "id": "btn_1",
                "title": "Falar com vendas"
              }
            },
            {
              "type": "reply",
              "reply": {
                "id": "btn_2",
                "title": "Suporte"
              }
            },
            {
              "type": "reply",
              "reply": {
                "id": "btn_3",
                "title": "Outro assunto"
              }
            }
          ]
        }
      }
    }),
  }
);
const data = await res.json();
console.log(res.status, data);
import requests

res = requests.post(
    "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages",
    headers={
        "Authorization": "Bearer hai_live_SEU_TOKEN",
        "Content-Type": "application/json",
    },
    json={
      "messaging_product": "whatsapp",
      "to": "5511999999999",
      "type": "interactive",
      "interactive": {
        "type": "button",
        "body": {
          "text": "Como podemos ajudar?"
        },
        "action": {
          "buttons": [
            {
              "type": "reply",
              "reply": {
                "id": "btn_1",
                "title": "Falar com vendas"
              }
            },
            {
              "type": "reply",
              "reply": {
                "id": "btn_2",
                "title": "Suporte"
              }
            },
            {
              "type": "reply",
              "reply": {
                "id": "btn_3",
                "title": "Outro assunto"
              }
            }
          ]
        }
      }
    },
)
print(res.status_code, res.json())

Enviar mensagens

Localização, contato e reação

Tipos adicionais suportados pelo proxy:

  • Localização (type: "location"): latitude, longitude, e opcionalmente name/address.
  • Contato (type: "contacts"): array com name e phones[].
  • Reação (type: "reaction"): message_id (o wamid recebido) + emoji.

Selecione esses endpoints no Explorer para ver o corpo exato de cada um.

curl -X POST \
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages" \
  -H "Authorization: Bearer hai_live_SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "messaging_product": "whatsapp",
  "to": "5511999999999",
  "type": "location",
  "location": {
    "latitude": -23.5613,
    "longitude": -46.6565,
    "name": "Av. Paulista",
    "address": "Av. Paulista, 1000 - São Paulo"
  }
}'
const res = await fetch(
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer hai_live_SEU_TOKEN",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      "messaging_product": "whatsapp",
      "to": "5511999999999",
      "type": "location",
      "location": {
        "latitude": -23.5613,
        "longitude": -46.6565,
        "name": "Av. Paulista",
        "address": "Av. Paulista, 1000 - São Paulo"
      }
    }),
  }
);
const data = await res.json();
console.log(res.status, data);
import requests

res = requests.post(
    "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages",
    headers={
        "Authorization": "Bearer hai_live_SEU_TOKEN",
        "Content-Type": "application/json",
    },
    json={
      "messaging_product": "whatsapp",
      "to": "5511999999999",
      "type": "location",
      "location": {
        "latitude": -23.5613,
        "longitude": -46.6565,
        "name": "Av. Paulista",
        "address": "Av. Paulista, 1000 - São Paulo"
      }
    },
)
print(res.status_code, res.json())

Conversa & status

A janela de 24 horas

O WhatsApp separa dois tipos de mensagem do negócio para o cliente:

  • Resposta de serviço: dentro de 24h desde a última mensagem do contato, pode mandar texto, mídia e interativos livremente.
  • Iniciada pelo negócio: fora da janela de 24h, só template aprovado. Qualquer outro tipo é recusado pela Meta.
Se você receber um erro pedindo template fora da janela, é exatamente isso: use Template para reabrir a conversa.

Conversa & status

Lida, digitação e status de entrega

Confirme leitura e mostre que está digitando usando o wamid que chegou no seu webhook:

  • Marcar como lida (✓✓ azuis): { status: "read", message_id }.
  • Digitando…: adicione typing_indicator: { type: "text" }. Some sozinho em ~25s ou quando você responde.
  • Status de envio (sent, delivered, read, failed) chega pelo webhook message_status.
curl -X POST \
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages" \
  -H "Authorization: Bearer hai_live_SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "messaging_product": "whatsapp",
  "status": "read",
  "message_id": "wamid.HBgM..."
}'
const res = await fetch(
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer hai_live_SEU_TOKEN",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      "messaging_product": "whatsapp",
      "status": "read",
      "message_id": "wamid.HBgM..."
    }),
  }
);
const data = await res.json();
console.log(res.status, data);
import requests

res = requests.post(
    "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID/messages",
    headers={
        "Authorization": "Bearer hai_live_SEU_TOKEN",
        "Content-Type": "application/json",
    },
    json={
      "messaging_product": "whatsapp",
      "status": "read",
      "message_id": "wamid.HBgM..."
    },
)
print(res.status_code, res.json())

Número & templates

Dados do número

Consulte os metadados do número conectado: nome verificado, número exibido, qualidade e status de verificação. É um GET simples em /v1/{phone_number_id}.

curl -X GET \
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID?fields=verified_name,display_phone_number,quality_rating,code_verification_status" \
  -H "Authorization: Bearer hai_live_SEU_TOKEN"
const res = await fetch(
  "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID?fields=verified_name,display_phone_number,quality_rating,code_verification_status",
  {
    method: "GET",
    headers: {
      "Authorization": "Bearer hai_live_SEU_TOKEN",
    },
  }
);
const data = await res.json();
console.log(res.status, data);
import requests

res = requests.get(
    "https://api.hypeai.com.br/v1/PHONE_NUMBER_ID?fields=verified_name,display_phone_number,quality_rating,code_verification_status",
    headers={
        "Authorization": "Bearer hai_live_SEU_TOKEN",
    },
)
print(res.status_code, res.json())

Número & templates

Templates

Como tudo é repassado à Meta, você gerencia templates pelos mesmos endpoints da Cloud API (listar, criar, conferir status de aprovação). Pelo painel da HypeAi há uma UI guiada para isso; pela API, use os caminhos da Meta sob o seu número/WABA.

Referência completa: Message Templates (Meta).

Listar templates
GET https://api.hypeai.com.br/v1/{phone_number_id}/message_templates
Authorization: Bearer hai_live_SEU_TOKEN

Número & templates

Upload e download de mídia

Para enviar mídia sem URL pública, faça upload primeiro e use o id retornado nas mensagens. Para baixar mídia recebida, use o media_id que chega no webhook.

  • Upload: POST /v1/{phone_number_id}/media (multipart) → retorna { "id": "..." }.
  • Download: GET /v1/{phone_number_id}/media/{media_id}.
Upload
curl -X POST \
  "https://api.hypeai.com.br/v1/{phone_number_id}/media" \
  -H "Authorization: Bearer hai_live_SEU_TOKEN" \
  -F "messaging_product=whatsapp" \
  -F "file=@/caminho/arquivo.jpg"

Webhooks

Receber eventos

Registre uma URL de webhook no painel (aba Integrações) e a HypeAi entrega os eventos do seu número via POST em JSON. O corpo segue o envelope ao lado.

Eventos

  • messages: mensagens recebidas (texto, mídia, interativo, localização, contato).
  • message_status: status de envio (sent, delivered, read, failed).
  • templates: mudança de status de um template (aprovado/rejeitado).
  • account_update: qualidade do número, limites de tier, restrições da conta.
  • smb_message_echoes (coexistência, opt-in explícito): eco das mensagens que você envia pelo app WhatsApp Business do celular — para o seu sistema exibir a conversa completa. Direção invertida:from = o seu número, to = o cliente. Nunca chega dentro de messages.

Entrega e reentrega

Responda 2xx rápido. Em falha, reentregamos com backoff (1m, 5m, 30m, 2h, 12h; até 5 tentativas, depois dead-letter). O header X-HypeAi-Event-Id é estável entre tentativas: deduplique por ele.

{
  "object": "whatsapp_business_account",
  "event": "messages",
  "entry": [
    {
      "id": "<WABA_ID>",
      "changes": [
        {
          "field": "messages",
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "5511999999999",
              "phone_number_id": "123456789012345"
            },
            "contacts": [
              {
                "profile": {
                  "name": "Maria"
                },
                "wa_id": "5511988887777"
              }
            ],
            "messages": [
              {
                "from": "5511988887777",
                "id": "wamid.HBgNNTUxMTk4...",
                "timestamp": "1718800000",
                "type": "text",
                "text": {
                  "body": "Olá!"
                }
              }
            ]
          }
        }
      ]
    }
  ],
  "received_at": "2026-06-19T12:00:00.000Z"
}
{
  "object": "whatsapp_business_account",
  "event": "message_status",
  "entry": [
    {
      "id": "<WABA_ID>",
      "changes": [
        {
          "field": "message_status",
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "5511999999999",
              "phone_number_id": "123456789012345"
            },
            "statuses": [
              {
                "id": "wamid.HBgNNTUx...",
                "status": "delivered",
                "timestamp": "1718800050",
                "recipient_id": "5511988887777"
              }
            ]
          }
        }
      ]
    }
  ],
  "received_at": "2026-06-19T12:00:50.000Z"
}
{
  "object": "whatsapp_business_account",
  "event": "smb_message_echoes",
  "entry": [
    {
      "id": "<WABA_ID>",
      "changes": [
        {
          "field": "smb_message_echoes",
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "5511999999999",
              "phone_number_id": "123456789012345"
            },
            "message_echoes": [
              {
                "from": "5511999999999",
                "to": "5511988887777",
                "id": "wamid.HBgNNTUxMTk4...",
                "timestamp": "1718800100",
                "type": "text",
                "text": {
                  "body": "Respondi pelo celular 👍"
                }
              }
            ]
          }
        }
      ]
    }
  ],
  "received_at": "2026-06-19T12:01:40.000Z"
}
X-HypeAi-Event: messages
X-HypeAi-Signature-256: sha256=<hmac-sha256 do corpo, com seu secret>
X-HypeAi-Event-Id: 3f2a...-uuid    # estável entre re-entregas do MESMO evento — deduplique por ele
X-HypeAi-Delivery-Id: 7b1f...-uuid    # muda a cada tentativa
X-HypeAi-Delivery-Attempt: 1

Webhooks

Validar a assinatura

Cada entrega vem assinada com HMAC-SHA256 do corpo cru, usando o secret do seu webhook, no header X-HypeAi-Signature-256 (prefixado por sha256=). Valide antes de confiar no payload.

Use o corpo exatamente como recebido (raw), não o JSON re-serializado. Qualquer reordenação de chaves muda o hash.

O secret é revelado uma única vez (na criação). Perdeu ou suspeita de vazamento? Rotacione — no painel (Integrações → editar webhook → Rotacionar secret) ou pela API de Gestão (action: "rotate"): o novo secret é revelado uma vez e passa a assinar as entregas na hora.

import crypto from "node:crypto";

// rawBody = corpo exato recebido (string), NÃO o JSON re-serializado.
function verify(rawBody, header, secret) {
  const expected = "sha256=" + crypto
    .createHmac("sha256", secret)
    .update(rawBody)
    .digest("hex");
  return crypto.timingSafeEqual(Buffer.from(header), Buffer.from(expected));
}
import hmac, hashlib

def verify(raw_body: bytes, header: str, secret: str) -> bool:
    expected = "sha256=" + hmac.new(
        secret.encode(), raw_body, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(header, expected)

Referência

Idempotência

Em POST, envie um header Idempotency-Key (qualquer string única por operação). Repetir a chamada com a mesma chave e o mesmo corpo devolve a resposta em cache (24h) sem reenviarà Meta. A resposta replicada traz X-Hypeai-Idempotent-Replayed: true.

Mesma chave com corpo diferente retorna 422 (hypeai_type: "idempotency").

Header
Idempotency-Key: pedido-12345

Referência

Limites de uso

O limite padrão é de 120 requisições por minuto por chave (ajustável por chave). Ao estourar, você recebe 429 com o header Retry-After (segundos). Espere esse tempo antes de tentar de novo.

429 Too Many Requests
HTTP/1.1 429 Too Many Requests
Retry-After: 30

Referência

Erros

Erros seguem o mesmo formato da Meta, com um campo extra hypeai_type para você tratar programaticamente. O header X-Request-Id ajuda no suporte.

HTTPhypeai_typeSignificado
401authChave de API ausente, inválida ou revogada.
403 / 503unavailableConta arquivada ou credencial do WhatsApp indisponível.
404not_foundphone_number_id não pertence à sua conta.
413payload_too_largeCorpo acima do limite (100MB).
422idempotencyIdempotency-Key reusada com corpo diferente.
429rate_limitLimite de requisições excedido (veja Retry-After).
502upstreamFalha ao falar com a Meta.
504upstream_timeoutMeta não respondeu a tempo (25s).
Corpo de erro
{
  "error": {
    "message": "Mensagem fora da janela de 24h. Use um template aprovado.",
    "type": "HypeAiError",
    "code": 400,
    "error_subcode": null,
    "fbtrace_id": "A1b2C3...",
    "hypeai_type": "upstream"
  }
}
Referência exaustiva de campos: Cloud API da Meta. Precisa de uma chave? Acesse o painel.

Formatos para máquinas e IAs

  • openapi.json — contrato OpenAPI 3.1, importável em ferramentas de dev e IA.
  • llms-full.txt — referência completa em markdown, um arquivo para LLMs.
  • Servidor MCP — a API operável por agentes (Claude, ChatGPT etc.).