FiscalAPI
Guias

Como consultar o Simples Nacional de uma lista de CNPJs?

Script pronto em Python: lê a planilha de CNPJs, consulta o Simples Nacional ao vivo e grava optante, data da opção, MEI e regime de IBS/CBS.

Atualizado em

Use GET /api/consultar-simples-nacional uma vez por CNPJ. O script desta página lê um CSV, consulta cada CNPJ ao vivo na Receita Federal e grava uma planilha com a situação no Simples, a data da opção, o MEI e o regime regular de IBS/CBS. Se parar, continua de onde parou.

  • Custo: 1 consulta por CNPJ, de R$ 0,025 a R$ 0,67 conforme o plano (tabela).
  • Para testar: a API pede plano ou recarga, a partir de R$ 19,99/mês. No painel, sem programar, são 10 consultas grátis por mês.
  • Sem certificado digital: basta o CNPJ.
  • Comece: crie a conta e a chave de API.

Antes de começar

  • Python 3.9 ou mais novo. O SDK oficial não tem dependências.
  • A chave de API na variável de ambiente FISCALAPI_API_KEY.
  • Um arquivo cnpjs.csv com a coluna cnpj (pontuação é aceita).
pip install fiscalapi-br
export FISCALAPI_API_KEY="fapi_sua_chave_aqui"

O script

Salve como simples_lote.py:

"""Consulta o Simples Nacional de uma lista de CNPJs, com retomada."""
import csv
import os
import sys
import time

from fiscalapi_br import (
    APIConnectionError,
    AuthenticationError,
    BadRequestError,
    FiscalAPI,
    InsufficientBalanceError,
    RateLimitError,
    ServerError,
)

ENTRADA = "cnpjs.csv"   # coluna "cnpj"
SAIDA = "simples.csv"   # resultado; é também o checkpoint
COLUNAS = [
    "cnpj", "nome_empresarial", "optante_simples", "data_opcao_simples",
    "enquadrado_simei", "regime_regular_ibs", "regime_regular_cbs",
    "data_consulta", "erro",
]

# Segundos entre chamadas, pelo limite por minuto do plano.
PAUSA = {"lite": 12.0, "starter": 3.0, "pro": 1.0, "enterprise": 0.5}
PLANO = "starter"


def limpar(valor: str) -> str:
    return "".join(c for c in valor if c.isalnum()).upper()


def ja_concluidos() -> set[str]:
    if not os.path.exists(SAIDA):
        return set()
    with open(SAIDA, encoding="utf-8", newline="") as f:
        return {linha["cnpj"] for linha in csv.DictReader(f)}


def gravar(linha: dict) -> None:
    novo = not os.path.exists(SAIDA)
    with open(SAIDA, "a", encoding="utf-8", newline="") as f:
        w = csv.DictWriter(f, fieldnames=COLUNAS, extrasaction="ignore")
        if novo:
            w.writeheader()
        w.writerow(linha)


def main() -> None:
    api = FiscalAPI()  # lê FISCALAPI_API_KEY; repete sozinho em 429 e 5xx
    with open(ENTRADA, encoding="utf-8", newline="") as f:
        cnpjs = [limpar(linha["cnpj"]) for linha in csv.DictReader(f)]
    feitos = ja_concluidos()
    pendentes = list(dict.fromkeys(c for c in cnpjs if c and c not in feitos))
    print(f"{len(feitos)} já concluídos, {len(pendentes)} pendentes")

    falhas = 0
    for i, cnpj in enumerate(pendentes, 1):
        inicio = time.monotonic()
        try:
            r = api.consultar_simples_nacional(cnpj)
            gravar({**r, "cnpj": cnpj})
        except InsufficientBalanceError as e:
            print(f"Parei no {cnpj}: {e.message}. Rode de novo depois de recarregar.")
            sys.exit(2)
        except AuthenticationError as e:
            print(f"Chave recusada: {e.message}")
            sys.exit(3)
        except BadRequestError as e:
            # 400 CNPJ_INVALIDO ou 404 CNPJ_NAO_ENCONTRADO: grava e não repete.
            gravar({"cnpj": cnpj, "erro": e.code})
        except RateLimitError as e:
            time.sleep(e.retry_after or 60)   # fica para a próxima rodada
            falhas += 1
        except (ServerError, APIConnectionError):
            falhas += 1                        # fica para a próxima rodada
        if i % 100 == 0:
            print(f"{i}/{len(pendentes)}")
        espera = PAUSA[PLANO] - (time.monotonic() - inicio)
        if espera > 0:
            time.sleep(espera)

    print(f"Fim. {falhas} ficaram para a próxima rodada: rode de novo para consultá-los.")


