Suporte: suporte@alethor.com.br alethor.com.br ↗ Baixar Collection

Documentação · API REST

Envie um documento.
Receba dados estruturados e validados.

A Alethor API recebe documentos de compliance brasileiros — de CPF a PGR — extrai os campos, valida a consistência e devolve o resultado. Quando um documento finaliza, a API pode notificar seu sistema automaticamente por webhook.

Autenticação

Toda chamada, exceto o login, exige um token. Faça Login, guarde o token retornado e envie-o no cabeçalho Authorization em todas as requisições seguintes.

Authorization: Bearer {{token}}
Accept: application/json

A base de todos os caminhos é a variável {{endpoint_base}} da collection. As variáveis token, webhook_id e delivery_id são preenchidas conforme você avança.

Padrão de retorno

As respostas seguem uma estrutura previsível. Em caso de sucesso, os dados vêm em data; mensagens legíveis vêm em message.

Sucesso

{
  "message": "Operação realizada.",
  "data": { /* recurso ou lista */ }
}

Erro de validação (422)

{
  "message": "The given data was invalid.",
  "errors": {
    "url": ["The url must be a valid HTTPS URL."]
  }
}
CódigoSignificado
200 / 201Sucesso. 201 em criações.
401Token ausente ou inválido.
404Recurso não encontrado — ou pertence a outra empresa.
422Dados inválidos. Detalhes em errors.
429Limite de requisições atingido.
Isolamento por empresaUm recurso de outra empresa retorna 404, nunca 403 — a API não confirma sequer a existência de dados que não são seus.

Collection do Postman

Importe a collection para ter todos os endpoints prontos, com variáveis e exemplos de corpo já configurados.

⬇ Baixar alethor_api__V06.postman_collection.json

Login

POST/auth/login

Autentica o usuário e devolve o token de acesso. É o primeiro passo de qualquer integração.

Corpo (form-data)

CampoTipoDescrição
emailtextE-mail do usuário.
passwordtextSenha.

Guarde o token retornado na variável {{token}}.

Me

POST/auth/me

Retorna os dados do usuário autenticado. Útil para confirmar que o token é válido e a qual empresa ele pertence.

Logout

POST/auth/logout

Invalida o token atual. Após o logout, é necessário fazer login novamente para obter um novo token.

Enviar documento

POST/document/create

Envia um arquivo para processamento. A API separa páginas, extrai os campos e valida. O resultado é consultado depois pelo endpoint de resultado, ou entregue por webhook quando finaliza.

Corpo (form-data)

CampoTipoDescrição
filefileO documento. Formatos aceitos abaixo.
document_typetextO tipo do documento, ex.: cnh, contrato-social.

A resposta traz o identificador do documento (UUID), usado para consultar o resultado.

Enviar com reconciliação

POST/document/createcom reconciliation_input

Além de extrair, a API confere os campos extraídos contra valores que você já conhece. Envie reconciliation_input com os campos esperados e a API informa se batem.

Corpo (form-data)

CampoTipoDescrição
filefileO documento.
document_typetextTipo do documento.
reconciliation_inputtext (JSON)Lista de campos esperados e o modo de comparação.

Exemplo de reconciliation_input

[
  { "field": "cnh.nome_completo", "value": "JOSE DA SILVA", "match_mode": "strict" },
  { "field": "cnh.cpf",           "value": "099.123.456-79", "match_mode": "strict" }
]
match_modeComportamento
strictComparação exata do valor.
tolerantComparação tolerante a variações (acentos, espaçamento, caixa).

Resultado do documento

GET/document/result/{uuid}

Consulta o resultado de um documento pelo seu UUID: os dados extraídos, o resultado da validação e, quando houver, o resultado da reconciliação.

Este é também o endereço que chega no payload do webhook, no campo result_url — é como seu sistema recupera o resultado completo após ser notificado.

Documento trancado pelo prazo de retenção

Vencido o prazo de retenção, o conteúdo do documento é trancado e deixa de ser servido. A resposta continua 200 com status deleted e extracted_data vazio, e traz o motivo:

{
  "document_id": "uuid",
  "document_type": "holerite",
  "status": "deleted",
  "extracted_data": {},
  "error_code": "documento_trancado_lgpd",
  "message": "O conteúdo deste documento foi trancado pelo prazo de retenção. Para contestação de extração, abra um chamado no Console, assunto 'Contestação de extração'."
}
Já apagadoDocumento cujo pacote já foi apagado responde deleted sem error_code: não há o que contestar.

