Transação, sessão de assinatura ou envelope: qual API usar

Quem abre a referência da API pela primeira vez encontra 44 endpoints e três caminhos diferentes que parecem fazer a mesma coisa: POST /v1/transactions, POST /v1/signing-sessions e POST /v1/envelopes. Os três terminam em um documento assinado com evidência, e a documentação de cada um funciona isoladamente — o que torna fácil escolher o primeiro que aparece e descobrir o problema tarde. E o problema tem um formato específico: uma transação carrega um signatário e um documento. Se o segundo signatário aparecer depois que o fluxo estiver pronto, não há campo para acrescentá-lo. Este guia mostra o que cada modelo assume, para você escolher uma vez.

Resposta rápida: um signatário e você controla a interface → transação. Um signatário e você quer um link pronto → sessão de assinatura. Mais de um signatário no mesmo documento → envelope. Nenhum documento, só um ato a autenticar → Sessão de Confiança.

Os quatro modelos

Modelo Cria Signatários Documento
Transação POST /v1/transactions 1 1
Sessão de assinatura POST /v1/signing-sessions 1 1
Envelope POST /v1/envelopes + /sessions 1 a 100 1
Sessão de Confiança POST /v1/trust-sessions 1 Nenhum

A coluna "Documento" é a que mais surpreende: ela nunca passa de 1. Não existe envelope com vários documentos. Voltaremos a isso.

Transação: o registro do ato

A transação é a unidade fundamental — tudo o mais acaba criando uma. Ela amarra quatro coisas: quem (o signatário), o quê (o documento), como (a política de verificação) e o resultado (as etapas executadas e a evidência).

POST https://api-hml.signdocs.com.br/v1/transactions Authorization: Bearer <access_token> { "purpose": "DOCUMENT_SIGNATURE", "policy": { "profile": "CLICK_PLUS_OTP" }, "signer": { "name": "Ana Ribeiro Costa", "userExternalId": "cliente-8812", "cpf": "12345678901", "email": "ana@exemplo.com.br" }, "document": { "content": "JVBERi0xLjQK...", "filename": "contrato.pdf" } }

Repare no singular: signer, não signers. Não é uma limitação a contornar — é o modelo. Não existe campo para acrescentar uma segunda pessoa, nem no momento da criação nem depois.

Escolha transações quando você conduz o fluxo: sua aplicação chama /steps/{id}/start e /steps/{id}/complete, desenha a própria interface e decide o que mostrar a cada passo. É o caminho de maior controle e maior trabalho.

Sessão de assinatura: a porta pronta

A sessão cria a transação por baixo e devolve, na mesma resposta, tudo o que é preciso para colocar a pessoa para assinar:

POST https://api-hml.signdocs.com.br/v1/signing-sessions Authorization: Bearer <access_token> { ...mesmos campos da transação... } // 201 { "sessionId": "ss_01J...", "transactionId": "tx_01J...", // a transação existe, criada por baixo "status": "ACTIVE", "url": "https://sign-hml.signdocs.com.br/s/ss_01J...", "clientSecret": "ss_secret_...", "expiresAt": "2026-09-08T10:14:02Z" }

O link final é a url com o segredo anexado como parâmetro. A partir daí, quem conduz as etapas é a página de assinatura — a sua integração só acompanha por /status ou por webhook.

Note que transactionId vem na resposta. Ele é o que você usa para buscar a evidência e o documento assinado depois: a sessão é a porta, a transação é o registro.

Envelope: vários signatários, um documento

O envelope é criado em duas etapas — primeiro o continente, depois cada pessoa:

// 1. O envelope declara o documento e quantas pessoas vão assinar POST https://api-hml.signdocs.com.br/v1/envelopes { "signingMode": "SEQUENTIAL", // ou PARALLEL "totalSigners": 3, "document": { "content": "JVBERi0xLjQK...", "filename": "contrato.pdf" } } // 2. Uma chamada por signatário — cada um com a sua própria política POST /v1/envelopes/{envelopeId}/sessions { "signerIndex": 1, // começa em 1 "signer": { "name": "Ana Ribeiro Costa", "userExternalId": "cliente-8812", "cpf": "12345678901" }, "policy": { "profile": "CLICK_PLUS_OTP" } }

