Pular para o conteúdo
FiscalAPI
API & Integração

Onboarding de comprador no marketplace B2B: CNPJ e inscrição estadual

Equipe FiscalAPI 5 min de leitura
APIIntegraçãoCNPJNode.js

No marketplace B2B, o comprador que entra com CNPJ inativo ou IE irregular só aparece na hora da nota, como rejeição. Dá para pegar no cadastro, com duas consultas: o CNPJ na Receita e a IE no estado do comprador.

Os dois cadastros são independentes. CNPJ ativo não diz nada sobre a IE, e a SEFAZ confere os dois.

O que checar e em que ordem#

PassoOndeConfereCusto
1. Formato do CNPJNo formulário, sem redeTamanho e dígito verificadorGrátis
2. CNPJ na ReceitaGET /api/consultar-cnpjsituacao_cadastral ATIVA, razão social, CNAE, sócios (qsa)1 consulta (3 ao vivo)
3. IE na UF do compradorGET /api/consultar?uf=XX&cnpj=...situacao_ie, situacao_contribuinte1 consulta
4. DecisãoNo seu sistemaLiberar, revisar ou bloquear—

Os passos 2 e 3 rodam em paralelo. A UF é a do estabelecimento comprador: é a que vai na nota como UF do destinatário.

CNPJ válido? ──não──> recusa no formulário
     │sim
     ├── Receita: ATIVA? ──não──> bloquear
     └── Estado: IE na UF?
            ├── nenhuma ─────────────────> fiscal decide (sem IE)
            ├── vedada ou bloqueada ─────> bloquear
            ├── nenhuma Habilitado ──────> bloquear até regularizar
            └── Habilitado, sem restrição > liberar como contribuinte

As regras de bloqueio#

ResultadoNa NF-eAção sugerida
CNPJ diferente de ATIVARejeição 182 a partir de 16/11/2026 (NT 2026.007)Bloquear
situacao_contribuinte Vedada operação como Destinatário na UFUso denegado: 302 com IE, 303 sem IEBloquear
situacao_contribuinte Bloqueado como Destinatário na UFRejeição 305Bloquear
situacao_ie Não habilitadoRejeição 306 se a IE for informadaBloquear até o comprador regularizar
Nenhuma IE na UFDepende do indIEDestO fiscal decide entre não contribuinte e isento
Habilitado e Sem restriçãoPassa nessas regrasLiberar, com indIEDest 1
Consulta com erro (502, 503, 504)Você não sabePendente. Nunca gravar como "sem IE"

O que cada indIEDest exige está em cliente é contribuinte do ICMS?.

O código (TypeScript)#

Roda no seu servidor, nunca no navegador: a chave da API não pode ir para o front-end.

typescript
const BASE = "https://api.fiscalapi.com.br/api";
const CHAVE = process.env.FISCALAPI_KEY ?? "";

type Decisao =
  | { acao: "liberar"; ie: string }
  | { acao: "fiscal_decide" | "bloquear" | "pendente"; motivo: string };

interface Inscricao {
  inscricao_estadual: string;
  situacao_ie: string;
  situacao_contribuinte: string;
}

async function consultar(rota: string, params: Record<string, string>) {
  const resp = await fetch(`${BASE}/${rota}?${new URLSearchParams(params)}`, {
    headers: { "X-API-Key": CHAVE },
    signal: AbortSignal.timeout(100_000),
  });
  return { status: resp.status, corpo: resp.ok ? await resp.json() : null };
}

const norm = (s: string | undefined) => (s ?? "").trim().toLowerCase();

export async function avaliarComprador(cnpj: string, uf: string): Promise<Decisao> {
  const [rf, sefaz] = await Promise.all([
    consultar("consultar-cnpj", { cnpj }),
    consultar("consultar", { uf, cnpj }),
  ]);

  if (rf.status === 404) return { acao: "bloquear", motivo: "CNPJ não encontrado na Receita" };
  if (rf.status !== 200 || sefaz.status !== 200 || rf.corpo.source_status.status !== "success") {
    // 429: espere o Retry-After. 5xx: o órgão não respondeu. 402 e 403: veja a conta e a chave.
    return { acao: "pendente", motivo: `HTTP ${rf.status} / ${sefaz.status}` };
  }

  const situacaoRf: string = rf.corpo.result.situacao_cadastral;
  if (norm(situacaoRf) !== "ativa") return { acao: "bloquear", motivo: `CNPJ ${situacaoRf}` };

  const ies: Inscricao[] = sefaz.corpo.results;
  if (ies.length === 0) return { acao: "fiscal_decide", motivo: `Sem IE em ${uf}` };

  const restrita = ies.find((i) => /vedad|bloquead/.test(norm(i.situacao_contribuinte)));
  if (restrita) return { acao: "bloquear", motivo: restrita.situacao_contribuinte };

  const habilitadas = ies.filter((i) => norm(i.situacao_ie) === "habilitado");
  if (habilitadas.length === 0) return { acao: "bloquear", motivo: "IE não habilitada" };
  if (habilitadas.length > 1) return { acao: "fiscal_decide", motivo: "Mais de uma IE habilitada na UF" };

  return { acao: "liberar", ie: habilitadas[0].inscricao_estadual };
}

Grave junto com a decisão: a data, o request_id de cada resposta e os campos de situação. É o que mostra por que o comprador foi liberado.

Razão social, CNAE e sócios não entram na regra automática. Eles vão para a tela de quem aprova o cadastro: CNAE incompatível com o que o comprador diz fazer, por exemplo, pede uma conversa.

MEI e isento#

  • MEI é um CNPJ como outro. A consulta de IE mostra se ele tem IE habilitada na UF. Se tem, entra como contribuinte. Se não tem, cai em "fiscal decide".
  • Comprador que se declara isento de IE: a nota usa indIEDest 2, mas nem todo estado aceita. Quando o estado do destinatário não permite, a SEFAZ recusa, salvo exceções do manual, com a rejeição 805. Confira com o fiscal antes de aceitar a declaração.

Depois do cadastro#

A situação muda. O comprador liberado hoje pode estar com a IE suspensa no mês que vem. Revalide a base numa rotina: veja como revalidar o cadastro de clientes.

A FiscalAPI não avisa quando a situação muda. Não há rota de lote na API: uma chamada por documento, no limite por minuto do plano (5, 20, 60 ou 120). Para a base inicial, sem código, use a consulta de IE em massa.


Perguntas frequentes#

Por que consultar a IE se o CNPJ está ativo? Porque são cadastros diferentes. O CNPJ é da Receita Federal. A IE é do estado, e o estado pode suspender a inscrição com o CNPJ ativo. Veja CNPJ ativo, IE suspensa.

Uso a consulta de CNPJ normal ou a ao vivo? A normal (1 consulta) usa a base pública mensal da Receita. A ao vivo (force_fresh=true, 3 consultas) traz o dado do momento. Veja por que a consulta de CNPJ fica desatualizada.

O comprador tem filiais. Qual CNPJ consulto? O do estabelecimento que vai receber a nota. Cada filial tem CNPJ e IE próprios.

A plataforma atende muitos vendedores. A conta é uma só? O limite e o saldo são da conta. Veja ERPs e hubs de marketplace.


Fontes#

Artigos relacionados#

Compartilhar: WhatsApp LinkedIn Twitter

Consulte dados fiscais via API

Consulte Inscrições Estaduais, CNPJs e Certidões Negativas via API REST. Dados direto da SEFAZ e Receita Federal. Planos a partir de R$ 19,99/mês.

Criar conta →