Chaves de API e escopos

Como criar, escopar, girar e revogar chaves de API (sk_live_ e sk_test_), e quais escopos cada rota exige.

Chaves de API

A chave de API é a credencial que o seu servidor usa para falar com a API da Asender: enviar e-mail, SMS, push e WhatsApp, e ler os dados da sua conta. Este guia mostra como criar e usar uma chave, quais escopos existem, como mantê-la segura e quando, em vez de uma chave, você deve usar um app OAuth.

Chave de API ou app OAuth: qual usar

Chave de APIApp OAuth ("Entrar com Asender")
Para quêintegração da sua própria conta, de servidor para servidorum app que age em nome de usuários de outras contas
Quem autorizavocê, ao criar a chavecada usuário, na tela de consentimento
Credencialsk_live_… / sk_test_…, longa e estáticatoken de acesso de vida curta, renovado por refresh
Pode enviar mensagenssim (escopos *:send)não: só leitura
Pode ler dadossimsim, só o que o usuário concedeu
Revogaçãovocê revoga a chave no painelo usuário revoga o acesso do app, ou o app é bloqueado

Regra prática: se o código roda no seu servidor e age na sua conta (disparar um código de verificação, importar relatórios para o seu BI), use chave de API. Se você vai oferecer um produto que outras pessoas conectam à conta delas, use app OAuth: veja o guia Entrar com Asender. Não distribua a sua chave a clientes seus para "conectarem" a conta deles; é o caso de uso do app OAuth.

