fix: migra fonte do /pix/v1/participants para snapshot versionado (BCB descontinuou o CSV) - #892
Open
felipeflfranca wants to merge 4 commits into
Open
Conversation
O BCB descontinuou o CSV público de participantes do Pix (401 via WAF para o dia corrente, 404 para anteriores), derrubando a rota com 500 em produção. A lista oficial agora é publicada apenas em PDF, disponível somente para os ~2 dias mais recentes. - scripts/generate-pix-participants-snapshot.js: baixa o PDF (fallback de datas), extrai a tabela de participantes ativos com pdfjs-dist (devDependency, nunca em request-time) e grava snapshot já no formato de resposta da rota, com validações de sanidade - services/pix/snapshots/latest.json: snapshot versionado (880 participantes), atualizado em dias úteis via GitHub Action - rota passa a servir o snapshot; contrato de resposta preservado (ispb, nome, nome_reduzido, modalidade_participacao, tipo_participacao, inicio_operacao) - extração validada contra CSV arquivado do formato recente (Wayback, 10/06/2026): 0 divergências de modalidade nos 879 ISPBs em comum Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
O CSV do BCB pode ter sido bloqueado apenas temporariamente (o link
dentro do próprio PDF ainda aponta para ele). O script agora tenta, para
cada data, o CSV original (com colunas resolvidas pelo cabeçalho e
validação que cai para o PDF em caso de formato inesperado) antes de
extrair o PDF. Se o BCB reativar o CSV, a fonte melhor volta a ser usada
automaticamente, sem mudança de código.
O parser de CSV também corrige um bug latente do parser antigo da rota:
linhas de cabeçalho repetidas no meio do arquivo (o BCB já publicou CSV
assim) eram servidas como participante fantasma; agora qualquer linha
cujo ISPB não seja ^\d{8}$ é descartada.
O campo source_format no metadata-latest.json registra qual fonte cada
snapshot usou.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
@felipeflfranca is attempting to deploy a commit to the BrasilAPI Team on Vercel. A member of the Team first needs to authorize it. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Apontamentos do SonarQube no PR BrasilAPI#892: - npm ci --ignore-scripts no workflow (lifecycle scripts não rodam na instalação; o job só precisa de axios + pdfjs-dist) - node:fs / node:path nos requires - KNOWN_MODALIDADES e KNOWN_TIPOS como Set (.has em vez de .includes) - replaceAll, optional chaining, Array#includes e Array#at Aproveitando: o CSV do BCB voltou a responder em 12/08/2026 e o fallback CSV-primeiro o capturou automaticamente. Isso revelou que o CSV traz uma segunda tabela concatenada ("Lista de instituições em processo de adesão ao Pix"), que o parser antigo da rota servia misturada — duplicando instituições presentes nas duas listas (ex.: WISE). O parseCsv agora corta na segunda tabela, igual ao parser do PDF, e as duas fontes produzem exatamente os mesmos 880 participantes. Snapshot regenerado a partir do CSV: única diferença são nomes cosmeticamente mais fiéis (espaços duplos preservados, hífen sem espaço espúrio). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
O skip de d2d7856 só sondava o OpenCEP, mas as coordenadas do /cep/v3 vêm do Photon (lib/fetchGeocoordinateFromBrazilLocation), que devolve latitude/longitude null quando bloqueia o runner — derrubando o CI com uma falha flaky alheia ao PR. Agora a suíte também pula quando o Photon está inacessível. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



