Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

consultacnpj

Consulta de CNPJ Gratuito - Delphi

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

Delphi CNPJ Client

Cliente Delphi para consulta de CNPJ em APIs públicas brasileiras.

APIs Suportadas

1. CNPJA (open.cnpja.com) - Recomendada

  • Endpoint: https://open.cnpja.com/office/{cnpj}
  • Limite: 5 consultas por minuto por IP
  • Vantagens: Mais completa, retorna dados SUFRAMA, estrutura societária detalhada

2. CNPJWS (publica.cnpj.ws)

  • Endpoint: https://publica.cnpj.ws/cnpj/{cnpj}
  • Limite: 3 consultas por minuto por IP
  • Vantagens: Alternativa quando a principal estiver indisponível

Requisitos

  • Delphi 10.2 Tokyo ou superior
  • Windows (Win32/Win64)
  • Unidades do sistema: System.JSON, System.Net.HttpClient, System.DateUtils

Estrutura do Projeto

pascal
CNPJ Ja/
????????? src/
???   ????????? CNPJWS.pas          # Unidade principal com a classe TCNPJClient
????????? demo/
???   ????????? CNPJ_Demo.dpr       # Aplica????o console de demonstra????o
???   ????????? CNPJ_Demo.dproj     # Projeto Delphi
????????? vcl/
???   ????????? CNPJ_VCL.dpr        # Aplica????o VCL com interface gr??fica
???   ????????? UnitPrincipal.pas   # Formul??rio principal
???   ????????? UnitPrincipal.dfm   # Recursos do formul??rio
???   ????????? CNPJ_VCL.dproj      # Projeto Delphi
????????? README.md               # Este arquivo

Instalação

  1. Copie a unidade src/CNPJWS.pas para o seu projeto
  2. Adicione a unidade na cláusula uses ou no projeto
  3. Pronto para usar!

Uso Básico

Consulta Síncrona

delphi
uses
  CNPJWS;

var
  LClient: TCNPJClient;
  LEstabelecimento: TEstablishment;
begin
  LClient := TCNPJClient.Create;
  try
    // Consulta usando a API padrão (CNPJA)
    LEstabelecimento := LClient.Consultar('27.865.757/0001-02');

    if Assigned(LEstabelecimento) then
    try
      Writeln('Empresa: ', LEstabelecimento.Company.Name);
      Writeln('Situação: ', LEstabelecimento.StatusText);
      Writeln('Endereço: ', LEstabelecimento.Address.FormattedAddress);
    finally
      LEstabelecimento.Free;
    end;
  finally
    LClient.Free;
  end;
end;

Especificar a API

delphi
// Usar API CNPJA
LEstabelecimento := LClient.Consultar('27865757000102', apiCNPJA);

// Usar API CNPJWS
LEstabelecimento := LClient.Consultar('27865757000102', apiCNPJWS);

Consulta Assíncrona

delphi
LClient.ConsultarAsync('27.865.757/0001-02',
  procedure(AEst: TEstablishment; AError: Exception)
  begin
    if Assigned(AError) then
      ShowMessage('Erro: ' + AError.Message)
    else if Assigned(AEst) then
    try
      // Processar resultado
      ShowMessage('Empresa: ' + AEst.Company.Name);
    finally
      AEst.Free;
    end;
  end);

Configurações Avançadas

delphi
LClient := TCNPJClient.Create;
try
  // Configurar timeout (30 segundos)
  LClient.Timeout := 30000;

  // Configurar User-Agent customizado
  LClient.UserAgent := 'MinhaAplicacao/1.0';

  // Definir API padrão
  LClient.APIType := apiCNPJA;

  // Configurar intervalo mínimo entre consultas (respeitar rate limit)
  // Padrão: 20000ms (20 segundos)
  LClient.MinInterval := 20000;

  // Realizar consulta
  LEstabelecimento := LClient.Consultar('27865757000102');
finally
  LClient.Free;
end;

Estrutura de Dados

TEstablishment

Classe principal contendo todos os dados do estabelecimento:

delphi
property TaxId: string              // CNPJ (14 dígitos)
property Alias: string              // Nome fantasia
property Founded: TDate             // Data de abertura
property Head: Boolean              // True = Matriz, False = Filial
property StatusText: string         // Situação cadastral
property StatusDate: TDate          // Data da situação
property IsActive: Boolean          // True se situação = "Ativa"
property Updated: TDateTime         // Data da última atualização

property Company: TCompany          // Dados da empresa
property Address: TAddress          // Endereço completo
property MainActivity: TActivity    // CNAE principal
property SideActivities: TList<TActivity>  // CNAEs secundários
property Phones: TList<TPhone>      // Telefones
property Emails: TList<TEmail>      // Emails
property Registrations: TList<TRegistration>  // Inscrições estaduais
property SUFRAMA: TList<TSUFRAMA>   // Dados SUFRAMA

