Documentação da API de integração
Versão v1. Cadastre, consulte e atualize a base monitorada pelo seu sistema e
receba avisos por webhook.
Introdução
A API de integração deixa o sistema da sua empresa cadastrar, consultar, atualizar e remover documentos da base monitorada do Datarich, e os webhooks avisam o seu sistema quando algo importante acontece.
Quem libera o acesso é o Administrador da sua conta, na tela Integrações do app: ele cria um sistema integrado, escolhe o que ele pode fazer e recebe a chave. A mesma regra da tela vale para a API — o que a tela recusa (documento inválido, fonte não habilitada, conta bloqueada), a API recusa igual.
Endereço base: https://api.datarich.com.br /api/v1/public/integration/v1
Autenticação
Chave de API
Envie a chave no cabeçalho X-Api-Key (ou Authorization: Bearer <chave>) em toda chamada. O formato é drk_<id>_<segredo>.
A chave aparece uma única vez, ao ser criada ou rotacionada: guarde-a no cofre do seu sistema. O Datarich guarda só um resumo (hash) dela; se você perder, gere outra — a antiga deixa de valer na hora. Revogar é definitivo.
A chave é sua e só sua: nunca coloque em código de navegador ou de aplicativo distribuído, e nunca em repositório.
A conta vem da chave
Você não informa conta nem usuário: a conta é sempre a da chave. Cada chave só enxerga os documentos que ela mesma cadastrou (ou que apresentou já existindo na base); qualquer outro documento responde 404, como se não existisse.
Opcionalmente o Administrador limita a chave a uma lista de endereços IP (ou faixas CIDR) e define uma data de expiração.
Acessos (escopos)
| Acesso | Permite |
entities:read | Consultar documentos e resultados. |
entities:write | Cadastrar, atualizar e remover documentos. |
Rotas
- GET
/sources
— Lista as fontes habilitadas na sua conta, com o preço final por consulta. - POST
/entities
— Cadastra documentos em lote e agenda a primeira consulta. - GET
/entities
— Lista os documentos da chave, com a situação e o último resultado de cada fonte. - GET
/entities/{id}
— Situação do monitoramento e resultado atual de cada fonte. - PATCH
/entities/{id}
— Pausa ou retoma o monitoramento, muda a frequência ou a referência externa. - DELETE
/entities/{id}
— Remove o documento e todo o seu histórico (definitivo).
GET /sources
Lista as fontes habilitadas na sua conta, com o preço final por consulta.
Acesso necessário: entities:read · Sucesso: 200
- Use os
id devolvidos em id_data_sources ao cadastrar documentos. Só aparecem fontes habilitadas pelo Administrador em Fontes de dados.
Exemplo de chamada
curl -X GET 'https://api.datarich.com.br/api/v1/public/integration/v1/sources' \
-H 'X-Api-Key: <sua chave>'
Exemplo de resposta
[
{ "id": "3f1c0c8e-0000-4000-8000-000000000001", "code": "EXEMPLO_CNPJ", "name": "Dados cadastrais de CNPJ", "tipo_entidade": "empresa", "preco": 0.25 }
]
POST /entities
Cadastra documentos em lote e agenda a primeira consulta.
Acesso necessário: entities:write · Sucesso: 201
tipo_entidade: pessoa (CPF), empresa (CNPJ) ou imovel (CEP). Pessoa exige data_nascimento (aaaa-mm-dd, dd/mm/aaaa ou ddmmaaaa), exigência da Receita Federal.id_data_sources: ao menos uma fonte habilitada e do tipo certo. monitorado (padrão true) e frequencia_dias definem a reconsulta recorrente.referencia_externa (até 120 caracteres) é o identificador do SEU sistema; volta nas consultas e nos webhooks.- O lote tem um tamanho máximo definido pela plataforma. Repetir o pedido é seguro: o documento é a chave natural, então não duplica nem cobra de novo.
- A resposta nunca devolve o documento.
indice é a posição do item no seu pedido; aceito: false indica item recusado (documento inválido, fonte inválida ou dado do titular ausente).
Exemplo de chamada
curl -X POST 'https://api.datarich.com.br/api/v1/public/integration/v1/entities' \
-H 'X-Api-Key: <sua chave>' \
-H 'Content-Type: application/json' \
-d '{ "items": [ { "tipo_entidade": "empresa", "documento": "11.222.333/0001-81", "referencia_externa": "cliente-42", "id_data_sources": ["3f1c0c8e-0000-4000-8000-000000000001"], "monitorado": true, "frequencia_dias": 30 }, { "tipo_entidade": "pessoa", "documento": "529.982.247-25", "data_nascimento": "1980-05-17", "referencia_externa": "cliente-43", "id_data_sources": ["3f1c0c8e-0000-4000-8000-000000000002"] } ] }'
Exemplo de resposta
{
"criados": 2,
"ja_existentes": 0,
"invalidos": 0,
"itens": [
{ "indice": 0, "id": "9b2f6c40-0000-4000-8000-0000000000a1", "referencia_externa": "cliente-42", "aceito": true },
{ "indice": 1, "id": "9b2f6c40-0000-4000-8000-0000000000a2", "referencia_externa": "cliente-43", "aceito": true }
]
}
GET /entities
Lista os documentos da chave, com a situação e o último resultado de cada fonte.
Acesso necessário: entities:read · Sucesso: 200
- Parâmetros:
page, page_size e referencia_externa (filtra pela referência do seu sistema).
Exemplo de chamada
curl -X GET 'https://api.datarich.com.br/api/v1/public/integration/v1/entities' \
-H 'X-Api-Key: <sua chave>'
Exemplo de resposta
{
"items": [ { "id": "9b2f6c40-0000-4000-8000-0000000000a1", "tipo_entidade": "empresa", "referencia_externa": "cliente-42", "monitorado": true, "frequencia_dias": 30, "resultados": [] } ],
"page": 1,
"page_size": 20,
"total": 1
}
GET /entities/{id}
Situação do monitoramento e resultado atual de cada fonte.
Acesso necessário: entities:read · Sucesso: 200
- Traz classificação, tom e datas. Dados do titular (nome, endereço) não saem pela API — só no app, a quem tem permissão.
Exemplo de chamada
curl -X GET 'https://api.datarich.com.br/api/v1/public/integration/v1/entities/{id}' \
-H 'X-Api-Key: <sua chave>'
Exemplo de resposta
{
"id": "9b2f6c40-0000-4000-8000-0000000000a1",
"tipo_entidade": "empresa",
"referencia_externa": "cliente-42",
"monitorado": true,
"motivo_pausado": null,
"frequencia_dias": 30,
"proxima_reconsulta": "2026-11-07T12:00:00Z",
"resultados": [
{
"id_data_source": "3f1c0c8e-0000-4000-8000-000000000001",
"fonte": "Dados cadastrais de CNPJ",
"classificacao": "Ativa",
"tom": "info",
"atualizado_em": "2026-10-08T12:00:00Z",
"valido_ate": "2026-11-07T12:00:00Z"
}
]
}
PATCH /entities/{id}
Pausa ou retoma o monitoramento, muda a frequência ou a referência externa.
Acesso necessário: entities:write · Sucesso: 200
- Envie só o que quer mudar:
monitorado, motivo, frequencia_dias, referencia_externa.
Exemplo de chamada
curl -X PATCH 'https://api.datarich.com.br/api/v1/public/integration/v1/entities/{id}' \
-H 'X-Api-Key: <sua chave>' \
-H 'Content-Type: application/json' \
-d '{ "monitorado": false, "motivo": "cliente encerrou o contrato", "frequencia_dias": 90 }'
Exemplo de resposta
{
"id": "9b2f6c40-0000-4000-8000-0000000000a1",
"tipo_entidade": "empresa",
"referencia_externa": "cliente-42",
"monitorado": true,
"motivo_pausado": null,
"frequencia_dias": 30,
"proxima_reconsulta": "2026-11-07T12:00:00Z",
"resultados": [
{
"id_data_source": "3f1c0c8e-0000-4000-8000-000000000001",
"fonte": "Dados cadastrais de CNPJ",
"classificacao": "Ativa",
"tom": "info",
"atualizado_em": "2026-10-08T12:00:00Z",
"valido_ate": "2026-11-07T12:00:00Z"
}
]
}
DELETE /entities/{id}
Remove o documento e todo o seu histórico (definitivo).
Acesso necessário: entities:write · Sucesso: 204
Exemplo de chamada
curl -X DELETE 'https://api.datarich.com.br/api/v1/public/integration/v1/entities/{id}' \
-H 'X-Api-Key: <sua chave>'
Webhooks
Um webhook é uma URL do seu sistema que o Datarich chama (POST, JSON) quando um evento acontece. O Administrador cadastra a URL em Integrações, escolhe os eventos e recebe o segredo de assinatura (whsec_...), mostrado uma única vez.
O corpo nunca leva documento, nome nem data de nascimento: só identificadores, a fonte e a classificação. Para o detalhe, consulte a API com o id_monitored_entity.
Um webhook pode ser ligado a uma chave: então recebe só os eventos dos documentos dela, e data.referencia_externa traz a referência do seu sistema.
Eventos
| Evento | Quando |
query.completed | Uma consulta terminou com sucesso (e foi cobrada). |
query.failed | A consulta falhou. detalhe.motivo é falha_da_fonte ou dados_do_titular. |
monitoring.result_changed | A classificação de um documento mudou. Traz a anterior e a nova. |
credit.low | O motor pausou por crédito insuficiente. No máximo um aviso pendente por webhook. |
Corpo
{
"id": "4c7d1e22-0000-4000-8000-0000000000b1",
"evento": "monitoring.result_changed",
"ocorrido_em": "2026-10-08T12:00:00.0000000Z",
"data": {
"id_monitored_entity": "9b2f6c40-0000-4000-8000-0000000000a1",
"tipo_entidade": "empresa",
"referencia_externa": "cliente-42",
"detalhe": {
"fonte": "EXEMPLO_CNPJ",
"classificacao_anterior": "Ativa",
"classificacao": "Baixada",
"tom": "critical"
}
}
}
Cabeçalhos
| Cabeçalho | Conteúdo |
X-Datarich-Event | Nome do evento (ex.: monitoring.result_changed). |
X-Datarich-Event-Id | Identificador do evento. Use para deduplicar: o mesmo evento pode chegar mais de uma vez. |
X-Datarich-Delivery-Id | Identificador desta entrega. |
X-Datarich-Timestamp | Instante do envio, em segundos Unix. |
X-Datarich-Signature | Assinatura: v1= seguido do HMAC-SHA256 em hexadecimal. |
Como verificar a assinatura
- Calcule
HMAC-SHA256(segredo, "<timestamp>.<corpo exato recebido>") em hexadecimal, prefixe com v1= e compare com X-Datarich-Signature em tempo constante. - Use o corpo bruto, antes de converter para objeto: qualquer espaço ou ordem de campos diferente muda a assinatura.
- Recuse timestamps muito antigos (sugestão: mais de 5 minutos) para impedir a repetição de uma mensagem capturada.
Node.js
import { createHmac, timingSafeEqual } from 'node:crypto';
// `rawBody` = o corpo EXATAMENTE como chegou (string), antes de qualquer JSON.parse.
export function isValid(secret, headers, rawBody, toleranceSeconds = 300) {
const timestamp = Number(headers['x-datarich-timestamp']);
if (!Number.isFinite(timestamp) || Math.abs(Date.now() / 1000 - timestamp) > toleranceSeconds) return false;
const expected = 'v1=' + createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest('hex');
const received = String(headers['x-datarich-signature'] ?? '');
return expected.length === received.length && timingSafeEqual(Buffer.from(expected), Buffer.from(received));
}
C#
using System.Security.Cryptography;
using System.Text;
// rawBody = o corpo EXATAMENTE como chegou, antes de desserializar.
static bool IsValid(string secret, string timestampHeader, string signatureHeader, string rawBody, int toleranceSeconds = 300) {
if (!long.TryParse(timestampHeader, out var timestamp)) return false;
if (Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - timestamp) > toleranceSeconds) return false;
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
var expected = "v1=" + Convert.ToHexString(hmac.ComputeHash(Encoding.UTF8.GetBytes($"{timestamp}.{rawBody}"))).ToLowerInvariant();
return CryptographicOperations.FixedTimeEquals(Encoding.ASCII.GetBytes(expected), Encoding.ASCII.GetBytes(signatureHeader));
}
Python
import hashlib, hmac, time
def is_valid(secret: str, timestamp_header: str, signature_header: str, raw_body: str, tolerance_seconds: int = 300) -> bool:
# raw_body = o corpo EXATAMENTE como chegou, antes de json.loads.
try:
timestamp = int(timestamp_header)
except ValueError:
return False
if abs(time.time() - timestamp) > tolerance_seconds:
return False
digest = hmac.new(secret.encode(), f"{timestamp}.{raw_body}".encode(), hashlib.sha256).hexdigest()
return hmac.compare_digest("v1=" + digest, signature_header)
Entrega e novas tentativas
- Responda com qualquer status 2xx dentro do tempo máximo definido pela plataforma. Outra resposta, ou falha de conexão, agenda nova tentativa em intervalos crescentes.
- Esgotadas as tentativas, a entrega fica como falhou e o Administrador pode reenviá-la na tela Integrações. O histórico de entregas fica disponível por um período limitado.
- A URL precisa ser https, na porta padrão, com endereço público. O endereço é conferido a cada envio; redirecionamentos não são seguidos.
Para começar, o Administrador da sua conta cria o sistema integrado em Integrações, dentro
do app.
Contratar
·
Perguntas frequentes