Documentação da API

Tudo que você precisa pra integrar a consulta de Inscrição Estadual por CNPJ no seu sistema.

1. Autenticação

Todas as requisições exigem o seu token no header x-api-key. O token é gerado no seu painel após ativar uma assinatura, tem o formato iefacil_... e é exibido uma única vez.

x-api-key: iefacil_seu_token_aqui

Não compartilhe seu token. Se suspeitar de vazamento, use o botão Regenerar no painel (o antigo para de funcionar na hora).

2. Endpoints

Consultar Inscrição Estadual

GET https://www.inscricaoestadualfacil.com.br/api/b2b/consultar/{cnpj}?uf={UF}
ParâmetroOndeDescrição
cnpjURLCNPJ (14) ou CPF (11). Com ou sem formatação. Aceita CNPJ alfanumérico (NT 2026.004).
ufQuerySigla do estado da consulta (ex: PR, SP, RS). Obrigatório.
x-api-keyHeaderSeu token da API. Obrigatório.

Consultar seu uso / franquia

GET https://www.inscricaoestadualfacil.com.br/api/b2b/uso

Mesmo header x-api-key. Retorna consultas usadas hoje, no mês, restantes e a data de renovação.

Observação sobre o Maranhão (MA)

A SEFAZ-MA não disponibiliza consulta cadastral via webservice. Consultas com uf=MA retornam 422 com o link do portal oficial.

3. Exemplos de código

curl -H "x-api-key: iefacil_seu_token" \ "https://www.inscricaoestadualfacil.com.br/api/b2b/consultar/12345678000195?uf=PR"
using var http = new HttpClient(); http.DefaultRequestHeaders.Add("x-api-key", "iefacil_seu_token"); var url = "https://www.inscricaoestadualfacil.com.br/api/b2b/consultar/12345678000195?uf=PR"; var resposta = await http.GetAsync(url); var json = await resposta.Content.ReadAsStringAsync(); if (resposta.IsSuccessStatusCode) { var dados = System.Text.Json.JsonDocument.Parse(json).RootElement; Console.WriteLine($"IE: {dados.GetProperty("ie")}"); Console.WriteLine($"Razão social: {dados.GetProperty("razao_social")}"); Console.WriteLine($"Situação: {dados.GetProperty("situacao")}"); } else { Console.WriteLine($"Erro {(int)resposta.StatusCode}: {json}"); }
const resposta = await fetch( 'https://www.inscricaoestadualfacil.com.br/api/b2b/consultar/12345678000195?uf=PR', { headers: { 'x-api-key': 'iefacil_seu_token' } } ); const dados = await resposta.json(); if (resposta.ok) { console.log('IE:', dados.ie); console.log('Razão social:', dados.razao_social); console.log('Situação:', dados.situacao); } else { console.error('Erro', resposta.status, dados.mensagem); }
<?php $ch = curl_init('https://www.inscricaoestadualfacil.com.br/api/b2b/consultar/12345678000195?uf=PR'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, ['x-api-key: iefacil_seu_token']); $json = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); $dados = json_decode($json, true); if ($status === 200) { echo "IE: {$dados['ie']}\n"; echo "Razão social: {$dados['razao_social']}\n"; echo "Situação: {$dados['situacao']}\n"; } else { echo "Erro $status: {$dados['mensagem']}\n"; }
import requests resposta = requests.get( "https://www.inscricaoestadualfacil.com.br/api/b2b/consultar/12345678000195", params={"uf": "PR"}, headers={"x-api-key": "iefacil_seu_token"}, ) dados = resposta.json() if resposta.status_code == 200: print("IE:", dados["ie"]) print("Razão social:", dados["razao_social"]) print("Situação:", dados["situacao"]) else: print("Erro", resposta.status_code, dados.get("mensagem"))

4. Resposta JSON (200 OK)

{ "uf": "PR", "documento": "12345678000195", "ie": "9019801910", "ie_unica": null, "ie_atual": null, "razao_social": "EMPRESA EXEMPLO LTDA", "nome_fantasia": "EXEMPLO", "situacao": "Ativa", "cnae": "4751201", "regime": "SIMPLES NACIONAL", "nfe_status": "1", "cte_status": "1", "data_inicio": "2010-05-12", "data_baixa": null, "data_ult_sit": "2010-05-12", "mensagem_sefaz": "Consulta cadastro com uma ocorrência", "endereco": { "logradouro": "RUA EXEMPLO", "numero": "100", "complemento": null, "bairro": "CENTRO", "codigo_ibge": "4106902", "municipio": "CURITIBA", "cep": "80000000" } }

situacao vem como Ativa ou Inativa. Campos sem valor na SEFAZ retornam null.

5. Códigos de erro

CódigoSignificadoO que fazer
200Consulta realizada com sucesso
400CNPJ/CPF inválido ou UF ausenteCorrija o documento/UF e reenvie
401Token ausente ou inválidoConfira o header x-api-key
402Assinatura inativa ou pagamento pendenteRegularize a assinatura no painel
404Documento não encontrado na base da UFConfira a UF (a empresa pode não ter IE nesse estado)
422UF sem serviço de consulta (ex: MA)Use o portal oficial indicado na resposta
429Franquia mensal atingida, limite por minuto excedido ou alto volume no momentoVeja o campo erro na resposta. Aguarde o Retry-After ou faça upgrade de plano
500Erro internoTente novamente; se persistir, fale com o suporte
502/503SEFAZ da UF indisponívelTente novamente em instantes (não desconta da sua franquia)

6. Limites de uso

PlanoFranquia mensalRequisições por minutoRenovação
Starter — R$ 69,00/mês1.000 consultas10 req/minDia 1º de cada mês
Pro — R$ 149,00/mês5.000 consultas20 req/minDia 1º de cada mês
Business — R$ 399,00/mês10.000 consultas30 req/minDia 1º de cada mês

Consultas com erro 5xx (indisponibilidade da SEFAZ) não descontam da sua franquia. Erros 4xx (documento inválido, não encontrado) contam normalmente.

Limite de requisições por minuto

Cada token tem um teto de requisições por minuto conforme o plano. O limite existe para garantir estabilidade a todos os clientes e evitar bloqueios nos serviços da SEFAZ. Ao ultrapassar, a API responde 429 com o campo erro: "rate_limit_excedido".

Toda resposta traz os headers padrão para sua aplicação se autorregular:

X-RateLimit-Limit: 20
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1784865600
Retry-After: 23  (apenas nas respostas 429)
HeaderSignificado
X-RateLimit-LimitTeto de requisições por minuto do seu plano
X-RateLimit-RemainingQuantas ainda restam na janela atual
X-RateLimit-ResetTimestamp Unix em que a janela zera
Retry-AfterSegundos para tentar de novo (só no 429)

Recomendação: ao processar lotes, respeite o X-RateLimit-Remaining e implemente retry lendo o Retry-After. Um intervalo de 2 a 3 segundos entre consultas atende com folga qualquer um dos planos.

Acompanhe seu consumo em tempo real no painel ou via GET /api/b2b/uso, que também retorna limite_por_minuto e restantes_no_minuto.

Precisa de mais volume?

Fale com a gente pela página de contato pra planos personalizados de alto volume.