Navegação

Introdução

O que é a Hosthy API e como ela funciona.

A Hosthy API é a interface REST oficial da plataforma para integrações com WhatsApp Business. Permite que desenvolvedores gerenciem contatos, conversas, enviem mensagens e recebam eventos em tempo real.

Construída sobre a Meta WhatsApp Cloud API — todas as mensagens passam pela infraestrutura oficial da Meta com garantias de entrega, criptografia e compliance.

AtributoValor
Base URLhttps://api.hosthy.com.br/public-api/v1
Versãov1
ProtocoloHTTPS obrigatório
FormatoJSON (Content-Type: application/json)
AutenticaçãoAPI Key via Authorization: Bearer
Esta documentação cobre a API pública (por API Key). O painel Hosthy possui funcionalidades adicionais via login de operador.

Autenticação

Todas as requisições exigem uma API Key válida.

Formato do token

Cada chave é um token de 56 caracteres hexadecimais gerado aleatoriamente — sem prefixo.

text
a3f8c2e1d94b7065f2a1c8e3b47d92f0e6c5a1b8d3e7f094c2a6b1e5d8f3a970

Como enviar

Use o header Authorization: Bearer ou X-API-Key:

http
Authorization: Bearer SEU_TOKEN

# ou via header alternativo
X-API-Key: SEU_TOKEN

Verificar autenticação

bash
curl https://api.hosthy.com.br/public-api/v1/me \
  -H "Authorization: Bearer SEU_TOKEN"

# Resposta 200 OK
{
  "keyId": "550e8400-...",
  "tenantId": "550e8400-...",
  "scopes": ["contacts.read", "messages.send"],
  "tenant": {
    "name": "Minha Empresa",
    "subdomain": "minhaempresa",
    "plan": "business"
  }
}

Gerar uma API Key

  1. Acesse o painel Hosthy
  2. Vá em Configurações → API Keys
  3. Clique em Nova API Key
  4. Escolha um nome descritivo e os scopes necessários
  5. Copie a chave gerada — ela é exibida uma única vez
Segurança: A API Key concede acesso completo ao seu tenant (dentro dos scopes). Nunca a exponha em código-fonte público ou apps mobile. Use variáveis de ambiente no backend.

Scopes

Cada API Key tem scopes que definem as operações permitidas.

Use o princípio do menor privilégio — conceda apenas os scopes necessários para cada integração.

ScopeDescrição
contacts.readListar e buscar contatos
contacts.writeCriar e atualizar contatos
conversations.readListar conversas e mensagens
messages.sendEnviar mensagens em conversas
tags.readListar tags disponíveis
tags.writeAdicionar/remover tags de contatos
Scope insuficiente retorna 403 Forbidden com o campo "Required scope: <scope>" no corpo do erro.

Formato & Erros

Todas as respostas são JSON com Content-Type: application/json.

Resposta de sucesso

json
// HTTP 200 OK
{
  "contacts": [...],
  "pagination": {
    "total": 42,
    "page": 1,
    "limit": 50,
    "pages": 1
  }
}

Resposta de erro

json
// HTTP 401 Unauthorized
{
  "error": "API key required. Use Authorization: Bearer <key>"
}

Erro de validação (400)

json
// HTTP 400 Bad Request
{
  "error": "Validation error",
  "details": {
    "fieldErrors": {
      "phone": ["String must contain at least 7 characters"]
    }
  }
}

Paginação

Endpoints de listagem suportam paginação via query params.

ParâmetroTipoPadrãoDescrição
pageinteger1Número da página (começa em 1)
limitinteger50Itens por página (máx. 100)
searchstringBusca por nome, telefone ou e-mail
statusstringFiltro por status (open, closed…)
bash
curl "https://api.hosthy.com.br/public-api/v1/contacts?page=2&limit=25&search=Joao" \
  -H "Authorization: Bearer SEU_TOKEN"

Rate Limit

Limites de requisições por minuto por IP/chave.

EndpointLimite
GET /me, GET /tags60 req/min
GET /contacts, GET /contacts/:id, GET /conversations, GET /conversations/:id120 req/min
POST /contacts, POST …/messages, POST/DELETE …/tags/:tagId30 req/min

Limite excedido retorna 429 Too Many Requests. Implemente retry com backoff exponencial.

json
// HTTP 429 Too Many Requests
{ "error": "Rate limit exceeded. Retry after 60 seconds." }

Contatos

Gerencie a base de contatos da sua conta Hosthy.

GET /public-api/v1/contacts contacts.read

Lista contatos com suporte a busca por nome, telefone ou e-mail.

bash
curl "https://api.hosthy.com.br/public-api/v1/contacts?limit=10" \
  -H "Authorization: Bearer SEU_TOKEN"

