Consultar CNPJ grátis com n8n

Antes de fechar negócio com um fornecedor, emitir uma nota ou cadastrar um cliente, é comum querer conferir se o CNPJ existe, qual é a razão social e se a empresa está ativa. Neste tutorial você vai montar no n8n uma pequena ferramenta para isso: um formulário onde você digita o CNPJ e, logo depois, vê os principais dados da empresa numa página final.

Os dados vêm da BrasilAPI, um projeto gratuito que reúne informações públicas do Brasil e não pede cadastro nem chave. O workflow tem só três nós e, no caminho, você aprende a limpar o que a pessoa digitou com uma expressão, para que o CNPJ funcione com ou sem pontos, barra e hífen.

O que você vai construir

Este é o workflow final no editor do n8n:

Editor do n8n com o workflow Consultar CNPJ (BrasilAPI): nós On form submission, HTTP Request e Form (Form Ending) ligados em sequência
O workflow final “Consultar CNPJ (BrasilAPI)” no editor do n8n (versão 2.40.7).
  • n8n Form Trigger (no canvas, “On form submission”): cria o formulário com o campo CNPJ e dispara o workflow a cada envio.
  • HTTP Request: consulta a BrasilAPI com o CNPJ digitado, já sem pontuação.
  • n8n Form com a página Form Ending: mostra os dados da empresa na tela final.

Versão usada: n8n 2.40.7. Os nomes de botões e campos aparecem em inglês, exatamente como na interface. Como exemplo, usamos o CNPJ do Banco do Brasil, 00.000.000/0001-91, que é público e bem conhecido. Você também pode testar com o da Petrobras, 33.000.167/0001-01.

Pré-requisitos


Montando o workflow, nó por nó

Crie um workflow novo e dê a ele o nome Consultar CNPJ (BrasilAPI). Depois, adicione os três nós abaixo, nesta ordem, sempre pelo botão + que aparece à direita do nó anterior.

Nó 1: n8n Form Trigger (o formulário)

Clique em Add first step, digite “form” na busca, clique em n8n Form e escolha o gatilho On new n8n Form event. O nó entra no canvas com o nome On form submission. Ele cria uma página web com os campos que você definir e entrega as respostas ao próximo nó.

Tela do nó On form submission com Form Title Consultar CNPJ, Form Description, um campo Text Input com Label CNPJ e placeholder ex.: 00.000.000/0001-91; à direita, a saída JSON com CNPJ 00.000.000/0001-91, submittedAt e formMode test
Configuração do Form Trigger. À direita (OUTPUT), o que chegou depois de um envio de teste.
CampoValorPor que assim
AuthenticationNoneQualquer pessoa com o link pode usar o formulário. Os dados consultados são públicos.
Form TitleConsultar CNPJTítulo no topo da página do formulário.
Form DescriptionDigite um CNPJ para ver os dados públicos da empresa.Explica em uma frase o que fazer.
Form Elements → LabelCNPJNome do campo na tela. Também vira o nome do dado na saída do nó, e é assim que vamos usá-lo no Nó 2.
Form Elements → Element TypeText InputCampo de texto. Um campo de número perderia os zeros do começo, como os do CNPJ do exemplo.
Form Elements → Placeholderex.: 00.000.000/0001-91Exemplo em cinza que some quando a pessoa começa a digitar.
Form Elements → Required FieldligadoImpede o envio com o campo vazio.
Options(nenhuma)As opções padrão bastam.

No topo do nó ficam os Form URLs: a Test URL, para testar enquanto você monta o workflow, e a Production URL, o link definitivo, que só funciona depois que o workflow é publicado. Para testar agora, clique em Execute step. O n8n abre o formulário numa nova aba. Digite o CNPJ do exemplo, do jeito que ele costuma aparecer, com pontos, barra e hífen, e clique em Submit:

Formulário de teste Consultar CNPJ com o aviso This is a test version of your form, o campo CNPJ preenchido com 00.000.000/0001-91 e o botão Submit
O formulário de teste com o CNPJ do Banco do Brasil digitado com pontuação.

Volte ao n8n: a saída do nó (painel OUTPUT, no print anterior) traz o campo CNPJ exatamente como foi digitado, 00.000.000/0001-91, além de submittedAt (data e hora do envio) e formMode (test, porque usamos o link de teste).