Tipos e formatos suportados

Formatos de arquivo

PDFJPGJPEG PNGTIFF

Tipos de documento (document_type)

CPFRGCNH PassaporteTítulo de Eleitor Comprovante de ResidênciaContrato Social Requerimento de EmpresárioEstatuto Social Comprovante de PagamentoComprovante de Conta Bancária Folha de PagamentoFolha de Ponto CCMEIHoleriteDRE ASOASO DemissionalPGR

Acesso do titular (LGPD)

GET/lgpd/documents/holder

Atende ao direito de acesso do titular (art. 18 da LGPD). Como a Alethor é operadora, o acesso é exercido pela sua empresa (a controladora): localize os documentos de um titular dentro da janela de retenção, antes do trancamento.

Parâmetros (query)

ParâmetroObrigatórioDescrição
cpfsimCPF do titular. Aceita qualquer formato (123.456.789-00 ou 12345678900) — normalizado para dígitos.
namenãoNome completo. Refina a busca; case e acento-insensível.

Exemplo

GET {{endpoint_base}}lgpd/documents/holder?cpf=12345678900&name=João da Silva

Resposta

{
  "count": 1,
  "has_more": false,
  "documents": [
    {
      "document_id": "uuid",
      "file_original": "holerite_joao.pdf",
      "stage": "FINALIZADO",
      "created_at": "2026-07-29T...",
      "extracted_data_public": { /* campos servidos ao cliente */ }
    }
  ],
  "observacao": "Documentos com conteúdo trancado não aparecem nesta consulta; o pedido do titular sobre eles é atendido pelo encarregado (lgpd@inroot.com.br)."
}
Só na janela de retençãoA busca considera apenas documentos FINALIZADO — os que ainda não foram trancados. Documento com conteúdo trancado não aparece aqui; o pedido do titular sobre ele é atendido pelo encarregado (lgpd@inroot.com.br), como diz o campo observacao.
Sem vazamento de campos internosA resposta traz apenas campos servíveis ao cliente. Campos internos de diagnóstico nunca aparecem — nem na resposta, nem na busca. cpf é obrigatório para impedir varredura da base por nome.
Teto de resultadosRetorna no máximo 100 documentos. Quando há mais, has_more vem true — refine por name para estreitar.

Webhooks — ordem de configuração

Um webhook notifica seu sistema quando um documento é finalizado. A configuração segue uma ordem: você cria, o endpoint é verificado, e só então ele passa a receber. Siga os passos abaixo.

  1. Criar o webhook — POST /webhooksO webhook nasce inativo. A resposta traz o secret em texto claro uma única vez — guarde-o.
  2. Verificação de posse (automática)A API envia um desafio ao seu endpoint. Seu endpoint precisa devolver o mesmo desafio para provar que a URL é sua.
  3. AtivaçãoSe o desafio for devolvido corretamente, o webhook é ativado. A partir daí ele recebe os documentos finalizados.
  4. Reverificar quando necessário — POST /webhooks/{id}/verifySe a verificação falhou (endpoint fora do ar, URL errada), corrija e chame verify para tentar de novo — sem recadastrar.
Um único webhook ativoCada empresa pode ter apenas um webhook ativo por vez. Quando um novo webhook é criado e passa na verificação, a API desativa automaticamente todos os outros webhooks ativos daquela empresa. A resposta informa quais foram desativados.
Por que a troca só ocorre após verificarA desativação dos demais acontece no instante em que o novo webhook é ativado com sucesso, não no cadastro. Assim, se a URL nova estiver errada e a verificação falhar, o webhook que já funcionava continua ativo — você nunca fica sem cobertura por causa de um erro de digitação.
Troca de URL exige reverificaçãoAlterar a url de um webhook (via PATCH) o desativa e exige nova verificação, fechando a brecha de repontar um webhook já ativo para um destino não confirmado.

Criar webhook

POST/webhooks

Registra um endpoint. Nasce inativo até a verificação de posse.

Corpo

