<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fred Estante</title>
    <description>The latest articles on DEV Community by Fred Estante (@fredestante).</description>
    <link>https://dev.to/fredestante</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4135903%2Fd3dcc5cd-4815-4262-8c78-19cc0f8ea7da.png</url>
      <title>DEV Community: Fred Estante</title>
      <link>https://dev.to/fredestante</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fredestante"/>
    <language>en</language>
    <item>
      <title>Como dar a um agente acesso à base de empresas do Brasil em um comando (MCP)</title>
      <dc:creator>Fred Estante</dc:creator>
      <pubDate>Mon, 21 Sep 2026 14:06:43 +0000</pubDate>
      <link>https://dev.to/fredestante/como-dar-a-um-agente-acesso-a-base-de-empresas-do-brasil-em-um-comando-mcp-2og3</link>
      <guid>https://dev.to/fredestante/como-dar-a-um-agente-acesso-a-base-de-empresas-do-brasil-em-um-comando-mcp-2og3</guid>
      <description>&lt;p&gt;O agente precisa responder perguntas como "essa empresa existe, está ativa, faz o quê, fica onde e como entro em contato". A resposta existe na base da Receita Federal. O problema é o caminho até ela.&lt;/p&gt;

&lt;p&gt;As opções manuais cobram pedágio. Planilha baixada perde a data de referência na segunda semana. Scraper de portal quebra no primeiro redesign. CSV mensal pesa gigabytes e exige pipeline próprio. E dado cadastral sem data não sustenta decisão: situação, endereço e quadro societário mudam, e quem consome precisa saber de quando é a foto.&lt;/p&gt;

&lt;p&gt;Pense no onboarding: o agente recebe um CNPJ e precisa dizer se a empresa está ativa, se é optante do Simples, qual o CNAE principal e em que município fica. Ou na prospecção: listar empresas de um setor e cidade, com telefone disponível, e contar quantas são antes de percorrer a lista. Nos dois casos, o agente precisa de fonte única, datada e com erro tipado — não de texto plausível.&lt;/p&gt;

&lt;p&gt;O cnpj.ia.br expõe a base como servidor MCP remoto. O agente chama ferramentas, cada resposta informa a data da base em &lt;code&gt;meta.data_as_of&lt;/code&gt;, e o custo em créditos é conhecido antes da chamada. A base é a da Receita Federal, atualizada mensalmente. Abaixo: o servidor em duas frases, a configuração por cliente, as quatro ferramentas, o custo e os limites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Um servidor MCP remoto, em duas frases
&lt;/h2&gt;

&lt;p&gt;Um servidor MCP remoto expõe ferramentas por HTTP para qualquer cliente compatível: o agente descobre as ferramentas por &lt;code&gt;tools/list&lt;/code&gt; e chama com a chave da sua conta. No cnpj.ia.br, são quatro ferramentas sobre a base de empresas do Brasil, com a mesma chave e o mesmo custo em créditos da API REST.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuração
&lt;/h2&gt;

&lt;p&gt;Transporte HTTP na URL &lt;code&gt;https://mcp.cnpj.ia.br&lt;/code&gt;, autenticação pela chave da conta no header &lt;code&gt;Authorization: Bearer&lt;/code&gt;. A chave fica guardada no cliente do agente e viaja só no header de cada chamada, para validação. Com a conexão feita, &lt;code&gt;tools/list&lt;/code&gt; devolve as quatro ferramentas e nada mais.&lt;/p&gt;

&lt;p&gt;Claude Code resolve em um comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http cnpjia https://mcp.cnpj.ia.br &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$CNPJIA_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Desktop só aceita servidor local no &lt;code&gt;claude_desktop_config.json&lt;/code&gt;, por isso usa a ponte &lt;code&gt;mcp-remote&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cnpjia"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.cnpj.ia.br"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
               &lt;/span&gt;&lt;span class="s2"&gt;"--header"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Authorization: Bearer ${CNPJIA_KEY}"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"CNPJIA_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cnpj_live_…"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cursor, em &lt;code&gt;.cursor/mcp.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cnpjia"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.cnpj.ia.br"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer [REDACTED]"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windsurf usa o mesmo JSON com &lt;code&gt;serverUrl&lt;/code&gt; no lugar de &lt;code&gt;url&lt;/code&gt;. Codex CLI lê a chave da variável de ambiente a cada início, sem gravar no config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CNPJIA_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"cnpj_live_…"&lt;/span&gt;
