# PNCP Licitações Brasil — Radar com Itens e Alertas (`kodama-data/pncp-licitacoes-brasil`) Actor

Licitações abertas do PNCP (governo do Brasil) com itens e preços unitários, filtro por UF, palavra-chave, valor e prazo. Modo alerta só com novidades.

- **URL**: https://apify.com/kodama-data/pncp-licitacoes-brasil.md
- **Developed by:** [Guilherme Kodama](https://apify.com/kodama-data) (community)
- **Categories:** Lead generation, Automation, Other
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 licitaçãos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## PNCP Licitações Brasil 🇧🇷 — radar de licitações abertas com itens e alertas de novidades

> Desenvolvido e mantido por **Guilherme Kodama** · GitHub: [github.com/guilhermeKodama](https://github.com/guilhermeKodama)

> 📬 **Não quer rodar o actor?** O **Radar Vending Público** usa este mesmo dado do PNCP e manda todo dia, no seu e-mail, só as licitações de máquinas de café, snack e água (órgão, valor, prazo, link). [Ver amostra e planos](https://guilhermekodama.github.io/radar-vending/) · [Assinar o plano Fundador — R$ 29/mês](https://pay.kiwify.com.br/caNaoiF)

Coleta licitações do **Portal Nacional de Contratações Públicas (PNCP)**, a base oficial e obrigatória de compras públicas do Brasil (Lei 14.133/2021). Pregões, dispensas, concorrências, credenciamentos — de prefeituras, estados e União — em JSON, CSV ou Excel.

Direto da **API oficial de dados abertos** do PNCP. Sem login, sem chave, sem raspar HTML.

### Pra quem é

- **Empresas que vendem para o governo**: receba todo dia as licitações abertas do seu ramo, na sua região, com tempo de preparar proposta.
- **Consultorias e assessorias de licitação**: monitore vários clientes (um `stateKey` por cliente).
- **Jornalismo, pesquisa e controle social**: baixe tudo que foi publicado num período.

### O que tem de diferente

- **Itens da licitação** (opcional): descrição, quantidade, unidade e **valor unitário estimado** de cada item — dá pra precificar sem abrir o edital.
- **Só novidades**: com `onlyNew`, o actor lembra o que já entregou e retorna apenas licitações novas. Agende diariamente + webhook/e-mail = alerta automático.
- **Prazo mínimo**: `minDaysToDeadline` descarta licitações que fecham antes de você conseguir montar a proposta. Campo `diasParaEncerrar` em cada resultado.
- **Palavra inteira, sem acento**: `cafe` acha "CAFÉ", mas não "Cafelândia".
- **Link direto** para a página do edital no PNCP.
- **Sem dados pessoais**: só órgãos públicos (CNPJ). CPF, e-mail e telefone em texto livre são mascarados.

### Entrada (principais campos)

| Campo | Descrição |
|---|---|
| `mode` | `abertas` (propostas abertas até `dateTo`) ou `publicadas` (publicadas entre `dateFrom` e `dateTo`) |
| `modalidades` | Códigos PNCP. Padrão `[6, 8]` = pregão eletrônico + dispensa. 4 = concorrência eletrônica, 9 = inexigibilidade, 12 = credenciamento |
| `ufs` | `["SP","MG"]`; vazio = Brasil inteiro |
| `codigoMunicipioIbge`, `cnpjOrgao` | Filtro por município ou órgão |
| `keywords`, `excludeKeywords` | Qualquer uma das palavras / descartar |
| `minValue`, `maxValue` | Faixa de valor estimado (R$) |
| `esferas` | Federal, Estadual, Municipal, Distrital |
| `minDaysToDeadline` | Prazo mínimo até o fim das propostas |
| `includeItems` | Traz os itens (1 requisição extra por licitação) |
| `onlyNew`, `stateKey` | Monitoramento sem repetição |
| `maxItems` | Limite de resultados (padrão 500) |

Exemplo — TI em SP, só novidades, com 5 dias de prazo:

```json
{"mode":"abertas","ufs":["SP"],"modalidades":[6,4],"keywords":["software","licenca","sistema de gestao"],
 "minDaysToDeadline":5,"includeItems":true,"onlyNew":true,"stateKey":"ti-sp"}
```

### Saída (um registro por licitação)

`numeroControlePNCP, urlPncp, objeto, informacaoComplementar, modalidade, modoDisputa, situacao, srp, valorTotalEstimado, valorTotalHomologado, dataPublicacaoPncp, dataAberturaProposta, dataEncerramentoProposta, diasParaEncerrar, orgaoCnpj, orgaoRazaoSocial, orgaoEsfera, orgaoPoder, unidadeNome, uf, municipio, codigoIbge, amparoLegal, linkSistemaOrigem, plataforma, itens[]` (se `includeItems`). Resumo da execução na chave `RESUMO` do key-value store.

### Fonte e uso responsável

Dados públicos do PNCP (https://pncp.gov.br), via `https://pncp.gov.br/api/consulta`. O actor faz pausa entre requisições (padrão 1 s), reduz a velocidade sozinho ao receber HTTP 429 e tenta de novo em erros 5xx. Não é um produto oficial do Governo Federal.

***

### English (short)

**Brazil public tenders (PNCP) scraper.** Pulls open and published Brazilian government tenders from the official PNCP open-data API — no login, no key. Filters: state, city (IBGE), agency CNPJ, procurement mode, keywords (accent-insensitive, whole word), value range, sphere, minimum days to deadline. Optional **line items with unit prices**, and **onlyNew** mode for daily alerting without duplicates. Output: JSON/CSV/Excel, one row per tender with a direct link to the PNCP notice. Public-agency data only; CPF/e-mail/phone patterns in free text are masked.

***

### Rodar localmente

Requisitos: Python 3.11+.

```bash
cd primeiro-actor
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
mkdir -p storage/key_value_stores/default
echo '{"mode":"abertas","ufs":["SP"],"maxItems":50}' > storage/key_value_stores/default/INPUT.json
.venv/bin/python -m src
## resultados: storage/datasets/default/*.json   resumo: storage/key_value_stores/default/RESUMO
```

Com Apify CLI (opcional, não exige conta para rodar local): `npm i -g apify-cli && apify run --input='{"mode":"abertas","ufs":["SP"]}'`.
Publicar: `apify login` → `apify push` (precisa de conta).

# Actor input Schema

## `mode` (type: `string`):

'abertas' = licitações com recebimento de propostas aberto até a data final (para quem quer vender ao governo). 'publicadas' = tudo que foi publicado no PNCP entre duas datas (para monitoramento/análise).

## `dateFrom` (type: `string`):

AAAA-MM-DD. Só usado no modo 'publicadas'. Padrão: ontem.

## `dateTo` (type: `string`):

AAAA-MM-DD. Modo 'abertas': propostas abertas até esta data (padrão hoje+30). Modo 'publicadas': fim do período (padrão hoje).

## `modalidades` (type: `array`):

Códigos PNCP: 1 Leilão eletrônico, 2 Diálogo competitivo, 3 Concurso, 4 Concorrência eletrônica, 5 Concorrência presencial, 6 Pregão eletrônico, 7 Pregão presencial, 8 Dispensa, 9 Inexigibilidade, 10 Manifestação de interesse, 11 Pré-qualificação, 12 Credenciamento, 13 Leilão presencial.

## `ufs` (type: `array`):

Siglas, ex.: \["SP", "MG"]. Vazio = Brasil inteiro.

## `codigoMunicipioIbge` (type: `string`):

Opcional. Ex.: 3550308 (São Paulo).

## `cnpjOrgao` (type: `string`):

Opcional. Só licitações deste órgão público.

## `keywords` (type: `array`):

Filtra pelo objeto da compra, sem acento e sem diferenciar maiúsculas. Ex.: \["software", "limpeza", "merenda"].

## `excludeKeywords` (type: `array`):

Descarta licitações cujo objeto contenha alguma destas palavras.

## `minValue` (type: `integer`):

Opcional.

## `maxValue` (type: `integer`):

Opcional.

## `esferas` (type: `array`):

Opcional: Federal, Estadual, Municipal, Distrital.

## `minDaysToDeadline` (type: `integer`):

Só licitações cujo encerramento de propostas está a pelo menos N dias de hoje. Ex.: 5.

## `onlyNew` (type: `boolean`):

Lembra o que já foi entregue em execuções anteriores e retorna só licitações novas. Ideal com agendamento diário + webhook/e-mail.

## `stateKey` (type: `string`):

Use nomes diferentes para monitoramentos independentes (ex.: 'ti-sp', 'merenda-mg').

## `includeItems` (type: `boolean`):

Busca a lista de itens (descrição, quantidade, valor unitário) de cada licitação. 1 requisição extra por licitação — mais lento.

## `maxItems` (type: `integer`):

Limite de licitações salvas no dataset.

## `pageSize` (type: `integer`):

10–50.

## `maxPagesPerQuery` (type: `integer`):

Limite de páginas da API PNCP por combinação de modalidade/UF. Protege contra execuções longas demais.

## `requestDelaySecs` (type: `string`):

Rate limit educado com a API pública. Mínimo 0.3.

## Actor input object example

```json
{
  "mode": "abertas",
  "modalidades": [
    6,
    8
  ],
  "ufs": [
    "SP"
  ],
  "keywords": [],
  "onlyNew": false,
  "stateKey": "pncp-licitacoes-vistos",
  "includeItems": false,
  "maxItems": 500,
  "pageSize": 50,
  "maxPagesPerQuery": 200,
  "requestDelaySecs": "1.0"
}
```

# Actor output Schema

## `results` (type: `string`):

Uma linha por contratação/licitação publicada no PNCP, com dados do órgão, prazos, valores e (opcional) itens.

## `resumo` (type: `string`):

JSON com contadores da execução.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "modalidades": [
        6,
        8
    ],
    "ufs": [
        "SP"
    ],
    "keywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("kodama-data/pncp-licitacoes-brasil").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "modalidades": [
        6,
        8,
    ],
    "ufs": ["SP"],
    "keywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("kodama-data/pncp-licitacoes-brasil").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "modalidades": [
    6,
    8
  ],
  "ufs": [
    "SP"
  ],
  "keywords": []
}' |
apify call kodama-data/pncp-licitacoes-brasil --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kodama-data/pncp-licitacoes-brasil"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/5tUQF72Yy3XgB3dBX/builds/NDhVOPRJGryZqwHqC/openapi.json