if __name__ == "__main__":
    main()

Rode com python simples_lote.py. Ajuste PLANO para o seu plano.

O que sai na planilha

ColunaO que é
optante_simplesTrue se a empresa é optante do Simples Nacional hoje
data_opcao_simplesData da opção atual (DD/MM/AAAA), ou vazio
enquadrado_simeiTrue se é MEI (SIMEI)
regime_regular_ibs, regime_regular_cbsSe a empresa optou por recolher IBS e CBS pelo regime regular (Reforma Tributária)
data_consultaData e hora da consulta na Receita
erroCNPJ_INVALIDO ou CNPJ_NAO_ENCONTRADO, quando for o caso

A resposta completa traz também situacao_simples e situacao_simei (o texto da Receita), os eventos futuros e os períodos anteriores. Campos em Consultar Simples Nacional.

Para filial, a resposta é a da matriz: a opção pelo Simples vale para todos os estabelecimentos, e o CNPJ da matriz vem em cnpj_matriz.

Como ele lida com cada situação

SituaçãoO que o script faz
Limite por minutoEspera PAUSA[PLANO] segundos entre as chamadas: 12 no Lite, 3 no Starter, 1 no Pro, 0,5 no Enterprise. O limite é da conta, somando todas as chaves.
429 e 503O SDK espera o Retry-After e tenta de novo, até 3 vezes. Se persistir, o CNPJ fica para a próxima rodada.
402Acabaram as consultas do mês e não há recarga. O script para; recarregue ou mude de plano e rode de novo.
400 e 404CNPJ com dígito errado ou que não existe na Receita. Vai para a planilha com o erro e não é repetido. Não é cobrado.
Interrupçãosimples.csv é o checkpoint: na próxima rodada, os CNPJs já gravados são pulados.

Faça uma chamada de cada vez, como o script faz. Resposta com erro HTTP não é cobrada.

Simples da consulta de CNPJ ou consulta ao vivo?

A consulta de CNPJ também traz opcao_pelo_simples e opcao_pelo_mei, da base que a Receita publica uma vez por mês. Serve para triagem. Use a consulta ao vivo quando a posição de hoje importa: emissão de nota, retenção na fonte, cadastro de fornecedor em janeiro (mês da opção) ou exclusão recente.

Quanto custa

PlanoPor consultaNa recargaPor minuto
LiteR$ 0,67sem recarga5
StarterR$ 0,10R$ 0,1220
ProR$ 0,065R$ 0,0760
EnterpriseR$ 0,025R$ 0,02120

"Por consulta" é o preço da consulta do Simples Nacional dentro do plano; "por minuto", o número de consultas por minuto.

No Enterprise, 10.000 CNPJs cabem na franquia de R$ 250 do mês. Veja Planos e limites e a comparação de APIs do Simples Nacional.

Perguntas frequentes

Existe API para consultar o Simples Nacional por CNPJ?

Sim. GET /api/consultar-simples-nacional?cnpj=... devolve, em JSON, se a empresa é optante do Simples Nacional e desde quando, se é MEI e se optou pelo regime regular de IBS/CBS, consultado na Receita Federal na hora.

Como saber se vários CNPJs são optantes do Simples de uma vez?

Com uma chamada por CNPJ, uma depois da outra. O script desta página lê a lista de um CSV e grava o resultado em outro.

Dá para consultar o Simples Nacional sem programar?

Sim. No painel, digite o CNPJ na consulta Simples Nacional. Conta nova tem 10 consultas grátis por mês.

A API diz desde quando a empresa é optante?

Sim, em data_opcao_simples. Os períodos anteriores vêm em mais_info.opcoes_periodos_anteriores.

Precisa de certificado digital?

Não. A consulta pede só o CNPJ e a chave da API.

Planos e preços

Esta pagina foi util?

On this page