Como Obter Credenciais (API Key / OAuth2) da API de Assinatura

Antes de enviar o primeiro documento para assinatura via API, você precisa de uma coisa: credenciais válidas. Na API SignDocs, isso significa criar um aplicativo, obter o seu client_id e client_secret e trocá-los por um access token OAuth2. Este guia mostra, passo a passo, como gerar essas credenciais, gerenciar scopes, separar homologação de produção e proteger seus segredos seguindo as boas práticas de segurança.

Diferente de muitas APIs que distribuem uma "API key" estática, a API SignDocs adota o fluxo OAuth2 client-credentials: você nunca envia o segredo nas chamadas de negócio, apenas um token de curta duração. É um modelo mais seguro, mais auditável e alinhado às exigências de clientes regulados.

Se você ainda está avaliando a plataforma, vale começar pela visão geral da API de assinatura digital e por o que é uma API de assinatura digital. Já se o objetivo é colocar a integração de pé rapidamente, o roteiro de primeiros passos em 5 minutos complementa este artigo. Aqui, o foco é exclusivamente o ponto de partida de toda integração: as credenciais.

API key estática vs. OAuth2 client-credentials

Muitos desenvolvedores chegam procurando por "como obter a API key" da assinatura digital. É um termo genérico e perfeitamente compreensível, mas é importante entender o que está por trás dele na prática moderna de segurança de APIs.

Uma API key tradicional é uma string longa que você anexa a cada requisição (em um header ou query string). É simples de usar, porém carrega problemas estruturais: não expira sozinha, é difícil de rotacionar sem downtime, costuma carregar permissões amplas demais e, se vaza, dá acesso total até ser revogada manualmente.

O OAuth2 client-credentials resolve isso separando identidade de autorização. Você recebe duas peças de informação:

  • client_id — identificador público do seu aplicativo. Não é segredo; pode aparecer em logs.
  • client_secret — o segredo de fato. Combinado com o client_id, é trocado por um token. Nunca trafega nas chamadas de negócio.

O segredo é usado uma única vez por ciclo, contra o endpoint de token, para obter um access token de vida curta. Esse token (um JWT) é o que viaja nas chamadas reais da API. Os benefícios são diretos:

Critério API key estática OAuth2 client-credentials
Exposição do segredo Enviado em toda requisição Usado só no endpoint de token; chamadas usam o access token
Expiração Não expira sozinha Tokens expiram automaticamente (curta duração)
Granularidade Geralmente acesso total Scopes limitam o que cada credencial pode fazer
Rotação Manual e arriscada Reprovisionamento controlado; tokens curtos dão margem natural
Auditoria Difícil de rastrear por uso Tokens e scopes auditáveis por app
Em resumo: quando alguém pede "a API key da SignDocs", o que ele realmente precisa é do par client_id + client_secret para o fluxo OAuth2. Para uma análise aprofundada do protocolo, scopes e ciclo de vida do token, consulte o guia dedicado de autenticação OAuth2 da API de assinatura.

Passo a passo: criando seu aplicativo e gerando credenciais

O processo de obtenção das credenciais de homologação (HML) é self-service e leva poucos minutos no painel da SignDocs. Dois pré-requisitos importantes: a conta precisa ser Pessoa Jurídica (com CNPJ), e o fluxo deve ser feito pela web ou pelo app Android — no iOS a opção Enterprise não aparece, por restrição da App Store.

1. Crie sua conta PJ

Faça o cadastro gratuito em app.signdocs.com.br, marcando Pessoa Jurídica e preenchendo o CNPJ.

2. Abra o wizard de plano

No dashboard, abra o menu de Perfil (avatar) → Gerenciar Plano. Responda ao questionário até chegar ao card "Plano Enterprise — Orçamento personalizado" e, no campo de necessidades, descreva seu caso de uso de integração (por exemplo: "Integração da External API no nosso backend; quero credenciais HML para testar OAuth2 + transações"). Clique em Receber Orçamento — sua conta é marcada como Enterprise imediatamente, sem espera nem revisão manual.

3. Abra o API Dashboard

De volta ao Perfil, aparece o botão Abrir API Dashboard (visível apenas para contas Enterprise). Clique nele.

4. Ative as credenciais HML

Na tela "Ativar credenciais HML", preencha o nome da empresa (e, opcionalmente, o CNPJ), aceite os termos de uso do sandbox e clique em Ativar credenciais HML.

5. Copie tudo — o modal aparece uma única vez

Um modal exibe o tenantId, o client_id, o client_secret e as URLs do sandbox e da documentação. Atenção: o client_secret é mostrado apenas uma vez. Copie e armazene imediatamente em um cofre de segredos. Se perdê-lo, é preciso reprovisionar: o client_id continua o mesmo, mas um novo segredo é gerado e o antigo é invalidado.

