Onboarding de comprador no marketplace B2B: CNPJ e inscrição estadual
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#
| Passo | Onde | Confere | Custo |
|---|---|---|---|
| 1. Formato do CNPJ | No formulário, sem rede | Tamanho e dígito verificador | Grátis |
| 2. CNPJ na Receita | GET /api/consultar-cnpj | situacao_cadastral ATIVA, razão social, CNAE, sócios (qsa) | 1 consulta (3 ao vivo) |
| 3. IE na UF do comprador | GET /api/consultar?uf=XX&cnpj=... | situacao_ie, situacao_contribuinte | 1 consulta |
| 4. Decisão | No seu sistema | Liberar, 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#
| Resultado | Na NF-e | Ação sugerida |
|---|---|---|
| CNPJ diferente de ATIVA | Rejeição 182 a partir de 16/11/2026 (NT 2026.007) | Bloquear |
| situacao_contribuinte Vedada operação como Destinatário na UF | Uso denegado: 302 com IE, 303 sem IE | Bloquear |
| situacao_contribuinte Bloqueado como Destinatário na UF | Rejeição 305 | Bloquear |
| situacao_ie Não habilitado | Rejeição 306 se a IE for informada | Bloquear até o comprador regularizar |
| Nenhuma IE na UF | Depende do indIEDest | O fiscal decide entre não contribuinte e isento |
| Habilitado e Sem restrição | Passa nessas regras | Liberar, com indIEDest 1 |
| Consulta com erro (502, 503, 504) | Você não sabe | Pendente. 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.
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
indIEDest2, 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#
- MOC 7.0, Anexo I: Leiaute e Regras de Validação da NF-e e da NFC-e (PDF), Confaz: regras 5E17-40 a 5E17-63
- Nota Técnica 2026.007 v1.10 (PDF), Portal da NF-e: rejeições 181 e 182
- Consultar CNPJ e Consultar IE por UF, documentação da FiscalAPI
Artigos relacionados#
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 →