Aplicativos (OAuth)

Cadastrar e gerenciar seu aplicativo de "Entrar com Asender" no painel: credenciais, escopos, revisão e testadores.

Aplicativos (OAuth)

Um aplicativo (app) Asender é a sua integração registrada para agir em nome de usuários de outras contas, com o consentimento deles. Com um app você oferece o botão Entrar com Asender, lê dados pela API pública e conecta agentes de IA pelo servidor MCP, sempre com os escopos que cada usuário aprovou.

Este guia mostra como criar e manter um app no painel, o ciclo de vida até a publicação e como clientes MCP se registram sozinhos. O fluxo OAuth em si (passo a passo, tokens e erros) está em Entrar com Asender.

App ou chave de API?

Chave de API (sk_live_, sk_test_)App (OAuth)
Age em nome deda sua própria contade cada usuário que autoriza, em outras contas
Quem concedevocê, ao criar a chaveo usuário, na tela de consentimento
Escoposos que você marca na chaveos que o usuário aprova (o app só pede o que declarou)
Revogaçãovocê revoga a chave no painelo usuário revoga o acesso do app, ou a Asender suspende o app
Uso típicoseu backend falando com a sua contaproduto de terceiros, integração para clientes, agentes de IA

Se o código só acessa a sua conta, use chave de API: é mais simples. Crie um app quando outras pessoas precisam entrar com a conta Asender delas no seu produto.

Criar um app no painel

  1. Entre em https://admin.asender.net, escolha a conta e abra Desenvolvedores > Aplicativos (https://admin.asender.net/t/<conta>/aplicativos).
  2. Preencha Novo aplicativo e confirme com Criar aplicativo.

Quem pode: só quem é owner ou admin da conta enxerga e gerencia os apps dela. Quem tem outro papel recebe a mensagem "Só owner e admin da conta gerenciam aplicativos".

CampoRegra
Nomeobrigatório, até 100 caracteres
Site do appURL https://; opcional para criar, obrigatório para pedir revisão
Logo (URL)URL https://; aparece na tela de autorização (só para app verificado)
Redirect URIsde 1 a 10; https:// ou loopback (http://localhost, http://127.0.0.1, http://[::1]); sem # (fragmento) e sem usuário/senha na URL
Tiposervidor com segredo ou sem segredo (PKCE); veja abaixo
Escoposos que o app precisa; openid está sempre incluído

Os escopos que a tela oferece são de identidade (profile, email, offline_access) e de leitura (account:read, leads:read, conversions:read, forms:read, analytics:read, campaigns:read, email:read, messaging:read, conversations:read, journeys:read, logs:read). Peça só o que o app usa: a revisão pesa isso (veja O que a revisão confere).

Confidencial ou público

Confidencial (servidor, com segredo)Público (sem segredo, PKCE)
Parabackend seu, que guarda o segredoSPA, app mobile ou desktop, CLI, cliente MCP local
Credenciaisclient_id + client_secretsó client_id
Autenticação em /tokenclient_secret_basic (ou client_secret_post)token_endpoint_auth_method: none; o code_verifier do PKCE é a prova
Redirect de loopbackcasa exatamente, com a portahttp://127.0.0.1, http://[::1] e http://localhost casam qualquer porta (RFC 8252); esquema, host, caminho e query continuam exatos
Refresh tokenconforme a configuração do servidorvale até 30 dias

PKCE S256 é obrigatório nos dois tipos. Um app público que envie client_secret recebe invalid_client. Na troca do code, o redirect_uri precisa ser o mesmo do /authorize, inclusive a porta.

O segredo aparece uma vez

Para app confidencial, o client_secret é mostrado uma única vez, logo depois de criar (e depois de girar). A tela o mantém só até você fechá-la; a Asender não consegue mostrá-lo de novo. Guarde-o no cofre ou nas variáveis de ambiente do seu backend, nunca no navegador, em app mobile, repositório ou log.

Girar o segredo (botão Girar segredo no detalhe do app) emite um novo e invalida o atual na hora: o app para de trocar tokens até receber o novo. App público não tem segredo, então não há o que girar.

Limites

LimiteValor
Apps por conta10 (acima disso: "A conta já tem 10 aplicativos")
Criações de app5 por hora, por usuário (acima disso, tente mais tarde)
Redirect URIs por app10
Testadores por app25

Excluir um app o desativa e revoga todas as autorizações e refresh tokens.

Ciclo de vida

Todo app nasce em Desenvolvimento. Enquanto não está publicado, só a equipe dele consegue autorizá-lo; assim você integra e testa sem esperar ninguém.

EstadoQuem consegue autorizar o appEscopos
Desenvolvimentomembros da conta dona e testadorestodos os declarados
Em revisãomembros da conta dona e testadorestodos os declarados
Publicadoqualquer usuário Asenderos aprovados na revisão; os declarados ainda não aprovados valem só para membros e testadores
Recusadomembros da conta dona e testadorestodos os declarados
Suspensoninguém; os acessos existentes são revogadosnenhum

Quem não pode autorizar vê a tela "Este aplicativo não está disponível" e o app recebe um erro no redirect. O motivo da recusa ou da suspensão aparece no app, no painel.

Testadores

Em Testadores, convide por e-mail pessoas que já têm usuário Asender (sem usuário com aquele e-mail, o convite falha). O testador pode autorizar o app mesmo em desenvolvimento, em revisão ou recusado, sem ser membro da sua conta. São até 25 por app, e você remove quando quiser.

Pedir revisão