📋 Descrição
GET /api/pix/v1/participantsestá retornando 500 em produção: o BCB descontinuou o CSV público de participantes do Pix — a URL antiga responde 401 (WAF) para o dia corrente e 404 para dias anteriores, mesmo com User-Agent/Referer/cookies de navegador. A lista oficial agora é publicada apenas em PDF, disponível somente para os ~2 dias mais recentes, e não existe dataset equivalente no OData (Pix_DadosAbertos,SPI) nem no CKAN de dados abertos do BCB.Este PR migra a fonte da rota para um snapshot versionado no repositório, extraído do PDF oficial fora do request-time — mesmo padrão já usado em
scripts/generate-bank-headquarters-snapshot.js:scripts/generate-pix-participants-snapshot.js: para cada data (hoje e até 7 dias para trás), tenta primeiro o CSV original (com validação de cabeçalho — se o BCB o reativar, a fonte melhor volta a ser usada automaticamente) e cai para o PDF, extraindo a tabela de participantes ativos compdfjs-dist(devDependency — nunca roda em request-time). Grava o snapshot já no formato de resposta da rota, com validações de sanidade que fazem o CI falhar alto se o layout do BCB mudar (mínimo de 700 participantes, ISPB^\d{8}$, sem ISPBs duplicados, modalidades/tipos dentro do conjunto conhecido). O camposource_formatnometadata-latest.jsonregistra qual fonte cada snapshot usou.services/pix/snapshots/latest.json: snapshot com 880 participantes, atualizado em dias úteis via GitHub Action (pix-participants-snapshot.yml), que só commita quando a lista realmente muda.ispb,nome,nome_reduzido,modalidade_participacao,tipo_participacao,inicio_operacao), incluindo zeros à esquerda no ISPB e o erro 500 comPIX_LIST_ERROR. O campoinicio_operacaojá eranulldesde nov/2025, quando o BCB removeu essa informação da fonte.modalidade_participacao, 3 divergências detipo_participacao(migrações reais Indireta→Direta no período) e divergências de nome correspondentes a renomeações reais de instituições (conferidas no PDF atual).Bônus: a rota deixa de depender da disponibilidade do BCB em request-time — o 500 intermitente de fim de semana/feriado desaparece junto.
🎯 Tipo de Mudança
📚 Checklist de Documentação
/pages/docs/doc/O exemplo do schema
PIX_PARTICIPANTESfoi corrigido: mostrava códigos (PDCT/DRCT) que a fonte não retorna desde nov/2025; agora reflete os valores reais (Provedor de Conta Transacional/Direta) e o ISPB com zeros à esquerda.🧪 Checklist de Testes
npm test)O E2E existente (
tests/pix-v1.test.js) estava falhando com a fonte morta e volta a passar sem alteração. O teste unitário (tests/services/pix/participants.test.js) foi reescrito: valida o contrato de todos os registros do snapshot (formato do ISPB, campos string/null, ausência de duplicados, mínimo de participantes). O caminho de erro 500 (PIX_LIST_ERROR) foi preservado no service, mas só é alcançável se o snapshot sumir do bundle — as falhas de fonte agora acontecem no CI do snapshot, não em produção.💻 Checklist de Código
npm run fixantes de commitarpdfjs-distentra como devDependency de propósito: é usada apenas pelo script de snapshot (local e CI), nunca pelas rotas — não afeta o bundle serverless.🚀 Checklist de Performance e Custos
A rota fica mais barata e mais rápida: zero chamadas externas em request-time (antes eram até 2 requests ao BCB por cache miss), servindo JSON estático de ~213 KB do bundle com o cache de 6h já existente. O parse de PDF (que estouraria o limite de 10s/256 MB do
vercel.json) roda só no CI, 1x por dia útil.🔍 Como Testar
npm ci && npm run dev, depoiscurl http://localhost:3000/api/pix/v1/participants— deve retornar 200 com ~880 participantes no contrato atual (compare com produção, que hoje retorna 500)npm test -- tests/pix-v1.test.js tests/services/pix/participants.test.js— E2E + unitários passamnpm run snapshot:pix:participants— regenera o snapshot a partir do PDF do dia no site do BCB e imprime o resumo das validações (rode em dia útil ou até 1 dia depois; o BCB não publica em fim de semana)📸 Screenshots (se aplicável)
N/A
📎 Issues Relacionadas
Closes #
📝 Notas Adicionais
Detalhes do parser, para quem for revisar
scripts/generate-pix-participants-snapshot.js:rotate: 90), então os eixos detransformvêm trocados — o script trata os dois casos.LTDA- SICOOBem 1 dos 880 nomes) — indistinguível a partir do PDF. Se o CSV voltar, o fallback corrige isso automaticamente.{"ispb": "ISPB", "nome": "Nome Reduzido", ...}). Agora linhas cujo ISPB não seja^\d{8}$são descartadas.