Três propriedades que valem conhecer antes de decidir:

A política é por signatário. O comprador pode assinar com clique e código enquanto o avalista assina com biometria e o representante da empresa com certificado ICP-Brasil — no mesmo documento. Isso não é possível com transações avulsas, porque não haveria um documento comum.

O modo é do envelope inteiro. SEQUENTIAL convida um de cada vez, na ordem dos índices; PARALLEL convida todos ao mesmo tempo. Não há modo híbrido por grupos. O detalhamento está em ordem sequencial vs paralela.

O teto é 100 signatários, e o motivo é técnico e vale saber: toda leitura de envelope é feita em uma consulta única e não paginada ao índice, então o conjunto de signatários precisa caber em uma página de 1 MB. Além disso, a consulta truncaria em silêncio — a verificação de índice duplicado deixaria de enxergar signatários já existentes e a validação de ordem passaria a rejeitar alguém cujo antecessor realmente concluiu. O 400 explícito é preferível a essa classe de corrupção invisível.

O limite que não tem contorno: um documento por envelope

Esta é a pergunta que mais aparece, e a resposta é curta: envelope com vários documentos não existe. O envelope resolve muitas pessoas sobre um arquivo, não muitos arquivos.

Para um pacote que deve ser assinado junto — contrato, anexo técnico e procuração —, o padrão é encadear:

// Assine o evento de conclusão e crie o próximo envelope ENVELOPE.ALL_SIGNED → cria o envelope do documento 2 ENVELOPE.ALL_SIGNED → cria o envelope do documento 3

É mais trabalho, e tem uma vantagem que quase compensa: cada documento fica com o próprio pacote de evidências, independente dos demais. Se um deles for contestado, a prova daquele ato não depende dos outros. Sobre o consumo de plano, note que cada envelope é um documento para efeito de cota.

Sessão de Confiança: quando não há documento

Nem todo ato que precisa de identidade tem um PDF. Aprovar uma transferência, confirmar uma troca de conta bancária, liberar um acesso privilegiado — são atos, e o que se quer registrar é quem autorizou o quê, quando.

POST https://api-hml.signdocs.com.br/v1/trust-sessions Authorization: Bearer <access_token> { "purpose": "ACTION_AUTHENTICATION", "policy": { "profile": "CLICK_PLUS_OTP" }, "signer": { "name": "Ana Ribeiro Costa", "userExternalId": "cliente-8812", "cpf": "12345678901" }, "action": { "type": "ALTERACAO_CADASTRAL", "description": "Alteração de conta bancária para recebimento", "reference": "chamado-44127" } }

A mesma escada de verificação de identidade se aplica — clique, código, biometria, certificado. A diferença é que o objeto do ato é a descrição, não um arquivo.

Armadilha documentada: GET /v1/trust-sessions/{id}/evidence não existe, embora apareça em exemplos antigos que circularam. A Sessão de Confiança gera evidência normalmente — só que pela rota de sempre. Use o transactionId que vem na criação e no /status e chame GET /v1/transactions/{transactionId}/evidence.

Como escolher, na prática

Situação Use
Termo de aceite, um cliente, você quer só mandar um link Sessão de assinatura
Assinatura dentro do seu app, interface sua, cada passo controlado Transação + rotas de etapa
Contrato entre duas ou mais partes Envelope
Uma parte hoje, talvez um avalista amanhã Envelope — funciona bem com um só
Vários documentos do mesmo negócio Envelopes encadeados por ENVELOPE.ALL_SIGNED
Aprovar um ato, sem documento Sessão de Confiança

A quarta linha é a recomendação mais útil deste artigo. Na dúvida entre transação e envelope, escolha envelope. Ele aceita um signatário sem cerimônia, e a migração no sentido contrário é barata; a migração de transação para envelope não é.