Nó 2: HTTP Request (consultar a BrasilAPI)

A BrasilAPI recebe o CNPJ no fim da URL, só com os caracteres do número. O problema é que a barra do CNPJ formatado (a de “0001”) quebra o endereço: para a API, ela separa partes do caminho, e a consulta dá erro. Por isso, a URL usa uma expressão que remove tudo o que não é número ou letra antes de montar o endereço. Esta é a URL completa:

https://brasilapi.com.br/api/cnpj/v1/{{ $json.CNPJ.replace(/[^0-9A-Za-z]/g, '') }}

Clique no + à direita do Form Trigger, adicione um nó HTTP Request e preencha como na tabela:

Tela do nó HTTP Request com Method GET e a URL com a expressão que limpa o CNPJ, resolvida como https://brasilapi.com.br/api/cnpj/v1/00000000000191; à direita, a resposta em Schema com uf DF, cep, cnpj, porte DEMAIS, municipio BRASILIA, razao_social BANCO DO BRASIL SA e nome_fantasia DIRECAO GERAL; o campo qsa aparece recolhido
HTTP Request com o CNPJ limpo na URL. À direita (OUTPUT, visão Schema), os dados da empresa. O campo qsa foi recolhido de propósito (veja o aviso abaixo).
CampoValorPor que assim
MethodGETVamos apenas consultar dados.
URLa URL do bloco acimaEndereço de CNPJ da BrasilAPI. A expressão entre chaves duplas é trocada pelo CNPJ sem pontos, barra e hífen.
AuthenticationNoneA BrasilAPI é pública e não pede chave.
Send Query ParametersdesligadoO CNPJ já vai dentro da própria URL.
Send HeadersdesligadoNão são necessários cabeçalhos especiais.
Send BodydesligadoUma consulta GET não envia corpo.
Options(nenhuma)As opções padrão bastam.

Vamos entender a expressão por partes. $json.CNPJ é o campo que veio do formulário. O .replace(/[^0-9A-Za-z]/g, '') troca por nada (as aspas vazias no final) todo caractere que não seja um algarismo de 0 a 9 ou uma letra; o g faz a troca valer para todas as ocorrências, e não só para a primeira. Assim, pontos, barra, hífen e espaços somem. As letras ficam de propósito: o novo formato de CNPJ adotado pela Receita Federal pode ter letras, e a expressão já está pronta para ele.

Confira a prévia abaixo do campo URL: com o CNPJ digitado como 00.000.000/0001-91, a URL resolvida ficou https://brasilapi.com.br/api/cnpj/v1/00000000000191, só com os 14 algarismos. Clique em Execute step. A resposta é um único objeto (1 item) com dezenas de campos, como razao_social (BANCO DO BRASIL SA), nome_fantasia (DIRECAO GERAL), municipio (BRASILIA), uf (DF), porte (DEMAIS) e capital_social.

Cuidado com dados pessoais. A resposta da BrasilAPI também traz o campo qsa (quadro de sócios e administradores), com nomes de pessoas ligadas à empresa. Esses dados são públicos, mas continuam sendo dados pessoais, protegidos pela LGPD. Neste tutorial, a página final mostra apenas dados da empresa, e nos prints o campo qsa aparece recolhido (na visão Schema, basta clicar na setinha ao lado dele). Evite guardar ou repassar esses nomes sem um motivo legítimo.

Nó 3: n8n Form com Form Ending (a página final)

Agora vamos mostrar o resultado. Clique no + à direita do HTTP Request, procure por n8n Form e adicione o nó. Em Page Type, escolha Form Ending. O nó aparece no canvas com o nome Form e a legenda “Form Ending”. Como a mensagem final é longa, ela está completa no bloco abaixo; o <br> serve para quebrar a linha na página:

Nome fantasia: {{ $json.nome_fantasia }}<br>Situação: {{ $json.descricao_situacao_cadastral }}<br>Cidade: {{ $json.municipio }}/{{ $json.uf }}<br>Início das atividades: {{ $json.data_inicio_atividade }}<br>Atividade principal: {{ $json.cnae_fiscal_descricao }}
Tela do nó Form com Page Type Form Ending, On n8n Form Submission Show Completion Screen, Completion Title com a expressão $json.razao_social resolvida como BANCO DO BRASIL SA e Completion Message com expressões; à direita, a saída com o campo qsa recolhido
O nó Form configurado como Form Ending. Abaixo de cada campo, a prévia com os dados do Banco do Brasil.
CampoValorPor que assim
Page TypeForm EndingIndica que esta é a última tela do formulário.
On n8n Form SubmissionShow Completion ScreenMostra uma tela de conclusão com título e mensagem.
Completion Title{{ $json.razao_social }}O título da página final é a própria razão social da empresa.
Completion Messageo texto do bloco acimaUma linha para cada dado: nome fantasia, situação, cidade/UF, início das atividades e atividade principal.
Limit Wait TimedesligadoNão precisamos limitar o tempo de espera.
Options(nenhuma)As opções padrão bastam.

Você não precisa digitar os nomes dos campos: arraste cada um do painel INPUT para dentro da Completion Message e escreva os rótulos (“Nome fantasia:”, “Situação:” etc.) entre eles. Os campos usados são nome_fantasia, descricao_situacao_cadastral, municipio, uf, data_inicio_atividade e cnae_fiscal_descricao. Na prévia abaixo do campo, o n8n já mostra o começo do resultado: “Nome fantasia: DIRECAO GERAL<br>Situação: ATIVA…”. Na prévia o <br> aparece como texto, mas na página final ele vira uma quebra de linha.


O workflow completo e o teste

Feche o nó e clique em Execute workflow, na parte de baixo do canvas. O n8n abre o formulário de teste numa nova aba e fica esperando. Digite 00.000.000/0001-91 e clique em Submit. Em poucos segundos, aparece a página final:

Página final do formulário com o título BANCO DO BRASIL SA e as linhas Nome fantasia: DIRECAO GERAL, Situação: ATIVA, Cidade: BRASILIA/DF, Início das atividades: 1966-08-01 e Atividade principal: Bancos múltiplos, com carteira comercial
Resultado do teste: a página Form Ending com os dados públicos do Banco do Brasil.

A página mostra a razão social como título e, abaixo, o nome fantasia (DIRECAO GERAL, que é o nome do estabelecimento matriz), a situação cadastral (ATIVA), a cidade (BRASILIA/DF), a data de início das atividades (1966-08-01, no formato ano-mês-dia) e a atividade principal (Bancos múltiplos, com carteira comercial). De volta ao editor, os três nós estão em verde, com 1 item em cada ligação:

Workflow executado com os três nós em verde: On form submission, HTTP Request e Form (Form Ending), com 1 item em cada ligação
O workflow completo depois do teste, com os três nós em verde.

O painel Logs, na barra inferior, também mostra a saída de cada nó. Só que, na tabela dele, o campo qsa aparece aberto, com os nomes dos administradores; por isso, neste tutorial, preferimos mostrar o resultado pela página final.

Usar o formulário de verdade (Production URL)

O link de teste só funciona enquanto o editor está esperando um envio. Para ter um link fixo, clique em Publish, no canto superior direito do editor, e confirme. Depois, abra o Form Trigger, clique na aba Production URL e copie o endereço. As consultas feitas por esse link aparecem na aba Executions, no topo do editor. Com o n8n rodando só no seu computador, o link também só abre nele.

Erros comuns

“The resource you are requesting could not be found” (erro 404) com um texto cheio de código. É o que acontece se a URL usar só {{ $json.CNPJ }}, sem a limpeza. Com o CNPJ digitado como 00.000.000/0001-91, a barra entra na URL (veja a prévia: …/cnpj/v1/00.000.000/0001…) e o servidor responde com uma página de “não encontrado”, cujo código aparece na mensagem. A solução é usar a expressão com .replace mostrada no Nó 2.

Nó HTTP Request com a URL usando apenas $json.CNPJ, resolvida com a barra do CNPJ, e o erro The resource you are requesting could not be found com o texto 404: This page could not be found
Erro real: sem a limpeza, a barra do CNPJ quebra a URL e a API responde 404.

“Bad request – please check your parameters”, com a mensagem “CNPJ … inválido.” A BrasilAPI confere os dígitos verificadores (os dois últimos números) e responde com o código 400 quando a conta não fecha. No teste abaixo, trocamos só o último dígito do CNPJ do exemplo (00.000.000/0001-92). Na aba do formulário, a pessoa vê “Problem submitting response”. Confira se o número foi digitado corretamente.

