OrbitSenderDocs

Autenticação

Como autenticar requisições na API externa do OrbitSender.

A API oferece dois modos de autenticação:

  • Chave de API (sk_live_..., header x-api-key) — self-service. Você integra a sua própria conta; a chave dá acesso total ao seu tenant.
  • OAuth de parceiro (Authorization: Bearer) — para apps de terceiro que agem em nome de outros usuários, com consentimento por-scope, alcance limitado e resposta mascarada. Veja a seção Partner.

Esta página cobre a chave de API. Cada chave pertence a um tenant (sua conta) e herda os limites do seu plano.

api-key vs OAuth de parceiro

Escolha pela posse da conta integrada: se é a sua, use a chave de API (header x-api-key); se é de outro usuário do OrbitSender, use OAuth de parceiro. O parceiro nunca vê PII, segredos de cadência anti-ban nem credenciais de marketplace, e só recebe os scopes que o usuário consentiu.

Header de autenticação

Envie a chave em todas as requisições:

x-api-key: sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Header legado `api-key`

O header oficial é x-api-key — o mesmo que o SDK @orbitsender/* e a especificação OpenAPI usam. Por compatibilidade, o backend ainda aceita api-key (sem o x-) como fallback de transição, mas prefira sempre x-api-key em código novo.

Mantenha sua chave secreta

A chave concede acesso total à sua conta via API. Nunca a exponha no front-end, em repositórios públicos ou em logs. Se vazar, revogue-a no painel e gere uma nova.

Obtendo uma chave

  1. Acesse o painel do OrbitSender.
  2. Vá em Configurações → Chaves de API (requer um plano com api_access).
  3. Clique em Gerar chave. O valor sk_live_... é exibido uma única vez — copie e guarde com segurança.

Você pode ter até 5 chaves por conta, ativá-las/desativá-las e revogá-las a qualquer momento.

Exemplo de requisição

curl https://api.orbitsender.com/api/external/ping \
  -H "x-api-key: sk_live_sua_chave_aqui"

Resposta:

{
  "success": true,
  "message": "Pong! Sua chave de API é válida.",
  "timestamp": "2026-06-26T14:30:45.123Z"
}

Modo de teste (sandbox) — sk_test_

Antes de mexer na sua conta real, teste a integração sem nenhum risco: envie uma chave que começa com sk_test_ no header x-api-key. Requisições com chave de teste são respondidas inteiramente com dados sintéticos e nunca tocam o seu banco, os seus canais ou o pipeline de envio.

curl https://api.orbitsender.com/api/external/list-channels \
  -H "x-api-key: sk_test_qualquer_coisa"
  • Qualquer string sk_test_... é aceita — você não precisa de plano, canal conectado nem QR escaneado para começar a ler a documentação e rodar exemplos.
  • Os endpoints de leitura devolvem exemplos fixos; os de criação respondem 201 sintético; nada é persistido e nenhuma campanha é enviada.
  • Troque para a sua chave sk_live_... quando quiser exercitar o fluxo real.

Convenções de resposta

Todas as respostas são JSON.

  • Sucesso: incluem "success": true e os dados da operação.
  • Erro: incluem "success": false, um error e uma message (descrição). Nos erros de autenticação, escopo e rate limit o próprio error já é o identificador estável — ramifique por ele: invalid_token, insufficient_scope, rate_limited. Os 403 de limite de plano trazem limitExceeded: true com limitType (channels, campaigns, segments, groups, group_monitorings), current e max. Os 501 trazem code: "not_implemented".
{
  "success": false,
  "error": "Bad Request",
  "message": "O campo \"name\" é obrigatório no body da requisição."
}

Códigos de status

CódigoSignificado
200 / 201Sucesso
400Requisição inválida (campos/formats/regra de negócio)
401Chave de API ausente ou inválida
403Limite do plano atingido
404Recurso não encontrado ou não pertence à conta
409Conflito (recurso já existe)
429Muitas requisições (rate limit) — respeite o header Retry-After
500Erro interno
501Operação ainda não implementada (Fase 2)
502 / 503Serviço de WhatsApp temporariamente indisponível

Datas

Datas de resposta são ISO 8601 em UTC. Para agendar campanhas, o campo scheduled_at usa o formato DD/MM/YYYY - HH:mm no horário de Brasília.

Rate limit

Cada credencial tem um teto de requisições por janela:

EscopoLimiteJanela
/api/external/* (chamadas de recurso)300 req60 s
POST /api/oauth/token (troca/refresh de token)30 req60 s

Ao estourar, a resposta é 429 com o header Retry-After (segundos até poder repetir) e os headers RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset. Faça backoff antes de retentar.

Idempotência (evitar disparo duplicado)

Os endpoints de criação (create-channel, create-segment e create-campaign/message · poll · carousel) aceitam o header opcional Idempotency-Key. Reenviar o mesmo POST com a mesma chave devolve a resposta original em vez de criar um segundo recurso — essencial quando um POST dá timeout e você precisa retentar sem duplicar a campanha/canal/segmento.

curl -X POST https://api.orbitsender.com/api/external/create-campaign/message \
  -H "x-api-key: sk_live_sua_chave_aqui" \
  -H "Idempotency-Key: 8f3a...seu-uuid-unico" \
  -H "Content-Type: application/json" \
  -d '{ ... }'

Paginação

Apenas dois endpoints paginam: GET /api/external/list-channels e GET /api/external/partner/campaigns. Ambos aceitam o query param page (inteiro, padrão 1) e devolvem total, page, per_page e pages (total de páginas) ao lado do array — itere page de 1 até pages para varrer tudo.

Os demais endpoints de listagem (list-segments, list-webhooks, list-settings) não paginam: ignoram page e devolvem a coleção inteira, sem o campo pages.

Nesta página