O custo de descobrir tarde

Vale ser concreto sobre o que muda quando um segundo signatário aparece numa integração feita com transações:

  • O endpoint de criação muda, e com ele o formato do corpo.
  • Passa a existir um passo novo — criar o envelope antes de criar as sessões — que não tinha equivalente.
  • O evento de conclusão deixa de ser TRANSACTION.COMPLETED e passa a ser ENVELOPE.ALL_SIGNED: quem escuta o evento antigo vai processar o fim do primeiro signatário como se fosse o fim do negócio.
  • O PDF final deixa de ser o download da transação e passa a ser o carimbo combinado do envelope.
  • Aparece a ordenação — sequencial ou paralela — que antes não existia como conceito.

São cinco pontos do código, não uma flag. Meia hora de decisão no começo evita uma refatoração no meio.

Escolhido o modelo, os próximos passos costumam ser entender os prazos que governam cada objeto, quem autentica cada rota em os dois tokens da API, e o mapa de escopos. Para o passo zero, a primeira assinatura em 5 minutos.

Perguntas Frequentes

Qual a diferença entre transação e sessão de assinatura?

A transação é o registro do ato: um signatário, um documento, uma política de verificação, e é dela que sai o pacote de evidências. A sessão de assinatura é a porta por onde a pessoa entra — ela cria a transação por baixo e devolve, na mesma resposta, a URL pronta e o segredo de acesso. Se você quer conduzir cada etapa por conta própria, use transações; se quer entregar um link e receber o resultado, use sessões.

Posso acrescentar um segundo signatário a uma transação?

Não. Uma transação é single-signer e single-document por definição, e não existe campo para acrescentar alguém depois. Documento com mais de uma parte é caso de envelope: POST /v1/envelopes declara o documento e o total de signatários, e cada signatário entra por POST /v1/envelopes/{id}/sessions com a sua própria política.

Quantos signatários cabem em um envelope?

Até 100. O limite não é cosmético: toda leitura de envelope é feita em uma única consulta ao índice, e o conjunto de signatários precisa caber em uma página de 1 MB. Passado isso, a consulta truncaria em silêncio — a checagem de índice duplicado deixaria de enxergar signatários existentes e a validação de ordem rejeitaria alguém cujo antecessor de fato concluiu. O 400 explícito troca uma corrupção silenciosa por um erro claro.

Um envelope pode ter mais de um documento?

Não. O envelope resolve vários signatários sobre um documento. Para um conjunto de documentos que devem ser assinados juntos, o caminho é encadear envelopes: assine o evento ENVELOPE.ALL_SIGNED e crie o próximo quando o anterior fechar.

Para que serve a Sessão de Confiança?

Para autenticar um ato, e não um documento — aprovar um pagamento, confirmar uma alteração cadastral, liberar um acesso. É a mesma escada de verificação de identidade, com purpose igual a ACTION_AUTHENTICATION. Ela também gera evidência, mas as partes que dependem do hash do documento não se aplicam.

Como obtenho a evidência de uma Sessão de Confiança?

Pela rota normal de evidência da transação. A sessão devolve um transactionId na criação e no status; use-o em GET /v1/transactions/{transactionId}/evidence. Não existe /v1/trust-sessions/{id}/evidence — é um endpoint que aparece em exemplos antigos e nunca existiu.

Dá para migrar de transação para envelope depois?

Dá, mas é refatoração, não configuração: muda o endpoint de criação, muda o momento em que cada signatário entra, muda quem dispara o evento de conclusão e muda como você recupera o PDF final. Se existe qualquer chance de um segundo signatário aparecer, comece por envelope — ele funciona bem com um signatário só.

Escolha o modelo certo antes da primeira linha de código

Um signatário, vários signatários ou autenticação sem documento: os três caminhos existem no sandbox gratuito e podem ser testados de ponta a ponta antes de qualquer decisão de arquitetura.

Criar credenciais de homologação Fale com o time comercial