Autenticação
Como autenticar requisições na API externa do OrbitSender.
A API oferece dois modos de autenticação:
- Chave de API (
sk_live_..., headerx-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_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxHeader 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
- Acesse o painel do OrbitSender.
- Vá em Configurações → Chaves de API (requer um plano com
api_access). - 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
201sinté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": truee os dados da operação. - Erro: incluem
"success": false, umerrore umamessage(descrição). Nos erros de autenticação, escopo e rate limit o próprioerrorjá é o identificador estável — ramifique por ele:invalid_token,insufficient_scope,rate_limited. Os403de limite de plano trazemlimitExceeded: truecomlimitType(channels,campaigns,segments,groups,group_monitorings),currentemax. Os501trazemcode: "not_implemented".
{
"success": false,
"error": "Bad Request",
"message": "O campo \"name\" é obrigatório no body da requisição."
}Códigos de status
| Código | Significado |
|---|---|
200 / 201 | Sucesso |
400 | Requisição inválida (campos/formats/regra de negócio) |
401 | Chave de API ausente ou inválida |
403 | Limite do plano atingido |
404 | Recurso não encontrado ou não pertence à conta |
409 | Conflito (recurso já existe) |
429 | Muitas requisições (rate limit) — respeite o header Retry-After |
500 | Erro interno |
501 | Operação ainda não implementada (Fase 2) |
502 / 503 | Serviç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:
| Escopo | Limite | Janela |
|---|---|---|
/api/external/* (chamadas de recurso) | 300 req | 60 s |
POST /api/oauth/token (troca/refresh de token) | 30 req | 60 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.