{
  "url": "https://seu-sistema.com.br/webhooks/alethor",
  "events": ["document.finalized"],
  "payload_mode": "full"
}
CampoDescrição
urlDestino HTTPS, e precisa ser a URL final do seu endpoint. Endereços privados e não-HTTPS são recusados, e o destino é conferido de novo antes de cada envio. Redirecionamentos não são seguidos: uma resposta 3xx conta como falha da entrega.
eventsEventos assinados. Hoje: document.finalized.
payload_modefull inclui extracted_data_public no payload; reference envia só os identificadores e o result_url.
O secret aparece uma vezO secret usado para assinar as entregas é retornado apenas nesta resposta. Se perdê-lo, gere outro em rotate-secret.

Verificar webhook

POST/webhooks/{id}/verify

Dispara (ou repete) a verificação de posse. A API envia um desafio à URL; seu endpoint deve devolvê-lo no corpo da resposta. Em caso de sucesso, o webhook é ativado — e os demais webhooks ativos da empresa são desativados. O desafio precisa ser respondido na própria URL cadastrada: a API não segue redirecionamentos, e destino que aponta para endereço privado ou que não resolve não recebe o desafio.

Seu endpoint deve responder ao desafio

// a API envia:  { "type": "verification", "challenge": "aB3xK9..." }
// seu endpoint devolve o mesmo challenge:
{ "challenge": "aB3xK9..." }

Listar webhooks

GET/webhooks

Retorna todos os webhooks da sua empresa, ativos e inativos.

Detalhar webhook

GET/webhooks/{id}

Mostra a configuração e o estado de um webhook: se está ativo, quando foi verificado, últimos sucessos e falhas. O secret nunca é retornado aqui.

Atualizar webhook

PATCH/webhooks/{id}

Altera events, payload_mode ou is_active. Reativar um webhook (is_active: true) desativa o que estiver ativo na empresa. Só webhook verificado pode ser ativado: sem verificação a resposta é 409 e nada muda — chame verify antes.

{
  "events": ["document.finalized"],
  "payload_mode": "reference",
  "is_active": true
}
Alterar a URLSe o PATCH mudar a url, o webhook é desativado e precisa passar por nova verificação antes de voltar a receber.

Remover webhook

DELETE/webhooks/{id}

Remove o webhook. O histórico de auditoria da remoção é preservado.

Testar webhook

POST/webhooks/{id}/test

Envia um payload de exemplo (com dados fictícios) ao seu endpoint. Serve para validar a integração sem esperar um documento real. Não gera registro de entrega. A resposta traz o status e o corpo que o seu endpoint devolveu, e redirecionamentos não são seguidos. Destino que aponta para endereço privado, ou cujo host não resolve, responde 422 sem que nada seja enviado.

Rotacionar segredo

POST/webhooks/{id}/rotate-secret

Gera um novo secret de assinatura e invalida o anterior. O novo valor é retornado em texto claro uma única vez. Use quando perder o segredo ou suspeitar de exposição.

Auditoria

GET/webhooks/{id}/audit-logsum webhook
GET/audit-logs-history-webhooks-companytoda a empresa

Histórico de todas as mudanças de configuração — criação, alteração, ativação, desativação, rotação de segredo e remoção. O segredo nunca aparece em texto claro nos registros. O histórico da empresa inclui webhooks já removidos.

Listar entregas

GET/webhooks/{id}/deliveries

Lista as tentativas de entrega de um webhook. Cada documento finalizado gera uma entrega. Use os filtros para investigar falhas.

Filtros (query)

ParâmetroDescrição
statussuccess, failed, exhausted ou pending.
document_idFiltra pelas entregas de um documento.
from / toIntervalo de datas.
StatusSignificado
pendingAguardando envio ou próxima tentativa.
successEntregue (resposta 2xx). Estado final.
failedFalhou, ainda há novas tentativas agendadas.
exhaustedEsgotou as tentativas, ou erro definitivo do cliente (ex.: 404). Estado final.

Resposta do seu endpoint

response_body traz o que o seu endpoint respondeu. Quando o conteúdo do documento é trancado ou apagado pela política de retenção, essa resposta deixa de ser guardada: response_body vem null e conteudo_indisponivel diz o motivo.

conteudo_indisponivelSignificado
nullA resposta está disponível em response_body (que também pode ser null se o seu endpoint não respondeu).
"trancado"O conteúdo do documento foi trancado pelo prazo de retenção.
"apagado"O conteúdo do documento foi apagado pela política de retenção.
{
  "id": "9d3c…",
  "status": "success",
  "response_status": 200,
  "response_body": null,
  "conteudo_indisponivel": "trancado",
  …
}
Histórico guardadoAs entregas não são apagadas por idade: a listagem continua mostrando entregas antigas, com o conteúdo pessoal retirado.

