Catalog · How the catalog works
consultacnpj
Consulta de CNPJ Gratuito - Delphi
- ★ 3 on GitHub
Anyone may press Interesting, signed in or not. It helps others find 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
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 arquivoInstalação
- Copie a unidade
src/CNPJWS.paspara o seu projeto - Adicione a unidade na cláusula
usesou no projeto - Pronto para usar!
Uso Básico
Consulta Síncrona
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
// Usar API CNPJA
LEstabelecimento := LClient.Consultar('27865757000102', apiCNPJA);
// Usar API CNPJWS
LEstabelecimento := LClient.Consultar('27865757000102', apiCNPJWS);Consulta Assíncrona
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
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:
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 SUFRAMATCompany
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 administradoresTAddress
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 formatadoTMember (Sócio)
property Since: TDate // Data de entrada
property Person: TPerson // Dados da pessoa
property Role: TRole // Cargo/qualificaçãoTPhone
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
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
// Configurar intervalo personalizado (em milissegundos)
LClient.MinInterval := 15000; // 15 segundos entre consultasExemplos Práticos
Validar CNPJ antes de consultar
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
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
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
- As APIs públicas podem ter defasagem de dados em relação à Receita Federal
- Respeite sempre os limites de taxa para não ser bloqueado
- Para uso em produção com alto volume, considere contratar as versões comerciais das APIs
- 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:

