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ódigo | Significado |
|---|---|
200 / 201 | Sucesso. 201 em criações. |
401 | Token ausente ou inválido. |
404 | Recurso não encontrado — ou pertence a outra empresa. |
422 | Dados inválidos. Detalhes em errors. |
429 | Limite de requisições atingido. |
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.
Login
Autentica o usuário e devolve o token de acesso. É o primeiro passo de qualquer integração.
Corpo (form-data)
| Campo | Tipo | Descrição |
|---|---|---|
email | text | E-mail do usuário. |
password | text | Senha. |
Guarde o token retornado na variável {{token}}.
Me
Retorna os dados do usuário autenticado. Útil para confirmar que o token é válido e a qual empresa ele pertence.
Logout
Invalida o token atual. Após o logout, é necessário fazer login novamente para obter um novo token.
Enviar documento
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)
| Campo | Tipo | Descrição |
|---|---|---|
file | file | O documento. Formatos aceitos abaixo. |
document_type | text | O tipo do documento, ex.: cnh, contrato-social. |
A resposta traz o identificador do documento (UUID), usado para consultar o resultado.
Enviar com reconciliação
reconciliation_inputAlé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)
| Campo | Tipo | Descrição |
|---|---|---|
file | file | O documento. |
document_type | text | Tipo do documento. |
reconciliation_input | text (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_mode | Comportamento |
|---|---|
strict | Comparação exata do valor. |
tolerant | Comparação tolerante a variações (acentos, espaçamento, caixa). |
Resultado do documento
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'."
}
deleted sem error_code: não há o que contestar.Tipos e formatos suportados
Formatos de arquivo
Tipos de documento (document_type)
Acesso do titular (LGPD)
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âmetro | Obrigatório | Descrição |
|---|---|---|
cpf | sim | CPF do titular. Aceita qualquer formato (123.456.789-00 ou 12345678900) — normalizado para dígitos. |
name | não | Nome 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)."
}
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.cpf é obrigatório para impedir varredura da base por nome.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.
- Criar o webhook —
POST /webhooksO webhook nasce inativo. A resposta traz osecretem texto claro uma única vez — guarde-o. - 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.
- AtivaçãoSe o desafio for devolvido corretamente, o webhook é ativado. A partir daí ele recebe os documentos finalizados.
- Reverificar quando necessário —
POST /webhooks/{id}/verifySe a verificação falhou (endpoint fora do ar, URL errada), corrija e chameverifypara tentar de novo — sem recadastrar.
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
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"
}
| Campo | Descrição |
|---|---|
url | Destino 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. |
events | Eventos assinados. Hoje: document.finalized. |
payload_mode | full inclui extracted_data_public no payload; reference envia só os identificadores e o result_url. |
secret usado para assinar as entregas é retornado apenas nesta resposta. Se perdê-lo, gere outro em rotate-secret.Verificar webhook
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
Retorna todos os webhooks da sua empresa, ativos e inativos.
Detalhar webhook
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
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
}
PATCH mudar a url, o webhook é desativado e precisa passar por nova verificação antes de voltar a receber.Remover webhook
Remove o webhook. O histórico de auditoria da remoção é preservado.
Testar webhook
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
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
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
Lista as tentativas de entrega de um webhook. Cada documento finalizado gera uma entrega. Use os filtros para investigar falhas.
Filtros (query)
| Parâmetro | Descrição |
|---|---|
status | success, failed, exhausted ou pending. |
document_id | Filtra pelas entregas de um documento. |
from / to | Intervalo de datas. |
| Status | Significado |
|---|---|
pending | Aguardando envio ou próxima tentativa. |
success | Entregue (resposta 2xx). Estado final. |
failed | Falhou, ainda há novas tentativas agendadas. |
exhausted | Esgotou 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_indisponivel | Significado |
|---|---|
null | A 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",
…
}
Reenviar uma entrega — 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.
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_delivery | 3 dias depois da primeira entrega bem-sucedida do documento. |
completed_without_successful_delivery | 7 dias depois da conclusão, se nenhuma entrega teve sucesso. |
permanent_error | 7 dias depois da falha permanente. |
never_processed | 7 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
}
not_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
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"
}
| Campo | Descrição |
|---|---|
date | Um dia (AAAA-MM-DD). A API considera o dia inteiro, no fuso da aplicação. |
status | Quais entregas reenviar, normalmente exhausted. |
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.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.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.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.
POST Replay
Várias entregas, por filtro (data + status).
Em lote. Você descreve um critério, a API reenvia todas que casam.
replay_of) e nunca alteram a entrega original — o histórico de auditoria permanece intacto.