# Licitações PNCP Monitor – Brazil Public Tenders (`wlubrigati/pncp-licitacoes-monitor`) Actor

Monitor licitações públicas do PNCP: pregão eletrônico, dispensa, concorrência. Brazil public procurement tenders from the official PNCP API, filtered by keywords, UF, município, modalidade and value. Schedule it and get only tenders new since your last run. $0.01 per new tender.

- **URL**: https://apify.com/wlubrigati/pncp-licitacoes-monitor.md
- **Developed by:** [William Lubrigati](https://apify.com/wlubrigati) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 new tender delivereds

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

## Licitações PNCP Monitor – Brazil Public Tenders (Only New Ones)

**Monitor Brazilian public tenders (licitações) from the official PNCP API and get only the ones that are new since your last run.** PNCP (Portal Nacional de Contratações Públicas, Lei 14.133/2021) is where federal, state and municipal agencies publish their procurement notices: pregão eletrônico, dispensa, concorrência, inexigibilidade, credenciamento and more. Filter by keywords, state (UF), municipality, modality and estimated value, schedule it, and pay only for new tenders.

🇧🇷 **Monitor de licitações públicas do PNCP**: receba só as licitações novas do seu nicho e região. [Resumo em português ↓](#-em-português)

- ✅ **Official public government API**: no scraping, no proxies, no login, no captchas.
- 🔔 **"Only new" memory** per monitor ID: run it daily and receive just the fresh tenders, never charged twice.
- 🔤 **Accent- and case-insensitive keywords** (`licenca` matches `licença`), plus exclude words.
- 📅 **Two modes**: tenders **open for proposals** (deadline within N days) or **recently published** (last N days).
- 🔗 **Direct PNCP link (edital)** for every tender, plus the agency's CNPJ, estimated value and proposal dates.
- 💰 **$0.01 per new tender**. Runs that find nothing new only pay Apify's tiny start fee.

### Quick start (costs at most $0.05)

```json
{
  "mode": "published",
  "publishedWithinDays": 1,
  "ufs": ["SC"],
  "onlyNew": false,
  "maxItems": 5
}
```

This returns up to 5 tenders published in Santa Catarina in the last day: at most 5 × $0.01 = **$0.05**. A similar test (state AC, 3 items) finished in about 6 seconds.

### Who uses it

- **Companies that sell to the government**: a daily feed of new tenders (editais) for their products and regions.
- **Procurement consultants (assessoria em licitações)**: one monitor ID per client, each with its own memory.
- **Market research**: public spending by category, region and modality.
- **Automations and AI agents**: send new tenders to Slack, e-mail, Google Sheets or a CRM through Apify integrations or webhooks.

### Input

| Field | Description |
|---|---|
| `mode` | `open` = currently accepting proposals; `published` = published in the last N days |
| `keywords` | Matches any of these words in the tender object (empty = all tenders) |
| `excludeKeywords` | Drops tenders that contain any of these words |
| `ufs` | States, e.g. `["SP","SC"]` (empty = all of Brazil, slower) |
| `municipiosIbge` | 7-digit IBGE municipality codes (optional) |
| `modalidades` | PNCP modality codes (6 = Pregão eletrônico, 8 = Dispensa, 4 = Concorrência eletrônica, ...) |
| `minValue` / `maxValue` / `requireValue` | Estimated value range in R$; `requireValue` drops tenders without a value |
| `closingWithinDays` | Open mode: proposal deadline within N days (default 60) |
| `publishedWithinDays` | Published mode: published in the last N days (default 7) |
| `onlyNew` / `monitorId` | Deliver only tenders this monitor hasn't delivered before (default on) |
| `maxItems` | Cap on results, and therefore on cost, per run (default 1000; the Console form is prefilled with 10 for a cheap first test) |

**Daily monitor: software and licensing tenders open in Santa Catarina and Paraná, R$ 10,000 or more:**

```json
{
  "mode": "open",
  "keywords": ["software", "licença de uso", "sistema de gestão"],
  "ufs": ["SC", "PR"],
  "minValue": 10000,
  "onlyNew": true,
  "monitorId": "sul-software",
  "maxItems": 100
}
```

**Pregão eletrônico published in the last 3 days in São Paulo city, excluding food purchases:**

```json
{
  "mode": "published",
  "publishedWithinDays": 3,
  "ufs": ["SP"],
  "municipiosIbge": ["3550308"],
  "modalidades": ["6"],
  "excludeKeywords": ["gêneros alimentícios", "merenda"],
  "onlyNew": false,
  "maxItems": 100
}
```

### Output

One dataset item per tender. Download as JSON, CSV or Excel, or read it through the API. Real example:

```json
{
  "numeroControlePNCP": "45279635000108-1-000919/2026",
  "objeto": "REGISTRO DE PREÇO PARA EVENTUAL AQUISIÇÃO DE MATERIAIS ELÉTRICOS DESTINADOS À MANUTENÇÃO DAS INSTALAÇÕES E SISTEMAS DE ILUMINAÇÃO, COM ENTREGAS PARCELADAS, PELO PERÍODO DE 12 (DOZE) MESES.",
  "orgao": "MUNICIPIO DE ATIBAIA",
  "orgaoCnpj": "45279635000108",
  "unidade": "Prefeitura Municipal da Estância de Atibaia",
  "uf": "SP",
  "municipio": "Atibaia",
  "codigoIbge": "3504107",
  "modalidadeId": 6,
  "modalidade": "Pregão - Eletrônico",
  "modoDisputa": "Aberto",
  "valorEstimado": 0.0,
  "srp": true,
  "situacao": "Divulgada no PNCP",
  "processo": "767/2026",
  "numeroCompra": "PE 188",
  "amparoLegal": "Lei 14.133/2021, Art. 28, I",
  "dataPublicacaoPncp": "2026-10-17T21:35:52",
  "dataAberturaProposta": "2026-10-19T10:00:00",
  "dataEncerramentoProposta": "2026-10-29T09:00:00",
  "linkSistemaOrigem": null,
  "url": "https://pncp.gov.br/app/editais/45279635000108/2026/919",
  "matchedKeywords": ["sistema"],
  "informacaoComplementar": null,
  "fetchedAt": "2026-10-18T02:11:17+00:00"
}
```

`valorEstimado = 0` usually means the budget is confidential (orçamento sigiloso) or was not informed. `srp: true` marks a price registration (registro de preços). Tip: the `orgaoCnpj` can be enriched with our [CNPJ Lookup Actor](https://apify.com/wlubrigati/cnpj-brasil-empresas).

### Speed and freshness

- **Freshness:** every run queries the live PNCP API, so a tender shows up as soon as the agency publishes it on PNCP. Each item has `fetchedAt` and `dataPublicacaoPncp`.
- **Speed:** typical runs finish in under 40 s (measured on Apify, 512 MB, October 2026): open software tenders in Santa Catarina in 9 s, school-meal tenders in SC (3 matches) in 20 s, tenders published in SC and PR over the last 7 days in 9 s, and a nationwide search for drone tenders in 35 s. PNCP has no keyword search, so the Actor lists the tenders and filters them itself. Most of the time is spent waiting for the PNCP API, so times vary with its load.

### Pricing (pay per event)

| Event | Price |
|---|---|
| New tender delivered | **$0.01** each ($10 per 1,000) |
| Actor start (Apify standard) | $0.00005 per GB of memory ($0.00005 at 512 MB) |

- With **Only new** on (the default), a tender is charged once per monitor ID and never again on later runs.
- A daily run that finds nothing new costs only the start fee.
- No proxy or compute charges on top. Cap your spend with `maxItems` or **Maximum cost per run**.

### Tips

- **Schedule it daily** (Apify Schedules) with the same `monitorId`, and add a Slack, e-mail, Google Sheets or webhook integration.
- Use **several monitor IDs** for different clients or niches. Each keeps its own "already delivered" memory.
- Add `excludeKeywords` to drop common false positives.

### Data source and disclaimer

Data comes from the public PNCP consultation API (`https://pncp.gov.br/api/consulta`), maintained by the Brazilian federal government. This Actor is not affiliated with the government. Always confirm deadlines, documents and conditions on the official tender page (edital) before bidding.

***

### 🇧🇷 Em português

Monitore **licitações públicas** do Brasil pela **API oficial do PNCP** (Portal Nacional de Contratações Públicas, Lei 14.133/2021): pregão eletrônico e presencial, dispensa de licitação, concorrência, inexigibilidade, credenciamento, leilão e mais. Ideal para quem vende para o governo e para assessorias em licitações.

- **Filtros:** palavras-chave (sem diferenciar acentos e maiúsculas), palavras excluídas, UF, município (código IBGE), modalidade e valor estimado.
- **Dois modos:** licitações **abertas para propostas** (prazo em até N dias) ou **publicadas recentemente** (últimos N dias).
- **Só as novas:** agende uma execução diária com o mesmo `monitorId` e receba **somente as licitações novas** desde a última execução.
- **Dados em tempo real:** consulta direta à API do PNCP a cada execução, com link para o edital, CNPJ do órgão, valor estimado e datas de proposta.
- **Preço:** **US$ 0,01 por licitação nova entregue**. A mesma licitação nunca é cobrada duas vezes no mesmo monitor. Use `maxItems` para limitar o gasto.
- **Teste barato:** o exemplo de início rápido (SC, último dia, até 5 licitações) custa no máximo US$ 0,05.
- Sem scraping, sem proxy, sem login. Não é afiliado ao governo.

# Actor input Schema

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

'open' = tenders currently accepting proposals (closing within the window below). 'published' = tenders published in the last N days (any status).

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

Match if ANY keyword appears in the tender object/description. Accent- and case-insensitive. Leave empty for all.

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

Drop tenders containing any of these words.

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

Two-letter state codes, e.g. SP, SC. Empty = all of Brazil (slower).

## `municipiosIbge` (type: `array`):

Optional 7-digit IBGE codes (e.g. 4209102 for Joinville).

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

PNCP modality codes. Empty = all. 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.

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

Keep only tenders with estimated value at or above this (R$). Tenders without a value are kept unless 'Require estimated value' is on.

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

Keep only tenders with estimated value at or below this (R$).

## `requireValue` (type: `boolean`):

Drop tenders with no/secret estimated value when a value range is set.

## `closingWithinDays` (type: `integer`):

Open mode: tenders whose proposal deadline is within this many days from today.

## `publishedWithinDays` (type: `integer`):

Published mode: look back this many days.

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

Remember what was already delivered (per monitor ID) and output only new tenders. You pay only for new ones.

## `monitorId` (type: `string`):

Name your monitor to keep separate 'already seen' memories for different searches.

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

Maximum tenders to output (and charge) in this run. Default 1000; the form is prefilled with 10, so a first test costs $0.10 or less. Raise it (e.g. 100–1000) for real monitors.

## Actor input object example

```json
{
  "mode": "open",
  "keywords": [
    "software",
    "licença"
  ],
  "ufs": [
    "SC"
  ],
  "requireValue": false,
  "closingWithinDays": 60,
  "publishedWithinDays": 7,
  "onlyNew": true,
  "monitorId": "default",
  "maxItems": 10
}
```

# Actor output Schema

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

One item per tender (licitação) from PNCP, with agency, object, modality, estimated value, proposal dates and the PNCP link.

# 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 = {
    "keywords": [
        "software",
        "licença"
    ],
    "ufs": [
        "SC"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("wlubrigati/pncp-licitacoes-monitor").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 = {
    "keywords": [
        "software",
        "licença",
    ],
    "ufs": ["SC"],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("wlubrigati/pncp-licitacoes-monitor").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 '{
  "keywords": [
    "software",
    "licença"
  ],
  "ufs": [
    "SC"
  ],
  "maxItems": 10
}' |
apify call wlubrigati/pncp-licitacoes-monitor --silent --output-dataset

```

## MCP server setup

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

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/vNJMpHGPzbK7upsZY/builds/N9Vvam988mTSg4UOY/openapi.json