E as credenciais de produção? O acesso de produção à API é contratado como plano sob medida: quando a integração estiver validada no sandbox, fale com o time comercial para dimensionar volume e receber as credenciais de produção. A flag Enterprise do wizard serve para destravar o sandbox — o contrato comercial é conversado depois, quando o volume justificar. As diferenças entre os ambientes estão no guia do ambiente de homologação (sandbox) da API.

Regra de ouro do segredo: trate o client_secret como uma senha de produção. Ele não deve ir para o Git, para um print de tela, para uma mensagem de chat ou para um arquivo .env versionado. Armazene-o em um cofre (AWS Secrets Manager, Google Secret Manager, HashiCorp Vault) e injete em runtime.

Trocando as credenciais por um access token

Com o client_id e o client_secret em mãos, o próximo passo é obter um access token. Você faz uma requisição POST ao endpoint de token, enviando as credenciais e o grant_type=client_credentials. A resposta traz o token que você usará nas demais chamadas.

Requisição de token (cURL)

# Troca client_id + client_secret por um access token (HML) curl -X POST https://api-hml.signdocs.com.br/oauth2/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials" \ -d "client_id=SEU_CLIENT_ID" \ -d "client_secret=SEU_CLIENT_SECRET" \ -d "scope=transactions:write transactions:read"

Uma resposta de sucesso retorna o access token, o tipo (Bearer), o tempo de expiração em segundos e os scopes efetivamente concedidos:

