Public Tender Data

Home › Guides

API do PNCP: guia prático para consultar licitações

O PNCP (Portal Nacional de Contratações Públicas) concentra as licitações publicadas sob a Lei 14.133/2021. Ele tem uma API de consulta pública, sem cadastro nem chave. A documentação oficial está espalhada em PDFs e no Swagger. Este guia junta o essencial, com exemplos testados em 3 de novembro de 2026.

1. O endpoint de licitações publicadas

GET https://pncp.gov.br/api/consulta/v1/contratacoes/publicacao

curl -s "https://pncp.gov.br/api/consulta/v1/contratacoes/publicacao?dataInicial=20261103&dataFinal=20261103&codigoModalidadeContratacao=6&pagina=1&tamanhoPagina=50"

A resposta traz data (as licitações), totalRegistros, totalPaginas e numeroPagina. Cada chamada levou de 0,7 a 1,7 s.

2. Os parâmetros que causam erro

SituaçãoResposta da API (testada)
Sem codigoModalidadeContratacao400: “Required request parameter ‘codigoModalidadeContratacao’…”
tamanhoPagina=100400: “Tamanho de página inválido” (o máximo é 50)
Data no formato 2026-11-02422: “Data Inicial inválida, deve estar no formato yyyyMMdd.”
uf=XX422: “Sigla de UF inválida.”
Nenhum resultado (por exemplo um domingo, ou um feriado como Finados)204: resposta vazia, sem JSON. Trate como lista vazia.
Muitas chamadas seguidas (no nosso teste, à 7.ª página com 0,3 s de pausa)429 Too Many Requests: espere e repita, aumentando a pausa a cada nova tentativa.

3. Modalidades

A modalidade é obrigatória, por isso é preciso fazer uma consulta por modalidade. As mais usadas:

4. Filtrar por estado e paginar

Acrescente uf=SP para um estado. Para trazer tudo, percorra pagina=1…totalPaginas com tamanhoPagina=50. Faça uma pausa entre as chamadas (1 s funcionou bem) e trate o 429, porque a API é pública e partilhada.

import httpx, time
url = "https://pncp.gov.br/api/consulta/v1/contratacoes/publicacao"
p = {"dataInicial": "20261027", "dataFinal": "20261103", "codigoModalidadeContratacao": 6, "uf": "SP",
     "pagina": 1, "tamanhoPagina": 50}
itens = []
while True:
    for tentativa in range(5):  # 429 = muitas chamadas: espere e repita, cada vez mais devagar
        r = httpx.get(url, params=p, timeout=60)
        if r.status_code != 429:
            break
        time.sleep(2 ** tentativa)
    if r.status_code == 204:
        break
    r.raise_for_status(); body = r.json(); itens += body["data"]
    if p["pagina"] >= body["totalPaginas"]:
        break
    p["pagina"] += 1; time.sleep(1)
print(len(itens), "licitações")

5. Licitações com propostas abertas

Para as licitações que ainda recebem propostas, use …/contratacoes/proposta com dataFinal (data limite) e a modalidade.

6. Sem código

O Brazil Public Procurement Scraper (PNCP) na Apify usa esta mesma API, já trata o 204, a paginação e as várias modalidades. Ele filtra por estado, palavras-chave e valor mínimo e exporta para CSV, Excel ou JSON, inclusive de forma agendada. Você paga por licitação retornada.

Obter licitações do PNCP em CSV / API →

Perguntas frequentes

Precisa de cadastro? Não, a API de consulta é pública.

Os dados podem ser reutilizados? Sim. São informações públicas (Lei 12.527/2011, Lei de Acesso à Informação), e a Lei 14.133/2021 exige a sua publicação.

Tem dados pessoais? As licitações trazem o órgão comprador. Alguns campos de contratos podem identificar fornecedores pessoa física: não os republique sem base legal (LGPD).

Fonte: PNCP. Exemplos testados em 2026-11-03.