Pular para o conteúdo
FiscalAPI
Certidões

Homologação de fornecedores: certidões automáticas por API

Equipe FiscalAPI 4 min de leitura
CertidõesCNDCNDTPython

Homologar fornecedor é conferir a regularidade antes de contratar e antes de pagar. As certidões vencem em datas diferentes, e controlar isso em planilha falha. Com a API, o sistema consulta, guarda o PDF e a validade e reconsulta antes de vencer.

Quais certidões#

CertidãoÓrgãoDocumentoValidadeRota
CND Federal (tributos federais e Dívida Ativa da União)Receita Federal e PGFNCNPJ da matriz; vale para as filiais180 dias/api/consultar-cnd-federal
CNDT (débitos trabalhistas)TSTCPF ou CNPJ; certifica todos os estabelecimentos180 dias/api/consultar-cndt
CRF (regularidade no FGTS)CaixaCNPJ completo, com os 14 dígitos, ou CPFVem no campo validade/api/consultar-crf-fgts
CND estadual (ICMS)SEFAZ de cada estadoCPF ou CNPJ, por UFVaria por estado/api/consultar-cnd?uf=XX

Todas pedem só o documento e a chave da API, sem certificado digital. Cada uma conta 1 consulta. Consulta com erro não é cobrada.

Para ver tudo de uma vez, GET /api/certidoes-todas traz a CND estadual nos 27 estados, a CNDT, a CND Federal e o CRF numa chamada, por 1 consulta. Ela não traz os PDFs: para guardar o documento, use a rota de cada certidão.

O que cada status quer dizer#

statusLeituraAção sugerida
negativaSem pendênciasHomologar
positiva_com_efeitos_de_negativaHá débitos suspensos ou garantidos. Tem os efeitos da negativaHomologar e registrar
positivaHá pendênciaPedir regularização ao fornecedor
nao_contribuinteCND estadual: sem inscrição estadual naquela UFNão se aplica naquele estado
sem_certidaoCND estadual: o órgão respondeu, mas não emitiu certidãoPedir a certidão ao fornecedor
erroA certidão não saiu: o órgão não respondeu ou recusou o pedidoLer status_raw e consultar de novo. Não é cobrada

Duas situações da CND Federal:

  • CNPJ de filial: a Receita emite para a matriz e a resposta vem com erro. Consulte o CNPJ da matriz.
  • EM_PROCESSAMENTO: a emissão está em andamento. A resposta é HTTP 200 com o header Retry-After. Consulte de novo depois desse tempo. Não é cobrada nem dispara outra emissão.

O código (Python)#

Consulta as quatro certidões de um fornecedor, salva os PDFs e calcula quando renovar:

python
import base64
import os
import time
from datetime import date, timedelta
from pathlib import Path

import requests

BASE = "https://api.fiscalapi.com.br/api"
CHAVE = os.environ["FISCALAPI_KEY"]  # nunca no código-fonte
REGULAR = {"negativa", "positiva_com_efeitos_de_negativa"}
ANTECEDENCIA = timedelta(days=15)  # defina com compras


def consultar(rota: str, params: dict, tentativas: int = 4) -> dict:
    for _ in range(tentativas):
        resp = requests.get(f"{BASE}/{rota}", headers={"X-API-Key": CHAVE}, params=params, timeout=120)
        espera = int(resp.headers.get("Retry-After", "60"))
        if resp.status_code == 429:  # limite por minuto do plano
            time.sleep(espera)
            continue
        if resp.status_code >= 500:  # o órgão ou a API não responderam
            return {"source_status": {"status": "error", "error_code": f"HTTP {resp.status_code}"}}
        resp.raise_for_status()  # 400, 402, 403: repetir não resolve
        dados = resp.json()
        if dados["source_status"]["error_code"] == "EM_PROCESSAMENTO":  # CND Federal em emissão
            time.sleep(espera)
            continue
        return dados
    return {"source_status": {"status": "error", "error_code": "SEM_RESPOSTA_FINAL"}}


def homologar(cnpj_matriz: str, uf: str, pasta: Path) -> dict:
    rotas = {
        "cnd_federal": ("consultar-cnd-federal", {"cnpj": cnpj_matriz}),
        "cndt": ("consultar-cndt", {"cnpj": cnpj_matriz}),
        "crf_fgts": ("consultar-crf-fgts", {"cnpj": cnpj_matriz}),
        "cnd_estadual": ("consultar-cnd", {"uf": uf, "cnpj": cnpj_matriz}),
    }
    resultado = {}
    for nome, (rota, params) in rotas.items():
        dados = consultar(rota, params)
        certidao = dados.get("result")
        if dados["source_status"]["status"] != "success" or not certidao:
            resultado[nome] = {"situacao": "consultar_de_novo", "motivo": dados["source_status"]["error_code"]}
            continue
        arquivo = None
        if certidao.get("pdf_base64"):
            arquivo = pasta / f"{cnpj_matriz}-{nome}-{certidao['emissao_iso'] or date.today()}.pdf"
            arquivo.write_bytes(base64.b64decode(certidao["pdf_base64"]))
        resultado[nome] = {
            "situacao": "regular" if certidao["status"] in REGULAR else certidao["status"],
            "validade": certidao["validade_iso"],
            "protocolo": certidao["protocolo"],
            "pdf": str(arquivo) if arquivo else None,
            "request_id": dados["request_id"],
        }
    validades = [r["validade"] for r in resultado.values() if r.get("validade")]
    if validades:
        resultado["renovar_em"] = (date.fromisoformat(min(validades)) - ANTECEDENCIA).isoformat()
    return resultado

Para filial em outro estado, rode a CND estadual com o CNPJ e a UF da filial.

Renovação#

  • Agende a próxima rodada em renovar_em: a data da validade mais curta, menos a antecedência.
  • CND Federal: a API devolve a certidão vigente enquanto ela valer mais de 3 dias. Para trocar antes, envie emitir_nova=true.
  • CNDT: o resultado fica 24 horas em cache. Depois disso, a consulta emite uma certidão nova no TST.
  • Bloqueio no pagamento: antes de liberar um pagamento, confira se as certidões guardadas ainda valem. Defina com o financeiro o que fazer com a vencida.

Guarde o PDF#

  • Nome do arquivo: CNPJ, certidão e data de emissão, como no código.
  • Junto do PDF: status, validade_iso, protocolo e request_id.
  • Autenticidade: confira pelo número no site do órgão. protocolo é o código de controle da CND Federal, o número da CNDT e o número do CRF. Na CND de MT, o código vem em codigo_autenticacao.

Perguntas frequentes#

A CND Federal sai para pessoa física? Ainda não pela API: a Receita pede a data de nascimento, e a rota não recebe esse dado. Por CPF, a resposta vem com erro, sem cobrança.

Preciso consultar a CNDT de cada filial? Não. A CNDT certifica a empresa em relação a todos os estabelecimentos, agências e filiais (CLT, art. 642-A, § 3º).

Dá para homologar sem programar? Dá. As mesmas consultas estão no painel. Veja a página de certidões.

Quanto custa? Cada certidão conta 1 consulta. Os quatro documentos de um fornecedor somam 4. Veja os planos.


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 →