{ "access_token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 900, "scope": "transactions:write transactions:read" }

Usando o token nas chamadas de negócio

De posse do access_token, você o envia no header Authorization de cada requisição. Por exemplo, ao criar uma sessão de assinatura expressa:

curl -X POST https://api-hml.signdocs.com.br/v1/signing-sessions \ -H "Authorization: Bearer eyJhbGciOiJFUzI1Ni..." \ -H "Content-Type: application/json" \ -d '{ "purpose": "DOCUMENT_SIGNATURE", "policy": { "profile": "CLICK_PLUS_OTP" }, "signer": { "name": "Maria Silva", "email": "maria@empresa.com.br", "userExternalId": "usr_12345", "cpf": "12345678901" }, "document": { "content": "<PDF em base64>", "filename": "Contrato.pdf" } }'

Cacheando e renovando o token (Node.js)

Como o token expira em 15 minutos (900 segundos, conforme expires_in), o cliente deve reutilizá-lo entre chamadas e renová-lo um pouco antes de expirar, em vez de solicitar um novo a cada requisição:

let cachedToken = null; let tokenExpiresAt = 0; async function getAccessToken() { // Reusar token em cache se ainda faltar > 60s para expirar if (cachedToken && Date.now() < tokenExpiresAt - 60000) { return cachedToken; } const res = await fetch('https://api-hml.signdocs.com.br/oauth2/token', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ grant_type: 'client_credentials', client_id: process.env.SIGNDOCS_CLIENT_ID, client_secret: process.env.SIGNDOCS_CLIENT_SECRET, scope: 'transactions:write transactions:read' }) }); const data = await res.json(); cachedToken = data.access_token; tokenExpiresAt = Date.now() + data.expires_in * 1000; return cachedToken; }

Note que o client_id e o client_secret vêm de process.env — nunca hardcoded. Esse é um ponto não negociável de segurança que aprofundamos mais abaixo.

Scopes: aplicando o menor privilégio

Scopes são as permissões granulares concedidas a cada credencial. Em vez de uma chave "tudo ou nada", você restringe cada app exatamente ao que ele precisa. Se um segredo vazar, o impacto fica limitado aos scopes daquele app.

Scope (exemplo) Permite Quando usar
transactions:write Criar transações, envelopes e sessões de assinatura expressa Backend que dispara assinaturas (checkout, widget, envelopes)
transactions:read Consultar status e detalhes Painéis, jobs de reconciliação, relatórios
steps:write Iniciar e concluir etapas de assinatura Fluxos orquestrados pela sua aplicação (OTP, certificado A1)
evidence:read Baixar o pacote de evidências (.p7m) Arquivamento, integração com GED/ERP
verification:write Verificar assinaturas de PDFs Validação de documentos recebidos de terceiros
webhooks:write Configurar endpoints de webhook Provisionamento programático de eventos
Boa prática: solicite em cada token apenas os scopes que aquele serviço precisa. Um job que só lê status não deveria pedir transactions:write. Essa separação reduz a superfície de ataque e simplifica a auditoria: tokens emitidos só carregam os scopes solicitados que estiverem dentro dos autorizados para a sua credencial.

JWT ES256 e chaves em KMS

O access token que você recebe é um JWT (JSON Web Token) assinado pela plataforma com ECDSA na curva P-256 (ES256). As chaves privadas de assinatura ficam protegidas em KMS (Key Management Service), nunca expostas. Isso garante que um token Bearer não pode ser forjado: sua autenticidade é verificável criptograficamente pela chave pública correspondente.

Na prática, você não manipula essa chave — basta enviar o token Bearer e a SignDocs cuida da emissão e validação. O conhecimento de ES256 é útil para entender as garantias do sistema: com uma chave de apenas 256 bits, o ECDSA oferece segurança equivalente a uma RSA de 3072 bits, com tokens menores e verificação mais rápida. Para clientes regulados que precisam de uma camada adicional de autenticação de canal, a resposta é o mTLS — assunto da próxima seção e detalhado no guia de segurança mTLS enterprise da API.

mTLS para clientes enterprise e regulados

Para integrações de alta exigência — instituições financeiras, contextos BACEN/Open Finance e setores regulados — a SignDocs oferece mTLS (mutual TLS) em adição ao OAuth2. No TLS comum, apenas o servidor apresenta certificado; no mTLS, cliente e servidor se autenticam mutuamente por certificados.

Na prática, isso significa que, além de possuir credenciais OAuth2 válidas, o seu cliente precisa apresentar um certificado cliente reconhecido para sequer estabelecer a conexão. É uma camada adicional que torna o vazamento de um segredo insuficiente para acessar a API a partir de uma máquina não autorizada. Os passos de provisionamento de certificados, CA confiável e configuração estão no guia dedicado de mTLS enterprise.

Separando credenciais de homologação e produção

Um erro comum e perigoso é misturar credenciais de ambientes. Homologação e produção devem usar apps, credenciais e hosts totalmente separados.

Aspecto Homologação (HML) Produção (PROD)
Host base api-hml.signdocs.com.br (com hífen) Host de produção da API
Credenciais client_id/secret exclusivos de teste client_id/secret exclusivos de produção
Persistência de dados Entidades com TTL de 7 dias Persistência durável
Uso recomendado Testes, CI, validação de fluxo Operação real com clientes
Atenção ao host: o ambiente de homologação usa api-hml.signdocs.com.br (forma com hífen), e não api.hml.signdocs.com.br. Errar o host é uma das causas mais frequentes de falha de conexão nos primeiros testes. Lembre-se também de que entidades criadas em HML expiram em 7 dias.

Na sua aplicação, mantenha as credenciais de cada ambiente em cofres separados e selecione a configuração por variável de ambiente (por exemplo, STAGE=hml vs STAGE=prod). Nunca aponte código de produção para credenciais de teste, nem vice-versa.

Rotação de credenciais

Segredos devem ser rotacionados periodicamente — a Política de Uso Aceitável da API prevê rotação a cada 12 meses — e imediatamente após qualquer suspeita de vazamento (segredo em log, em commit, em ticket de suporte). Na SignDocs, a rotação é feita reprovisionando a credencial: o client_id permanece o mesmo, um novo client_secret é gerado e o segredo antigo é invalidado no ato. Como não há período de sobreposição, planeje a troca:

  1. Prepare sua aplicação para ler o segredo de um cofre em runtime, sem exigir novo deploy.
  2. Reprovisione a credencial e copie o novo client_secret do modal (exibido uma única vez).
  3. Atualize o cofre de segredos com o novo valor imediatamente.
  4. Force a renovação do token em cache — tokens já emitidos continuam válidos até expirarem (15 minutos), o que dá uma pequena margem natural.
  5. Valide que as chamadas de negócio voltaram a autenticar normalmente.
Dica operacional: se sua aplicação cacheia segredos em escopo de módulo (comum em funções serverless), garanta que a atualização do segredo force um "cold start" ou invalide o cache. Containers quentes podem continuar usando o segredo antigo por horas se não houver invalidação explícita.

Boas práticas de segurança para credenciais

Reunindo tudo, este é o checklist de segurança que toda integração com a API SignDocs deve seguir:

  • Nunca faça commit de segredos. Adicione .env ao .gitignore e use ferramentas como git-secrets ou scanners de segredo no CI.
  • Nada de segredo no frontend. O fluxo client-credentials é server-to-server. Apps web, mobile e SPAs jamais devem conter o client_secret.
  • Cofre de segredos em produção. Prefira AWS Secrets Manager, Google Secret Manager ou Vault a variáveis de ambiente em texto plano.
  • Menor privilégio nos scopes. Conceda apenas o necessário; crie apps separados por função.
  • Rotacione periodicamente. E imediatamente após qualquer suspeita de exposição.
  • Separe HML de PROD. Credenciais, hosts e cofres distintos por ambiente.
  • Valide webhooks. Use a verificação de assinatura HMAC-SHA256 descrita em webhooks e eventos da API de assinatura para confiar nos eventos recebidos.
  • Considere mTLS em contextos regulados, somando autenticação de certificado ao OAuth2.
  • Monitore o uso. Acompanhe a emissão de tokens e chamadas por app para detectar anomalias cedo.

Com as credenciais geradas e protegidas, o próximo passo natural é colocar a integração em prática — siga o roteiro de primeiros passos em 5 minutos para o seu primeiro envio e valide tudo no ambiente de homologação (sandbox) antes de ir para produção.

Perguntas Frequentes

Qual a diferença entre API key e as credenciais OAuth2 (client_id e client_secret)?

Uma API key tradicional é uma string única e estática enviada a cada requisição, simples mas sem expiração natural e difícil de rotacionar com segurança. A API SignDocs usa OAuth2 client-credentials: você recebe um client_id (identificador público do seu app) e um client_secret (segredo), troca esses dois por um access token de curta duração e usa apenas o token nas chamadas. Esse modelo é mais seguro porque o segredo nunca trafega nas requisições de negócio, os tokens expiram automaticamente e os scopes limitam o que cada credencial pode fazer.

Como obtenho meu client_id e client_secret na SignDocs?

Com uma conta Pessoa Jurídica (CNPJ) em app.signdocs.com.br, abra Perfil, Gerenciar Plano e siga o wizard até o card Enterprise, descrevendo seu caso de uso de integração — a conta é marcada como Enterprise imediatamente. De volta ao Perfil, clique em Abrir API Dashboard e em Ativar credenciais HML. Um modal exibe o tenantId, o client_id e o client_secret uma única vez. Copie e armazene o secret imediatamente em um cofre de segredos, pois ele não é exibido novamente. Se perdê-lo, reprovisione: um novo segredo é gerado (o client_id não muda) e o antigo é invalidado. As credenciais de produção são contratadas como plano sob medida com o time comercial.

Posso usar as mesmas credenciais em homologação e produção?

Não. Homologação (HML) e produção (PROD) usam apps e credenciais totalmente separados, em hosts distintos: api-hml.signdocs.com.br para homologação e a API de produção para o ambiente real. Manter credenciais separadas evita que testes afetem dados reais e permite revogar chaves de teste sem impacto na produção. Lembre-se de que entidades criadas em HML têm TTL de 7 dias, então o ambiente de homologação não deve ser usado como armazenamento de longo prazo.

Por quanto tempo o access token OAuth2 é válido?

O access token retornado pelo endpoint de token expira em 15 minutos (900 segundos), conforme o campo expires_in da resposta. Seu cliente deve solicitar um novo token quando o atual expirar, em vez de armazená-lo indefinidamente. A boa prática é cachear o token em memória e renová-lo um pouco antes da expiração, reutilizando-o entre múltiplas chamadas para não solicitar um token novo a cada requisição.

Como faço a rotação do client_secret sem causar downtime?

Na SignDocs, a rotação é feita reprovisionando a credencial: o client_id permanece, um novo client_secret é gerado e o antigo é invalidado no ato — não há período de sobreposição de segredos. Para minimizar o impacto, prepare sua aplicação para ler o segredo de um cofre (como AWS Secrets Manager) em runtime, atualize o cofre imediatamente após reprovisionar e force a renovação do token em cache. Tokens já emitidos continuam válidos até expirarem (15 minutos), o que dá uma margem natural. Execute a rotação periodicamente (a AUP da API prevê 12 meses) ou imediatamente após qualquer suspeita de vazamento.

O que é a chave JWT ES256 e quando preciso dela?

A SignDocs assina os access tokens como JWT usando ECDSA na curva P-256 (ES256), com as chaves privadas guardadas em KMS. Você nunca precisa manipular essa chave: a plataforma cuida da emissão e da validação, e o seu cliente apenas envia o token Bearer. Saber que o token é ES256 serve para entender as garantias criptográficas do sistema — um token não pode ser forjado sem a chave privada, que nunca sai do KMS. Clientes regulados que precisam de autenticação adicional de canal devem avaliar o mTLS, que soma um certificado de cliente ao OAuth2.

É seguro colocar o client_secret direto no código do aplicativo?

Não. Nunca faça commit do client_secret em repositórios, nem o embuta em aplicativos frontend, mobile ou em qualquer código distribuído ao usuário final. O fluxo client-credentials é exclusivamente server-to-server. Armazene o segredo em variáveis de ambiente injetadas em runtime ou, preferencialmente, em um cofre de segredos. Aplique o princípio do menor privilégio nos scopes e habilite verificação de assinatura nos webhooks para fechar o ciclo de segurança.

Gere suas credenciais e comece a integrar hoje

Crie um app de homologação em minutos, obtenha seu client_id e client_secret e dispare a primeira sessão de assinatura via OAuth2. Com SDKs oficiais em TypeScript/Node, Python, Go, Java, PHP e C#/.NET, mTLS para enterprise e ICP-Brasil nativo.

Comece grátis Fale com nossa equipe sobre a API Enterprise