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.csvcom a colunacnpj(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
| Coluna | O que é |
|---|---|
optante_simples | True se a empresa é optante do Simples Nacional hoje |
data_opcao_simples | Data da opção atual (DD/MM/AAAA), ou vazio |
enquadrado_simei | True se é MEI (SIMEI) |
regime_regular_ibs, regime_regular_cbs | Se a empresa optou por recolher IBS e CBS pelo regime regular (Reforma Tributária) |
data_consulta | Data e hora da consulta na Receita |
erro | CNPJ_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ção | O que o script faz |
|---|---|
| Limite por minuto | Espera 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 503 | O SDK espera o Retry-After e tenta de novo, até 3 vezes. Se persistir, o CNPJ fica para a próxima rodada. |
402 | Acabaram as consultas do mês e não há recarga. O script para; recarregue ou mude de plano e rode de novo. |
400 e 404 | CNPJ 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ção | simples.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
| Plano | Por consulta | Na recarga | Por minuto |
|---|---|---|---|
| Lite | R$ 0,67 | sem recarga | 5 |
| Starter | R$ 0,10 | R$ 0,12 | 20 |
| Pro | R$ 0,065 | R$ 0,07 | 60 |
| Enterprise | R$ 0,025 | R$ 0,02 | 120 |
"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.
Esta pagina foi util?
Como consultar inscrição estadual em PHP?
Com o SDK oficial fiscalapi-br/fiscalapi-php, uma linha consulta a inscrição estadual de um CNPJ ou CPF. A página traz a consulta única e um lote simples com pausa por plano e tratamento de 402 e 429.
Como consultar as certidões de um fornecedor por API?
Script pronto em Python: CND Federal, CNDT e CRF do FGTS de uma lista de CNPJs, com a situação, a validade e o PDF de cada certidão.