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.
- Base da API:
https://api.asender.net - Formato:
sk_live_…ousk_test_…, enviada emAuthorization: Bearer - Onde criar: painel de administração da conta, em Chaves de API
Chave de API ou app OAuth: qual usar
| Chave de API | App OAuth ("Entrar com Asender") | |
|---|---|---|
| Para quê | integração da sua própria conta, de servidor para servidor | um app que age em nome de usuários de outras contas |
| Quem autoriza | você, ao criar a chave | cada usuário, na tela de consentimento |
| Credencial | sk_live_… / sk_test_…, longa e estática | token de acesso de vida curta, renovado por refresh |
| Pode enviar mensagens | sim (escopos *:send) | não: só leitura |
| Pode ler dados | sim | sim, só o que o usuário concedeu |
| Revogação | você revoga a chave no painel | o 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
- 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. - Dê um nome que diga onde a chave é usada (por exemplo
site-checkout). - Escolha o modo (
liveoutest; veja abaixo) e marque só os escopos de que a integração precisa. Nasce marcado apenasemail:send. - 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
| escopo | o que permite |
|---|---|
email:send | enviar e-mail (POST /v1/emails/send e /v1/emails/batch) e listar remetentes válidos (GET /v1/senders) |
sms:send | enviar SMS (POST /v1/sms/send) |
push:send | enviar notificações push (POST /v1/push/send) |
push:devices | registrar e listar dispositivos de push (/v1/push/devices) |
whatsapp:send | enviar WhatsApp oficial, por texto ou template (POST /v1/whatsapp/send) |
telegram:send | enviar mensagem por bot do Telegram (POST /v1/telegram/send) |
whatsweb:send | enviar WhatsApp por sessão, canal não oficial (POST /v1/whatsweb/send) |
telegramconta:send | enviar pela conta pessoal do Telegram, canal não oficial (POST /v1/telegramconta/send) |
Leitura
| escopo | o que permite |
|---|---|
email:read | consultar mensagens de e-mail enviadas (GET /v1/emails, /v1/emails/{id}) |
account:read | ler o consumo da conta (GET /v1/account/usage) |
logs:read | ler o log das requisições feitas com as chaves da conta, com corpos redigidos (GET /v1/logs) |
leads:read | listar e consultar contatos (leads) do CRM |
leads:write | criar 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:read | consultar conversões e o status das entregas às plataformas de anúncio |
analytics:read | métricas de páginas e formulários |
campaigns:read | campanhas de e-mail marketing e relatórios |
messaging:read | mensagens e relatórios de SMS, WhatsApp e push |
conversations:read | conversas e mensagens do atendimento |
journeys:read | jornadas de automação do CRM |
webhooks:manage | cadastrar, listar, alterar, apagar e testar os endpoints de webhook da conta (/v1/webhooks); só chave, nunca app OAuth |
dns:read | ler zonas, registros e o histórico de DNS da conta (GET /v1/dns/*); só chave, nunca app OAuth |
dns:write | criar, alterar e apagar registros de DNS (POST/PATCH/DELETE /v1/dns/zones/{zona}/records); só chave; não inclui leitura |
forms:read | listar formulários e seus envios |
Administração e conteúdo
| escopo | o que permite |
|---|---|
mail:admin | criar e listar domínios e caixas do e-mail da conta. Não lê mensagens nem envia |
forms:write | criar, editar e apagar formulários e enviar leads (em api.pages.asender.net) |
pages:read | ler páginas, versões, rascunhos, SEO, domínios e mídia (em api.pages.asender.net) |
pages:write | criar e editar páginas, salvar versões, importar, duplicar, mudar de domínio e enviar mídia. Não publica |
pages:publish | publicar 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
- Uma chave por integração. Se uma vazar, você revoga só ela, sem derrubar o resto. O nome da chave e o "último uso" mostram qual integração é qual.
- O mínimo de escopos. Um serviço que só dispara códigos de verificação precisa de
email:sende nada mais. Uma chave de relatórios não deve ter*:send. Escopos de leitura e de envio raramente pertencem à mesma chave. - Só no servidor. Nunca em JavaScript de navegador, em app mobile, em repositório, em log, em tela ou em chat. O que vai para o navegador não é segredo. As rotas de envio de push, WhatsApp, Telegram e canais não oficiais recusam chave de servidor usada de um navegador (
403 ServerKeyInBrowser). - Variável de ambiente ou cofre. Leia de
ASENDER_API_KEY(ou do gerenciador de segredos), nunca do código-fonte. Não imprima a chave em log de erro. - Rotação. Crie a chave nova, publique-a no seu ambiente, confirme o tráfego pelo "último uso" e revogue a antiga. Faça isso em intervalos regulares e sempre que alguém com acesso sair da equipe.
- Idempotência nos envios. Mande
Idempotency-Keyem todo envio que pode ser repetido por retry, para um retry não duplicar a mensagem nem a cobrança. - Respeite o rate limit. O teto padrão é de 100 requisições por segundo, por chave; em
429, espere oRetry-After. Veja o guia da API Platform. - Audite pelo log. Com
logs:read,GET /v1/logsmostra o que cada chave mandou e o que a API respondeu, com segredos e conteúdo redigidos.
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:
- formato
pk_push_…, pública (vai no HTML do site, no snippet de push); - é gerada no painel, na tela de push, junto do
manifest.json, do service worker e do snippet já preenchidos, e fica atrelada às origens do site que você declara; - só abre uma rota,
POST /v1/push/site/devices, que registra a inscrição de web push do visitante. Não envia nada, não lê nada; - é limitada por volume (por IP e por chave), porque, como toda chave de navegador, ela pode ser vista por qualquer visitante.
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
| resposta | causa | o que fazer |
|---|---|---|
401 AuthorizationError | chave 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 InsufficientScope | a chave não tem o escopo da rota (a mensagem nomeia o escopo) | crie uma chave com o escopo mínimo necessário |
403 ServerKeyInBrowser | chave sk_… usada a partir de um navegador | chame do seu servidor; para web push use a chave pk_push_… |
400 ValidationError na criação | scopes ausente, vazio ou com valor fora do catálogo | use só os escopos desta página |
429 Throttling | passou do teto de requisições | espere o Retry-After e use backoff |
Próximos passos
- API Platform: todas as rotas, escopos e erros.
- Entrar com Asender: apps que agem em nome de usuários de outras contas.
- Aplicativos: cadastrar e publicar o seu app OAuth no painel.
- Webhooks: receber eventos em vez de consultar.
- Servidor MCP, em
https://api.asender.net/mcp: veja o guia MCP.