Reenviar uma entrega — Redeliver

POST/webhooks/{id}/deliveries/{delivery_id}/redeliver

Reenvia uma entrega específica, identificada pelo seu delivery_id. É cirúrgico: uma entrega, uma vez.

Use quando você viu, na listagem, exatamente qual entrega falhou e quer reenviá-la após corrigir seu endpoint.

Documento trancado ou apagadoEntrega de documento com conteúdo trancado pelo prazo de retenção é recusada com 422 e error_code documento_trancado_lgpd; de documento já apagado, com document_deleted. Nenhuma entrega é criada.

Janela de reenvio

O reenvio só é possível enquanto o conteúdo do documento não estiver trancado. Pela política de retenção, o conteúdo é trancado:

Caso (redelivery_window_days)Prazo
after_first_successful_delivery3 dias depois da primeira entrega bem-sucedida do documento.
completed_without_successful_delivery7 dias depois da conclusão, se nenhuma entrega teve sucesso.
permanent_error7 dias depois da falha permanente.
never_processed7 dias depois do recebimento, se o documento nunca foi processado.

Entrega não encontrada

Um delivery_id que não existe responde 404 com error_code delivery_not_found e o bloco retention:

{
  "message": "Delivery not found. It may never have existed, or it may have been removed by the retention policy.",
  "error_code": "delivery_not_found",
  "retention": {
    "note": "Delivery records are kept. A delivery can be redelivered only while its document's content is not locked under the data retention policy. …",
    "redelivery_window_days": {
      "after_first_successful_delivery": 3,
      "completed_without_successful_delivery": 7,
      "permanent_error": 7,
      "never_processed": 7
    },
    "not_retained_before": null,
    "oldest_surviving_delivery_at": "2026-10-11T12:00:00+00:00"
  },
  "data": null
}
Obsoletonot_retained_before vem sempre null. Ele trazia a data de corte do apagamento das entregas por idade, que deixou de existir. O campo foi mantido para não quebrar integrações; não dependa dele.

Reenviar em lote — Replay

POST/webhooks/{id}/deliveries/replay

Reenvia todas as entregas que casam com um filtro. Você não aponta IDs — descreve um critério (data + status) e a API reenvia o lote.

Corpo

{
  "date": "2026-07-26",
  "status": "exhausted"
}
CampoDescrição
dateUm dia (AAAA-MM-DD). A API considera o dia inteiro, no fuso da aplicação.
statusQuais entregas reenviar, normalmente exhausted.
Use uma data, não a meia-noiteInforme o dia (2026-07-26) e a API expande para o dia todo. Enviar um intervalo com hora Z pode escapar do fuso local e não casar nenhuma entrega.
Documentos trancados ou apagadosO lote não é recusado: entregas de documento com conteúdo trancado são puladas e listadas em skipped_document_locked (reason documento_trancado_lgpd); as de documento já apagado, em skipped_document_deleted. Cada bloco traz count, truncated e até 200 pares delivery_id/document_id, e só aparece quando algo foi pulado.
Janela de reenvioQuando nada é enfileirado, ou quando alguma entrega é pulada por documento trancado, a resposta traz o bloco retention com note, redelivery_window_days e not_retained_before (obsoleto, sempre null). Os prazos são os da janela de reenvio. O período pedido continua limitado a 90 dias.
Deixaram de ocorrerOs motivos window_partially_purged e window_fully_purged, e os campos requested_from e complete_from que vinham com eles, não são mais emitidos: as entregas não são apagadas por idade.

Redeliver × Replay — qual usar

Os dois reenviam entregas. A diferença é escala e seletor.

POST Redeliver

Uma entrega, apontada pelo delivery_id.

Cirúrgico. Você já sabe qual entrega quer reenviar.

Quando: uma entrega específica falhou e você quer reenviar só ela.

POST Replay

Várias entregas, por filtro (data + status).

Em lote. Você descreve um critério, a API reenvia todas que casam.

Quando: seu endpoint ficou fora do ar e muitas entregas falharam no período.
Em comumAmbos criam uma nova entrega vinculada à original (via replay_of) e nunca alteram a entrega original — o histórico de auditoria permanece intacto.