v3.0 · Fev 2026

Documentação Técnica

AXIO — Plataforma de Consulta de Informações Corporativas · METADAX

Nesta página

  1. Visão Geral da Arquitetura
  2. Autenticação via systemsStatus
  3. Endpoint POST /api/data
  4. Estrutura da Resposta
  5. Campos: cadastro
  6. Campos: localizacao
  7. Campos: cadastro.qsa[]
  8. Campos: CNAEs
  9. Campos: regime_tributario[]
  10. Algoritmo de Rating A–F
  11. Códigos de Erro
  12. Exemplos de Integração
  13. Variáveis de Ambiente

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:

  1. Correspondência de chave: O valor do header X-Metadax-Key deve ser idêntico ao process.env.METADAX_API_KEY (systemId UUID).
  2. Consulta systemsStatus: O servidor faz um GET em https://metadax.com.br/_functions/systemsStatus?systemId={key} e verifica se systems[0].license === "true".
  3. 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ávelDescriçãoExemplo
METADAX_API_KEYsystemId UUID registrado no systemsStatus. Enviado no header X-Metadax-Key.14aa8fb8-c927-4f6d-89b2-57bbede12406
METADAX_APP_URLHostname 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

HeaderValorDescrição
Content-Typeapplication/jsonFormato do body
X-Metadax-Key{systemId UUID}Chave de autenticação do sistema cadastrado no systemsStatus

Body (JSON)

CampoTipoObrigatórioDescrição
cnpjstringrequiredCNPJ com ou sem formatação (14 dígitos ou formatado XX.XXX.XXX/XXXX-XX)

Respostas HTTP

StatusSignificado
200Sucesso — retorna o JSON completo da empresa
400Body inválido ou CNPJ ausente/inválido
401X-Metadax-Key inválida ou não autorizada
404Empresa não encontrada na Receita Federal
405Método não permitido (apenas POST é aceito)
502API 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.

CampoTipoDescrição
cnpjstringCNPJ numérico (14 dígitos, sem formatação)
razao_socialstringRazão social conforme Receita Federal
nome_fantasiastringNome fantasia (pode estar em branco)
natureza_juridicastringDescrição da natureza jurídica (ex: "Sociedade Empresária Limitada")
codigo_natureza_juridicaintCódigo numérico da natureza jurídica (ex: 2062)
identificador_matriz_filialint1 = MATRIZ, 2 = FILIAL
descricao_identificador_matriz_filialstring"MATRIZ" ou "FILIAL"
portestring"MICRO EMPRESA", "EPP", "GRANDE", "MICROEMPREENDEDOR INDIVIDUAL (MEI)"
codigo_porteintCódigo numérico do porte
situacao_cadastralintCódigo: 2=ATIVA, 3=SUSPENSA, 4=INAPTA, 8=BAIXADA
descricao_situacao_cadastralstring"ATIVA", "SUSPENSA", "INAPTA", "BAIXADA"
data_situacao_cadastralstringData ISO 8601 (ex: "2008-08-25")
motivo_situacao_cadastralintCódigo do motivo (0 = sem motivo)
descricao_motivo_situacao_cadastralstringDescrição do motivo (ex: "SEM MOTIVO")
situacao_especialstringSituação especial, se houver
data_situacao_especialstring|nullData da situação especial
data_inicio_atividadestringData de início das atividades (ISO 8601)
capital_socialfloatCapital social em reais (ex: 73000.0)
qualificacao_do_responsavelintCódigo de qualificação do sócio responsável
opcao_pelo_simplesbooleantrue se optante pelo Simples Nacional
data_opcao_pelo_simplesstring|nullData de opção pelo Simples
data_exclusao_do_simplesstring|nullData de exclusão do Simples (se aplicável)
opcao_pelo_meibooleantrue se MEI
data_opcao_pelo_meistring|nullData de opção pelo MEI
data_exclusao_do_meistring|nullData de exclusão do MEI
cnae_fiscalintCódigo do CNAE principal (ex: 6201501)
cnae_fiscal_descricaostringDescrição do CNAE principal
cnaes_secundariosarrayLista de CNAEs secundários (ver seção 8)
regime_tributarioarrayHistórico de regime tributário (ver seção 9)
descricao_tipo_de_logradourostringTipo do logradouro (ex: "RUA", "AVENIDA")
logradourostringNome do logradouro
numerostringNúmero
complementostringComplemento do endereço
bairrostringBairro
municipiostringNome do município
codigo_municipiointCódigo SIAFI do município
codigo_municipio_ibgeintCódigo IBGE do município (ex: 3106200)
ufstringUF (ex: "MG")
cepstringCEP (8 dígitos, sem hífen)
ddd_telefone_1stringDDD + número (ex: "3199870972"). O DDD está embutido nos dois primeiros dígitos.
ddd_telefone_2stringSegundo telefone (pode estar em branco)
ddd_faxstringFax (pode estar em branco)
emailstring|nullE-mail de contato
paisstring|nullPaís (null para empresas nacionais)
codigo_paisint|nullCódigo do país
nome_cidade_no_exteriorstringCidade no exterior (se aplicável)
ente_federativo_responsavelstringEnte federativo responsável
qsaarrayQuadro 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.