# Resposta 200 OK
{
  "contacts": [
    {
      "id": "CONTACT_ID",
      "name": "João Silva",
      "phone": "5551992371100",
      "email": "[email protected]",
      "notes": null,
      "contactTags": []
    }
  ],
  "pagination": { "total": 1, "page": 1, "limit": 10, "pages": 1 }
}
POST /public-api/v1/contacts contacts.write

Cria um novo contato. O telefone é normalizado automaticamente para o formato Meta (wa_id).

bash
curl -X POST https://api.hosthy.com.br/public-api/v1/contacts \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Maria Souza",
    "phone": "5541991392989",
    "email": "[email protected]"
  }'
GET /public-api/v1/contacts/{id} contacts.read

Retorna contato específico com conversas recentes e tags.

POST /public-api/v1/contacts/{id}/tags/{tagId} tags.write

Adiciona uma tag a um contato.

DELETE /public-api/v1/contacts/{id}/tags/{tagId} tags.write

Remove uma tag de um contato.

Normalização de telefone

EntradaNormalizado
+55 51 99237-1100555192371100
5551992371100555192371100
+1 555 631 180715556311807

Nono dígito BR: Números com 13 dígitos são convertidos para 12 conforme padrão Meta.


Conversas

Threads de comunicação com contatos via WhatsApp.

GET /public-api/v1/conversations conversations.read

Lista conversas. Filtre por status: open, pending ou closed.

bash
curl "https://api.hosthy.com.br/public-api/v1/conversations?status=open&limit=10" \
  -H "Authorization: Bearer SEU_TOKEN"
GET /public-api/v1/conversations/{id} conversations.read

Retorna conversa com as últimas 20 mensagens incluídas.

POST /public-api/v1/conversations/{id}/messages messages.send

Envia mensagem de texto em uma conversa. Fora da janela de 24h, use templates aprovados.

bash
curl -X POST \
  "https://api.hosthy.com.br/public-api/v1/conversations/CONV_ID/messages" \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"content": "Olá! Como posso ajudar?"}'

Status de Mensagens

Ciclo de vida das mensagens enviadas.

StatusDescrição
pendingCriada, aguardando envio
sentEnviada para a Meta
deliveredEntregue no dispositivo do contato
readLida pelo contato
failedFalha no envio

Os status delivered e read chegam via webhook da Meta. Configure webhooks de saída para recebê-los em tempo real.

Use webhooks em vez de polling para receber atualizações de status. Menor latência e sem consumo de rate limit.

Janela de 24 horas

Regra fundamental da Meta WhatsApp Business Platform.

Importante: Quando um cliente envia uma mensagem, abre-se uma janela de 24h para resposta com texto livre. Após 24h, apenas templates aprovados podem ser enviados.
SituaçãoPode enviarCategoria
Cliente respondeu nos últimos 24h✓ Texto livreservice
Mais de 24h sem resposta✗ Texto bloqueado
Fora da janela, com template aprovado✓ Templateutility / marketing

Verificar estado (painel autenticado)

json
// GET /conversations/{id}/meta-state
{
  "within24hWindow": true,
  "windowExpiresAt": "2024-01-16T08:00:00Z",
  "remainingSeconds": 14400,
  "canSendFreeform": true,
  "requiresTemplate": false
}
A API pública retorna 422 ao tentar enviar texto fora da janela. Use /messages/preview no painel autenticado para verificar antes do envio.

Templates WhatsApp

Mensagens pré-aprovadas pela Meta para uso fora da janela 24h.

Templates pertencem ao WABA do cliente — criados e aprovados no Meta Business Manager, não pela Hosthy.

A Hosthy não cobra por templates. O custo (se houver) é cobrado pela Meta diretamente na conta Business conectada.

Categorias

CategoriaUso
utilityNotificações transacionais (confirmações, status, atualizações)
marketingPromoções, ofertas, campanhas publicitárias
authenticationOTP, verificação de identidade
serviceRespostas dentro da janela 24h

Status de aprovação

StatusPode usar?
APPROVED✓ Sim
PENDING✗ Aguardando aprovação Meta
REJECTED✗ Verifique no Business Manager
PAUSED✗ Suspensão temporária

Custos Meta

Separação de cobranças entre Hosthy e Meta.

Modelos separados: A Hosthy cobra a mensalidade da plataforma. Os custos de uso do WhatsApp são cobrados pela Meta diretamente na conta Business do cliente.
CobrançaQuem cobraPara quem
Mensalidade HosthyHosthyCliente
Mensagens entreguesMetaDono do WABA
Templates (utility, marketing)MetaDono do WABA
A fatura oficial é sempre a do Business Manager da Meta. Consulte a tabela de preços oficial da Meta para valores atualizados.

Webhooks de Saída

Receba eventos da Hosthy em tempo real no seu sistema.

Eventos disponíveis