codex mcp add cnpjia &lt;span class="nt"&gt;--url&lt;/span&gt; https://mcp.cnpj.ia.br &lt;span class="nt"&gt;--bearer-token-env-var&lt;/span&gt; CNPJIA_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os caminhos de arquivo variam por cliente; a chave, nunca: fica sempre do lado do agente, em arquivo local ou variável de ambiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  As quatro ferramentas
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ferramenta&lt;/th&gt;
&lt;th&gt;Operação da API&lt;/th&gt;
&lt;th&gt;Créditos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;consultar_cnpj&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /v1/cnpjs/{cnpj}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 em &lt;code&gt;basic&lt;/code&gt;, 6 em &lt;code&gt;full&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;buscar_empresas&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /v1/cnpjs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 por empresa retornada, até 20 por página&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gerar_filtro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /v1/filters/generate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 por chamada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ver_uso&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /v1/usage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Uma pergunta em linguagem natural para cada uma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;consultar_cnpj&lt;/code&gt; em &lt;code&gt;basic&lt;/code&gt;: "Qual é a situação cadastral e o CNAE principal do CNPJ 00.000.000/0001-91?"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;consultar_cnpj&lt;/code&gt; em &lt;code&gt;full&lt;/code&gt;: "Me dá o telefone e os sócios do Banco do Brasil, CNPJ 00.000.000/0001-91."&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gerar_filtro&lt;/code&gt; e depois &lt;code&gt;buscar_empresas&lt;/code&gt;: "Quantas empresas de software ativas existem em Florianópolis?" A primeira página já traz a contagem com teto.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ver_uso&lt;/code&gt;: "Quantos créditos ainda tenho este mês?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;gerar_filtro&lt;/code&gt; recebe uma descrição ("padarias ativas em Curitiba optantes do Simples") e devolve os filtros estruturados que &lt;code&gt;buscar_empresas&lt;/code&gt; aceita. É a ponte entre a pergunta do usuário e a busca. Custa 1 crédito por chamada, com resultado ou sem.&lt;/p&gt;

&lt;p&gt;O agente decide o perfil (&lt;code&gt;basic&lt;/code&gt; ou &lt;code&gt;full&lt;/code&gt;) a partir do pedido. Para economizar, oriente no prompt do sistema a usar &lt;code&gt;basic&lt;/code&gt; e só pedir &lt;code&gt;full&lt;/code&gt; quando &lt;code&gt;has_phone&lt;/code&gt; ou &lt;code&gt;has_email&lt;/code&gt; vierem verdadeiros. Esses sinais do &lt;code&gt;basic&lt;/code&gt; dizem se o &lt;code&gt;full&lt;/code&gt; teria contato para mostrar.&lt;/p&gt;

&lt;p&gt;A busca pagina por cursor: repete com &lt;code&gt;meta.next_cursor&lt;/code&gt; até vir &lt;code&gt;null&lt;/code&gt;. A primeira página já traz &lt;code&gt;meta.total_count_capped&lt;/code&gt;, a contagem com teto — o agente responde "quantas são" antes de percorrer tudo, e cada empresa retornada custa 1 crédito.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custo em créditos e o plano gratuito
&lt;/h2&gt;