Quando o app estiver pronto, Pedir revisão o envia à equipe Asender. Antes disso, preencha o site do app: sem ele o pedido é recusado. Só se pede revisão de app em Desenvolvimento ou Recusado, e há no máximo uma revisão pendente por app. A equipe aprova (o app vira Publicado e Verificado, com os escopos aprovados, que podem ser menos que os pedidos) ou recusa, sempre com um motivo registrado no Histórico de revisões do app. Quem revisa não decide apps de uma conta da qual é membro.

O que a revisão confere

Não há prazo garantido de resposta. A equipe avalia, entre outros pontos:

Mudar um app já publicado

Suspensão

A equipe pode suspender um app a qualquer momento (por exemplo, por abuso ou denúncia). A suspensão revoga as autorizações e os refresh tokens existentes e o app deixa de funcionar para todos até uma reativação. Uma autorização revogada na suspensão não volta sozinha: o usuário autoriza de novo.

Selo Verificado e Não verificado

Na tela de consentimento o usuário vê o nome do app junto do domínio dele, os escopos em português, a conta em que o app vai operar e para onde voltará (Após autorizar, você volta para).

Clientes registrados automaticamente (MCP)

Clientes MCP (Claude, ChatGPT, Cursor, VS Code, MCP Inspector e outros) não têm alguém para criar o app no painel. Por isso o servidor de autorização aceita dois registros automáticos, sem cadastro prévio:

CIMD (documento de metadados)DCR (registro dinâmico)
PadrãoOAuth Client ID Metadata DocumentRFC 7591
client_iduma URL https que você hospedadcr_ + 32 hex, emitido pela Asender
Quandoo cliente usa a URL como client_id no /authorizeo cliente faz POST em /register antes

Os dois geram um cliente público (PKCE, sem segredo) que já nasce Publicado, porém Não verificado: exibe o selo de aviso, mostra o domínio do redirect na tela de consentimento e só recebe escopos de identidade e leitura. A equipe Asender pode verificar um cliente, suspendê-lo ou bloquear um domínio (o bloqueio suspende os clientes registrados automaticamente naquele domínio e recusa novos). CIMD e DCR podem estar desligados em um ambiente; os metadados do servidor só anunciam o que está ligado.

Descoberta

curl -s https://auth.asender.net/.well-known/oauth-authorization-server

O documento (RFC 8414) traz, quando o recurso está ligado:

CIMD: a URL é o client_id

Publique um documento JSON em uma URL https estável (por exemplo https://app.exemplo.com/oauth/client.json) e use essa URL como client_id:

{
  "client_id": "https://app.exemplo.com/oauth/client.json",
  "client_name": "Meu agente",
  "client_uri": "https://app.exemplo.com",
  "logo_uri": "https://app.exemplo.com/logo.png",
  "redirect_uris": ["http://127.0.0.1/callback", "https://app.exemplo.com/oauth/callback"],
  "grant_types": ["authorization_code", "refresh_token"],
  "response_types": ["code"],
  "token_endpoint_auth_method": "none",
  "scope": "openid profile email leads:read"
}

O que a Asender exige da URL e do documento:

Cache. A Asender guarda o documento conforme o Cache-Control: max-age da resposta, limitado entre 5 minutos e 24 horas (sem cabeçalho, 24 horas; no-store e no-cache valem 5 minutos). Se uma nova busca falhar por problema de rede, a cópia de até 7 dias é usada; um documento que ficou inválido nunca é aproveitado do cache. Se o documento não puder ser buscado ou validado, o /authorize responde invalid_client.

DCR: POST /register

curl -s https://auth.asender.net/register \
  -H 'Content-Type: application/json' \
  -d '{
    "client_name": "Meu agente",
    "redirect_uris": ["http://127.0.0.1/callback"],
    "grant_types": ["authorization_code", "refresh_token"],
    "response_types": ["code"],
    "token_endpoint_auth_method": "none",
    "scope": "openid profile email leads:read"
  }'

Resposta 201 Created:

{
  "client_id": "dcr_0123456789abcdef0123456789abcdef",
  "client_id_issued_at": 1792454400,
  "client_name": "Meu agente",
  "redirect_uris": ["http://127.0.0.1/callback"],
  "grant_types": ["authorization_code", "refresh_token"],
  "response_types": ["code"],
  "token_endpoint_auth_method": "none",
  "scope": "openid profile email leads:read"
}

Campos aceitos no pedido: client_name, client_uri, logo_uri, redirect_uris (obrigatório), grant_types, response_types, token_endpoint_auth_method (só none) e scope. As regras são as mesmas do CIMD; campos desconhecidos são ignorados. Sem client_name, o nome vira o domínio do primeiro redirect. O corpo é JSON, com Content-Type: application/json, até 64 KiB.

Erros seguem a RFC 7591, no formato {"error", "error_description"}:

StatuserrorQuando
400invalid_redirect_uriredirect_uris ausente, com mais de 10, fora de https/loopback, com fragmento ou credencial, ou de domínio bloqueado
400invalid_client_metadataContent-Type diferente de JSON, corpo ilegível ou grande demais, token_endpoint_auth_method diferente de none, grant_types/response_types não suportados, client_uri/logo_uri que não são https
429too_many_requestslimite por hora atingido
404not_foundregistro dinâmico desligado neste ambiente

O parâmetro resource (RFC 8707)

O resource diz para qual API o token vale e define o aud do token. Os valores aceitos são:

Envie-o no /authorize (o parâmetro pode se repetir). Qualquer outro valor é recusado com invalid_target: no /authorize, como error=invalid_target no redirect; no /token, como 400 com {"error":"invalid_target"}. No /token e no refresh você pode repetir resource com um subconjunto do que foi autorizado, para estreitar o aud do token; pedir algo que não foi autorizado também dá invalid_target. Sem resource, o token vale para https://api.asender.net.

Um token só do MCP não vale na API REST; veja o guia MCP.

Próximos passos