Neste artigo
1. Objetivo e Escopo
1.1 Objetivo
1.2 Escopo
1.3 Público-alvo
1.4 Convenções adotadas neste documento
2. Visão Geral da Solução
2.1 Como funciona
2.2 Componentes da solução
3. Pré-requisitos e Configuração
3.1 Conta e chave de API na CNPJá
3.2 Parâmetros do sistema
3.3 Seleção da chave de API por empresa
3.4 Validação de usuário nos campos de CNPJ
4. Operação
4.1 Cadastro de clientes
4.2 Cadastro de fornecedores
4.3 Campos preenchidos automaticamente
4.4 Regras de tratamento dos dados
4.5 Inscrição estadual
5. Documentação Técnica de Fontes
5.1 CNPJA00 — classe de comunicação com a API
5.2 CNPJA01 — atualização dos cadastros
5.3 Fluxo de execução
6. API CNPJá: custos, cache e limites
7. Tratamento de Erros e Diagnóstico
8. Quando acionar o suporte técnico
1. Objetivo e Escopo
1.1 Objetivo
Documentar a integração entre o TOTVS Protheus e a API do CNPJá, que realiza o preenchimento automático dos dados cadastrais de clientes e fornecedores a partir do CNPJ informado, reduzindo digitação manual e erros de cadastro.
1.2 Escopo
Este documento cobre:
- A visão geral e o funcionamento da solução;
- A configuração necessária no Protheus (parâmetros, validação de usuário e chave de API);
- A operação nos cadastros de clientes (SA1) e de fornecedores (SA2);
- A documentação técnica dos fontes ADVPL CNPJA00 e CNPJA01;
- O diagnóstico das ocorrências mais frequentes.
Não fazem parte do escopo deste documento:
- Contratação, faturamento e gestão de créditos junto à CNPJá;
- Instalação de patches e compilação de fontes no ambiente do cliente;
- Customizações específicas do cliente fora dos fontes aqui descritos.
1.3 Público-alvo
Os capítulos 3 e 4 destinam-se à equipe de operação e à consultoria funcional. Os capítulos 5 a 7 destinam-se à equipe técnica (desenvolvimento ADVPL e suporte). Pressupõe-se conhecimento prévio do TOTVS Protheus e dos cadastros de clientes e fornecedores.
1.4 Convenções adotadas neste documento
| Elemento | Convenção |
|---|---|
| Caminho de menu | Apresentado no formato Módulo → Menu → Submenu → Rotina. Exemplo: Faturamento → Atualizações → Cadastros → Clientes. |
| Campo, botão ou parâmetro | Grafado em negrito, conforme exibido no sistema. Exemplo: A1_CGC, AD_CNPJAUR. |
| Fonte, função ou código | Grafado em fonte monoespaçada. Exemplo: U_CNPJA01(). |
2. Visão Geral da Solução
2.1 Como funciona
O CNPJá é um serviço que consolida dados públicos de empresas brasileiras (Receita Federal, Simples Nacional, Cadastro Centralizado de Contribuintes, SINTEGRA e SUFRAMA) e os disponibiliza por meio de uma API REST. A integração consulta essa API assim que o usuário informa um CNPJ completo (14 dígitos) no cadastro e preenche automaticamente os campos de razão social, nome fantasia, endereço, contatos e inscrição estadual.
Resumo do fluxo
- O usuário informa o CNPJ no campo A1_CGC (clientes) ou A2_CGC (fornecedores);
- Ao sair do campo, a validação de usuário aciona a função
U_CNPJA01(); - A função consulta a API CNPJá (
GET /office/{CNPJ}) usando a classeCNPJA00; - Os dados retornados são tratados (maiúsculas, remoção de acentos, ajuste de tamanho) e gravados nos campos da tela;
- O usuário revisa os dados e confirma o cadastro normalmente.
Consulta somente com CNPJ completo
A consulta automática só é disparada em ambiente com interface (não ocorre em execuções sem interface, como rotinas automáticas) e somente quando o campo de CNPJ possui exatamente 14 caracteres. CPF (pessoa física) não aciona a consulta.
2.2 Componentes da solução
| Componente | Tipo | Função |
|---|---|---|
| CNPJA00.prw | Classe ADVPL (CNPJA00) |
Cliente REST da API CNPJá: define URL e chave de API, monta os cabeçalhos, executa a requisição e devolve o resultado em estrutura padronizada. |
| CNPJA01.prw | User Function (U_CNPJA01) |
Consulta o CNPJ, interpreta o JSON de retorno e atualiza os campos de clientes (SA1) ou fornecedores (SA2). |
ADTsTCNPJA |
User Function (dentro de CNPJA00.prw) | Utilitário de teste: consulta um CNPJ e devolve a estrutura de resposta bruta. |
| Validação de usuário | Configuração no dicionário (SX3) | Dispara U_CNPJA01() ao informar o CNPJ nos campos A1_CGC e A2_CGC. |
| API CNPJá | Serviço externo | Fornece os dados cadastrais (cnpja.com/api). |
3. Pré-requisitos e Configuração
3.1 Conta e chave de API na CNPJá
A API Comercial da CNPJá exige uma conta e uma Chave de API, enviada no cabeçalho Authorization de cada requisição. A chave é gerada automaticamente no cadastro da conta e fica disponível na página de Chave de API do portal da CNPJá. O consumo é controlado por créditos e por limite de requisições por minuto, ambos vinculados ao plano contratado (ver capítulo 6).
A CNPJá disponibiliza dois ambientes:
| Ambiente | URL base | Uso |
|---|---|---|
| API Comercial (paga) | https://api.cnpja.com |
Produção. Exige chave de API e consome créditos. |
| API Aberta (gratuita) | https://open.cnpja.com |
Testes e homologação. Possui limitações de uso; consulte a documentação da CNPJá. |
Atenção: ambiente padrão
Se o parâmetro AD_CNPJAUR não estiver configurado, a solução utiliza a API Aberta (https://open.cnpja.com). Em ambiente de produção, configure o parâmetro com a URL da API Comercial.
3.2 Parâmetros do sistema
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
| AD_CNPJAUR | Caractere | https://open.cnpja.com |
URL base da API CNPJá. Em produção, informar https://api.cnpja.com. |
| AD_CONSZTM | Lógico | .F. |
Quando .T., os campos são preenchidos a partir da tabela de apoio ZTM, por meio da função U_VTXRetZTM, nos processos CNPJA1 (clientes) e CNPJA2 (fornecedores), em vez de usar diretamente os valores retornados pela API. Quando .F., os dados da CNPJá são gravados diretamente. [INFORMAÇÃO A CONFIRMAR] — validar o propósito funcional da ZTM com a equipe responsável. |
3.3 Seleção da chave de API por empresa
A classe CNPJA00 identifica o CNPJ da empresa/filial logada no Protheus (campo M0_CGC do cadastro de empresas) e, com base nele, define qual chave de API será enviada à CNPJá. Isso permite que grupos com mais de um CNPJ, ou clientes distintos atendidos pelo mesmo repositório de fontes, utilizem contas CNPJá separadas.
A regra é aplicada em ResolveToken(), na seguinte ordem (a última regra atendida prevalece):
- Empresa de teste (código 99): utiliza a chave da conta de testes;
- CNPJ pertencente a uma lista de CNPJs associados a uma conta: utiliza a chave dessa conta;
- Nenhuma regra atendida: a chave fica vazia e a requisição é enviada sem o cabeçalho
Authorization.
Segurança da chave de API
Na versão atual dos fontes, as chaves de API estão gravadas diretamente no código (hardcoded). Isso expõe as chaves a qualquer pessoa com acesso ao repositório ou ao RPO e exige recompilação a cada troca de chave. A recomendação é mover as chaves para parâmetros do sistema (por exemplo, um parâmetro por CNPJ ou uma tabela de configuração). Nunca publique os fontes completos, nem chaves de API, em artigos da central de ajuda.
3.4 Validação de usuário nos campos de CNPJ
Para que a consulta seja disparada automaticamente, inclua a expressão abaixo na Validação de Usuário (dicionário de dados, tabela SX3) de cada campo:
Clientes — campo A1_CGC
IIF(!IsBlind() .And. Len(AllTrim(M->A1_CGC)) == 14, U_CNPJA01(), .T.)
Fornecedores — campo A2_CGC
IIF(!IsBlind() .And. Len(AllTrim(M->A2_CGC)) == 14, U_CNPJA01(), .T.)
A função identifica automaticamente a tabela de destino pela rotina em execução: quando a rotina é MATA020 (Fornecedores), atualiza a SA2; nos demais casos (por exemplo, MATA030 ou CRMA980 — Clientes), atualiza a SA1.
4. Operação
4.1 Cadastro de clientes
Caminho: Faturamento → Atualizações → Cadastros → Clientes (rotina MATA030 ou CRMA980, conforme a versão).
- Acione Incluir;
- No campo CNPJ/CPF (A1_CGC), informe os 14 dígitos do CNPJ e pressione Tab (ou saia do campo);
- Aguarde a consulta à CNPJá. Os campos de razão social, nome fantasia, endereço, bairro, município, UF, CEP, telefone, e-mail e inscrição estadual serão preenchidos;
- Revise os dados, complete os demais campos obrigatórios (loja, tipo, natureza, condição de pagamento etc.) e acione Confirmar.
4.2 Cadastro de fornecedores
Caminho: Compras → Atualizações → Cadastros → Fornecedores (rotina MATA020).
- Acione Incluir;
- No campo CNPJ/CPF (A2_CGC), informe os 14 dígitos do CNPJ e saia do campo;
- Os campos de dados cadastrais serão preenchidos automaticamente;
- Revise, complete os demais campos obrigatórios e acione Confirmar.
Dados sempre revisáveis
Os dados são preenchidos na tela e podem ser ajustados pelo usuário antes da confirmação. A integração não altera o cadastro sem que o usuário confirme a inclusão ou alteração (exceto no modo de gravação direta, descrito no item 5.2).
4.3 Campos preenchidos automaticamente
| Informação (campo no JSON da CNPJá) | Clientes (SA1) | Fornecedores (SA2) |
|---|---|---|
Razão social (company.name) |
A1_NOME | A2_NOME |
Nome fantasia (alias) |
A1_NREDUZ | A2_NREDUZ |
Logradouro e número (address.street, address.number) |
A1_END (formato "LOGRADOURO, NÚMERO") | A2_END (formato "LOGRADOURO, NÚMERO") |
Número (address.number) |
— (concatenado em A1_END) | A2_NR_END |
Bairro (address.district) |
A1_BAIRRO | A2_BAIRRO |
Complemento (address.details) |
A1_COMPLEM | A2_COMPLEM |
Município (address.city) |
A1_MUN | A2_MUN |
UF (address.state) |
A1_EST | A2_EST |
Código do município IBGE (address.municipality) |
A1_COD_MUN | A2_COD_MUN |
CEP (address.zip) |
A1_CEP | A2_CEP |
DDD do primeiro telefone (phones[1].area) |
A1_DDD | A2_DDD |
Número do primeiro telefone (phones[1].number) |
A1_TEL | A2_TEL |
Primeiro e-mail (emails[1].address) |
A1_EMAIL | A2_EMAIL |
Primeira inscrição estadual (registrations[1].number) |
A1_INSCR | A2_INSCR |
4.4 Regras de tratamento dos dados
- Textos: razão social, fantasia, logradouro, bairro, complemento e município são convertidos para maiúsculas, sem acentos;
-
Tamanho: cada valor é cortado ao tamanho do respectivo campo no dicionário de dados (
TamSX3); - Endereço: o campo de endereço é gravado no formato "LOGRADOURO, NÚMERO";
- Código do município: a CNPJá retorna o código IBGE de 7 dígitos (2 do estado + 5 do município). O Protheus recebe apenas os 5 dígitos do município;
- CEP: somente dígitos;
- Telefone e e-mail: utiliza-se o primeiro contato retornado pela API. Se a API não retornar contatos, os campos não são alterados pela consulta;
- Campos ausentes: quando a API não retorna determinada informação, o valor correspondente é gravado vazio.
4.5 Inscrição estadual
A inscrição estadual é obtida pelo parâmetro registrations da API (Cadastro Centralizado de Contribuintes/SINTEGRA):
- Se a API retornar inscrições, é utilizada a primeira da lista;
- Se não houver inscrição retornada, o campo é preenchido com ISENTO;
- Na rotina de clientes, a atualização da inscrição pode ser desabilitada pelo parâmetro
lAtuINSCRda função (ver item 5.2).
Conferência recomendada
Empresas com inscrição em mais de um estado podem possuir várias inscrições. A solução utiliza a primeira retornada; confira se corresponde à UF do endereço cadastrado. [INFORMAÇÃO A CONFIRMAR] — validar o valor enviado no parâmetro registrations da consulta (atualmente BR) frente à documentação da CNPJá, que prevê a lista de UFs, ORIGIN (UF do endereço) ou ALL (todas as UFs).
5. Documentação Técnica de Fontes
5.1 CNPJA00 — classe de comunicação com a API
Arquivo: CNPJA00.prw | Autor: Rafael Yera Barchi | Criação: 20/10/2025
Classe ADVPL que encapsula as chamadas REST à API CNPJá, utilizando a classe padrão FWREST.
Propriedades
| Propriedade | Descrição |
|---|---|
cBaseUrl |
URL base da API. Origem: parâmetro AD_CNPJAUR. |
cCNPJ |
CNPJ da empresa/filial logada (somente dígitos). Usado para escolher a chave de API. |
cToken |
Chave de API selecionada para o CNPJ da empresa. |
aDefaultHeaders |
Cabeçalhos HTTP padrão enviados em todas as requisições. |
Métodos
| Método | Descrição |
|---|---|
New() |
Construtor. Lê AD_CNPJAUR, identifica o CNPJ da empresa logada (FWSM0Util), resolve a chave de API e monta os cabeçalhos. |
SetCNPJ(cCNPJ) |
Define o CNPJ de contexto (somente dígitos) e chama ResolveToken(). |
ResolveToken() |
Seleciona a chave de API conforme o CNPJ da empresa (ver item 3.3). |
BuildHeaders() |
Monta os cabeçalhos: Content-Type: application/json, Accept: application/json, User-Agent: Protheus/1.0 e, havendo chave, Authorization. |
AddHeader(cName, cValue) |
Adiciona um cabeçalho personalizado à lista padrão. |
DoRequest(cMethod, cEndpoint, hQuery, cBody, hHeaders) |
Executa uma requisição genérica (GET, POST, PUT ou DELETE) e devolve a resposta padronizada. |
GetOffice(cnpj) |
Consulta um estabelecimento: GET /office/{CNPJ}. Se o CNPJ estiver vazio, devolve erro "CNPJ vazio" sem chamar a API. |
GetHealth() |
Chamada simples à raiz da API, útil para diagnóstico de conectividade. |
Estrutura de retorno do método DoRequest
O método devolve um array de pares chave/valor, sempre na mesma ordem:
| Posição | Chave | Tipo | Conteúdo |
|---|---|---|---|
| 1 | ok |
Lógico |
.T. se a requisição foi bem-sucedida. |
| 2 | status |
Numérico | Código HTTP retornado (ex.: 200, 404, 429). |
| 3 | url |
Caractere | URL final da requisição. |
| 4 | raw |
Caractere | Corpo da resposta (JSON) sem tratamento. |
| 5 | error |
Caractere | Mensagem de erro, quando houver. |
| 6 | headers |
Array | Cabeçalhos enviados na requisição. |
Funções auxiliares (internas ao fonte)
-
OnlyDigits(cVal)— mantém apenas os dígitos de uma string; -
UrlJoin(cBase, cPath)— concatena URL base e caminho, tratando a barra; -
BuildQueryString(hQuery)— monta a query string codificada a partir de um hash.
Exemplo de uso (utilitário de teste)
User Function ADTsTCNPJA(cCNPJ) local oCli := CNPJA00():New() local aRet := oCli:GetOffice(cCNPJ) return aRet
5.2 CNPJA01 — atualização dos cadastros
Arquivo: CNPJA01.prw | Função: U_CNPJA01 | Retorno: .T. em caso de sucesso; .F. em caso de falha.
Assinatura
U_CNPJA01(cCNPJ, cAliasCad, cCodCli, cLjCli, lAtuINSCR)
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
cCNPJ |
Caractere | vazio | CNPJ a consultar. Se vazio, utiliza M->A1_CGC ou M->A2_CGC, conforme a rotina. |
cAliasCad |
Caractere | vazio | Informado junto com cCNPJ para ativar o modo de gravação direta. |
cCodCli |
Caractere | vazio | Código do cliente/fornecedor a atualizar (modo de gravação direta). |
cLjCli |
Caractere | vazio | Loja do cliente/fornecedor a atualizar (modo de gravação direta). |
lAtuINSCR |
Lógico | .T. |
Define se a inscrição estadual deve ser atualizada (aplicado ao cadastro de clientes). |
Modos de execução
| Modo | Como é acionado | O que faz |
|---|---|---|
| Em memória (tela) | Chamada sem parâmetros, pela validação de usuário do campo CNPJ. | Atualiza as variáveis de memória da tela (M->A1_* ou M->A2_*). A gravação ocorre quando o usuário confirma o cadastro. |
| Gravação direta | Chamada com cCNPJ, cAliasCad, cCodCli e cLjCli (ex.: rotinas de integração e atualização em lote). |
Posiciona o registro na SA1/SA2 pela chave (filial + código + loja), trava o registro (RecLock) e grava os dados. Se o registro não for encontrado, retorna .F. e registra o erro. |
Exemplo de chamada em gravação direta (clientes)
lOk := U_CNPJA01("12345678000190", "SA1", "000001", "01", .T.)Detecção da tabela de destino
A função verifica o nome da rotina em execução (FunName()): se for MATA020, trata como fornecedor (SA2); em qualquer outra rotina, trata como cliente (SA1).
Chamada à API
GET {AD_CNPJAUR}/office/{CNPJ}?registrations=BR5.3 Fluxo de execução
- Obtém o CNPJ (parâmetro ou campo da tela) e mantém apenas os dígitos;
- Instancia
CNPJA00(resolve URL e chave de API) e executa a consulta; - Se a resposta for bem-sucedida, interpreta o JSON e carrega os dados em variáveis internas;
- Aplica os dados ao cadastro (em memória ou gravação direta) conforme as regras do capítulo 4. Se AD_CONSZTM estiver ativo, os valores vêm da tabela ZTM; caso contrário, diretamente da CNPJá;
- Se a consulta falhar, exibe a mensagem de erro em tela (
FWAlertError) ou, em execução sem interface, grava no console do Application Server (ConOut).
6. API CNPJá: custos, cache e limites
As informações abaixo foram extraídas da documentação oficial da CNPJá (cnpja.com/api) e podem ser alteradas pelo fornecedor. Em caso de dúvida, a documentação da CNPJá prevalece.
| Tema | Informação |
|---|---|
| Endpoint utilizado |
GET /office/:taxId — Consulta CNPJ centralizada, com dados de diversas fontes. |
| Autenticação | Chave de API no cabeçalho Authorization. |
| Custo | 1 crédito por consulta online; sem custo quando atendida pelo cache. O parâmetro registrations acrescenta 1 crédito (via CCC) ou 1 crédito por UF (via SINTEGRA). |
| Cache | Por padrão, a estratégia é CACHE_IF_ERROR: dados com até 45 dias (maxAge) são considerados atualizados; se a consulta online falhar, dados com até 365 dias (maxStale) podem ser devolvidos. |
| Limite de uso | Quantidade máxima de consultas por minuto, conforme o plano contratado. |
| Status da API | Disponibilidade das fontes em cnpja.com/api/status. |
Códigos de erro retornados pela API
| Código HTTP | Significado |
|---|---|
| 400 | Parâmetro mal formatado ou ausente (ex.: CNPJ inválido). |
| 401 | Chave de API ausente ou incorreta. |
| 404 | CNPJ não encontrado na fonte consultada. |
| 429 | Créditos esgotados ou limite de consultas por minuto excedido. |
| 500 | Erro interno da API. |
| 503 | Fonte de dados temporariamente indisponível. |
7. Tratamento de Erros e Diagnóstico
Em caso de falha, o sistema exibe a janela Erro na consulta CNPJá - Estabelecimentos com a mensagem retornada. Em execuções sem interface, a mesma mensagem é gravada no console do Application Server.
| Sintoma | Causa provável | Ação |
|---|---|---|
| Nada acontece ao informar o CNPJ | Validação de usuário não configurada no campo; CNPJ com menos de 14 dígitos; ou execução sem interface. | Conferir a validação de usuário (item 3.4) e se o campo contém exatamente 14 dígitos. |
| Erro 401 / chave inválida | CNPJ da empresa logada sem chave associada, ou chave revogada. | Acionar o suporte técnico para revisar a seleção de chave (item 3.3). |
| Erro 429 | Créditos esgotados ou limite por minuto excedido. | Verificar o saldo e o plano na conta CNPJá; aguardar e tentar novamente. |
| Erro 404 | CNPJ inexistente ou digitado incorretamente. | Conferir o CNPJ informado. |
| Erro 503 ou falha de conexão | Indisponibilidade da fonte de dados ou bloqueio de rede. | Consultar cnpja.com/api/status; conferir liberação de saída HTTPS para o domínio da CNPJá no servidor. |
| Dados preenchidos em ambiente de produção com limitações de consulta | Parâmetro AD_CNPJAUR não configurado (usa a API Aberta). | Configurar o parâmetro com https://api.cnpja.com. |
| Inscrição estadual preenchida com "ISENTO" | API não retornou inscrição para o CNPJ. | Conferir a situação do contribuinte e preencher manualmente, se necessário. |
| Município com código incorreto ou ausente | API não retornou o código IBGE do município. | Preencher manualmente e acionar o suporte para análise. |
| Registro não encontrado (modo de gravação direta) | Código/loja informados não existem na SA1/SA2 da filial corrente. | Conferir os parâmetros cCodCli e cLjCli e a filial de execução. |
8. Quando acionar o suporte técnico
Acione o suporte técnico da Atos Data quando:
- O erro apontar para chave de API, parâmetros ou configuração da solução;
- For necessário incluir um novo CNPJ/empresa na seleção de chave de API;
- For necessário habilitar a consulta para novas rotinas de cadastro;
- A ocorrência não for compreendida ou persistir após as ações indicadas no capítulo 7.
Não altere parâmetros, validações de usuário ou fontes por conta própria.
Comentários
0 comentário
Por favor, entre para comentar.