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ção | Resposta da API (testada) |
|---|---|
Sem codigoModalidadeContratacao | 400: “Required request parameter ‘codigoModalidadeContratacao’…” |
tamanhoPagina=100 | 400: “Tamanho de página inválido” (o máximo é 50) |
Data no formato 2026-11-02 | 422: “Data Inicial inválida, deve estar no formato yyyyMMdd.” |
uf=XX | 422: “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:
- 6: pregão eletrônico;
- 4: concorrência eletrônica;
- 8: dispensa de licitação.
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.