# Monitor Przetargów Publicznych PL (BZP + eZamówienia) (`liveclaude/bzp-monitor-pl`) Actor

🇵🇱 Monitor przetargów i zamówień publicznych z oficjalnego BZP. Nowe postępowania, rozstrzygnięcia, ceny umów, kryteria oceny. Filtry CPV, województwo, NIP. Pay-per-event od 12 zł/mc.

- **URL**: https://apify.com/liveclaude/bzp-monitor-pl.md
- **Developed by:** [FlareWOW](https://apify.com/liveclaude) (community)
- **Categories:** Lead generation, Automation, MCP servers
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 nowe pasujące ogłoszenies

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Monitor Zamówień Publicznych PL (BZP + eZamówienia)

Monitoruj polskie zamówienia publiczne prosto z **oficjalnego, bezpłatnego API UZP** (Biuletyn Zamówień Publicznych i eZamówienia). Filtrujesz po kodach CPV, słowach kluczowych, województwie i zamawiającym. Dostajesz nowe postępowania oraz rozstrzygnięcia z **ceną umowy**, gotowe do CRM, arkusza, Slacka albo webhooka.

Co odróżnia ten aktor od innych: dla rozstrzygnięć podajemy realną **cenę umowy i zwycięzcę**. Narzędzia oparte tylko o wyszukiwarkę BZP tego nie mają, bo w wynikach wyszukiwania nie ma pola z ceną. My pobieramy ją z pełnego ogłoszenia.

> 🎁 Darmowy start: pierwsze 20 nowych ogłoszeń + 10 pobrań szczegółów + 5 cen umów, bez karty.

### Kto tego potrzebuje

- **Firmy IT** dostarczające do urzędów, szpitali, samorządów (CPV 72, 48)
- **Firmy budowlane** startujące w publicznych inwestycjach (CPV 45)
- **Firmy konsultingowe i prawnicy PZP** monitorujący postępowania i rozstrzygnięcia (CPV 79)
- **Firmy medyczne** dostarczające do szpitali (CPV 33)
- **Firmy transportowe i sprzątające** (CPV 60, 90)
- **Analitycy rynku i handlowcy** budujący bazę zamawiających po NIP i województwie

### Co wyróżnia ten aktor

- ✅ **Cena umowy z rozstrzygnięć (kto wygrał i za ile).** Pobieramy ją z pełnego ogłoszenia o wyniku. Narzędzia oparte tylko o API wyszukiwania tego nie mają, bo w wyszukiwarce nie ma pola z ceną.
- ✅ **Wyszukiwanie w pełnej treści, nie tylko w tytule.** Włącz `matchInFullText`, a słowa kluczowe sprawdzimy w całym ogłoszeniu (dostajesz fragment z kontekstem).
- ✅ **Kryteria oceny i warunki udziału** wyciągane z pełnego ogłoszenia, których nie zwraca API wyszukiwania. Wartość zamówienia dodajemy, gdy zamawiający ją publikuje (pole `estimatedValueAvailable` mówi wprost, czy jest).
- ✅ **Kody CPV hierarchicznie.** `72000000` łapie wszystkie podkategorie IT (72200000, 72222300, ...).
- ✅ **Deduplikacja i monitoring.** Ustaw harmonogram, a dostajesz tylko nowe i zmienione ogłoszenia.
- ✅ **NIP i REGON osobno.** Mniejsze instytucje publiczne mają często wyłącznie REGON, więc filtr po nazwie lub identyfikatorze nie gubi ich po cichu.
- ✅ **Oficjalne API UZP.** Zero scrapingu HTML, zero proxy, dane publiczne.

### Co pobiera (jedno ogłoszenie to jeden rekord)

Typ zdarzenia (`new` / `changed` / `awarded` / `cancelled`), numer BZP, data publikacji, przedmiot, kody CPV z polskimi nazwami, zamawiający (nazwa, miasto, województwo, NIP, REGON), termin składania ofert, dni do terminu, wynik postępowania, wykonawcy (nazwa, miasto, NIP, REGON), a po włączeniu szczegółów: **cena umowy**, kryteria oceny z wagami, warunki udziału, wartość zamówienia (gdy podana), oraz `sourceUrl` z linkiem do ogłoszenia na platformie.

### Jak używać

1. Podaj **kody CPV** kategorii, które monitorujesz (można kilka).
2. Opcjonalnie zawęź: **słowa kluczowe**, **województwa**, **zamawiający** (nazwa, NIP lub REGON), **typy ogłoszeń**.
3. Zostaw domyślne wzbogacanie włączone, aby dostać ceny umów i kryteria.
4. Kliknij **Start**, albo ustaw **harmonogram** (Schedules) na co godzinę lub codziennie rano.
5. Odbierz wynik jako JSON lub CSV, albo podłącz webhook do Slacka lub CRM.

### Przykłady

**1. Firma IT: nowe postępowania i rozstrzygnięcia z cenami**

```json
{
  "cpvCodes": ["72000000", "48000000"],
  "noticeTypes": ["contract", "award"],
  "enrichAwardsWithPrice": true,
  "dateLookbackDays": 7
}
```

Dostajesz nowe przetargi IT z ostatnich 7 dni oraz rozstrzygnięcia z ceną umowy i nazwą zwycięzcy.

**2. Firma budowlana na Mazowszu, tylko duże rozstrzygnięcia**

```json
{
  "cpvCodes": ["45000000"],
  "voivodeships": ["Mazowieckie"],
  "noticeTypes": ["award"],
  "minAwardPriceNet": 1000000
}
```

Tylko rozstrzygnięcia robót budowlanych na Mazowszu z wartością umowy powyżej 1 mln zł.

**3. Monitoring konkretnego zamawiającego (kto u niego wygrywa)**

```json
{
  "cpvCodes": ["33000000"],
  "contractingAuthorities": ["Ministerstwo Zdrowia"],
  "noticeTypes": ["award"]
}
```

Kto i za ile wygrywa przetargi u wskazanego zamawiającego (tu: Ministerstwo Zdrowia).

### Cennik (pay-per-event, płacisz tylko za wartość)

Naliczamy **wyłącznie za użyteczne zdarzenia**, nigdy za samo skanowanie. Ceny maleją na wyższych planach Apify.

| Zdarzenie | Cena (Free / Bronze / Silver / Gold) |
|---|---|
| Nowe pasujące ogłoszenie | 0,010 / 0,008 / 0,006 / 0,005 USD |
| Zmiana ogłoszenia | 0,010 / 0,008 / 0,006 / 0,005 USD |
| Rozstrzygnięcie | 0,012 / 0,010 / 0,008 / 0,007 USD |
| Szczegóły z PDF (kryteria, warunki, wartość) | 0,004 / 0,003 / 0,002 / 0,002 USD |
| Cena umowy z rozstrzygnięcia | 0,008 / 0,006 / 0,005 / 0,004 USD |
| Pełnotekstowe wyszukiwanie | 0,003 / 0,002 / 0,002 / 0,001 USD |
| Start aktora | 0,050 USD |

🎁 Darmowy start: 20 nowych ogłoszeń + 10 pobrań szczegółów + 5 cen umów.

**Realny koszt** (firma IT, 100 nowych ogłoszeń, 50 szczegółów, 20 cen umów miesięcznie): około **3 USD, czyli ~12 zł/mc**.

### Integracje

- **Slack, Teams** przez webhooki Apify (alert przy nowym przetargu)
- **Make.com, Zapier** (dowolny downstream)
- **Google Sheets** przez eksport datasetu
- **CRM** przez webhook JSON POST
- **Agenci AI (MCP)** czytają dane bezpośrednio

### FAQ

**Czy to legalne?**
Tak. Zamówienia publiczne są z definicji jawne. Korzystamy z oficjalnego, bezpłatnego API UZP, bez scrapingu HTML.

**Czy zwraca wartość szacunkową?**
Czasem. Ogłoszenia poniżej progów unijnych (większość BZP) zwykle jej nie publikują, więc dla nich `estimatedValueAvailable` jest `false`. Za to dla **rozstrzygnięć** podajemy realną cenę umowy, a wiele ogłoszeń zawiera „Wartość zamówienia (bez VAT)", którą również wyciągamy.

**Dlaczego pole `documents` bywa puste?**
Bo UZP publikuje pliki SWZ i załączniki **na platformie eZamówienia, a nie w treści PDF ogłoszenia**. Dlatego zawsze zwracamy `sourceUrl`: kliknij, aby pobrać dokumenty z oficjalnej platformy. Pole `documentsAvailable` mówi wprost, czy linki są w ogłoszeniu (`in-notice`), tylko na platformie (`on-platform-only`), czy nie ma ich wcale (`none`).

**Dlaczego dostaję 0 wyników?**
Najczęstsza przyczyna: tryb „Tylko nowe/zmienione" (domyślny) zwraca wyłącznie ogłoszenia nowsze niż Twój poprzedni run z tym samym kluczem kontekstu. Jeśli właśnie zmieniłeś filtry (CPV, słowa, województwo), aktor i tak pilnuje watermarku i pomija starsze ogłoszenia. Rozwiązanie: ustaw **nowy „Klucz kontekstu" (stateKey)** albo przełącz **tryb na „Wszystkie"**. Aktor ostrzega o tym w logu uruchomienia.

**Ile ogłoszeń dostanę?**
Zależy od filtrów, a różnice między kategoriami są duże. Pomiary z żywego API, cała Polska: sama kategoria IT (CPV 72) to około **15 nowych postępowań w 7 dni**. Roboty budowlane mają dużo większy wolumen, więc kody 72 i 45 razem dały około **360 nowych postępowań i 450 rozstrzygnięć w ciągu 3 dni**. Zawężenie po województwie albo słowach kluczowych mocno to obniża.

**Jak często uruchamiać?**
Rekomendujemy co godzinę lub codziennie rano (zakładka Schedules). Aktor pamięta, co już widział, więc dostajesz tylko nowe i zmienione ogłoszenia.

**Co z zamówieniami poniżej progu ustawowego?**
Najmniejsze zamówienia trafiają do BIP-ów gmin, a nie do BZP. To osobny obszar (planowany kolejny aktor Klevio).

### Informacja prawna

Źródło danych: **oficjalne, bezpłatne API UZP (BZP + eZamówienia)**. Zero scrapingu HTML. Dane zamówień publicznych są jawne. Odpowiedzialność za sposób wykorzystania danych ponosi użytkownik aktora, zgodnie z regulaminem UZP i polskim prawem.

### O Klevio

Zbudowane przez **Klevio**. Więcej narzędzi dla polskich firm znajdziesz na profilu w Apify Store: [apify.com/klevio](https://apify.com/klevio).

# Actor input Schema

## `cpvCodes` (type: `array`):

Kody CPV do monitorowania. Dopasowanie hierarchiczne: „48000000" łapie wszystkie podkategorie (48200000, 48222300, ...). Popularne: 72000000 (usługi IT), 48000000 (oprogramowanie), 45000000 (roboty budowlane), 33000000 (medyczne), 79000000 (usługi biznesowe/prawne). Pełna lista: https://kody.uzp.gov.pl

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

Słowa szukane w tytule postępowania. Ignoruje wielkość liter i polskie znaki (np. „bezpieczenstwo" złapie „Bezpieczeństwo"). Puste = bez filtra słów.

## `voivodeships` (type: `array`):

Filtr województwa zamawiającego. Nazwy (Mazowieckie, Śląskie) lub kody (PL14, PL24). Puste = cała Polska.

## `contractingAuthorities` (type: `array`):

Filtruj konkretne urzędy lub instytucje. Fragment nazwy (np. „Ministerstwo Zdrowia"), NIP (10 cyfr) albo REGON (9 lub 14 cyfr). Uwaga: mniejsze instytucje publiczne często mają tylko REGON.

## `noticeTypes` (type: `array`):

Jakie ogłoszenia monitorować. Domyślnie: nowe postępowania oraz rozstrzygnięcia.

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

„Tylko nowe/zmienione" (domyślne): aktor pamięta, co już widział pod danym kluczem stanu, i przy kolejnych uruchomieniach zwraca wyłącznie nowe oraz zmienione ogłoszenia. Idealne do monitoringu z harmonogramem. „Wszystkie": zwraca wszystkie pasujące ogłoszenia z okna dat przy każdym uruchomieniu.

## `dateLookbackDays` (type: `integer`):

Okno publikacji: ile dni wstecz przeszukać (od dziś).

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

Unikalny identyfikator tego wyszukiwania. W trybie „Tylko nowe/zmienione” aktor pamięta pod tym kluczem, co już zwrócił. WAŻNE: jeśli zmienisz filtry (CPV, słowa, województwo), użyj NOWEGO klucza albo trybu „Wszystkie” — inaczej dostaniesz tylko ogłoszenia nowsze niż poprzedni run (często 0 wyników).

## `enrichWithDetails` (type: `boolean`):

Pobiera pełne ogłoszenie i wyciąga kryteria oceny, warunki udziału, dokumenty oraz wartość szacunkową (gdy jest podana). Dodatkowo płatne za pobrane ogłoszenie.

## `enrichAwardsWithPrice` (type: `boolean`):

Dla ogłoszeń o wyniku pobiera cenę zwycięskiej oferty i wartość umowy z PDF. To główny wyróżnik: konkurencyjne narzędzia tego nie zwracają.

## `matchInFullText` (type: `boolean`):

Domyślnie słowa kluczowe są sprawdzane tylko w tytule. Włącz, aby przeszukać pełną treść ogłoszenia (wymaga pobrania PDF, dodatkowo płatne).

## `fullTextIncludeFull` (type: `boolean`):

Domyślnie zwracamy tylko fragment wokół dopasowania. Włącz, aby dołączyć pełny tekst PDF (pole fullText). Uwaga: znacznie większy payload.

## `enrichMaxPerRun` (type: `integer`):

Bezpiecznik kosztów: ile ogłoszeń pobrać w całości (PDF) na jedno uruchomienie. Najświeższe mają priorytet. Ogłoszenia ponad ten limit nie dostają ceny umowy ani szczegółów (pole enrichedAt = null) — zwiększ limit, aby pobrać więcej. Przy monitoringu z harmonogramem domyślne 50 zwykle pokrywa wszystkie nowe ogłoszenia. 0 = bez wzbogacania.

## `minAwardPriceNet` (type: `integer`):

Filtr dla ogłoszeń o wyniku po wartości umowy z PDF. 0 = bez dolnego progu.

## `maxAwardPriceNet` (type: `integer`):

Filtr dla ogłoszeń o wyniku po wartości umowy z PDF. 0 = bez górnego progu.

## Actor input object example

```json
{
  "cpvCodes": [
    "72000000",
    "48000000"
  ],
  "keywords": [
    "system",
    "oprogramowanie"
  ],
  "noticeTypes": [
    "contract",
    "award"
  ],
  "mode": "new_only",
  "dateLookbackDays": 7,
  "stateKey": "default",
  "enrichWithDetails": true,
  "enrichAwardsWithPrice": true,
  "matchInFullText": false,
  "fullTextIncludeFull": false,
  "enrichMaxPerRun": 50,
  "minAwardPriceNet": 0,
  "maxAwardPriceNet": 0
}
```

# Actor output Schema

## `notices` (type: `string`):

No description

# 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 = {
    "cpvCodes": [
        "72000000",
        "48000000"
    ],
    "keywords": [
        "system",
        "oprogramowanie"
    ],
    "noticeTypes": [
        "contract",
        "award"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("liveclaude/bzp-monitor-pl").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 = {
    "cpvCodes": [
        "72000000",
        "48000000",
    ],
    "keywords": [
        "system",
        "oprogramowanie",
    ],
    "noticeTypes": [
        "contract",
        "award",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("liveclaude/bzp-monitor-pl").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 '{
  "cpvCodes": [
    "72000000",
    "48000000"
  ],
  "keywords": [
    "system",
    "oprogramowanie"
  ],
  "noticeTypes": [
    "contract",
    "award"
  ]
}' |
apify call liveclaude/bzp-monitor-pl --silent --output-dataset

```

## MCP server setup

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

```

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/bQdUv7QT88EgN7FK4/builds/fpjlpXslSvWci0q3e/openapi.json
