Bureaus
BetaConsulta a bureau com cache que impede pagar duas vezes pelo mesmo CPF
A camada entre a sua esteira e os fornecedores de dado cadastral brasileiro: formato estável, credencial cifrada, uma cobrança por documento consultado e trilha de quem perguntou o quê e por quê.
- Fintechs de crédito que consultam bureau em mais de uma etapa da mesma proposta e pagam por todas
- Times que hoje chamam a API do bureau direto do código da esteira, com o token no header e nada mais
- Operações que precisam provar à auditoria a finalidade de cada consulta a dado pessoal de terceiro
- O `fetch` para a API do bureau espalhado pelo código da esteira
- A planilha que tenta reconciliar a fatura do fornecedor com o que a empresa acha que consultou
- O cache improvisado em Redis que ninguém sabe quando expira
- Um motor de decisão — não aplica regra sobre o dado que traz
- Um serviço de KYC com biometria, prova de vida ou documentoscopia
- Um cadastro de clientes — não guarda o cliente, guarda a consulta
15 endpoints em 3 recursos.
Resumo executivo
O Bureaus fica entre a sua esteira e os fornecedores de dado cadastral brasileiro. Recebe um documento e uma pergunta, escolhe o fornecedor, devolve um formato estável, cobra uma vez só pelo que já perguntou e deixa rastro de quem perguntou e por quê.
Ele existe porque chamar a API do bureau é a parte fácil. O que custa caro é o que vem em volta: o mesmo CPF pago três vezes na mesma proposta, o token do fornecedor em texto puro na configuração, a fatura que ninguém consegue reconciliar, e nenhum registro da finalidade quando a fiscalização pergunta.
Hoje o bloco fala com o BigDataCorp, com 17 tipos de consulta implementados sobre CPF e CNPJ, mais um fornecedor sintético para desenvolvimento e teste. O contrato de fio foi desenhado para que Serasa, QUOD ou Boa Vista entrem depois sem quebrar quem já integrou.
| Consulta cadastral | R$ 0,030 na tabela pública do fornecedor |
| Acerto de cache | 218 ms → 10 ms, custo zero |
| Consultas de uma esteira típica no mesmo CPF | 3 (pré-análise, política, formalização) |
| Cobranças com o bloco | 1 |
O problema
negócioUma esteira de crédito toca o mesmo CPF mais de uma vez: na pré-análise, na aplicação da política e na formalização. Cada toque é uma consulta paga.
O preço unitário é baixo — três centavos —, e é justamente por isso que o desperdício não aparece. Ninguém revisa uma cobrança de três centavos. O problema aparece na fatura do mês, quando o volume multiplicou o descuido por cem mil.
Ao lado disso, três coisas que só aparecem quando já é tarde:
- O segredo. O token do fornecedor costuma ficar em texto puro na configuração da fonte de dados, porque é onde é conveniente colocá-lo.
- A conta. Sem medição por organização, a empresa descobre quanto consultou quando o boleto chega, e não tem como atribuir o custo a quem consumiu.
- A finalidade. Consultar dado pessoal de terceiro exige base legal
declarada. Um
fetchno meio do código não registra por que a consulta aconteceu, e a prova disso é exatamente o que a ANPD pede.
Proposta de valor
negócio- Cache que respeita o que muda. TTL por tipo de consulta — dado cadastral
vive trinta dias, cobrança vive um. Quem chama pode exigir dado fresco com
maxAgeSeconds, então o cache é escolha de quem paga e não imposição. - Uma cobrança por documento, mesmo no pico. Requisições simultâneas do mesmo CPF são deduplicadas com trava no Redis: a primeira consulta, as outras esperam o resultado dela.
- Credencial cifrada por organização, validada antes de ser gravada e nunca devolvida pela API.
- Custo medido e faturável. Cada consulta cobrada vira evento de uso no Billing, com o identificador da consulta como chave de idempotência.
- Trilha que prova a finalidade. Registro imutável por consulta, com o documento em HMAC e máscara, nunca em claro.
- Um contrato só. Trocar ou somar fornecedor não muda o formato que a esteira consome.
Casos de uso reais
negócioEsteira que consulta o mesmo CPF três vezes
Contexto. Fintech de crédito pessoal, quarenta mil propostas por mês. A esteira consulta dado cadastral na pré-análise, de novo ao aplicar a política, e mais uma vez na formalização.
Sem o bloco. Cento e vinte mil consultas pagas por mês para quarenta mil propostas.
Com o bloco. A primeira popula o cache com TTL de trinta dias; as outras duas leem de lá. Quarenta mil consultas pagas, e a esteira não mudou uma linha — o cache é transparente para quem chama.
Analista precisa provar por que consultou um CPF
Contexto. Auditoria interna pergunta por que o CPF de um não-cliente foi consultado em março.
Sem o bloco. Log de aplicação, se houver, sem finalidade nem base legal.
Com o bloco. GET /queries filtrando por documento — o valor vira HMAC no
handler, então o CPF não chega a aparecer nem na query string. A resposta traz
quem consultou, quando, com que finalidade e sob qual base legal.
Empresa quer saber se o fornecedor entrega o que cobra
Contexto. O contrato inclui um dataset de faturamento presumido que custa mais que o dobro da consulta cadastral.
Com o bloco. GET /usage mostra consultas, custo e taxa de acerto do cache
por período e por tipo. Se um tipo custa caro e devolve pouco, o dado para
renegociar está ali — e foi assim que descobrimos que um tipo estava retornando
vazio por erro de mapeamento, não por ausência de dado.
Mercado e diferenciais
negócioO mercado brasileiro de consulta cadastral tem três faixas. Os birôs de crédito — Serasa, Boa Vista, QUOD, SPC — que vendem score e restrição. As plataformas de dado — BigDataCorp, Neoway, Assertiva — que vendem cadastro, contato, endereço e processo. E a fonte primária estatal, o Serpro Datavalid, que valida contra a base oficial em vez de retornar.
Este bloco não compete com nenhum: é a camada que fala com todos.
| Integração direta | Com o Bureaus | |
|---|---|---|
| Mesmo CPF em três etapas | 3 cobranças | 1 |
| Token do fornecedor | Texto puro na config | Cifrado, nunca devolvido |
| Custo por organização | Descoberto na fatura | GET /usage |
| Finalidade da consulta | Não registrada | Campo obrigatório, em trilha imutável |
| Trocar de fornecedor | Reescrever quem consome | Trocar a configuração |
Uma armadilha que o desenho resolve. O score da QUOD vai de 300 a 1000 e o da
Serasa de 0 a 1000. Um score 300 da QUOD é o pior valor possível; um 300 da
Serasa está a um terço do caminho. O canônico guarda value e scale juntos
— gravar só o número perde a informação, e nenhum refactor recupera depois o que
nunca foi capturado.
Modelo de cobrança e ROI
negócioUnidade: consulta a bureau. Precificação do bloco em definição.
Drivers de custo: consultas efetivamente cobradas pelo fornecedor, taxa de acerto do cache, e quais datasets estão habilitados no contrato.
A tabela pública do BigDataCorp para a consulta cadastral é escalonada por volume mensal:
| Consultas no mês | Preço unitário |
|---|---|
| 1 – 10.000 | R$ 0,030 |
| 10.001 – 50.000 | R$ 0,029 |
| 50.001 – 100.000 | R$ 0,027 |
| 100.001 – 500.000 | R$ 0,026 |
| 500.001 – 1.000.000 | R$ 0,024 |
Uma esteira que toca o mesmo documento três vezes paga três vezes. O cache transforma isso em uma. Em quarenta mil propostas por mês, é a diferença entre consumir cento e vinte mil consultas e consumir quarenta mil — e, de quebra, descer de faixa de preço.
O custo é medido, não estimado às cegas. Sai marcado com estimated: true
quando vem da tabela pública; gravando o preço negociado em
settings.priceOverrides, passa a sair com estimated: false.
Arquitetura
flowchart TB
ESTEIRA["Decision Platform<br/>fonte do tipo BUREAU"]
APP["Outro consumidor<br/>Customers, backoffice"]
subgraph BUREAUS["Building Block Bureaus"]
ROTA["POST /queries<br/>valida documento e finalidade"]
CACHE{"cache válido?"}
LOCK["trava no Redis<br/>deduplicação em voo"]
DRIVER["driver do fornecedor<br/>traduz para o canônico"]
TRILHA["trilha imutável<br/>HMAC + máscara"]
end
BDC["BigDataCorp"]
BILL["Billing<br/>via fachada"]
ESTEIRA --> ROTA
APP --> ROTA
ROTA --> CACHE
CACHE -- "sim" --> TRILHA
CACHE -- "não" --> LOCK
LOCK --> DRIVER
DRIVER --> BDC
DRIVER --> TRILHA
TRILHA --> BILLO que o bloco não faz, e quem faz
| Não faz | Quem faz |
|---|---|
| Decidir com o dado — regra, árvore, tabela DMN | Decision Engine |
| Orquestrar a esteira, callback, fila | Decision Platform |
| Guardar o cadastro do cliente | Customers |
| Ler documento em imagem | Data Extraction |
| Biometria, prova de vida, documentoscopia | Fora do escopo |
A fronteira que sustenta isso: bureau responde sobre um documento; KYC responde sobre uma pessoa presente. São contratos comerciais, ciclos de mudança e exigências regulatórias diferentes.
Sem dependência direta de outro building block. O consumo vai ao Billing pela
fachada IBillingFacade; o Decision Platform chega aqui pela IBureausFacade.
Conceitos e modelo de dados
Glossário
| Termo | Significa |
|---|---|
kind | O tipo de pergunta, com namespace: person.basic, company.lawsuits |
| Canônico | O formato estável do bloco, igual para qualquer fornecedor |
raw | A resposta literal do fornecedor, sempre devolvida ao lado do canônico |
asOf | Quando a fonte apurou o dado — diferente de queriedAt, que é quando nós chamamos |
purpose | Finalidade declarada da consulta. Obrigatória, sem valor padrão |
| Sujeito | O documento consultado. Gravado como HMAC, máscara e, opcionalmente, cifrado |
Modelo de dados
| Modelo Prisma | Tabela | Propósito | Campos-chave |
|---|---|---|---|
BureauProviderConfig | bureau_provider_configs | Fornecedor por organização | credentials cifrado, settings, isDefault |
BureauQuery | bureau_queries | Trilha imutável e resultado | subjectHash, subjectMasked, purpose, billable, costAmount |
BureauCacheEntry | bureau_cache_entries | Cache persistente | cacheKey (HMAC), expiresAt |
BureauCachePolicy | bureau_cache_policies | TTL por kind, por organização | kind, ttlSeconds |
costAmount é Decimal(15,4) e não (15,2) como o resto do schema: o preço
unitário de bureau tem três casas (R$ 0,024), e truncar em duas transforma
medição de custo em ficção.
Estados de uma consulta
Os cinco valores são deliberadamente distintos. NOT_FOUND é resposta legítima
e cobrada; NOT_SUPPORTED é configuração e não custa nada. Colapsar o par
destrói a medição de custo e faz o retry insistir numa resposta que não vai
mudar.
Referência da API
Consultas
| Método | Rota | Descrição | Permissão |
|---|---|---|---|
POST | /bureaus/api/v1/queries | Consulta síncrona | BUREAUS_QUERY |
POST | /bureaus/api/v1/queries/batch | Lote, resultado item a item | BUREAUS_QUERY |
GET | /bureaus/api/v1/queries | A trilha | BUREAUS_READ |
GET | /bureaus/api/v1/queries/:id | Resultado, canônico e bruto | BUREAUS_READ |
POST /bureaus/api/v1/queries
Request
{
"kind": "person.basic",
"subject": { "type": "CPF", "value": "529.982.247-25" },
"purpose": "credit_analysis",
"maxAgeSeconds": 86400,
"includeRaw": true
}{
"kind": "person.basic",
"subject": { "type": "CPF", "value": "529.982.247-25" },
"purpose": "credit_analysis",
"maxAgeSeconds": 86400,
"includeRaw": true
}| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
kind | enum | sim | Tipo de consulta — ver GET /catalog |
subject.type | CPF, CNPJ, PHONE, EMAIL | sim | Tipo do documento |
subject.value | string | sim | Aceita com ou sem pontuação |
purpose | enum | sim | credit_analysis, fraud_prevention, onboarding, collection, regulatory_compliance, contract_execution |
legalBasis | string | não | Base legal, quando a organização exige registrá-la |
maxAgeSeconds | inteiro | não | Idade máxima aceita do cache. 0 força ida ao fornecedor |
providerHint | enum | não | Força um fornecedor específico |
includeRaw | booleano | não | Padrão true |
Resposta 201
{
"data": {
"queryId": "3f2a0c1e-…",
"kind": "person.basic",
"provider": "BIGDATACORP",
"status": "FOUND",
"subject": { "type": "CPF", "masked": "***.***.247-25" },
"data": { "name": "…", "taxIdStatus": "REGULAR", "deceased": false },
"raw": { "…": "resposta literal do fornecedor" },
"asOf": "2026-07-10T00:00:00.000Z",
"queriedAt": "2026-08-25T14:02:11.000Z",
"cached": false,
"cost": { "amount": "0.0300", "currency": "BRL", "estimated": true },
"elapsedMs": 412
}
}{
"data": {
"queryId": "3f2a0c1e-…",
"kind": "person.basic",
"provider": "BIGDATACORP",
"status": "FOUND",
"subject": { "type": "CPF", "masked": "***.***.247-25" },
"data": { "name": "…", "taxIdStatus": "REGULAR", "deceased": false },
"raw": { "…": "resposta literal do fornecedor" },
"asOf": "2026-07-10T00:00:00.000Z",
"queriedAt": "2026-08-25T14:02:11.000Z",
"cached": false,
"cost": { "amount": "0.0300", "currency": "BRL", "estimated": true },
"elapsedMs": 412
}
}Erros
| Status | Código | Quando |
|---|---|---|
400 | VALIDATION | purpose ausente, dígito verificador inválido, kind incompatível com o tipo de documento |
403 | FORBIDDEN | Token sem organizationId ou sem a permissão |
500 | INTERNAL | Falha de transporte com o fornecedor — o único caso que merece retry |
NOT_FOUND, NOT_SUPPORTED e DENIED voltam com HTTP 201: são respostas do
fornecedor, não erros. O status do envelope é quem distingue.
Fornecedores
| Método | Rota | Descrição | Permissão |
|---|---|---|---|
POST | /bureaus/api/v1/providers | Cadastra e valida a credencial | BUREAUS_ADMIN |
GET | /bureaus/api/v1/providers | Lista | BUREAUS_READ |
GET | /bureaus/api/v1/providers/:id | Detalhe | BUREAUS_READ |
PATCH | /bureaus/api/v1/providers/:id | Atualiza | BUREAUS_ADMIN |
DELETE | /bureaus/api/v1/providers/:id | Remove | BUREAUS_ADMIN |
POST | /bureaus/api/v1/providers/:id/test-connection | Testa a credencial | BUREAUS_ADMIN |
A credencial nunca é devolvida, nem cifrada.
Catálogo, consumo e manutenção
| Método | Rota | Descrição | Permissão |
|---|---|---|---|
GET | /bureaus/api/v1/catalog | O que dá para perguntar e a que TTL | BUREAUS_READ |
GET | /bureaus/api/v1/usage | Consumo, custo e taxa de acerto | BUREAUS_READ |
POST | /bureaus/api/v1/cache/invalidate | Invalida por kind ou por documento | BUREAUS_ADMIN |
POST | /bureaus/api/v1/retention/purge-payloads | Apaga o dado pessoal, preserva a trilha | BUREAUS_ADMIN |
POST | /bureaus/api/v1/retention/cleanup-cache | Remove entradas vencidas | BUREAUS_ADMIN |
Início rápido
1. Autenticar
TOKEN=$(curl -s -X POST https://iam.stg.catalisa.app/api/v1/users/login \
-H "Content-Type: application/json" \
-d '{"email":"admin@catalisa.app","password":"root123456","organizationId":"b0000000-0000-0000-0000-000000000001"}' \
| jq -r .accessToken)TOKEN=$(curl -s -X POST https://iam.stg.catalisa.app/api/v1/users/login \
-H "Content-Type: application/json" \
-d '{"email":"admin@catalisa.app","password":"root123456","organizationId":"b0000000-0000-0000-0000-000000000001"}' \
| jq -r .accessToken)2. Cadastrar o fornecedor
A credencial é validada contra a API do fornecedor antes de ser cifrada e gravada — guardar segredo que não funciona só adia a descoberta para a primeira consulta de produção.
curl -X POST https://bureaus.stg.catalisa.app/api/v1/providers \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"name": "bigdatacorp-prod",
"providerType": "BIGDATACORP",
"credentials": { "accessToken": "SEU-ACCESSTOKEN", "tokenId": "SEU-TOKENID" },
"isDefault": true
}'curl -X POST https://bureaus.stg.catalisa.app/api/v1/providers \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"name": "bigdatacorp-prod",
"providerType": "BIGDATACORP",
"credentials": { "accessToken": "SEU-ACCESSTOKEN", "tokenId": "SEU-TOKENID" },
"isDefault": true
}'3. Consultar
curl -X POST https://bureaus.stg.catalisa.app/api/v1/queries \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"kind": "person.basic",
"subject": { "type": "CPF", "value": "529.982.247-25" },
"purpose": "credit_analysis"
}'curl -X POST https://bureaus.stg.catalisa.app/api/v1/queries \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"kind": "person.basic",
"subject": { "type": "CPF", "value": "529.982.247-25" },
"purpose": "credit_analysis"
}'Resposta esperada:
{ "data": { "status": "FOUND", "cached": false,
"cost": { "amount": "0.0300", "currency": "BRL", "estimated": true } } }{ "data": { "status": "FOUND", "cached": false,
"cost": { "amount": "0.0300", "currency": "BRL", "estimated": true } } }4. Repetir a mesma consulta
{ "data": { "status": "FOUND", "cached": true, "cost": null } }{ "data": { "status": "FOUND", "cached": true, "cost": null } }Custo nulo. É esse o ponto do bloco.
Receitas
Exigir dado fresco numa etapa crítica. maxAgeSeconds: 0 força a ida ao
fornecedor mesmo com cache válido. Útil na formalização, onde vale pagar de novo
para não decidir com dado de trinta dias.
Descobrir o que o contrato cobre. Peça vários datasets numa chamada só à API do fornecedor: os não contratados voltam com código negativo sem custo, e o próprio fornecedor diz o que está liberado.
Ajustar o TTL de um tipo de consulta. A tabela bureau_cache_policies aceita
TTL por kind e por organização, sobrescrevendo o padrão do catálogo.
Forçar reconsulta de um documento. POST /cache/invalidate com o subject
apaga a entrada em todos os fornecedores configurados.
Integração com outros building blocks
| Bloco | Como se encaixa |
|---|---|
| Decision Platform | Fonte de dados do tipo BUREAU. A esteira herda cache, custo e trilha sem que a política saiba disso |
| Billing | Consulta cobrada vira UsageEvent, via fachada, com o identificador da consulta como chave de idempotência |
| Audit Trail | O evento bureaus.query.executed vira log de auditoria quando o consumer está rodando |
| Customers | Guarda o resultado como enriquecimento do cadastro |
| IAM | Escopo por organização e as permissões BUREAUS_* |
Fonte BUREAU no Decision Platform
{
"name": "bureau-cadastral",
"type": "BUREAU",
"typeConfig": {
"kind": "person.basic",
"subjectField": "proposta.cpf",
"subjectType": "CPF",
"purpose": "credit_analysis",
"maxAgeSeconds": 86400
},
"inputMapping": [
{ "path": "$.name", "targetField": "nomeBureau" },
{ "path": "$.taxIdStatus", "targetField": "situacaoCpf" },
{ "path": "$._cached", "targetField": "veioDoCache" }
]
}{
"name": "bureau-cadastral",
"type": "BUREAU",
"typeConfig": {
"kind": "person.basic",
"subjectField": "proposta.cpf",
"subjectType": "CPF",
"purpose": "credit_analysis",
"maxAgeSeconds": 86400
},
"inputMapping": [
{ "path": "$.name", "targetField": "nomeBureau" },
{ "path": "$.taxIdStatus", "targetField": "situacaoCpf" },
{ "path": "$._cached", "targetField": "veioDoCache" }
]
}subjectField é o que diferencia esta fonte da HTTP: em vez de uma URL fixa, o
documento sai do input da execução, então a mesma fonte serve qualquer proposta.
Além do canônico, o handler expõe _status, _cached, _asOf e _queryId,
para que a política possa ter uma regra para "sem registro no bureau".
Configuração e operação
Variáveis de ambiente
| Variável | Obrigatória | Padrão | Descrição |
|---|---|---|---|
BUREAUS_CREDENTIAL_MASTER_KEY | sim | — | 64 caracteres hex. Cifra a credencial e deriva o HMAC do documento |
BUREAUS_USAGE_CONSUMER_ENABLED | não | false | Liga o faturamento das consultas |
BUREAUS_CACHE_CLEANUP_ENABLED | não | true | Limpeza automática de cache vencido |
BUREAUS_RETENTION_PURGE_ENABLED | não | false | Purga automática do payload em toda a plataforma. Desligada por padrão: apagar dado pessoal é irreversível |
BUREAUS_RETENTION_DAYS | não | 365 | Retenção do payload. É variável de ambiente, e não constante de código, porque quem a decide é o jurídico |
BUREAUS_RETENTION_PURGE_INTERVAL_HOURS | não | 24 | Cadência da purga |
BUREAUS_CACHE_CLEANUP_INTERVAL_MINUTES | não | 60 | Cadência da limpeza |
A master key faz dois trabalhos, então trocá-la invalida todo o cache existente
além de tornar ilegível a credencial gravada. Ela é carregada sob demanda —
padrão da casa —, então um deploy sem ela sobe com /health verde e falha na
primeira consulta, com a mensagem BUREAUS_CREDENTIAL_MASTER_KEY is not configured.
Configuração por organização, sem deploy
Chave em settings | Para quê |
|---|---|
datasetOverrides | O nome do dataset do fornecedor mudou ou diverge do padrão |
priceOverrides | O preço negociado, para o custo deixar de ser estimativa |
baseUrl | Apontar para homologação |
Manutenção
A limpeza de cache é automática, com trava no Redis para que só uma réplica varra
a tabela por rodada. A purga de payload é endpoint e precisa de cron externo:
retentionDays é decisão de negócio, não constante de código, e o disparo fica
auditável.
A purga apaga o dado pessoal e preserva o registro da consulta, porque é o registro que prova que havia finalidade declarada. Apagar os dois juntos destruiria exatamente a prova que se quer ter numa fiscalização.
Fornecedores
| Driver | O que é |
|---|---|
BIGDATACORP | Plataforma BigBoost. POST /pessoas e /empresas, headers AccessToken e TokenId |
MOCK | Sintético e determinístico pelo documento, para teste sem gastar consulta |
Autenticação é assunto do driver, nunca do framework: o BigDataCorp autentica em header e a Serasa, no corpo da requisição.
Segurança e compliance
O documento nunca é gravado em claro. São três representações, cada uma com um trabalho:
| Representação | Como | Para quê |
|---|---|---|
| Chave de cache | HMAC-SHA256 com a master key | Determinística, e não revela o documento a quem lê o banco |
| Trilha legível | Máscara ***.***.247-25 | Suporte e auditoria reconhecem sem expor |
| Documento completo | Cifrado, opcional por organização | Só quando é preciso reconsultar pelo documento |
A busca na trilha por documento converte o valor em HMAC no handler — o documento não chega a aparecer no log de acesso.
Finalidade obrigatória. purpose não tem valor padrão. O atrito é
intencional: campo opcional em bloco de compliance nunca é preenchido depois, e o
valor dele é ser completo.
Retenção em duas velocidades. O payload expira com a política da organização; o registro da consulta fica.
Credencial. Cifrada com aes-256-gcm pela primitiva compartilhada
@shared/lib/credential-crypto, validada antes de gravar, e nunca devolvida pela
API — nem em resposta, nem em log, nem em evento.
Proteção contra SSRF. Toda saída HTTP passa pelo guard compartilhado, que
resolve o nome e bloqueia faixa privada, loopback e link-local. Apontar a
baseUrl de um fornecedor para o endereço de metadata de nuvem é recusado.
Limitações conhecidas
| Limitação | Situação |
|---|---|
| Um fornecedor real | Só BIGDATACORP. Cascata entre fornecedores não existe: com um driver não há o que cascatear |
| Sem score de crédito | Os tipos de score e restrição estão reservados no catálogo com supportedBy: []. Dependem de contrato com birô |
| Dois datasets fora do contrato | owners (quadro societário) e kyc_data (PEP e sanções) respondem NOT_SUPPORTED. É liberação no BDC Center, não código |
| Cache de dado errado é pior que consulta cara | Um documento que virou irregular ontem e volta do cache como regular aprova crédito indevido. Mitigado por TTL curto no que muda e por maxAgeSeconds |
| Custo é estimativa por padrão | Sai com estimated: true até a organização gravar o preço negociado |
| Purga de payload precisa de cron | Não há agendador embutido, por decisão |
Perguntas frequentes
Isso substitui uma consulta ao Serasa?
Não. O bloco é a camada de integração, não o dado. Ele fala com o fornecedor que você contratar. Hoje há driver para o BigDataCorp; Serasa, QUOD e Boa Vista entram como drivers novos, sem mudar o formato que a esteira consome.
Por que NOT_FOUND volta com HTTP 201 e não 404?
Porque é resposta, não erro — e é cobrada pelo fornecedor. Tratá-la como erro
estragaria a medição de custo e faria o retry insistir numa resposta que não vai
mudar. O status do envelope é quem distingue.
Posso comparar o score de dois birôs diferentes?
Não pelo número cru. A QUOD vai de 300 a 1000 e a Serasa de 0 a 1000. Por isso o
canônico guarda value e scale juntos: dá para normalizar quando houver dois
fornecedores, inclusive retroativamente sobre o histórico.
O cache pode me fazer decidir com dado velho?
Pode, e é por isso que o TTL é curto no que muda rápido — cobrança vive um dia,
dado cadastral trinta. Quem chama controla com maxAgeSeconds, e o envelope
sempre informa cached e asOf.
Preciso do Billing para usar?
Não. Sem conta de faturamento configurada, o consumidor registra no log e segue;
o consumo continua visível em GET /usage, que é a fonte de verdade do bloco.
Um campo do canônico veio nulo mas o dado está no raw. E agora?
É nome de chave divergente. Se for o nome do dataset, resolve em
settings.datasetOverrides — configuração, não release. Se for a chave da
resposta, é ajuste no mapeamento do driver. Em ambos os casos o raw está lá, e
quem consome pode se virar enquanto isso.
Ele faz KYC?
Não, e vale ser categórico. Bureau responde sobre um documento; KYC responde sobre uma pessoa presente. Biometria, prova de vida e documentoscopia são outro problema, com outro ciclo e outra exigência regulatória. Contrate um provedor especializado e guarde o resultado.