EventoQuando ocorre
message.receivedNova mensagem recebida de um contato
message.sentMensagem enviada com sucesso
message.failedFalha definitiva no envio
conversation.createdNova conversa criada
conversation.updatedConversa atualizada (status, atribuição)
conversation.stage_changedEstágio do pipeline alterado
tag.addedTag adicionada a contato
tag.removedTag removida de contato
automation.executedAutomação executada
ai.suggestion_createdSugestão de resposta IA gerada

Criar endpoint (painel autenticado)

json
// POST /webhooks
{
  "name": "Meu CRM",
  "url": "https://meu-sistema.com/webhook",
  "events": ["message.received", "message.sent"]
}

Verificar assinatura HMAC

Cada entrega inclui o header X-Hosthy-Signature: sha256=<hmac>. Sempre verifique antes de processar:

javascript
const crypto = require('crypto')

function verifySignature(rawBody, signature, secret) {
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex')
  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signature)
  )
}

// No handler do webhook:
const sig = req.headers['x-hosthy-signature']
if (!verifySignature(req.rawBody, sig, process.env.WEBHOOK_SECRET)) {
  return res.status(401).end()
}

Retries e idempotência

Retries automáticos em caso de timeout ou status não-2xx (até 5 tentativas com backoff exponencial). Seu endpoint deve responder com 2xx e processar eventos de forma idempotente.

Use webhooks em vez de polling. Webhooks entregam eventos em tempo real com latência <1s e sem consumo de rate limit.

Segurança

Boas práticas para integrações seguras com a API.

  • Mantenha a API Key no backend — nunca no frontend, app mobile ou repositório público
  • Use variáveis de ambiente para armazenar a chave no servidor
  • HTTPS obrigatório — todas as requisições exigem HTTPS
  • Verifique assinatura HMAC em todos os webhooks recebidos
  • Menor privilégio — conceda apenas os scopes necessários por chave
  • Rotacione periodicamente e imediatamente se suspeitar de comprometimento
  • Uma chave por integração — facilita rastreamento e revogação granular
  • Não logue API Keys — filtre os headers de Authorization nos seus logs
A Hosthy nunca solicita sua API Key por e-mail, chat ou suporte. Se receber esse tipo de pedido, trate como tentativa de phishing.

Erros Comuns

Referência rápida para os códigos de erro HTTP da API.

CódigoSignificadoSolução
400Bad RequestVerifique o campo details no corpo
401API Key ausente ou inválidaInclua Authorization: Bearer <key>
403Scope insuficienteAdicione o scope necessário à chave
404Recurso não encontradoVerifique o ID e o tenant corretos
409Conflito / duplicataTelefone ou recurso já cadastrado
422Fora da janela 24hUse um template aprovado
429Rate limit excedidoImplemente backoff exponencial
500Erro internoTente novamente; contate suporte se persistir

Boas Práticas

Recomendações para integrações robustas e eficientes.

Geral

  • Use webhooks em vez de polling para receber eventos em tempo real
  • Implemente retry com backoff exponencial para falhas temporárias (5xx, 429)
  • Processe webhooks de forma idempotente — o mesmo evento pode chegar mais de uma vez
  • Valide o telefone no formato canonical WhatsApp antes de criar contatos
  • Monitore message.failed para detectar problemas de entrega proativamente
  • Mantenha templates APPROVED prontos para contatos fora da janela 24h

Rate limit

  • Não implemente polling mais frequente que 1×/minuto
  • Em caso de 429, aguarde o tempo indicado antes de tentar novamente
  • Distribua requisições no tempo — evite burst de chamadas simultâneas

Janela 24h

  • Verifique within24hWindow via /meta-state antes de enviar mensagens
  • Tenha templates utility aprovados para ativar conversas sem janela aberta
  • Monitore a expiração via campo windowExpiresAt

Changelog

Histórico de versões e mudanças da API.

v1.4 — Pricing Awareness & Janela 24h

  • /conversations/{id}/meta-state — estado da janela 24h em tempo real
  • /conversations/{id}/messages/preview — prévia antes do envio
  • Classificação de mensagens: service, utility, marketing, authentication
  • Bloqueio automático de texto livre fora da janela 24h

v1.3 — Meta Templates Cache

  • Cache local de templates WABA via /meta/templates
  • Sincronização via /meta/templates/sync
  • /tenant/meta/status e /meta/pricing-awareness

v1.2 — Webhooks de Saída

  • Webhooks com assinatura HMAC-SHA256 (/webhooks)
  • Eventos: message.*, conversation.*, tag.*, automation.executed
  • Retries automáticos com backoff e logs de entrega

v1.5 — Tokens sem prefixo

  • Tokens gerados como 56 hex chars puros — sem prefixo proprietário
  • Suporte a Authorization: Bearer e X-API-Key

v1.1 — API Keys Públicas

  • Sistema de API Keys com scopes granulares
  • Rate limiting por endpoint e por chave

v1.0 — Lançamento

  • API pública: contatos, conversas, mensagens, tags
  • Integração com Meta Cloud API
  • Normalização automática de telefone BR/WhatsApp