&lt;p&gt;O peso de cada operação, em créditos:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operação&lt;/th&gt;
&lt;th&gt;Custo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Consulta &lt;code&gt;basic&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consulta &lt;code&gt;full&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Busca&lt;/td&gt;
&lt;td&gt;1 por empresa retornada (página vazia: 0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gerar_filtro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 por chamada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ver_uso&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Erros, 404 e limites&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O plano gratuito inclui 60 créditos grátis por mês: 60 consultas &lt;code&gt;basic&lt;/code&gt; ou 10 &lt;code&gt;full&lt;/code&gt;. A chave nasce com 15 créditos; o e-mail verificado libera os 60 do mês. Os planos pagos sobem em créditos e requisições por minuto:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plano&lt;/th&gt;
&lt;th&gt;Preço&lt;/th&gt;
&lt;th&gt;Créditos/mês&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;R$ 0&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starter&lt;/td&gt;
&lt;td&gt;R$ 49&lt;/td&gt;
&lt;td&gt;15 mil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro (Recomendado)&lt;/td&gt;
&lt;td&gt;R$ 199&lt;/td&gt;
&lt;td&gt;100 mil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;R$ 699&lt;/td&gt;
&lt;td&gt;500 mil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scale&lt;/td&gt;
&lt;td&gt;R$ 1.999&lt;/td&gt;
&lt;td&gt;3 milhões&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Quando a franquia acaba, a API responde &lt;code&gt;402 quota_exceeded&lt;/code&gt;: hard cap, nada é cobrado sem uma ação sua. Erros nunca consomem crédito, e &lt;code&gt;404 not_found&lt;/code&gt; é resultado (CNPJ válido que não existe na base), não falha.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limites e o que o servidor NÃO faz
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Não devolve CPF completo.&lt;/strong&gt; Sócio pessoa física sai com CPF mascarado (&lt;code&gt;***123456**&lt;/code&gt;) ou nulo. Nunca completo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Não devolve dado sem data.&lt;/strong&gt; Consulta, busca e filtro informam &lt;code&gt;meta.data_as_of&lt;/code&gt; em toda resposta. Nenhum campo reflete o instante da chamada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No plano gratuito, &lt;code&gt;buscar_empresas&lt;/code&gt; responde &lt;code&gt;insufficient_plan&lt;/code&gt;.&lt;/strong&gt; A ferramenta aparece em &lt;code&gt;tools/list&lt;/code&gt;, mas não executa sem plano pago. As outras três funcionam no Free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O limite de requisições por minuto é o do plano da conta&lt;/strong&gt;, somando agente e API REST. Um agente em loop atinge &lt;code&gt;rate_limited&lt;/code&gt; rápido; a resposta traz &lt;code&gt;Retry-After&lt;/code&gt; e o agente deve esperar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O agente não compra créditos nem muda de plano.&lt;/strong&gt; Crédito e plano se gerenciam no portal, por uma pessoa. A chave fica no cliente; se um agente sair do controle, revogue a chave no portal. A API recusa na próxima chamada e o MCP em até 60 segundos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Configuração completa, exemplos de perguntas e referência por ferramenta: &lt;a href="https://cnpj.ia.br/docs/mcp?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;Servidor MCP&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>api</category>
      <category>brasil</category>
    </item>
    <item>
      <title>CNPJ alfanumérico: o que muda no seu sistema e como validar o dígito</title>
      <dc:creator>Fred Estante</dc:creator>
      <pubDate>Mon, 21 Sep 2026 14:06:42 +0000</pubDate>
      <link>https://dev.to/fredestante/cnpj-alfanumerico-o-que-muda-no-seu-sistema-e-como-validar-o-digito-484l</link>
      <guid>https://dev.to/fredestante/cnpj-alfanumerico-o-que-muda-no-seu-sistema-e-como-validar-o-digito-484l</guid>
      <description>&lt;p&gt;Desde 2026 a Receita Federal emite CNPJs alfanuméricos. As oito posições da raiz e as quatro da ordem podem conter letras e dígitos. Os dois dígitos verificadores continuam numéricos.&lt;/p&gt;

&lt;p&gt;Um CNPJ numérico virou um caso particular do formato novo. Os CNPJs que já existem não mudam de número e continuam válidos. Nenhuma base precisa de migração de dados. O trabalho é outro: aceitar letras onde o sistema só aceitava dígito.&lt;/p&gt;

&lt;p&gt;Se o seu cadastro valida com &lt;code&gt;^\d{14}$&lt;/code&gt;, guarda em coluna numérica ou usa máscara fixa de dígito, ele vai rejeitar documento válido. Este artigo mostra o formato, o que quebra, a regra do dígito com um exemplo calculado passo a passo e como a API do cnpj.ia.br trata os dois formatos.&lt;/p&gt;

&lt;h2&gt;
  
  
  O formato
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parte&lt;/th&gt;
&lt;th&gt;Posições&lt;/th&gt;
&lt;th&gt;Conteúdo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Raiz&lt;/td&gt;
&lt;td&gt;1 a 8&lt;/td&gt;
&lt;td&gt;Letras maiúsculas ou dígitos. Identifica a empresa, comum a matriz e filiais.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ordem&lt;/td&gt;
&lt;td&gt;9 a 12&lt;/td&gt;
&lt;td&gt;Letras maiúsculas ou dígitos. Identifica o estabelecimento.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dígitos verificadores&lt;/td&gt;
&lt;td&gt;13 e 14&lt;/td&gt;
&lt;td&gt;Sempre numéricos. Módulo 11 sobre o valor ASCII menos 48 de cada posição anterior.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dois exemplos. Numérico: &lt;code&gt;00.000.000/0001-91&lt;/code&gt;, do Banco do Brasil. Alfanumérico: &lt;code&gt;12.ABC.345/01DE-35&lt;/code&gt;, exemplo de formato do contrato da API.&lt;/p&gt;

&lt;p&gt;O formato antigo continua válido, os números existentes não mudam, e a rotina nova aceita os dois formatos. Quem atualiza a validação uma vez cobre o estoque e o fluxo novo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que &lt;code&gt;bigint&lt;/code&gt; quebra e &lt;code&gt;varchar(14)&lt;/code&gt; sobrevive
&lt;/h2&gt;

&lt;p&gt;Três motivos, em ordem de dano.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Letras não cabem em número.&lt;/strong&gt; &lt;code&gt;12ABC34501DE35&lt;/code&gt; não é inteiro. A primeira inserção de um CNPJ alfanumérico em coluna &lt;code&gt;BIGINT&lt;/code&gt; ou &lt;code&gt;NUMERIC(14)&lt;/code&gt; falha. Em alguns modos de banco, pior: trunca em silêncio e grava lixo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Zero à esquerda some.&lt;/strong&gt; &lt;code&gt;00000000000191&lt;/code&gt; como inteiro vira &lt;code&gt;191&lt;/code&gt;. Toda leitura precisa reaplicar padding com &lt;code&gt;LPAD&lt;/code&gt;, e toda comparação direta com string falha sem aviso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Pontuação varia.&lt;/strong&gt; &lt;code&gt;00.000.000/0001-91&lt;/code&gt; e &lt;code&gt;00000000000191&lt;/code&gt; são a mesma empresa em duas strings distintas. Coluna numérica resolve esse caso por acidente e quebra nos dois anteriores.&lt;/p&gt;

&lt;p&gt;A forma que sobrevive: texto de 14 caracteres, maiúsculas, sem pontuação. O fluxo de entrada fica assim:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Converte para maiúsculas.&lt;/li&gt;
&lt;li&gt;Remove pontos, barra, hífen e espaços.&lt;/li&gt;
&lt;li&gt;Valida comprimento (14) e dígitos verificadores.&lt;/li&gt;
&lt;li&gt;Guarda na forma normalizada. Formata só na exibição.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Máscaras de entrada no padrão &lt;code&gt;##.###.###/####-##&lt;/code&gt; passam a aceitar letras nas doze primeiras posições. Os dois últimos campos continuam numéricos. Comparações e chaves estrangeiras usam a forma normalizada que a API devolve.&lt;/p&gt;

&lt;p&gt;Procure no código por &lt;code&gt;\d{14}&lt;/code&gt;, &lt;code&gt;isdigit&lt;/code&gt;, &lt;code&gt;parseInt&lt;/code&gt;, &lt;code&gt;BIGINT&lt;/code&gt; e máscara fixa de dígito. Cada ocorrência é um ponto que rejeita ou corrompe CNPJ alfanumérico.&lt;/p&gt;

&lt;h2&gt;
  
  
  A regra do dígito verificador
&lt;/h2&gt;

&lt;p&gt;Módulo 11, em duas passadas. A regra nova coincide com a antiga quando só há dígitos. A diferença: cada caractere entra na soma pelo seu valor ASCII menos 48. Dígitos valem 0 a 9. Letras maiúsculas valem 17 (&lt;code&gt;A&lt;/code&gt;) a 42 (&lt;code&gt;Z&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Primeira passada: multiplique os doze primeiros caracteres pelos pesos &lt;code&gt;5 4 3 2 9 8 7 6 5 4 3 2&lt;/code&gt; e some. Tire o resto da divisão por 11. Resto menor que 2 dá dígito &lt;code&gt;0&lt;/code&gt;. Senão, o dígito é &lt;code&gt;11 − resto&lt;/code&gt;. Esse é o primeiro verificador.&lt;/p&gt;

&lt;p&gt;Segunda passada: repita com os treze caracteres (os doze mais o primeiro verificador) e os pesos &lt;code&gt;6 5 4 3 2 9 8 7 6 5 4 3 2&lt;/code&gt;. O resultado é o segundo verificador.&lt;/p&gt;

&lt;p&gt;Se o par calculado bate com o par informado, o formato é válido. Dígito certo não prova existência; prova que o número passou na checagem. Sequências repetidas, como &lt;code&gt;00000000000000&lt;/code&gt;, passam no cálculo e são rejeitadas à parte.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo passo a passo: &lt;code&gt;12ABC34501DE35&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Normalizado (sem pontuação, maiúsculas): &lt;code&gt;12ABC34501DE35&lt;/code&gt;. Valores de cada caractere (ASCII − 48):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Caractere&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;th&gt;C&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;5&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;D&lt;/th&gt;
&lt;th&gt;E&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Valor&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Primeira passada, pesos &lt;code&gt;5 4 3 2 9 8 7 6 5 4 3 2&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1×5 + 2×4 + 17×3 + 18×2 + 19×9 + 3×8 + 4×7 + 5×6 + 0×5 + 1×4 + 20×3 + 21×2
= 5 + 8 + 51 + 36 + 171 + 24 + 28 + 30 + 0 + 4 + 60 + 42
= 459
459 mod 11 = 8 → primeiro dígito = 11 − 8 = 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Segunda passada, com o &lt;code&gt;3&lt;/code&gt; calculado e pesos &lt;code&gt;6 5 4 3 2 9 8 7 6 5 4 3 2&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1×6 + 2×5 + 17×4 + 18×3 + 19×2 + 3×9 + 4×8 + 5×7 + 0×6 + 1×5 + 20×4 + 21×3 + 3×2
= 6 + 10 + 68 + 54 + 38 + 27 + 32 + 35 + 0 + 5 + 80 + 63 + 6
= 424
424 mod 11 = 6 → segundo dígito = 11 − 6 = 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Par calculado &lt;code&gt;35&lt;/code&gt;. Par informado &lt;code&gt;35&lt;/code&gt;. Formato válido.&lt;/p&gt;

&lt;h3&gt;
  
  
  Código
&lt;/h3&gt;

&lt;p&gt;Python, curto, sem dependência:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;PESOS_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;PESOS_2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_dv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;resto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;resto&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;resto&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cnpj_valido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cnpj&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cnpj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;vals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="n"&gt;d1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_dv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PESOS_1&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="n"&gt;d2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_dv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;PESOS_2&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d1&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;d2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;cnpj_valido("12.ABC.345/01DE-35")&lt;/code&gt; devolve &lt;code&gt;True&lt;/code&gt;. &lt;code&gt;cnpj_valido("00.000.000/0001-91")&lt;/code&gt; devolve &lt;code&gt;True&lt;/code&gt;. &lt;code&gt;cnpj_valido("00.000.000/0001-92")&lt;/code&gt;, com o último dígito trocado, devolve &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Roda em microssegundos, sem rede: elimina erro de digitação no formulário e separa linhas inválidas no lote antes de gastar consulta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como a API do cnpj.ia.br trata o formato
&lt;/h2&gt;

&lt;p&gt;A API aceita o formato antigo e o novo, com ou sem pontuação, minúsculas ou maiúsculas. Remove pontos, barra e hífen antes de validar, valida os dígitos pelo algoritmo alfanumérico e devolve &lt;code&gt;cnpj&lt;/code&gt; e &lt;code&gt;raiz_cnpj&lt;/code&gt; normalizados. Nada muda nos endpoints nem nos créditos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# numérico, com e sem pontuação: a mesma empresa&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://api.cnpj.ia.br/v1/cnpjs/00000000000191"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$CNPJIA_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://api.cnpj.ia.br/v1/cnpjs/00.000.000/0001-91"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$CNPJIA_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# alfanumérico (exemplo de formato do contrato)&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://api.cnpj.ia.br/v1/cnpjs/12.ABC.345/01DE-35"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$CNPJIA_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resposta resumida para o Banco do Brasil, perfil &lt;code&gt;full&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cnpj"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"00000000000191"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"razao_social"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BANCO DO BRASIL SA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"situacao_cadastral"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"codigo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"02"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"descricao"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ativa"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"socios"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NOME DO DIRIGENTE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"cnpj_cpf_socio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"***123456**"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"profile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"full"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rfb_open_data+oportunidados"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"data_as_of"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"credits_charged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quatro comportamentos para a sua integração:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Formato ou dígito inválido responde &lt;code&gt;400 invalid_cnpj&lt;/code&gt;, sem custo.&lt;/li&gt;
&lt;li&gt;CNPJ válido que não existe na base responde &lt;code&gt;404 not_found&lt;/code&gt;, também sem custo.&lt;/li&gt;
&lt;li&gt;Toda resposta informa a data da base em &lt;code&gt;meta.data_as_of&lt;/code&gt;. A base é a da Receita Federal, atualizada mensalmente.&lt;/li&gt;
&lt;li&gt;CPF de sócio sai mascarado ou nulo, nunca completo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O &lt;code&gt;basic&lt;/code&gt; custa 1 crédito; o &lt;code&gt;full&lt;/code&gt;, 6. O plano gratuito inclui 60 créditos por mês.&lt;/p&gt;

&lt;p&gt;Detalhe do formato e dos campos: &lt;a href="https://cnpj.ia.br/docs/cnpj-alfanumerico?utm_source=devto&amp;amp;utm_medium=article" rel="noopener noreferrer"&gt;CNPJ alfanumérico na API&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>brasil</category>
      <category>api</category>
      <category>backend</category>
      <category>dados</category>
    </item>
  </channel>
</rss>
