📘 API de Demonstrações Financeiras

A API da Niunai permite acesso padronizado a demonstrações financeiras de empresas brasileiras. Consulte Balanço Patrimonial (BP) e DRE usando filtros como CNPJ, ano, tipo de documento.

🧭 Como Funciona

  1. Buscar empresa pelo CNPJ
  2. Listar demonstrações por filtros
  3. Consumir dados estruturados em JSON

🔐 Autenticação

Inclua o token no header Authorization:

Authorization: Bearer SEU_TOKEN

Obtenha seu token em /painel.

📂 Endpoints

🔍 Periodos

GET /api/client/periodos?cnpj=12345678000190

🔍 Buscar Empresa

GET /api/empresas/:cnpj

📄 Buscar Demonstrações

GET /api/client/demonstracoes
ParâmetroTipoObrigatórioDescrição
cnpjstringsimCNPJ da empresa
periodostringsimPeriodo da demonstração (FY21, FY22)
tipo-dfstringnãotrue = consolidado

🧪 Exemplos

curl

curl -H "Authorization: Bearer SEU_TOKEN" \
        "https://api.niunai.com.br/api/demonstracoes?cnpj=12345678000195&ano=2023"

JavaScript (fetch)

fetch("https://api.niunai.com.br/api/demonstracoes?cnpj=123...", {
        headers: { Authorization: "Bearer SEU_TOKEN" }
        })

📤 Modelos de Resposta

{
        "empresa": "12345678000195",
        "ano": 2023,
        "tipo": "bp",
        "consolidado": false,
        "itens": [
            {
            "conta": "Ativo Circulante",
            "valor": 12345678.9,
            "moeda": "BRL"
            }
        ]
        }

🚫 Códigos de Erro

CódigoSignificadoSolução
401Token inválido ou ausenteVerifique o header Authorization
404Empresa ou DF não encontradaConfirme o CNPJ e ano
429Limite de requisiçõesAguarde ou aumente o plano

📤 Upload de Documentos — Explicação

A UI de teste (TestUploadPage) realiza um envio multipart/form-data para/api/client/documentos. Campos enviados:

  • cnpj (string) — CNPJ da empresa (campo obrigatório).
  • files (arquivo) — Um ou mais PDFs. O front envia vários campos files (mesmo nome repetido).
  • Autenticação — Pode vir via header Authorization: Bearer <token> ou via query-string ?token=... (opção de teste).

Como o frontend envia

O componente monta um FormData com fd.append("cnpj", cnpj) e para cada arquivo fd.append("files", file). O fetch é simples: método POST, body = formdata, sem Content-Type definido (o browser coloca o boundary).

Exemplo: curl (multipart)

curl -X POST "https://api.niunai.com.br/api/client/documentos" \
  -H "Authorization: Bearer SEU_TOKEN" \
  -F "cnpj=12345678000195" \
  -F "files=@/caminho/arquivo1.pdf" \
  -F "files=@/caminho/arquivo2.pdf"

Exemplo: fetch (browser)

const fd = new FormData();
          fd.append("cnpj", "12345678000195");
          fd.append("files", fileInput.files[0]);
          fetch("/api/client/documentos", { method: "POST", body: fd, headers: { Authorization: "Bearer SEU_TOKEN" } })
            .then(r => r.json()).then(console.log)

Formato de resposta esperado

// sucesso
          HTTP/1.1 201
          {
            "status": "ok",
            "uploaded": [
              { "id": 123, "filename": "arquivo1.pdf", "size": 34567, "gcsPath": "bucket/docs/123/arquivo1.pdf" }
            ]
          }

          // erro
          HTTP/1.1 400
          { "error": "cnpj inválido" }