Nó HTTP Request com o erro Bad request - please check your parameters e a mensagem CNPJ 00.000.000/0001-92 inválido
Erro real com um dígito errado: a API recusa o CNPJ antes mesmo de procurar a empresa.
  • “Form Trigger isn’t listening yet”. Você abriu a Test URL sem que o editor estivesse esperando um envio. Clique em Execute workflow (ou em Execute step no Form Trigger) e use o formulário que o n8n abre.
  • “Problem loading form” ao abrir a Production URL. O link de produção só funciona com o workflow publicado. Clique em Publish e tente de novo.
  • Campos em branco na página final. Alguns campos, como nome_fantasia, podem vir vazios para certas empresas. Não é defeito do workflow: a informação simplesmente não consta no cadastro.

JSON do workflow para importar

Se preferir, importe o workflow pronto. Baixe o arquivo abaixo ou copie o JSON. No n8n, crie um workflow novo e escolha uma das opções: abra o menu … (três pontinhos) no topo do editor, vá em Import e depois em From file; ou cole o JSON direto no canvas com Ctrl+V.

O download é um arquivo .zip com o consultar-cnpj-brasilapi.json dentro. Descompacte antes de importar (ou copie o JSON do bloco abaixo).

{
  "name": "Consultar CNPJ (BrasilAPI)",
  "nodes": [
    {
      "parameters": {
        "formTitle": "Consultar CNPJ",
        "formDescription": "Digite um CNPJ para ver os dados públicos da empresa.",
        "formFields": {
          "values": [
            {
              "fieldLabel": "CNPJ",
              "placeholder": "ex.: 00.000.000/0001-91",
              "requiredField": true
            }
          ]
        },
        "options": {}
      },
      "id": "7b2d4e61-1111-4a5b-9c02-0e0000000001",
      "name": "On form submission",
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.6,
      "position": [
        0,
        0
      ],
      "webhookId": "7b2d4e61-aaaa-4a5b-9c02-0e00000000f1"
    },
    {
      "parameters": {
        "url": "=https://brasilapi.com.br/api/cnpj/v1/{{ $json.CNPJ.replace(/[^0-9A-Za-z]/g, '') }}",
        "options": {}
      },
      "id": "7b2d4e61-2222-4a5b-9c02-0e0000000002",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.5,
      "position": [
        260,
        0
      ]
    },
    {
      "parameters": {
        "operation": "completion",
        "completionTitle": "={{ $json.razao_social }}",
        "completionMessage": "=Nome fantasia: {{ $json.nome_fantasia }}<br>Situação: {{ $json.descricao_situacao_cadastral }}<br>Cidade: {{ $json.municipio }}/{{ $json.uf }}<br>Início das atividades: {{ $json.data_inicio_atividade }}<br>Atividade principal: {{ $json.cnae_fiscal_descricao }}",
        "options": {}
      },
      "id": "7b2d4e61-3333-4a5b-9c02-0e0000000003",
      "name": "Form",
      "type": "n8n-nodes-base.form",
      "typeVersion": 2.5,
      "position": [
        520,
        0
      ],
      "webhookId": "7b2d4e61-bbbb-4a5b-9c02-0e00000000f2"
    }
  ],
  "connections": {
    "On form submission": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Form",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  }
}

O workflow não usa credenciais, então funciona logo depois de importado. Os campos webhookId identificam os endereços do formulário dentro do seu n8n; você não precisa mexer neles.

Recapitulando

  • O n8n Form Trigger cria um formulário com o campo CNPJ, com link de teste e link de produção.
  • A expressão com .replace(/[^0-9A-Za-z]/g, '') limpa pontos, barra e hífen, e evita o erro 404.
  • O HTTP Request consulta a BrasilAPI e devolve os dados públicos da empresa em 1 item.
  • O n8n Form com Form Ending mostra só os dados da empresa, sem expor os nomes do quadro de sócios.

Com esse modelo de formulário, consulta e resposta, você pode criar outras ferramentas internas, como consultas de CEP, de feriados ou de bancos pelo código. Nos próximos tutoriais, vamos continuar explorando APIs públicas e gratuitas com o n8n.