v3.0 · Fev 2026
Documentação Técnica
AXIO — Plataforma de Consulta de Informações Corporativas · METADAX
1. Visão Geral da Arquitetura
O AXIO é uma plataforma server-side proxy. O browser nunca chama a API RFN diretamente — todas as requisições passam pelo serverless function /api/data, que autentica, encaminha e devolve os dados.
Por que POST em vez de GET?
Usando POST, o CNPJ consultado não aparece em logs de CDN, histórico do browser, cabeçalhos Referer ou analytics. Combinado com CORS restrito ao domínio autorizado, isso impede que sites terceiros consumam a API indiretamente via browser.
Browser (axio.metadax.com.br)
│
│ POST /api/data { cnpj: "..." }
│ Header: X-Metadax-Key: {systemId}
▼
Vercel Serverless — api/data.js
│
├─► GET metadax.com.br/_functions/systemsStatus?systemId={key}
│ Valida: systemId === env.METADAX_API_KEY
│ title === env.METADAX_APP_URL
│ license === "true"
│
└─► GET axio.metadax.com.br/api/data?cnpj={cnpj}
Retorna: { cadastro, localizacao, rating, apiStatus, _meta }
▼
Resposta enriquecida com _coords e _auth
▼
Browser ← JSON final
2. Autenticação via systemsStatus
Fluxo de validação
O proxy valida a identidade da aplicação cliente em três etapas:
- Correspondência de chave: O valor do header
X-Metadax-Key deve ser idêntico ao process.env.METADAX_API_KEY (systemId UUID).
- Consulta systemsStatus: O servidor faz um GET em
https://metadax.com.br/_functions/systemsStatus?systemId={key} e verifica se systems[0].license === "true".
- Validação de URL: O campo
systems[0].title (ex: axio.metadax.com.br) deve bater com process.env.METADAX_APP_URL e/ou o Origin da requisição.
Resposta do systemsStatus (exemplo):
{"success":true,"systems":[{"systemId":"14aa8fb8-c927-4f6d-89b2-57bbede12406","title":"axio.metadax.com.br","owner":"METADAX","status":"✅ Operacional","license":"true"}]}
Configuração de ambiente
| Variável | Descrição | Exemplo |
| METADAX_API_KEY | systemId UUID registrado no systemsStatus. Enviado no header X-Metadax-Key. | 14aa8fb8-c927-4f6d-89b2-57bbede12406 |
| METADAX_APP_URL | Hostname da aplicação autorizada. Deve bater com o campo "title" do systemsStatus. | axio.metadax.com.br |
Modo desenvolvimento: quando METADAX_API_KEY não está configurado, a autenticação é ignorada com aviso no log. Nunca faça deploy sem a variável configurada.
Degraded mode
Se o endpoint systemsStatus estiver temporariamente indisponível, o proxy loga o aviso e prossegue com a validação relaxada (apenas chave vs. env var), evitando interrupção do serviço. O campo _auth.degraded: true na resposta indica quando isso aconteceu.
3. Endpoint POST /api/data
POST
https://axio.metadax.com.br/api/data
Headers obrigatórios
| Header | Valor | Descrição |
| Content-Type | application/json | Formato do body |
| X-Metadax-Key | {systemId UUID} | Chave de autenticação do sistema cadastrado no systemsStatus |
Body (JSON)
| Campo | Tipo | Obrigatório | Descrição |
| cnpj | string | required | CNPJ com ou sem formatação (14 dígitos ou formatado XX.XXX.XXX/XXXX-XX) |
Respostas HTTP
| Status | Significado |
| 200 | Sucesso — retorna o JSON completo da empresa |
| 400 | Body inválido ou CNPJ ausente/inválido |
| 401 | X-Metadax-Key inválida ou não autorizada |
| 404 | Empresa não encontrada na Receita Federal |
| 405 | Método não permitido (apenas POST é aceito) |
| 502 | API RFN upstream indisponível |
4. Estrutura da Resposta (200 OK)
A resposta é um JSON com os seguintes objetos de nível superior:
{
"apiStatus": {
"brasilapi": "online", // status da BrasilAPI
"viacep": "online", // status da ViaCEP
"bcb": "offline" // status do BCB Olinda (opcional)
},
"_meta": {
"sources": ["BrasilAPI", "ViaCEP"],
"warnings": [{ "api": "BCB Olinda", "reason": "NOT_FOUND" }]
},
"cadastro": { ... }, // dados da Receita Federal (ver seção 5)
"localizacao": { ... }, // dados de endereço enriquecidos via ViaCEP (ver seção 6)
"rating": { ... }, // rating calculado pela API RFN (pode divergir do CorpInfo)
"_coords": { "lat": -19.92, "lng": -43.94 }, // coordenadas por UF para mapa
"_auth": {
"systemId": "14aa8fb8-...", // systemId validado
"app": "axio.metadax.com.br", // aplicação autorizada
"degraded": false // true se systemsStatus estava offline
}
}
O objeto rating retornado pela API RFN usa critérios internos. O dashboard AXIO recalcula o rating no frontend usando o algoritmo próprio A–F descrito na seção 10, garantindo consistência independente de mudanças na API upstream.
5. Campos: cadastro
Todos os campos são fornecidos pela BrasilAPI (Receita Federal) via RFN. Campos numéricos não estão entre aspas no JSON.
| Campo | Tipo | Descrição |
| cnpj | string | CNPJ numérico (14 dígitos, sem formatação) |
| razao_social | string | Razão social conforme Receita Federal |
| nome_fantasia | string | Nome fantasia (pode estar em branco) |
| natureza_juridica | string | Descrição da natureza jurídica (ex: "Sociedade Empresária Limitada") |
| codigo_natureza_juridica | int | Código numérico da natureza jurídica (ex: 2062) |
| identificador_matriz_filial | int | 1 = MATRIZ, 2 = FILIAL |
| descricao_identificador_matriz_filial | string | "MATRIZ" ou "FILIAL" |
| porte | string | "MICRO EMPRESA", "EPP", "GRANDE", "MICROEMPREENDEDOR INDIVIDUAL (MEI)" |
| codigo_porte | int | Código numérico do porte |
| situacao_cadastral | int | Código: 2=ATIVA, 3=SUSPENSA, 4=INAPTA, 8=BAIXADA |
| descricao_situacao_cadastral | string | "ATIVA", "SUSPENSA", "INAPTA", "BAIXADA" |
| data_situacao_cadastral | string | Data ISO 8601 (ex: "2008-08-25") |
| motivo_situacao_cadastral | int | Código do motivo (0 = sem motivo) |
| descricao_motivo_situacao_cadastral | string | Descrição do motivo (ex: "SEM MOTIVO") |
| situacao_especial | string | Situação especial, se houver |
| data_situacao_especial | string|null | Data da situação especial |
| data_inicio_atividade | string | Data de início das atividades (ISO 8601) |
| capital_social | float | Capital social em reais (ex: 73000.0) |
| qualificacao_do_responsavel | int | Código de qualificação do sócio responsável |
| opcao_pelo_simples | boolean | true se optante pelo Simples Nacional |
| data_opcao_pelo_simples | string|null | Data de opção pelo Simples |
| data_exclusao_do_simples | string|null | Data de exclusão do Simples (se aplicável) |
| opcao_pelo_mei | boolean | true se MEI |
| data_opcao_pelo_mei | string|null | Data de opção pelo MEI |
| data_exclusao_do_mei | string|null | Data de exclusão do MEI |
| cnae_fiscal | int | Código do CNAE principal (ex: 6201501) |
| cnae_fiscal_descricao | string | Descrição do CNAE principal |
| cnaes_secundarios | array | Lista de CNAEs secundários (ver seção 8) |
| regime_tributario | array | Histórico de regime tributário (ver seção 9) |
| descricao_tipo_de_logradouro | string | Tipo do logradouro (ex: "RUA", "AVENIDA") |
| logradouro | string | Nome do logradouro |
| numero | string | Número |
| complemento | string | Complemento do endereço |
| bairro | string | Bairro |
| municipio | string | Nome do município |
| codigo_municipio | int | Código SIAFI do município |
| codigo_municipio_ibge | int | Código IBGE do município (ex: 3106200) |
| uf | string | UF (ex: "MG") |
| cep | string | CEP (8 dígitos, sem hífen) |
| ddd_telefone_1 | string | DDD + número (ex: "3199870972"). O DDD está embutido nos dois primeiros dígitos. |
| ddd_telefone_2 | string | Segundo telefone (pode estar em branco) |
| ddd_fax | string | Fax (pode estar em branco) |
| email | string|null | E-mail de contato |
| pais | string|null | País (null para empresas nacionais) |
| codigo_pais | int|null | Código do país |
| nome_cidade_no_exterior | string | Cidade no exterior (se aplicável) |
| ente_federativo_responsavel | string | Ente federativo responsável |
| qsa | array | Quadro Societário (ver seção 7) |
6. Campos: localizacao
Dados enriquecidos via ViaCEP. Prefira estes campos para exibição de endereço, pois têm formatação consistente e incluem estado e região.
| Campo | Tipo | Descrição |
| cep | string | CEP formatado (ex: "31270-300") |
| logradouro | string | Nome do logradouro (ex: "Rua Frei Manoel da Cruz") |
| complemento | string | Complemento |
| unidade | string | Unidade (normalmente vazio) |
| bairro | string | Bairro |
| localidade | string | Cidade (ex: "Belo Horizonte") |
| uf | string | UF (ex: "MG") |
| estado | string | Nome completo do estado (ex: "Minas Gerais") |
| regiao | string | Região geográfica (ex: "Sudeste") |
| ibge | string | Código IBGE do município (ex: "3106200") |
| gia | string | Código GIA (SP) |
| ddd | string | DDD do município (ex: "31") |
| siafi | string | Código SIAFI do município |
7. Campos: cadastro.qsa[]
Cada objeto do array representa um sócio ou administrador cadastrado na Receita Federal.
| Campo | Tipo | Descrição |
| nome_socio | string | Nome completo do sócio |
| cnpj_cpf_do_socio | string | CPF/CNPJ mascarado (ex: "***918266**") |
| qualificacao_socio | string | Qualificação (ex: "Sócio-Administrador") |
| codigo_qualificacao_socio | int | Código numérico da qualificação (49 = Sócio-Administrador) |
| identificador_de_socio | int | 1 = Pessoa Jurídica, 2 = Pessoa Física |
| faixa_etaria | string | Ex: "Entre 41 a 50 anos" |
| codigo_faixa_etaria | int | Código da faixa etária (1–8) |
| data_entrada_sociedade | string | Data de entrada na sociedade (ISO 8601) |
| pais | string|null | País do sócio (null para nacionais) |
| codigo_pais | int|null | Código do país |
| cpf_representante_legal | string | CPF mascarado do representante legal |
| nome_representante_legal | string | Nome do representante legal (pode estar em branco) |
| qualificacao_representante_legal | string | Qualificação do representante |
| codigo_qualificacao_representante_legal | int | Código numérico da qualificação do representante |
8. Campos: CNAEs
CNAE Principal
Retornado como campos soltos em cadastro:
| Campo | Tipo | Descrição |
| cnae_fiscal | int | Código do CNAE principal (ex: 6201501). Atenção: é um inteiro, não string. |
| cnae_fiscal_descricao | string | Descrição do CNAE principal |
CNAEs Secundários (cnaes_secundarios[])
| Campo | Tipo | Descrição |
| codigo | int | Código numérico do CNAE secundário. Também é inteiro. |
| descricao | string | Descrição da atividade econômica |
Atenção: tanto cnae_fiscal quanto cnaes_secundarios[].codigo chegam como números inteiros no JSON. Sempre converta para string com String(c.cnae_fiscal) antes de exibir.
9. Campos: regime_tributario[]
Histórico do regime tributário da empresa. Cada entrada representa um ano fiscal.
| Campo | Tipo | Descrição |
| ano | int | Ano fiscal (ex: 2022) |
| forma_de_tributacao | string | "LUCRO PRESUMIDO", "LUCRO REAL", "SIMPLES NACIONAL" |
| quantidade_de_escrituracoes | int | Número de escriturações no ano |
| cnpj_da_scp | string|null | CNPJ da Sociedade em Conta de Participação (se aplicável) |
10. Algoritmo de Rating A–F (AXIO)
O rating é calculado pelo frontend (script.js · calcRating()), não pelo backend, garantindo transparência total. A API RFN também devolve seu próprio rating, que pode divergir; o CorpInfo sempre exibe o valor calculado localmente.
Critérios e pontuação
| Critério | Campo(s) utilizado(s) | Max | Lógica |
| Situação Cadastral |
descricao_situacao_cadastral |
20 pts |
ATIVA=20 · SUSPENSA=10 · INAPTA=5 · Outros=0 |
| Capital Social |
capital_social |
20 pts |
≥R$1B=20 · ≥R$1M=16 · ≥R$100K=12 · ≥R$10K=8 · >R$0=4 · R$0=0 |
| Porte da Empresa |
porte |
10 pts |
GRANDE=10 · MÉDIO=8 · EPP=6 · MICRO EMPRESA=4 · MEI=2 |
| Quadro Societário |
qsa[] (quantidade) |
15 pts |
≥3 sócios=15 · 2=12 · 1=8 · 0=0 |
| Abrangência (Matriz/Filial) |
identificador_matriz_filial |
10 pts |
MATRIZ=7 · FILIAL=3 |
| Atividades Econômicas |
cnae_fiscal + cnaes_secundarios[] |
10 pts |
≥5 CNAEs=10 · ≥3=8 · ≥2=6 · 1=3 · 0=0 |
| Natureza Jurídica |
natureza_juridica |
10 pts |
S.A. Aberta=10 · S.A. Fechada=8 · Ltda=7 · EIRELI=5 · MEI=2 |
| Regime Tributário |
regime_tributario[] + opcao_pelo_simples + opcao_pelo_mei |
5 pts |
Lucro Real/Presumido=5 · Simples=3 · MEI=2 · Sem info=2 |
Conversão score → nota
| Nota | Score | Descrição |
| A | 90 – 100 | Solidez Máxima |
| B | 75 – 89 | Alta Solidez |
| C | 58 – 74 | Solidez Moderada |
| D | 42 – 57 | Solidez Baixa |
| E | 25 – 41 | Alta Fragilidade |
| F | 0 – 24 | Fragilidade Máxima |
11. Códigos de Erro
Todas as respostas de erro seguem o formato:
{ "error": "CODIGO_DO_ERRO", "message": "Descrição legível", "docs": "URL" }
| HTTP | error | Causa |
| 400 | BAD_REQUEST | Campo cnpj ausente no body |
| 400 | INVALID_BODY | Body não é JSON válido |
| 400 | INVALID_CNPJ | CNPJ com menos de 8 dígitos |
| 401 | UNAUTHORIZED | X-Metadax-Key inválida, systemId não encontrado, licença inativa ou URL não autorizada |
| 404 | NOT_FOUND | CNPJ não encontrado na Receita Federal |
| 405 | METHOD_NOT_ALLOWED | Tentativa de usar GET em vez de POST |
| 502 | UPSTREAM_ERROR | API RFN (axio.metadax.com.br) indisponível |
12. Exemplos de Integração
cURL
curl -X POST https://axio.metadax.com.br/api/data \
-H "Content-Type: application/json" \
-H "X-Metadax-Key: 14aa8fb8-c927-4f6d-89b2-57bbede12406" \
-d '{"cnpj":"10292923000118"}'
JavaScript (fetch)
const response = await fetch('/api/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Metadax-Key': window.__METADAX_KEY__, // injetado no build
},
body: JSON.stringify({ cnpj: '65.640.808/0001-89' }),
});
const data = await response.json();
// Campos principais:
const c = data.cadastro;
const l = data.localizacao;
console.log(c.razao_social); // "METADAX CONSULTORIA LTDA"
console.log(c.descricao_situacao_cadastral); // "ATIVA"
console.log(c.capital_social); // 73000
console.log(String(c.cnae_fiscal)); // "6201501" (converter para string!)
console.log(l.estado + ' / ' + l.regiao); // "Minas Gerais / Sudeste"
// QSA:
c.qsa.forEach(s => {
console.log(s.nome_socio, s.qualificacao_socio, s.data_entrada_sociedade);
});
// CNAEs secundários:
c.cnaes_secundarios.forEach(cn => {
console.log(String(cn.codigo), cn.descricao);
});
Node.js (server-side)
const https = require('https');
function consultarCNPJ(cnpj, systemKey) {
return new Promise((resolve, reject) => {
const body = JSON.stringify({ cnpj });
const req = https.request({
hostname: 'axio.metadax.com.br',
path: '/api/data',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(body),
'X-Metadax-Key': systemKey,
},
}, (res) => {
let data = '';
res.on('data', c => { data += c; });
res.on('end', () => resolve(JSON.parse(data)));
});
req.on('error', reject);
req.write(body);
req.end();
});
}
const dados = await consultarCNPJ('65.640.808/0001-89', process.env.METADAX_API_KEY);
console.log(dados.cadastro.razao_social);
Exemplo: METADAX CONSULTORIA LTDA (65.640.808/0001-89)
| Critério | Valor | Pts | Nota |
| Situação Cadastral | ATIVA | 20/20 | A |
| Capital Social | R$ 73.000,00 | 8/20 | D |
| Porte da Empresa | MICRO EMPRESA | 4/10 | D |
| Quadro Societário | 2 sócios | 15/15 | A |
| Abrangência | MATRIZ | 7/10 | C |
| Atividades Econômicas | 5 CNAEs (1 principal + 15 sec.) | 10/10 | A |
| Natureza Jurídica | Sociedade Empresária Limitada | 7/10 | B |
| Regime Tributário | Lucro Presumido (2022) | 5/5 | A |
| Total | | 76/100 | B |
13. Variáveis de Ambiente (Vercel)
Configure no painel Vercel em Project → Settings → Environment Variables:
| Variável | Descrição | Exemplo |
| METADAX_API_KEY |
systemId UUID do sistema registrado no systemsStatus METADAX. Deve ser o mesmo valor enviado no header X-Metadax-Key pelo frontend. |
14aa8fb8-c927-4f6d-89b2-57bbede12406 |
| METADAX_APP_URL |
Hostname da aplicação autorizada, deve bater com o campo "title" no systemsStatus. |
axio.metadax.com.br |
Nunca exponha o systemId UUID em código-fonte público. Embora o header X-Metadax-Key seja enviado pelo browser, o valor real é injetado via variável de ambiente no momento do build. Para ambientes de produção, use window.__METADAX_KEY__ com substituição em tempo de build (ex: script de build do Vercel).
Configuração Vercel (vercel.json)
{
"build": {
"env": {
"METADAX_API_KEY": "@metadax-api-key",
"METADAX_APP_URL": "axio.metadax.com.br"
}
},
"headers": [
{
"source": "/api/(.*)",
"headers": [
{ "key": "Cache-Control", "value": "no-store" },
{ "key": "X-Content-Type-Options", "value": "nosniff" }
]
}
]
}