Criar uma chave

  1. Entre no painel de administração da conta (https://admin.asender.net/t/<conta>/api-keys). Criar, editar e revogar chaves exige permissão de administração da conta.
  2. Dê um nome que diga onde a chave é usada (por exemplo site-checkout).
  3. Escolha o modo (live ou test; veja abaixo) e marque só os escopos de que a integração precisa. Nasce marcado apenas email:send.
  4. Clique em Criar chave. O segredo completo aparece uma única vez: copie e guarde num cofre ou no gerenciador de segredos do seu servidor. A Asender guarda só um hash; se você perder, revogue e crie outra.

Depois disso a lista mostra, para cada chave, o nome, o prefixo (por exemplo sk_live_ab12, só para você reconhecê-la), o modo, os escopos, a data de criação e o último uso (data e IP de origem).

Quem automatiza a emissão pode usar a API de sessão da plataforma (POST https://api.asender.net/api/tenants/{id}/api-keys, com name, scopes e opcionalmente mode); veja o guia da API Platform.

Usar a chave

curl -X POST 'https://api.asender.net/v1/emails/send' \
  -H "Authorization: Bearer $ASENDER_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: pedido-1042-confirmacao' \
  -d '{
    "Source": "contato@empresa.com.br",
    "Destination": { "ToAddresses": ["cliente@exemplo.test"] },
    "Message": { "Subject": { "Data": "Pedido confirmado" }, "Body": { "Text": { "Data": "Obrigado!" } } }
  }'

A mesma chave vale nas APIs de produto (por exemplo api.mail.asender.net, api.pages.asender.net), conforme os escopos. Só o header Authorization: Bearer é aceito; X-Api-Key e ?api_key= respondem 401.

Escopos

Todo escopo tem o formato <recurso>:<ação>. Chave sem escopo não funciona: a emissão sem escopos, ou com um valor fora desta tabela, é recusada com 400 (a resposta traz a lista válida), e uma chave antiga sem escopo do catálogo recebe 403 InsufficientScope em toda rota. Cada rota exige exatamente um escopo.

Envio

escopoo que permite
email:sendenviar e-mail (POST /v1/emails/send e /v1/emails/batch) e listar remetentes válidos (GET /v1/senders)
sms:sendenviar SMS (POST /v1/sms/send)
push:sendenviar notificações push (POST /v1/push/send)
push:devicesregistrar e listar dispositivos de push (/v1/push/devices)
whatsapp:sendenviar WhatsApp oficial, por texto ou template (POST /v1/whatsapp/send)
telegram:sendenviar mensagem por bot do Telegram (POST /v1/telegram/send)
whatsweb:sendenviar WhatsApp por sessão, canal não oficial (POST /v1/whatsweb/send)
telegramconta:sendenviar pela conta pessoal do Telegram, canal não oficial (POST /v1/telegramconta/send)

Leitura

escopoo que permite
email:readconsultar mensagens de e-mail enviadas (GET /v1/emails, /v1/emails/{id})
account:readler o consumo da conta (GET /v1/account/usage)
logs:readler o log das requisições feitas com as chaves da conta, com corpos redigidos (GET /v1/logs)
leads:readlistar e consultar contatos (leads) do CRM
leads:writecriar e atualizar contatos (leads) do CRM (POST /v1/leads, PATCH /v1/leads/{id}); só chave, nunca app OAuth; não inclui leitura. Também libera as ferramentas asender_leads_create e asender_leads_update do MCP
conversions:readconsultar conversões e o status das entregas às plataformas de anúncio
analytics:readmétricas de páginas e formulários
campaigns:readcampanhas de e-mail marketing e relatórios
messaging:readmensagens e relatórios de SMS, WhatsApp e push
conversations:readconversas e mensagens do atendimento
journeys:readjornadas de automação do CRM
webhooks:managecadastrar, listar, alterar, apagar e testar os endpoints de webhook da conta (/v1/webhooks); só chave, nunca app OAuth
dns:readler zonas, registros e o histórico de DNS da conta (GET /v1/dns/*); só chave, nunca app OAuth
dns:writecriar, alterar e apagar registros de DNS (POST/PATCH/DELETE /v1/dns/zones/{zona}/records); só chave; não inclui leitura
forms:readlistar formulários e seus envios

Administração e conteúdo

escopoo que permite
mail:admincriar e listar domínios e caixas do e-mail da conta. Não lê mensagens nem envia
forms:writecriar, editar e apagar formulários e enviar leads (em api.pages.asender.net)
pages:readler páginas, versões, rascunhos, SEO, domínios e mídia (em api.pages.asender.net)
pages:writecriar e editar páginas, salvar versões, importar, duplicar, mudar de domínio e enviar mídia. Não publica
pages:publishpublicar e despublicar páginas: a ação que o público enxerga, por isso é um escopo separado

GET /v1/account (dados básicos da conta) aceita qualquer chave válida. O detalhe rota a rota está no guia da API Platform.

Painel e catálogo. A API aceita os 28 escopos acima na emissão. Hoje a tela de criação do painel ainda não lista os escopos de canal não oficial (telegram:send, whatsweb:send, telegramconta:send); para uma chave com eles, emita pela API de sessão (POST /api/tenants/{id}/api-keys), com o escopo no corpo.

Boas práticas

Revogar e alterar

Na lista de chaves, Revogar invalida a chave. Também é possível renomear uma chave e trocar os seus escopos sem mudar o segredo. Como a API guarda a validação em cache por pouco tempo, uma revogação ou troca de escopos passa a valer em até 60 segundos. Depois disso a chave revogada recebe 401.

Se você suspeita de vazamento: revogue primeiro, investigue depois (o log da API e o "último uso" dizem de onde veio o tráfego) e emita uma chave nova.

Live e test

Ao criar a chave você escolhe o modo: produção (sk_live_…, o padrão) ou teste (sk_test_…). Hoje a diferença é só o rótulo: o modo aparece no painel e nos logs da API (filtro mode), e serve para separar o tráfego de desenvolvimento do de produção. Não existe sandbox: uma chave sk_test_ tem os mesmos escopos e o mesmo rate limit, e a API não trata o envio feito com ela de forma diferente. Não use uma chave de teste para "ensaiar" envio a clientes reais. Um sandbox de verdade é planejado.

Chave pública de site (pk_push_)

Para registrar visitantes do seu site para web push, o navegador não pode usar uma chave sk_…. Existe uma chave própria para isso:

Ela não substitui a chave de API: para enviar o push, o seu servidor usa uma chave sk_… com push:send. Veja o guia do navegador e a API Platform.

Erros comuns

respostacausao que fazer
401 AuthorizationErrorchave ausente, errada, revogada ou expirada; ou enviada por X-Api-Key/?api_key=confira o header Authorization: Bearer e se a chave está ativa
403 InsufficientScopea chave não tem o escopo da rota (a mensagem nomeia o escopo)crie uma chave com o escopo mínimo necessário
403 ServerKeyInBrowserchave sk_… usada a partir de um navegadorchame do seu servidor; para web push use a chave pk_push_…
400 ValidationError na criaçãoscopes ausente, vazio ou com valor fora do catálogouse só os escopos desta página
429 Throttlingpassou do teto de requisiçõesespere o Retry-After e use backoff

Próximos passos