TCompany

delphi
property Name: string               // Razão social
property Equity: Currency           // Capital social
property NatureId: string           // ID natureza jurídica
property NatureText: string         // Descrição natureza jurídica
property SizeId: Integer            // ID porte
property SizeText: string           // Descrição porte
property SizeAcronym: string        // Sigla porte (DEMAIS, ME, etc.)
property SimplesOptant: Boolean     // Optante Simples Nacional
property SimplesSince: TDate        // Data opção Simples
property SimeiOptant: Boolean       // Optante MEI
property SimeiSince: TDate          // Data opção MEI
property Members: TList<TMember>    // Sócios e administradores

TAddress

delphi
property Street: string             // Logradouro
property Number: string             // Número
property Details: string            // Complemento
property District: string           // Bairro
property City: string               // Cidade
property State: string              // UF
property ZipCode: string            // CEP
property Country: string            // País

function FormattedAddress: string;  // Retorna endereço formatado

TMember (Sócio)

delphi
property Since: TDate               // Data de entrada
property Person: TPerson            // Dados da pessoa
property Role: TRole                // Cargo/qualificação

TPhone

delphi
property PhoneType: TPhoneType      // ptLandline ou ptMobile
property AreaCode: string           // DDD
property Number: string             // Número

function Formatted: string;         // Retorna "(XX) XXXX-XXXX"

Tratamento de Erros

delphi
try
  LEstabelecimento := LClient.Consultar('12345678901234');
except
  on E: ECNPJException do
  begin
    // Erros específicos da consulta CNPJ
    if E.Message.Contains('não encontrado') then
      ShowMessage('CNPJ não existe na base de dados')
    else if E.Message.Contains('Limite') then
      ShowMessage('Aguarde antes de fazer outra consulta')
    else
      ShowMessage('Erro: ' + E.Message);
  end;
  on E: Exception do
    // Outros erros (rede, JSON inválido, etc.)
    ShowMessage('Erro inesperado: ' + E.Message);
end;

Rate Limiting

O cliente respeita automaticamente os limites de taxa das APIs:

  • CNPJA: 5 consultas/minuto → intervalo mínimo de 12 segundos
  • CNPJWS: 3 consultas/minuto → intervalo mínimo de 20 segundos
delphi
// Configurar intervalo personalizado (em milissegundos)
LClient.MinInterval := 15000;  // 15 segundos entre consultas

Exemplos Práticos

Validar CNPJ antes de consultar

delphi
function ValidarCNPJ(const ACNPJ: string): Boolean;
var
  LTemp: string;
  I: Integer;
begin
  LTemp := '';
  for I := 1 to Length(ACNPJ) do
    if ACNPJ[I] in ['0'..'9'] then
      LTemp := LTemp + ACNPJ[I];

  Result := (Length(LTemp) = 14);
end;

if ValidarCNPJ(edtCNPJ.Text) then
  LEstabelecimento := LClient.Consultar(edtCNPJ.Text)
else
  ShowMessage('CNPJ inválido!');

Buscar sócios com cargo específico

delphi
var
  LMember: TMember;
begin
  for LMember in LEstabelecimento.Company.Members do
  begin
    if SameText(LMember.Role.Text, 'Diretor') then
      Memo1.Lines.Add(LMember.Person.Name);
  end;
end;

Verificar se empresa é optante do Simples

delphi
if LEstabelecimento.Company.SimplesOptant then
begin
  Memo1.Lines.Add('Optante do Simples Nacional');
  Memo1.Lines.Add('Desde: ' + DateToStr(LEstabelecimento.Company.SimplesSince));
end;

Demonstração

Demo Console

Execute demo\CNPJ_Demo.dpr para ver exemplos de:

  • Consulta síncrona
  • Consulta assíncrona
  • Múltiplas consultas com rate limiting
  • Comparação entre APIs

Demo VCL

Execute vcl\CNPJ_VCL.dpr para uma aplicação com interface gráfica que demonstra:

  • Consulta interativa
  • Exibição de dados em abas organizadas
  • Log de operações

Licença

Este código é fornecido como exemplo para fins educacionais e comerciais.

Observações

  1. As APIs públicas podem ter defasagem de dados em relação à Receita Federal
  2. Respeite sempre os limites de taxa para não ser bloqueado
  3. Para uso em produção com alto volume, considere contratar as versões comerciais das APIs
  4. Os dados obtidos são de acesso público, mas seu uso deve respeitar a LGPD

Suporte e Bugs

Para reportar problemas ou sugerir melhorias, consulte a documentação das APIs: