Referência
Referência da API
As oitenta e três operações do contrato, mais dezesseis objetos e doze enumerações, espelhando
docs/CONTRATO_API.openapi.yaml. Cada operação traz o escopo de chave e o
papel mínimo que exige, e tem link permanente. A busca da barra lateral filtra esta página
inteira sem sair dela e sem enviar o que você digita para lugar nenhum; a tecla
/ leva o foco até ela.
>>> PENDENTE DE BACKEND <<< (página inteira)
Esta página foi conferida contra o contrato canônico
docs/CONTRATO_API.openapi.yaml, e não contra um servidor em execução.
Nenhuma operação foi exercida em produção. Onde este texto divergir do contrato, o
contrato vence e o texto está errado. Pendências específicas trazem a marcação no próprio
cabeçalho da operação.
Convenções
Vale para toda a API, e não se repete em cada operação.
| Item | Regra |
| URL base, produção | https://api.adigitalmax.com.br/v1 |
| URL base, sandbox | https://api.adigitalmax.com.br/v1/sandbox |
| Exceção de host | Duas rotas anônimas moram no host institucional e não em api.: a validação pública e o formulário de contato do site. Isso evita abrir CORS justamente no endpoint mais exposto. |
| Autenticação | Authorization: Bearer adx_live_<prefixo>.<segredo> para chave de API, cookie adx_sessao para o painel, e OAuth 2.0 para aplicações de terceiros. Veja Autenticação. |
| Formato | application/json, exceto envio de arquivo, que é multipart/form-data, e download, que devolve application/pdf. |
| Nomes de campo | camelCase. Valores de enumeração em MAIUSCULA_COM_SUBLINHADO, com a única exceção dos nomes de evento de webhook, que são minúsculos no formato recurso.acao. |
| Identificadores | UUID v4 em toda rota. Não há sequencial. Identificador opaco não é autorização: toda operação revalida o direito no servidor. |
| Escopo de organização | Nenhuma operação aceita identificador de organização. Não existe tenantId nem organizacaoId em corpo, consulta, caminho ou cabeçalho. O escopo vem do token, sempre. Um campo desses chegando na requisição é descartado e registrado como evento de segurança. |
| Data e hora | RFC 3339 com fuso. 2026-08-16T14:32:07-03:00. |
| Dinheiro | Inteiro em centavos. Nunca ponto flutuante. |
| Coordenada de campo | Fração de 0 a 1 relativa à página, origem no canto superior esquerdo. |
Campo ausente em PATCH | Só altera o que veio no corpo. Enviar null apaga; omitir preserva. |
| Campo novo em resposta | Pode ser acrescentado sem aviso. Seu cliente precisa ignorar o que não conhece, em vez de falhar. |
⚠
Recurso de outra organização responde 404, nunca 403.
O corpo e a latência do 404 de "não existe" e do 404 de "é de
outro" são indistinguíveis, de propósito: 403 significaria "existe, e você
não pode", e isso é um oráculo de existência. 403 aparece em um caso só, e
ali é correto e acionável: recurso da própria organização que o papel do
usuário não alcança.
Paginação por cursor
Toda listagem é paginada por cursor. Os parâmetros de consulta são limite e
cursor, e a resposta é o objeto Pagina.
Forma de toda listagem
{
"itens": [ { "id": "6f2a1c94-8b3d-4e57-9a20-71c5f0d3ab48" } ],
"total": 412,
"proximoCursor": "Y3Vyc29yOjIwMjYtMDgtMTZUMTQ6MzI6MDdaOjZmMmExYzk0"
}
Pare quando proximoCursor vier ausente ou null, e não quando a
página vier com menos itens que o limite: as duas coisas não são equivalentes. O
total obedece ao mesmo escopo dos itens; um total calculado fora do escopo
entregaria o volume de negócio de outra organização mesmo sem entregar uma linha. O cursor
é opaco e não deve ser construído nem decomposto.
Idempotência
Toda operação de criação aceita o cabeçalho Idempotency-Key. Repetir a
chamada com a mesma chave dentro de 24 horas devolve a resposta original em vez de criar de
novo. Sem isso, um tempo limite de rede no envio de um documento vira dois documentos e
duas cobranças.
ⓘ
Use um identificador do seu domínio, como o número do pedido ou do contrato,
e não um UUID aleatório gerado na hora da chamada. Aleatório gerado na hora muda a cada
retentativa, que é exatamente o caso que a idempotência deveria cobrir.
Documentos
Cria um documento a partir de um PDF, com signatários e campos posicionados. O
documento nasce em RASCUNHO e não dispara nada: enviar é
uma operação separada e explícita, porque disparar por efeito colateral de uma criação
é como se envia contrato errado para cliente.
Escopodocumentos:escrever
PapelOPERADOR
IdempotenteIdempotency-Key
O corpo é multipart/form-data. O arquivo é limitado a 20 MB
e apenas application/pdf; o tipo real é conferido pelo conteúdo, e não
pela extensão nem pelo cabeçalho declarado. Os demais campos seguem
DocumentoEntrada.
Corpo, parte de dados
{
"titulo": "Contrato de prestação de serviços",
"descricao": "Vigência de 12 meses, renovação automática.",
"nivelAssinatura": "SEGURA",
"fatoresExigidos": ["EMAIL", "SMS_OTP"],
"ordenado": true,
"recusavel": true,
"pararSeRecusado": true,
"lembrete": "SEMANAL",
"prazoEm": "2026-09-15T23:59:59-03:00",
"expiraEm": "2026-09-30T23:59:59-03:00",
"signatarios": [
{
"nome": "Maria Oliveira",
"email": "maria@exemplo.com.br",
"telefone": "+5511988887777",
"funcao": "ASSINAR",
"metodoEntrega": "EMAIL",
"ordem": 1
}
],
"campos": [
{
"tipo": "ASSINATURA",
"pagina": 7,
"x": 0.10, "y": 0.72, "largura": 0.34, "altura": 0.07,
"obrigatorio": true
}
]
}
ⓘ
Dois fatores simultâneos é simplesmente informar dois valores em
fatoresExigidos. Não há booleano de "exigir todos": a lista é
o conjunto exigido, e todos os seus itens precisam ser cumpridos. O signatário pode
exigir mais que o documento, nunca menos.
Lista os documentos da organização, do mais recente para o mais antigo, paginada por cursor.
Escopodocumentos:ler
PapelVISUALIZADOR
Parâmetros de consulta
| Parâmetro | Tipo | Descrição |
limite | integer | Itens por página. |
cursor | string | O proximoCursor da página anterior. |
status | StatusDocumento | Filtra por estado. |
pastaId | uuid | Restringe a uma pasta. |
busca | string | Trecho do título ou de nome e e-mail de signatário. |
A listagem devolve DocumentoResumo, sem campos nem auditoria. Para o objeto inteiro, use a leitura individual.
GET
/documentos/{documentoId}
#
O Documento completo, com signatários, campos e o estado de cada assinatura.
Escopodocumentos:ler
PapelVISUALIZADOR
Documento de outra organização responde 404, e não 403.
PATCH
/documentos/{documentoId}
#
Altera o que o estado atual permite. Em RASCUNHO, quase tudo. Depois de
enviado, o conteúdo já foi apresentado a alguém e mudá-lo destruiria a prova: a
tentativa devolve 409 com o código DOCUMENTO_IMUTAVEL.
Escopodocumentos:escrever
PapelOPERADOR
DELETE
/documentos/{documentoId}
#
Exclusão lógica com carência. O documento sai das listagens e o arquivo continua
guardado até a política de retenção alcançá-lo. Documento concluído é prova documental
e não sai por esta rota.
Escopodocumentos:escrever
PapelADMINISTRADOR
Exigir ADMINISTRADOR aqui, e apenas OPERADOR para criar e enviar, é deliberado: quem opera o dia a dia não apaga acervo.
POST
/documentos/{documentoId}/enviar
#
Tira o documento do rascunho e dispara os convites conforme a ordem configurada. É esta
chamada que consome um envelope da franquia do plano. Só funciona a partir de
RASCUNHO.
Escopodocumentos:escrever
PapelOPERADOR
Emite o evento document.sent. Franquia esgotada devolve FRANQUIA_ESGOTADA.
POST
/documentos/{documentoId}/reenviar
#
Reenvia o convite a quem ainda não assinou. Não consome envelope novo e não altera o prazo.
Escopodocumentos:escrever
PapelOPERADOR
POST
/documentos/{documentoId}/cancelar
#
Interrompe o processo. Os links dos signatários deixam de funcionar na hora, quem já
assinou continua registrado na auditoria, e o motivo entra na trilha. Não tem volta:
para retomar, crie um documento novo.
Escopodocumentos:escrever
PapelOPERADOR
Emite o evento document.cancelled.
POST
/documentos/{documentoId}/mover
#
Move o documento para outra pasta da mesma organização. pastaId: null devolve à raiz.
Escopodocumentos:escrever
PapelOPERADOR
GET
/documentos/{documentoId}/versoes
#
Lista as versões do arquivo do documento. Substituir o PDF não apaga o anterior; cria uma versão.
Escopodocumentos:ler
PapelVISUALIZADOR
POST
/documentos/{documentoId}/versoes
#
Sobe uma versão nova do arquivo, em multipart/form-data. A anterior permanece registrada e verificável.
Escopodocumentos:escrever
PapelADMINISTRADOR
GET
/documentos/{documentoId}/arquivo
#
Baixa o arquivo do documento. O parâmetro de consulta tipo aceita
ORIGINAL, ASSINADO, PADES e
CERTIFICADO, com ASSINADO como padrão.
Escopoarquivos:ler
PapelVISUALIZADOR
Exemplo
GET /v1/documentos/6f2a1c94-8b3d-4e57-9a20-71c5f0d3ab48/arquivo?tipo=ASSINADO
A API resolve o objeto dentro do escopo da organização, verifica o direito e só então
delega a entrega ao servidor web por X-Accel-Redirect, apontando para um
caminho marcado como interno. Não existe caminho público previsível para o
arquivo, e o diretório nunca é servido como estático.
GET
/documentos/{documentoId}/auditoria
#
A trilha de auditoria completa, em ordem cronológica, como uma página de
EventoAuditoria. É o mesmo
conteúdo que vai para o certificado, em JSON. A trilha é imutável: não há rota que
altere ou apague evento.
Escopoauditoria:ler
PapelVISUALIZADOR
Note que o escopo é auditoria:ler, e não documentos:ler: uma chave pode ler documentos sem ler a trilha deles.
GET
/documentos/{documentoId}/certificado
#
O certificado de conclusão e as evidências, que é a peça central do produto: o que
prova quem assinou, quando, de onde e depois de passar por qual autenticação. Veja
Certificado.
Escopodocumentos:ler
PapelVISUALIZADOR
200 OK
{
"id": "b81d4f9c-2a06-4e13-88f5-3c7e9012ab64",
"codigo": "ADX-CERT-9F2K4M7Q1B",
"versao": 1,
"nivelAssinatura": "SEGURA",
"hashDocumento": "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8",
"hashConteudo": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"hashAnterior": null,
"hash": "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b",
"emitidoEm": "2026-08-18T16:04:11-03:00",
"arquivoUrl": "/v1/documentos/6f2a1c94-8b3d-4e57-9a20-71c5f0d3ab48/arquivo?tipo=CERTIFICADO",
"qrConteudo": "https://adigitalmax.com.br/validar?codigo=ADM-7K4Q-2M9X-B3TD"
}
ⓘ
O certificado é versionado e encadeado. Emitir de novo cria uma
versão nova ligada por hash à anterior, em hashAnterior, e não
sobrescreve. Isso é o que permite provar que a prova não foi trocada.
Antes de o documento chegar a ASSINADO o certificado não existe, e a rota
responde com o código CERTIFICADO_INDISPONIVEL. Certificado parcial seria
uma prova de algo que ainda não aconteceu.
Signatários e campos
GET/documentos/{documentoId}/signatarios
# Signatários do documento, com estado, marcos e fatores exigidos de cada um.
Escoposignatarios:lerPapelVISUALIZADOR
POST
/documentos/{documentoId}/signatarios
#
Acrescenta um signatário. O corpo é um
SignatarioEntrada. Quando o
método de entrega é LINK, a resposta traz a URL pessoal de assinatura e a
entrega passa a ser sua.
Escoposignatarios:escrever
PapelOPERADOR
GET/documentos/{documentoId}/signatarios/{signatarioId}
# Detalhe do signatário, incluindo fatores exigidos, fatores cumpridos e os marcos de cada passo.
Escoposignatarios:lerPapelVISUALIZADOR
PATCH
/documentos/{documentoId}/signatarios/{signatarioId}
#
Corrige dados de quem ainda não assinou. É a rota para o caso mais comum de todos, o
e-mail digitado errado: corrigir e reenviar resolve sem cancelar o documento nem
consumir envelope novo. Signatário que já assinou é imutável.
Escoposignatarios:escrever
PapelOPERADOR
DELETE/documentos/{documentoId}/signatarios/{signatarioId}
# Remove signatário pendente e invalida o link dele na hora. Os campos que eram dele saem junto.
Escoposignatarios:escreverPapelOPERADOR
GET/documentos/{documentoId}/campos
# Todos os campos do documento, com página, coordenada relativa e o signatário dono de cada um.
Escopodocumentos:lerPapelVISUALIZADOR
PUT
/documentos/{documentoId}/campos
#
Substitui em lote o mapa inteiro de campos. É PUT, e não
PATCH, de propósito: posicionamento de campo é um desenho, e desenho se
troca inteiro. O que não vier no corpo deixa de existir.
Escopodocumentos:escrever
PapelOPERADOR
Envelopes
Envelope agrupa vários documentos em um único ato de envio: o signatário recebe um link só
e assina o conjunto. É também a unidade de medição da franquia do plano.
Lista os envelopes da organização, paginada por cursor.
Escopodocumentos:lerPapelVISUALIZADOR
Cria o envelope. Os documentos entram nele pelo campo envelopeId de DocumentoEntrada, na criação de cada um.
Escopodocumentos:escreverPapelOPERADORIdempotenteIdempotency-Key
POST/envelopes/{envelopeId}/enviar
# Dispara o envelope inteiro em um ato. Consome um envelope da franquia, independentemente de quantos documentos estejam dentro.
Escopodocumentos:escreverPapelOPERADOR
Pastas
Pastas da organização com a contagem de documentos de cada uma.
Escopopastas:lerPapelVISUALIZADOR
Cria pasta. O corpo é { "nome": "Contratos 2026", "paiId": null }.
Escopopastas:escreverPapelOPERADOR
Renomeia ou move a pasta. Mover para dentro da própria descendência é recusado.
Escopopastas:escreverPapelOPERADOR
Remove pasta vazia. Nunca apaga documento em cascata: pasta com conteúdo é recusada, com a contagem do que há dentro.
Escopopastas:escreverPapelADMINISTRADOR
Modelos
Modelos de documento visíveis à credencial: os pessoais de quem criou e os publicados na organização.
Escopomodelos:lerPapelVISUALIZADOR
Cria um modelo a partir de um PDF, em multipart/form-data. O modelo define papéis de signatário, e não pessoas: quem preenche cada papel é decidido ao instanciar.
Escopomodelos:escreverPapelOPERADOR
Detalhe do modelo, com papéis, campos e a lista de variáveis que ele aceita.
Escopomodelos:lerPapelVISUALIZADOR
PATCH/modelos/{modeloId}
# Edita o modelo. Documentos já gerados a partir dele não mudam.
Escopomodelos:escreverPapelOPERADOR
DELETE/modelos/{modeloId}
# Remove o modelo. Documentos gerados a partir dele continuam íntegros e verificáveis.
Escopomodelos:escreverPapelADMINISTRADOR
POST
/modelos/{modeloId}/documentos
#
Instancia um documento a partir do modelo. Sem upload de arquivo, sem posicionar campo
de novo: você manda as variáveis e quem preenche cada papel. É a rota que transforma
envio em uma chamada de JSON puro, e a mais usada em integração de volume.
Escopodocumentos:escrever
PapelOPERADOR
IdempotenteIdempotency-Key
Como toda criação, o documento nasce em RASCUNHO; o disparo continua sendo uma chamada separada.
Validação pública
POST
https://adigitalmax.com.br/api/v1/validacao/consultar
#
A única operação do produto totalmente sem autenticação, junto com o
formulário de contato do site. Ela existe porque quem valida costuma ser exatamente
quem não é cliente de ninguém: a contraparte, o cartório, o banco, o juiz.
AutenticaçãoNenhuma
Limite30 por minuto por IP, rajada de 10
⚠
O host é diferente do resto da API, e a diferença é proposital. A
página de validação mora no domínio raiz, em
adigitalmax.com.br/validar, e a API mora em api..
Consulta entre origens obrigaria CORS aberto justamente no endpoint mais exposto do
sistema. A borda roteia /api/v1/validacao/ no próprio host
institucional, e a chamada vira mesma origem, sem CORS nenhum.
Corpo, ao menos um dos três
| Campo | Formato | Descrição |
codigo | ADM-XXXX-XXXX-XXXX | O código impresso no rodapé do PDF. Alfabeto sem caracteres ambíguos. |
hashArquivo | 64 hexadecimais | SHA-256 do PDF. O arquivo nunca é enviado: o navegador calcula o hash localmente com crypto.subtle e transmite apenas os 64 caracteres. Isso importa porque quem valida costuma não confiar na outra parte, e não teria por que confiar na plataforma dela também. |
qrCode | string | O conteúdo lido do QR Code impresso no documento. |
curl
curl --request POST "https://adigitalmax.com.br/api/v1/validacao/consultar" \
--header "Content-Type: application/json" \
--data '{"codigo":"ADM-7K4Q-2M9X-B3TD"}'
Os três desfechos, que são diferentes e não podem ser confundidos
| Resultado | Significa |
AUTENTICO | O registro existe e o hash informado bate com o hash final gravado. O documento é o mesmo que foi assinado. |
ADULTERADO | O registro existe, o código confere, e o hash do arquivo apresentado não bate. O arquivo em mãos do visitante não é o que foi assinado. É o único desfecho que afirma algo negativo sobre o arquivo, e ele exige o hash: nunca é retornado a partir do código sozinho. |
NAO_ENCONTRADO | A plataforma não tem registro daquele código ou hash. Não significa que o documento é falso. Ele pode ter sido assinado em outra plataforma, pode ter sido excluído por política de retenção, ou o código pode ter sido digitado errado. A interface precisa dizer isso com essas palavras. |
A resposta é sempre 200, inclusive em NAO_ENCONTRADO: o
desfecho vai no corpo, e não no status, para que o status não vire oráculo de existência
consultável sem ler a resposta. A latência é uniforme entre os três desfechos pela mesma
razão. O e-mail dos signatários vem mascarado pelo servidor; o
mascaramento no navegador é segunda linha, nunca a primeira. Não há busca por título,
por nome nem por data: seria transformar a página pública em ferramenta de raspagem.
ⓘ
O limite de 30 por minuto é inseparável da entropia do código, que tem 60 bits. Os
dois controles são um só: afrouxar o limite sozinho transformaria o endpoint em
oráculo para varrer códigos.
Assinatura pelo token do signatário
Estas seis rotas são consumidas pela página de assinatura, e não pela sua
integração. Elas usam o token de uso pessoal que o signatário recebe no link, um espaço de
credencial distinto do da chave de API e do cookie do painel. Nenhum endpoint aceita um no
lugar do outro. Estão documentadas aqui para você entender o que acontece do outro lado, e
porque quem usa metodoEntrega: "LINK" monta a própria entrega.
Abre a sessão de assinatura: o documento, os campos daquele signatário e os fatores que ele ainda precisa cumprir. Registra a visualização na trilha e dispara document.viewed.
AutenticaçãoToken do signatário
POST
/assinatura/{token}/leitura
#
Relata até que ponto o signatário percorreu o documento, com
paginasLidas e segundos. Quando as páginas lidas alcançam o
total, o servidor grava a conclusão da leitura na trilha e passa a permitir o aceite.
AutenticaçãoToken do signatário
A operação existe porque a exigência de "ler o documento inteiro antes de assinar"
vivia apenas no navegador, e regra que existe só na interface não existe: uma chamada
direta à API pulava a leitura sem deixar rastro. Com ela, a trava passa a ser do
servidor.
⚠
Isto é evidência de percurso declarado, e não prova de leitura. O
progresso é relatado pelo cliente. O servidor sabe que aquele token afirmou ter
chegado à última página, de tal IP, em tal horário, após tantos segundos; ele não
sabe, e não tem como saber, se olhos humanos leram o texto. Medir o tempo torna um
percurso instantâneo implausível, nunca impossível.
A consequência é comercial, e vale repetir: material que prometer "comprovamos que
o signatário leu o documento" afirma mais do que o sistema entrega, e é exatamente
a frase que aparece citada quando alguém contesta. A formulação que o certificado
usa é "o signatário percorreu as N páginas do documento, tendo permanecido X
segundos, com registro de IP e horário".
POST
/assinatura/{token}/aceite
#
Registra que o signatário leu e concordou com um texto específico, em uma versão
específica, identificado por textoAceiteId ou
textoHash. Grava o aceite na trilha com IP, navegador e horário.
AutenticaçãoToken do signatário
É uma operação própria, e não um booleano dentro do assinar,
por três razões. Um booleano não prova que alguém concordou com um texto: ele afirma que
um campo veio marcado, e dois anos depois a pergunta em disputa nunca é se a pessoa
clicou, e sim com o quê ela concordou, exatamente. Aceitar e assinar são atos
distintos, e a distância entre eles às vezes é o que se discute. E quem concordava e
abandonava não deixava registro nenhum, porque a linha de assinatura nunca chegava a ser
criada, descartando um fato relevante em negociação interrompida.
POST/assinatura/{token}/otp
# Dispara o código de uso único pelo canal exigido. Cada disparo consome a medição correspondente, e é por isso que o reenvio de código aparece na fatura.
AutenticaçãoToken do signatário
POST/assinatura/{token}/autenticar
# Cumpre um fator: valida o código de OTP, o código do aplicativo autenticador ou os dados pessoais. Quando o último fator exigido é cumprido, dispara signer.authenticated.
AutenticaçãoToken do signatário
POST/assinatura/{token}/assinar
# Consuma a assinatura com os valores dos campos, registrando IP, agente, horário e localização aproximada. Recusa com AUTENTICACAO_INCOMPLETA se algum fator exigido não foi cumprido.
AutenticaçãoToken do signatário
POST/assinatura/{token}/recusar
# Recusa com motivo, aplicando pararSeRecusado quando configurado. Dispara document.refused.
AutenticaçãoToken do signatário
GET/assinatura/{token}/arquivo
# Permite ao signatário baixar o documento que está assinando, e a cópia assinada depois da conclusão.
AutenticaçãoToken do signatário
POST
https://adigitalmax.com.br/api/v1/contatos
#
Registra o contato do formulário do site institucional. Junto com a
validação pública, é uma das duas únicas operações
anônimas do sistema, e mora no host institucional pelo mesmo motivo: manter a chamada de
mesma origem, sem CORS e sem afrouxar a política de segurança de conteúdo do site.
AutenticaçãoNenhuma
Limite5 por hora e 20 por dia por IP
Não existe versão em api.adigitalmax.com.br, e a ausência é deliberada:
formulário de contato não tem caso de uso servidor a servidor, e uma segunda cópia
significaria manter dois conjuntos de defesa anti-robô em sincronia, sendo que o que sai
de sincronia vira a porta que o robô usa. Esta rota não interessa à sua
integração; está listada para completude do contrato.
Organização e membros
ⓘ
Não existe rota /me. Para conferir se a sua credencial
funciona, use GET /organizacao: ela é a
chamada mais barata autenticada da API e devolve a organização dona da chave.
A organização dona da credencial, com dados cadastrais, plano e a marca aplicada aos e-mails de convite e à página de assinatura.
Escopoorganizacao:lerPapelVISUALIZADOR
Altera dados cadastrais e a marca: cor primária, logotipo, nome do remetente, endereço de resposta e mensagem padrão.
Escopoorganizacao:escreverPapelADMINISTRADOR
Membros da organização com papel, estado e último acesso.
Escopoorganizacao:lerPapelOPERADOR
POST/organizacao/membros
# Convida alguém para a organização. O convite é amarrado ao e-mail e de uso único. Não é possível convidar como PROPRIETARIO: a propriedade se transfere, não se concede.
Escopoorganizacao:escreverPapelADMINISTRADOR
PATCH/organizacao/membros/{membroId}
# Troca o papel ou o estado do membro. Não permite remover o último proprietário.
Escopoorganizacao:escreverPapelADMINISTRADOR
DELETE/organizacao/membros/{membroId}
# Remove o membro e invalida as sessões dele na organização. Remover precisa cortar o acesso agora, e não no vencimento do token.
Escopoorganizacao:escreverPapelADMINISTRADOR
Chaves de API e webhooks
Chaves da organização, com prefixo, escopos, último uso e último IP. Nunca devolve o segredo.
AutenticaçãoSomente sessão de usuário
PapelADMINISTRADOR
⚠
As três rotas de chave não aceitam chave de API, apenas a sessão do
painel. Uma chave que pudesse criar outra chave tornaria a revogação
inútil: quem roubasse uma emitiria outra antes de você cortar a primeira.
Cria a chave com os escopos escolhidos. O valor completo, adx_live_<prefixo>.<segredo>, aparece uma única vez, nesta resposta. A plataforma guarda apenas o hash do segredo.
AutenticaçãoSomente sessão de usuárioPapelADMINISTRADOR
DELETE/chaves-api/{chaveId}
# Revoga a chave imediatamente, sem carência. Requisições com ela passam a responder CREDENCIAL_INVALIDA.
AutenticaçãoSomente sessão de usuárioPapelADMINISTRADOR
Webhooks cadastrados, com URL, eventos assinados, estado e resultado da última entrega.
Escopowebhooks:gerenciarPapelADMINISTRADOR
Cadastra um endpoint. O segredo de assinatura HMAC é devolvido uma única
vez, nesta resposta, e não se repete em nenhuma outra.
Escopowebhooks:gerenciar
PapelADMINISTRADOR
A URL é validada a cada entrega, e não só no cadastro: IP privado,
loopback, link-local, endereço de metadados de nuvem e redirecionamento para faixa
interna são recusados. Validar só no cadastro não basta, porque o DNS pode mudar
depois.
O formato do envio e a validação da assinatura estão em Webhooks.
PATCH/webhooks/{webhookId}
# Edita URL, eventos ou estado.
Escopowebhooks:gerenciarPapelADMINISTRADOR
DELETE/webhooks/{webhookId}
# Remove a assinatura de eventos.
Escopowebhooks:gerenciarPapelADMINISTRADOR
GET/webhooks/{webhookId}/entregas
# Histórico de entregas com evento, estado, número de tentativas, código de resposta do seu servidor e o erro, quando houve.
Escopowebhooks:gerenciarPapelADMINISTRADOR
Consumo e cobrança
A medição do período vigente, por tipo, com franquia e excedente. É como você prevê
custo sem esperar a fatura. Veja Consumo e o
detalhamento em Limites e consumo.
Escopoconsumo:ler
PapelADMINISTRADOR
Plano vigente, franquias e estado de pagamento.
Escopoconsumo:lerPapelPROPRIETARIO
Faturas emitidas, com itens e links de pagamento. Faturamento é do proprietário: o administrador não alcança por padrão.
Escopoconsumo:lerPapelPROPRIETARIO
Retenção e LGPD
GET/lgpd/politicas-retencao
# As políticas de retenção vigentes da organização, por categoria de documento.
PapelADMINISTRADOR
PUT/lgpd/politicas-retencao
# Define os prazos por categoria. Exige papel de proprietário porque expurgo é irreversível e alcança prova documental.
PapelPROPRIETARIO
Veja o estado da política em Limites. >>> PENDENTE DE BACKEND <<<
Solicitações de titular de dados abertas na organização, com estado e prazo legal.
PapelADMINISTRADOR
Abre uma solicitação de titular: acesso, correção, exportação ou exclusão. O tratamento tem carência e confirmação, e nunca apaga documento sob obrigação legal de guarda.
PapelOPERADOR
Sessão do painel
ⓘ
Estas dezesseis rotas são do usuário do painel, não da sua integração.
Elas usam o cookie adx_sessao, e não aceitam chave de API. Se você está
integrando um sistema, nenhuma delas lhe interessa: use chave de API ou OAuth. Estão
listadas para completude do contrato.
grupo
Autenticação do painel
#
| Rota | O que faz |
POST /autenticacao/cadastro | Cria conta e a primeira organização. |
POST /sessoes | Login. Emite o cookie de sessão e o valor do X-CSRF-Token. |
GET /sessoes | Sessões ativas do usuário, com dispositivo e último uso. |
DELETE /sessoes | Revoga todas as sessões. É o botão de pânico depois de um vazamento de senha. |
DELETE /sessoes/atual | Logout. |
POST /sessoes/renovar | Renova a sessão. O identificador é trocado a cada renovação. |
DELETE /sessoes/{sessaoId} | Revoga uma sessão específica. |
POST /sessoes/desafio | Responde ao segundo fator do login. |
POST /autenticacao/senha/recuperacao | Dispara o e-mail de redefinição. A resposta é idêntica exista ou não a conta. |
POST /autenticacao/senha/redefinicao | Troca a senha por token de uso único e invalida todas as sessões. |
GET /autenticacao/convites/{token} | Mostra o convite antes do aceite. |
POST /autenticacao/convites/{token}/aceitar | Aceita e entra na organização. |
POST /autenticacao/2fa | Registra o segundo fator do usuário do painel. |
POST /autenticacao/2fa/confirmacao | Confirma o registro com o primeiro código. |
POST /autenticacao/2fa/recuperacao | Reemite os códigos de recuperação. |
DELETE /autenticacao/2fa | Desativa o segundo fator. |
Toda operação com efeito colateral autenticada por cookie exige o cabeçalho
X-CSRF-Token, cujo valor acompanha a criação da sessão. Cookie sozinho é
vulnerável a requisição forjada entre sites, e SameSite=Lax reduz o
problema sem eliminá-lo. Este grupo tem limite próprio de
10 requisições por minuto por IP.
Objetos
| Campo | Tipo | Descrição |
id | uuid | Identificador do documento. |
titulo | string | Nome visível ao signatário. |
descricao | string | Texto interno, não mostrado ao signatário. |
status | StatusDocumento | Estado no ciclo de assinatura. |
nivelAssinatura | NivelAssinatura | Nível contratado para o documento. |
fatoresExigidos | array de FatorAutenticacao | Exigido de todo signatário. |
pastaId | uuid|null | null quando está na raiz. |
envelopeId | uuid|null | Envelope a que pertence, quando houver. |
ordenado | boolean | Respeita a ordem dos signatários, um de cada vez. |
recusavel | boolean | Permite ao signatário recusar com motivo. |
pararSeRecusado | boolean | Interrompe o fluxo na primeira recusa. |
lembrete | DIARIO|SEMANAL | Cobrança automática de quem não assinou. |
prazoEm | date-time | Data limite para assinar. |
expiraEm | date-time | Expiração do documento. É distinta do prazo, e o contrato mantém as duas. |
criadoEm, atualizadoEm | date-time | Marcos do documento. |
signatarios | array de Signatario | |
campos | array de Campo | Ausente na forma resumida da listagem. |
O que vai na parte de dados de POST /documentos. Obrigatório: titulo.
| Campo | Regra | Descrição |
titulo ! | 1 a 300 caracteres | Nome do documento. |
descricao | até 2000 | Texto interno. |
pastaId | uuid|null | Pasta de destino. |
envelopeId | uuid|null | Envelope a que o documento pertence. |
nivelAssinatura | enum | Veja NivelAssinatura. |
fatoresExigidos | mínimo 1 item | Fatores exigidos de todo signatário. Nível SEGURA exige ao menos um fator de OTP. |
ordenado | padrão false | Assinatura em fila conforme a ordem. |
recusavel | padrão true | |
pararSeRecusado | padrão true | |
mensagem | até 2000 | Texto do convite. |
lembrete | DIARIO|SEMANAL | Omitir desliga o lembrete. |
prazoEm, expiraEm | date-time | Prazo para assinar e expiração do documento. |
modeloEmailId | uuid|null | Modelo de e-mail do convite. |
responderPara | email | Endereço de resposta deste envio. |
signatarios | array | Veja SignatarioEntrada. |
campos | array | Veja CampoEntrada. Ficam no nível do documento, e cada um aponta o dono por signatarioId. |
⚠
Não há campo de organização. Se tenantId,
organizacaoId ou equivalente chegar neste corpo, é descartado antes da
desserialização e a tentativa vira evento de segurança.
Os campos de SignatarioEntrada,
mais os somente-leitura: id,
status (StatusSignatario),
link (presente quando metodoEntrega é LINK),
enviadoEm, visualizadoEm, assinadoEm,
motivoRecusa e fatoresCumpridos.
entradaSignatarioEntrada
#
| Campo | Tipo | Descrição |
funcao ! | FuncaoSignatario | É o único campo obrigatório. |
nome | string | Até 200 caracteres, como deve constar no certificado. |
email | email | |
telefone | string | E.164. Obrigatório quando a entrega ou o fator for SMS ou WhatsApp. |
cpf | string | Conferido no fator DADOS_PESSOAIS. |
dataNascimento | date | Conferida junto com o CPF. |
metodoEntrega | MetodoEntrega | |
fatoresExigidos | array | Reforça os fatores do documento para este signatário. Nunca reduz: o conjunto do signatário precisa conter o do documento. |
ordem | integer | A partir de 1. Só tem efeito em documento ordenado. |
travarDados | boolean | Impede o signatário de corrigir nome ou CPF na tela de assinatura. |
clienteId | uuid|null | Liga o signatário a um contato do seu cadastro. |
| Campo | Regra | Descrição |
tipo ! | TipoCampo | O que o campo recebe. |
pagina ! | a partir de 1 | Como o leitor humano conta. |
x, y ! | 0 a 1 | Fração da largura e da altura da página, origem no canto superior esquerdo. |
largura, altura ! | maior que 0, até 1 | Frações das mesmas dimensões. |
signatarioId | uuid|null | Dono do campo. null em campo de leitura preenchido pelo remetente. |
z | padrão 0 | Ordem de sobreposição. |
rotulo | até 100 | Texto de apoio mostrado ao signatário. |
obrigatorio | padrão true | |
valorPadrao | string | Pré-preenchimento. |
ⓘ
A coordenada é relativa e não absoluta em pontos porque o mesmo
posicionamento precisa valer para A4, carta e paisagem, e porque o PDF pode ser
reescalado na renderização. Ponto fixo quebra em silêncio quando o cliente sobe o
mesmo contrato em outro tamanho de papel. O campo tem que caber na página:
x + largura <= 1 e y + altura <= 1.
id, titulo, status, criadoEm, enviadoEm e a lista de documentos que ele contém. O envelope é a unidade de medição de ENVELOPE_ENVIADO.
id, nome, paiId (null na raiz), quantidadeDocumentos e criadaEm.
id, nome, descricao, escopo, paginas, vezesUsado, variaveis (nomes declarados no PDF), papeis (cada um com id, rotulo, funcao, ordem e fatoresExigidos) e campos.
id, acao, tipoAtor, ator, ocorridoEm, ip, porta, agenteUsuario, detalhe, hash do elo na cadeia, e geolocalizacao com país, estado, cidade, latitude, longitude e precisão. A geolocalização é aproximada por IP e a precisão vem declarada; não é GPS e não deve ser apresentada como se fosse.
id, codigo (formato ADX-CERT-XXXXXXXXXX), versao, nivelAssinatura, hashDocumento, hashConteudo (SHA-256 do pacote de evidências), hashAnterior, hash, emitidoEm, arquivoUrl, qrConteudo e conteudo.
O conteudo é o pacote de evidências congelado: dados do documento, hashes, e para cada signatário o identificador da transação, nome, contato usado, fatores exigidos e usados, datas de cada passo, IP e dados técnicos, mais a sequência integral de eventos com o hash de cada elo.
objetoResultadoValidacao
# resultado (AUTENTICO, ADULTERADO ou NAO_ENCONTRADO), codigo, hashRecebido, documento (nome, páginas, criadoEm, finalizadoEm, algoritmoHash, hashArquivo e nivelAssinatura), signatarios (nome, emailMascarado, papel, status, assinadoEm, ip e uma descrição legível dos fatores usados) e manifesto (versão, emitidoEm e codigoCertificado).
id, url, eventos, ativo, descricao, criadoEm, ultimaEntregaEm e ultimaEntregaStatus. O campo segredo aparece apenas na resposta da criação.
id, eventoId, webhookId, evento, status, tentativas, ocorridaEm, proximaTentativaEm, respostaHttp, duracaoMs e erro. O eventoId é a chave de idempotência do seu lado.
periodo com inicio e fim, e medicoes, uma lista de Medicao com tipo (TipoMedicao), quantidade, franquia, excedente e valorExcedenteCentavos.
itens (array), total (integer, sob o mesmo escopo dos itens) e proximoCursor (string ou null, ausente na última página).
Erro no formato RFC 9457 (problem details), com um campo
codigo estável para o cliente ramificar sem depender do texto.
application/problem+json
{
"type": "https://docs.adigitalmax.com.br/erros.html#nao_encontrado",
"title": "Recurso não encontrado",
"status": 404,
"detail": "Recurso não encontrado.",
"instance": "/v1/documentos/6f2a1c94-8b3d-4e57-9a20-71c5f0d3ab48",
"codigo": "NAO_ENCONTRADO",
"requestId": "01J9M4X7QK2ZB8N3P6R0T5V2WY"
}
Em erro de validação há também erros, um arranjo de objetos com
campo e mensagem. A mensagem nunca revela nome de tabela,
consulta, rastro de pilha nem a razão exata de uma negação entre organizações; o
detalhe completo vai para o log interno, ligado ao requestId. O catálogo
completo está em Erros.
Enumerações
ⓘ
Pode ser acrescentado valor novo a qualquer enumeração sem mudar a versão da API. Trate
valor desconhecido como um caso a registrar e ignorar, e nunca como erro fatal: um
switch sem ramo padrão é a causa mais comum de integração que quebra em
uma terça-feira sem ninguém ter mexido nela.
| Valor | O que o produto entrega |
ELETRONICA | E-mail mais evidências básicas. |
SEGURA | E-mail mais OTP por SMS ou TOTP, com trilha completa. |
AVANCADA | Identidade verificada, integridade e evidências reforçadas. |
ICP_BRASIL | Assinatura qualificada por prestador. Ainda não disponível; declarado no contrato porque o modelo o suporta desde o início. >>> PENDENTE DE BACKEND <<< |
| Valor | Significa |
RASCUNHO | Criado e ainda não enviado. É o único estado em que quase tudo é editável. |
AGUARDANDO_ASSINATURAS | Enviado, ninguém assinou ainda. |
PARCIALMENTE_ASSINADO | Pelo menos um assinou e falta alguém. |
ASSINADO | Todos assinaram. É aqui que o certificado passa a existir. |
RECUSADO | Alguém recusou e pararSeRecusado estava ativo. |
CANCELADO | Interrompido por quem enviou. |
EXPIRADO | O prazo venceu sem conclusão. |
| Valor | O que exige | Exige do payload |
EMAIL | Acesso ao link enviado ao e-mail declarado. | email |
SMS_OTP | Código de uso único por SMS. Consome a medição SMS_ENVIADO, inclusive nos reenvios. | telefone |
WHATSAPP_OTP | Código de uso único por WhatsApp. | telefone |
TOTP | Código do aplicativo autenticador do signatário, como o Google Authenticator. Não tem custo por uso. | nada além do e-mail |
DADOS_PESSOAIS | Conferência de CPF e data de nascimento contra o que você declarou. | cpf e dataNascimento |
SELFIE | Captura de selfie sem prova de vida. >>> PENDENTE DE BACKEND <<< | |
BIOMETRIA_FACIAL | Selfie com prova de vida, comparada ao documento. >>> PENDENTE DE BACKEND <<< | cpf |
DOCUMENTO_FOTO | Foto do documento de identidade. >>> PENDENTE DE BACKEND <<< | |
CERTIFICADO_ICP | Certificado digital ICP-Brasil A1 ou A3. >>> PENDENTE DE BACKEND <<< | cpf |
✓
Exigir dois fatores simultâneos é simplesmente informar dois valores em
fatoresExigidos. Não existe booleano de "exigir todos", e não
existe modo "qualquer um destes": a lista é o conjunto exigido, e todos precisam ser
cumpridos. ["EMAIL", "SMS_OTP"] significa e-mail e SMS.
- ASSINAR
- APROVAR
- RECONHECER
- TESTEMUNHAR
- ACUSAR_RECEBIMENTO
- ENDOSSAR
A equivalência com SIGN, APPROVE, RECOGNIZE, SIGN_AS_A_WITNESS, ACKNOWLEDGE e ENDORSE do Autentique está em Migração.
- PENDENTE
- ENVIADO
- VISUALIZADO
- ASSINADO
- RECUSADO
- CANCELADO
- FALHA_ENTREGA
FALHA_ENTREGA significa que o e-mail voltou ou o SMS não foi aceito. Trate como acionável: quase sempre é endereço errado, e a correção é corrigir e reenviar.
LINK não envia nada: devolve a URL no campo link do signatário e a entrega passa a ser sua. É o método certo quando o seu produto já tem um canal com o cliente.
- ASSINATURA
- RUBRICA
- NOME
- DATA
- CPF
- CNPJ
- EMAIL
- TEXTO
- CHECKBOX
- IMAGEM
| Valor | Alcance |
PROPRIETARIO | Faturamento, exclusão da organização e transferência de propriedade. |
ADMINISTRADOR | Usuários, perfis, integrações e configuração. |
OPERADOR | Cria e envia documentos. |
VISUALIZADOR | Somente leitura do que lhe foi compartilhado. |
⚠
OPERADOR aqui é o usuário operacional da organização
cliente. O operador da plataforma, funcionário do AdigitalMAX, é outro
ator, tem superfície de rede separada com autenticação própria, nunca aparece neste
enum e não é aceito nesta API.
- organizacao:ler
- organizacao:escrever
- documentos:ler
- documentos:escrever
- signatarios:ler
- signatarios:escrever
- pastas:ler
- pastas:escrever
- modelos:ler
- modelos:escrever
- arquivos:ler
- auditoria:ler
- webhooks:gerenciar
- consumo:ler
O que cada um concede está em Autenticação. Os mesmos nomes valem como escopos de OAuth 2.0.
| Evento | Disparado quando |
document.created | O documento é criado, sempre como rascunho. |
document.sent | Sai do rascunho e os convites partem. Marca o consumo de um envelope. |
document.viewed | Um signatário abre o documento pela primeira vez. |
signer.authenticated | Um signatário cumpre todos os fatores exigidos. |
document.signed | Um signatário assina. Dispara uma vez por signatário. |
document.completed | O último signatário assinou. É aqui que o PDF assinado e o certificado passam a existir. |
document.refused | Um signatário recusa, com motivo no payload. |
document.expired | O prazo venceu sem conclusão. |
document.cancelled | Quem enviou cancelou. |
São os únicos valores minúsculos do contrato, no formato recurso.acao, por
serem contrato público já definido. O formato do envio e a validação da assinatura estão
em Webhooks.
- ENVELOPE_ENVIADO
- DOCUMENTO_ENVIADO
- ASSINATURA_COLETADA
- REQUISICAO_API
- EMAIL_ENVIADO
- SMS_ENVIADO
- WHATSAPP_ENVIADO
- VERIFICACAO_BIOMETRICA
- CARIMBO_TEMPO
- ARMAZENAMENTO_MB_DIA
O que dispara cada contador está em Limites e consumo.
Os dezesseis valores estáveis do campo codigo. É por eles que o seu cliente ramifica, e não pelo texto nem pelo status.
- NAO_AUTENTICADO
- CREDENCIAL_INVALIDA
- MFA_OBRIGATORIO
- SENHA_FRACA
- TOKEN_INVALIDO
- ESCOPO_INSUFICIENTE
- PAPEL_INSUFICIENTE
- NAO_ENCONTRADO
- ENTRADA_INVALIDA
- DOCUMENTO_IMUTAVEL
- CERTIFICADO_INDISPONIVEL
- AUTENTICACAO_INCOMPLETA
- LINK_INDISPONIVEL
- FRANQUIA_ESGOTADA
- LIMITE_EXCEDIDO
- CONFLITO
O que fazer em cada um está em Erros.
Nada nesta página casa com a sua busca. Tente o nome da rota sem barra, o nome do campo em
camelCase, ou um valor de enumeração em maiúsculas.