Skip to content
WhatIsUp.dev

Canais

Canais são as conexões de WhatsApp na sua conta. O ciclo de vida completo está em Conceitos → Canais; esta página cobre o formato na rede (wire shape).

Listar canais

GET/v1/channelsBearer · API key

Retorna todos os canais do cliente autenticado, os mais recentes primeiro. Canais com exclusão lógica (soft-delete) são excluídos.

curl -s "$WHATISUP_API/v1/channels" \
  -H "Authorization: Bearer $WHATISUP_API_KEY"
{
  "data": [
    {
      "id": "8d653c66-e4ff-43ee-97da-3de5ad5680d4",
      "customer_id": "cust_01J6...",
      "name": "primary",
      "phone_number": "5511999999999",
      "status": "connected",
      "last_seen_at": "2026-05-01T12:34:56.000Z",
      "metadata": {},
      "created_at": "2026-04-12T08:11:32.000Z",
      "updated_at": "2026-05-01T12:34:56.000Z"
    }
  ]
}

Criar canal

POST/v1/channelsBearer · API key
Schema · Request body
FieldTypeRequiredNotes
namestringrequired
metadataobjectoptional
issue_scoped_keybooleanoptional
curl -sX POST "$WHATISUP_API/v1/channels" \
  -H "Authorization: Bearer $WHATISUP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"support-line","metadata":{"team":"support"}}'

A resposta é um objeto Channel. O status começa em pending — a conexão de WhatsApp ainda não foi alocada. Busque o QR para iniciar uma.

Schema · Response · Channel
FieldTypeRequiredNotes
idstring · uuidrequired
customer_idstring · uuidrequired
namestringrequired
phone_numberstringrequired · nullable
status`pending` \| `qr` \| `connecting` \| `reconnecting` \| `connected` \| `disconnected` \| `logged_out` \| `stopped_by_user` \| `disabled_by_admin` \| `error` \| `failed`required
last_seen_atstring · ISO 8601required · nullable
metadataobjectrequired
healthobjectoptional · nullable
created_atstring · ISO 8601required
updated_atstring · ISO 8601required

Obter um canal

GET/v1/channels/:idBearer · API key

Retorna o canal único. Dá 404 para canais que pertencem a outro cliente (nunca vazamos um 403 de "tenant errado"; ambos parecem "not found").

Obter o QR atual

GET/v1/channels/:id/qrBearer · API key

Inicia preguiçosamente a conexão de WhatsApp se não houver uma rodando, então aguarda até ~10s por um QR. Retorna data:image/png;base64,… mais a string crua em formato de rede (útil se você quiser renderizar com sua própria biblioteca de QR) e um expires_at.

{
  "qr": "data:image/png;base64,iVBORw0KGgo...",
  "raw": "2@dPBI4Tg9Mc...,vlD4Pmkr...",
  "expires_at": "2026-05-01T12:35:25.000Z"
}

O fluxo Pair do dashboard usa SSE no lugar — ele recebe o QR empurrado sem polling.

Exclusão lógica (soft-delete)

DELETE/v1/channels/:idBearer · API key

Para o socket, limpa o auth-state, marca a linha como excluída. Entregas de webhook que referenciaram este canal continuam consultáveis para forense.

curl -sX DELETE "$WHATISUP_API/v1/channels/8d653c66-e4ff-43ee-97da-3de5ad5680d4" \
  -H "Authorization: Bearer $WHATISUP_API_KEY"

Retorna 204 No Content.

Saúde do número

GET/v1/channels/:id/healthBearer · API key

O quanto o WhatsApp tende a restringir o número: level (good, warning, danger, restricted), os reasons, os contatos novos e a taxa de resposta dos últimos 7 dias, e o que a auto-proteção está fazendo. Recalculado a cada 15 minutos; uma restrição do WhatsApp aparece na hora. O webhook channel.health dispara quando o nível muda. Veja Mantendo os números saudáveis.

Schema · Resposta
FieldTypeRequiredNotes
level`good` \| `warning` \| `danger` \| `restricted`required
reasonsarray<`low_reply_rate` \| `very_low_reply_rate` \| `new_number` \| `whatsapp_warning` \| `whatsapp_restricted`>required
new_contacts_7dnumberrequired
reply_rate_7dnumberrequired · nullable
age_daysnumberrequired
auto_protectobjectrequired
checked_atstring · ISO 8601required · nullable
channel_idstring · uuidrequired

Limites do WhatsApp

GET/v1/channels/:id/limitsBearer · API key

O que o próprio WhatsApp informa do número: new_chats (a cota pra começar conversas com quem nunca escreveu pra ele) e restriction (um bloqueio temporário de mandar mensagem pra gente nova, com ends_at). O webhook channel.limits dispara quando um dos dois muda. O gateway nunca recusa um envio por causa deles — um envio pra alguém novo enquanto valem traz um item em warnings.

Schema · Resposta
FieldTypeRequiredNotes
new_chatsobjectrequired · nullable
restrictionobjectrequired · nullable
checked_atstring · ISO 8601required · nullable
channel_idstring · uuidrequired

Ritmo de envio

GET/v1/channels/:id/pacingBearer · API key
PUT/v1/channels/:id/pacingBearer · API key

Uma pausa aleatória entre os envios deste número e "digitando…" antes de cada um, mais a chave da auto-proteção (desligada, a menos que você ligue). Enquanto o número tem ritmo, os envios entram na fila (202, status: "queued") e saem um de cada vez.

Schema · Corpo da requisição
FieldTypeRequiredNotes
auto_protectbooleanoptional
min_gap_secondsnumberoptional
max_gap_secondsnumberoptional
typingbooleanoptional
Schema · Resposta
FieldTypeRequiredNotes
auto_protectbooleanoptional
min_gap_secondsnumberoptional
max_gap_secondsnumberoptional
typingbooleanoptional
channel_idstring · uuidrequired

Proxy

GET/v1/channels/:id/proxyBearer · API key
PUT/v1/channels/:id/proxyBearer · API key
DELETE/v1/channels/:id/proxyBearer · API key
POST/v1/channels/:id/proxy/testBearer · API key

Passa o tráfego de WhatsApp do número pelo seu proxy SOCKS5, SOCKS4 ou HTTP(S). O PUT testa o proxy antes (test: false pula o teste) e não salva nada se o teste falhar; POST …/test testa uma url sem salvar, ou o proxy salvo. Até 10 testes por minuto por conta (429 proxy_test_limit). A senha fica guardada criptografada e nunca volta na resposta.

Schema · Corpo da requisição · PUT
FieldTypeRequiredNotes
urlstringrequired
testbooleanoptional
Schema · Resposta
FieldTypeRequiredNotes
channel_idstring · uuidrequired
configuredbooleanrequired
scheme`socks5` \| `socks5h` \| `socks4` \| `http` \| `https`required · nullable
hoststringrequired · nullable
portnumberrequired · nullable
usernamestringrequired · nullable
has_passwordbooleanrequired
updated_atstring · ISO 8601required · nullable
last_checkobjectrequired · nullable
Schema · Resultado do teste
FieldTypeRequiredNotes
okbooleanrequired
egress_ipstringrequired · nullable
countrystringrequired · nullable
latency_msnumberrequired · nullable
errorstringrequired · nullable
warningsarray<`rotating_ip` \| `country_mismatch`>optional
checked_atstring · ISO 8601required