CampoTipoDescrição
cepstringCEP formatado (ex: "31270-300")
logradourostringNome do logradouro (ex: "Rua Frei Manoel da Cruz")
complementostringComplemento
unidadestringUnidade (normalmente vazio)
bairrostringBairro
localidadestringCidade (ex: "Belo Horizonte")
ufstringUF (ex: "MG")
estadostringNome completo do estado (ex: "Minas Gerais")
regiaostringRegião geográfica (ex: "Sudeste")
ibgestringCódigo IBGE do município (ex: "3106200")
giastringCódigo GIA (SP)
dddstringDDD do município (ex: "31")
siafistringCódigo SIAFI do município

7. Campos: cadastro.qsa[]

Cada objeto do array representa um sócio ou administrador cadastrado na Receita Federal.

CampoTipoDescrição
nome_sociostringNome completo do sócio
cnpj_cpf_do_sociostringCPF/CNPJ mascarado (ex: "***918266**")
qualificacao_sociostringQualificação (ex: "Sócio-Administrador")
codigo_qualificacao_sociointCódigo numérico da qualificação (49 = Sócio-Administrador)
identificador_de_socioint1 = Pessoa Jurídica, 2 = Pessoa Física
faixa_etariastringEx: "Entre 41 a 50 anos"
codigo_faixa_etariaintCódigo da faixa etária (1–8)
data_entrada_sociedadestringData de entrada na sociedade (ISO 8601)
paisstring|nullPaís do sócio (null para nacionais)
codigo_paisint|nullCódigo do país
cpf_representante_legalstringCPF mascarado do representante legal
nome_representante_legalstringNome do representante legal (pode estar em branco)
qualificacao_representante_legalstringQualificação do representante
codigo_qualificacao_representante_legalintCódigo numérico da qualificação do representante

8. Campos: CNAEs

CNAE Principal

Retornado como campos soltos em cadastro:

CampoTipoDescrição
cnae_fiscalintCódigo do CNAE principal (ex: 6201501). Atenção: é um inteiro, não string.
cnae_fiscal_descricaostringDescrição do CNAE principal

CNAEs Secundários (cnaes_secundarios[])

CampoTipoDescrição
codigointCódigo numérico do CNAE secundário. Também é inteiro.
descricaostringDescriçã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.

CampoTipoDescrição
anointAno fiscal (ex: 2022)
forma_de_tributacaostring"LUCRO PRESUMIDO", "LUCRO REAL", "SIMPLES NACIONAL"
quantidade_de_escrituracoesintNúmero de escriturações no ano
cnpj_da_scpstring|nullCNPJ 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érioCampo(s) utilizado(s)MaxLó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

NotaScoreDescrição
A90 – 100Solidez Máxima
B75 – 89Alta Solidez
C58 – 74Solidez Moderada
D42 – 57Solidez Baixa
E25 – 41Alta Fragilidade
F0 – 24Fragilidade 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" }
HTTPerrorCausa
400BAD_REQUESTCampo cnpj ausente no body
400INVALID_BODYBody não é JSON válido
400INVALID_CNPJCNPJ com menos de 8 dígitos
401UNAUTHORIZEDX-Metadax-Key inválida, systemId não encontrado, licença inativa ou URL não autorizada
404NOT_FOUNDCNPJ não encontrado na Receita Federal
405METHOD_NOT_ALLOWEDTentativa de usar GET em vez de POST
502UPSTREAM_ERRORAPI 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érioValorPtsNota
Situação CadastralATIVA20/20A
Capital SocialR$ 73.000,008/20D
Porte da EmpresaMICRO EMPRESA4/10D
Quadro Societário2 sócios15/15A
AbrangênciaMATRIZ7/10C
Atividades Econômicas5 CNAEs (1 principal + 15 sec.)10/10A
Natureza JurídicaSociedade Empresária Limitada7/10B
Regime TributárioLucro Presumido (2022)5/5A
Total76/100B

13. Variáveis de Ambiente (Vercel)

Configure no painel Vercel em Project → Settings → Environment Variables:

VariávelDescriçãoExemplo
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" }
      ]
    }
  ]
}