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.
| Atributo | Valor |
|---|---|
| Base URL | https://api.hosthy.com.br/public-api/v1 |
| Versão | v1 |
| Protocolo | HTTPS obrigatório |
| Formato | JSON (Content-Type: application/json) |
| Autenticação | API Key via Authorization: Bearer |
Todas as requisições exigem uma API Key válida.
Cada chave é um token de 56 caracteres hexadecimais gerado aleatoriamente — sem prefixo.
a3f8c2e1d94b7065f2a1c8e3b47d92f0e6c5a1b8d3e7f094c2a6b1e5d8f3a970
Use o header Authorization: Bearer ou X-API-Key:
Authorization: Bearer SEU_TOKEN
# ou via header alternativo
X-API-Key: SEU_TOKEN
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"
}
}
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.
| Scope | Descrição |
|---|---|
| contacts.read | Listar e buscar contatos |
| contacts.write | Criar e atualizar contatos |
| conversations.read | Listar conversas e mensagens |
| messages.send | Enviar mensagens em conversas |
| tags.read | Listar tags disponíveis |
| tags.write | Adicionar/remover tags de contatos |
403 Forbidden com o campo "Required scope: <scope>" no corpo do erro.Todas as respostas são JSON com Content-Type: application/json.
// HTTP 200 OK
{
"contacts": [...],
"pagination": {
"total": 42,
"page": 1,
"limit": 50,
"pages": 1
}
}
// HTTP 401 Unauthorized
{
"error": "API key required. Use Authorization: Bearer <key>"
}
// HTTP 400 Bad Request
{
"error": "Validation error",
"details": {
"fieldErrors": {
"phone": ["String must contain at least 7 characters"]
}
}
}
Endpoints de listagem suportam paginação via query params.
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
page | integer | 1 | Número da página (começa em 1) |
limit | integer | 50 | Itens por página (máx. 100) |
search | string | — | Busca por nome, telefone ou e-mail |
status | string | — | Filtro por status (open, closed…) |
curl "https://api.hosthy.com.br/public-api/v1/contacts?page=2&limit=25&search=Joao" \
-H "Authorization: Bearer SEU_TOKEN"
Limites de requisições por minuto por IP/chave.
| Endpoint | Limite |
|---|---|
GET /me, GET /tags | 60 req/min |
GET /contacts, GET /contacts/:id, GET /conversations, GET /conversations/:id | 120 req/min |
POST /contacts, POST …/messages, POST/DELETE …/tags/:tagId | 30 req/min |
Limite excedido retorna 429 Too Many Requests. Implemente retry com backoff exponencial.
// HTTP 429 Too Many Requests
{ "error": "Rate limit exceeded. Retry after 60 seconds." }
Gerencie a base de contatos da sua conta Hosthy.
Lista contatos com suporte a busca por nome, telefone ou e-mail.
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 }
}
Cria um novo contato. O telefone é normalizado automaticamente para o formato Meta (wa_id).
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]"
}'
Retorna contato específico com conversas recentes e tags.
Adiciona uma tag a um contato.
Remove uma tag de um contato.
| Entrada | Normalizado |
|---|---|
+55 51 99237-1100 | 555192371100 |
5551992371100 | 555192371100 |
+1 555 631 1807 | 15556311807 |
Nono dígito BR: Números com 13 dígitos são convertidos para 12 conforme padrão Meta.
Threads de comunicação com contatos via WhatsApp.
Lista conversas. Filtre por status: open, pending ou closed.
curl "https://api.hosthy.com.br/public-api/v1/conversations?status=open&limit=10" \
-H "Authorization: Bearer SEU_TOKEN"
Retorna conversa com as últimas 20 mensagens incluídas.
Envia mensagem de texto em uma conversa. Fora da janela de 24h, use templates aprovados.
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?"}'
Ciclo de vida das mensagens enviadas.
| Status | Descrição |
|---|---|
pending | Criada, aguardando envio |
sent | Enviada para a Meta |
delivered | Entregue no dispositivo do contato |
read | Lida pelo contato |
failed | Falha no envio |
Os status delivered e read chegam via webhook da Meta. Configure webhooks de saída para recebê-los em tempo real.
Regra fundamental da Meta WhatsApp Business Platform.
| Situação | Pode enviar | Categoria |
|---|---|---|
| Cliente respondeu nos últimos 24h | ✓ Texto livre | service |
| Mais de 24h sem resposta | ✗ Texto bloqueado | — |
| Fora da janela, com template aprovado | ✓ Template | utility / marketing |
// GET /conversations/{id}/meta-state
{
"within24hWindow": true,
"windowExpiresAt": "2024-01-16T08:00:00Z",
"remainingSeconds": 14400,
"canSendFreeform": true,
"requiresTemplate": false
}
422 ao tentar enviar texto fora da janela. Use /messages/preview no painel autenticado para verificar antes do envio.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.
| Categoria | Uso |
|---|---|
utility | Notificações transacionais (confirmações, status, atualizações) |
marketing | Promoções, ofertas, campanhas publicitárias |
authentication | OTP, verificação de identidade |
service | Respostas dentro da janela 24h |
| Status | Pode usar? |
|---|---|
APPROVED | ✓ Sim |
PENDING | ✗ Aguardando aprovação Meta |
REJECTED | ✗ Verifique no Business Manager |
PAUSED | ✗ Suspensão temporária |
Separação de cobranças entre Hosthy e Meta.
| Cobrança | Quem cobra | Para quem |
|---|---|---|
| Mensalidade Hosthy | Hosthy | Cliente |
| Mensagens entregues | Meta | Dono do WABA |
| Templates (utility, marketing) | Meta | Dono do WABA |
Receba eventos da Hosthy em tempo real no seu sistema.
| Evento | Quando ocorre |
|---|---|
message.received | Nova mensagem recebida de um contato |
message.sent | Mensagem enviada com sucesso |
message.failed | Falha definitiva no envio |
conversation.created | Nova conversa criada |
conversation.updated | Conversa atualizada (status, atribuição) |
conversation.stage_changed | Estágio do pipeline alterado |
tag.added | Tag adicionada a contato |
tag.removed | Tag removida de contato |
automation.executed | Automação executada |
ai.suggestion_created | Sugestão de resposta IA gerada |
// POST /webhooks
{
"name": "Meu CRM",
"url": "https://meu-sistema.com/webhook",
"events": ["message.received", "message.sent"]
}
Cada entrega inclui o header X-Hosthy-Signature: sha256=<hmac>. Sempre verifique antes de processar:
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 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.
Boas práticas para integrações seguras com a API.
Referência rápida para os códigos de erro HTTP da API.
| Código | Significado | Solução |
|---|---|---|
400 | Bad Request | Verifique o campo details no corpo |
401 | API Key ausente ou inválida | Inclua Authorization: Bearer <key> |
403 | Scope insuficiente | Adicione o scope necessário à chave |
404 | Recurso não encontrado | Verifique o ID e o tenant corretos |
409 | Conflito / duplicata | Telefone ou recurso já cadastrado |
422 | Fora da janela 24h | Use um template aprovado |
429 | Rate limit excedido | Implemente backoff exponencial |
500 | Erro interno | Tente novamente; contate suporte se persistir |
Recomendações para integrações robustas e eficientes.
message.failed para detectar problemas de entrega proativamenteAPPROVED prontos para contatos fora da janela 24h429, aguarde o tempo indicado antes de tentar novamentewithin24hWindow via /meta-state antes de enviar mensagensutility aprovados para ativar conversas sem janela abertawindowExpiresAtHistórico de versões e mudanças da API.
/conversations/{id}/meta-state — estado da janela 24h em tempo real/conversations/{id}/messages/preview — prévia antes do envioservice, utility, marketing, authentication/meta/templates/meta/templates/sync/tenant/meta/status e /meta/pricing-awareness/webhooks)message.*, conversation.*, tag.*, automation.executedAuthorization: Bearer e X-API-Key