# Poland Public Tenders (BZP + TED) (`delfielectronics/poland-public-tenders`) Actor

All Polish public tenders in one feed: BZP and TED notices with CPV, buyer, voivodeship, deadline, winners and award values. Daily alerts with onlyNew.

- **URL**: https://apify.com/delfielectronics/poland-public-tenders.md
- **Developed by:** [Artur Flamandzki](https://apify.com/delfielectronics) (community)
- **Categories:** Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Poland Public Tenders (BZP + TED in one feed)

Get **every Polish public tender in one clean feed**: national notices from the **Biuletyn Zamówień Publicznych
(BZP, e-Zamówienia)** and above-threshold notices of Polish buyers from **TED**, the EU's official journal. Calls
for tenders, results with **winners and award values**, intended direct awards, corrections and contract changes,
all mapped to one record format.

Every notice becomes one record: notice number, type, title, works/supplies/services, **buyer (name, national id, city,
voivodeship)**, **CPV codes**, publication date, **submission deadline**, winning contractors, award value and the
link to the official notice.

### What you can use it for

- **Tender alerts**: run it daily with **Only notices not returned before** and get only new tenders for your
  CPV codes, keywords or region.
- **Sales and business development**: find buyers that purchase what you sell, before the deadline.
- **Competitor intelligence**: who wins which contracts, for how much, with which buyers (result notices).
- **Market research**: public demand by CPV code, voivodeship and buyer type.
- **AI agents and CRMs**: structured, deduplicated notices via the Apify API or MCP.

### How it works

1. For each day in the window (newest first) and each source, the actor reads the official public APIs:
   the e-Zamówienia board for BZP and the TED search API for notices of Polish buyers.
2. Both are mapped to one record; contacts and raw notice HTML are never returned.
3. Your filters are applied: keywords in the title, CPV prefixes, voivodeships, buyers (name or NIP).
4. With **Only notices not returned before**, a notice is returned once per combination of filters (memory kept
   60 days): a ready-made tender alert.

### Input

| Field | What it does |
|---|---|
| Sources | BZP (below EU thresholds), TED (above EU thresholds); both by default |
| Notice types | Calls for tenders and results by default; also prior information / intended awards, corrections, contract changes (completion and modifications) |
| Published in the last N days | 1 = yesterday and today (best for a daily schedule); up to 31. A day is a Polish calendar day (Europe/Warsaw) for both sources |
| Keywords | Words in the title, e.g. `remont`, `oprogramowanie` (Polish letters optional) |
| CPV codes | Prefixes, e.g. `45` (construction works), `72` (IT services), `3312` (medical equipment) |
| Voivodeships | e.g. `mazowieckie`, `śląskie`: keeps a notice when the buyer's seat or the place of performance (TED) is in one of them |
| Buyers | Part of the buyer's name or its national id (NIP or REGON) |
| Include contractors | Winners on result notices (default on) |
| Only notices not returned before | Ideal for daily schedules |
| Max notices | Stop after this many |

### Output example

```json
{
  "notice_id": "2026/BZP 00520352/01",
  "source": "bzp",
  "notice_type": "result",
  "source_notice_type": "TenderResultNotice",
  "title": "Dostawa paliwa gazowego na rok 2027",
  "order_type": "supplies",
  "procedure_type": null,
  "buyer_name": "Przykładowy Ośrodek Doradztwa Rolniczego",
  "buyer_id": "1234567890",
  "buyer_city": "Częstochowa",
  "buyer_voivodeship": "śląskie",
  "performance_voivodeship": null,
  "cpv_main": "09123000",
  "cpv_codes": ["09123000", "65210000"],
  "published_at": "2026-11-03T23:16:35Z",
  "deadline_at": null,
  "below_eu_threshold": true,
  "procedure_results": ["zawarcieUmowy"],
  "contractors": [{"name": "Example Energy Sp. z o.o.", "city": "Warszawa", "national_id": "1111111111"}],
  "award_value": null,
  "award_currency": null,
  "tender_id": "ocds-148610-00000000-0000-0000-0000-000000000000",
  "notice_url": "https://ezamowienia.gov.pl/mo-client-board/bzp/notice-details/id/..."
}
```

Result notices carry `award_value` and `award_currency`: for TED the total value of the notice, for BZP the sum of
the contract values of every part that ended in a contract (null when the parts are in different currencies).
TED records carry `procedure_type` (open, restricted, ...) and a publication date without time; BZP records carry
the publication time and `procedure_results`.

### Pricing

Pay per event, no subscription. The prices are on the **Pricing** tab; you are charged for two events:

| Event | When |
|---|---|
| Source-day (`source-day`) | once per source and day read successfully (BZP and TED for 2 days = 4); a source that is down is not charged |
| Notice (`notice`) | once per notice saved to the dataset |

- A working day of both sources brings roughly 2,000-2,500 calls for tenders and results (measured on
  3 November 2026); filters (keywords, CPV, voivodeship, buyer) cut the notice fees, the source-day fee stays.
- A source-day is charged only when your remaining budget also covers at least one notice.
- The form starts with **Max notices** = 100 for a cheap first run; raise it for a full feed.
- Set a maximum cost per run in Apify and the actor stops cleanly when it is reached.

### Data and privacy

Notices are public-sector information published by law (Polish Public Procurement Law, EU Directive 2014/24/EU)
on ezamowienia.gov.pl and ted.europa.eu. Buyers are public bodies. Contractors are mostly companies, but sole
traders appear under their own name as published in the official notice: the actor returns only their name,
city and national id (NIP or REGON), never contact data, and **Include contractors** off removes them. Use such records in line with
the GDPR.

### Known limits

- Baza Konkurencyjności (EU-funded private tenders) is not included yet.
- BZP records have no estimated value; BZP contest results (prizes) have no award value.
- `buyer_voivodeship` is the buyer's seat for both sources; `performance_voivodeship` (place of performance) is given
  for TED notices only (BZP lists do not carry it) and is null when TED gives no Polish region.
- TED lists winners per lot but their ids and cities per organisation: city and national id are given only when a
  notice has a single winner.
- With onlyNew off, notices are not remembered: turning onlyNew on later starts from an empty memory.
- Notices are as published; corrections arrive as separate `update` notices.

# Actor input Schema

## `sources` (type: `array`):

bzp = Biuletyn Zamówień Publicznych (national notices below EU thresholds); ted = TED notices of Polish buyers (above EU thresholds). Both together cover all Polish public tenders.

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

contract = calls for tenders; result = awards with winners; intention = prior information and intended direct awards; update = corrections; performance = contract changes and completion.

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

1 = yesterday and today (Polish time). Run daily with onlyNew for a tender alert feed.

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

Keep notices whose title contains any of these words (case and Polish letters ignored, e.g. remont, oprogramowanie). Empty = all.

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

Keep notices with any CPV code starting with these digits (e.g. 45 = construction works, 72 = IT services, 3312 = medical equipment). Empty = all.

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

Keep notices in these voivodeships (e.g. mazowieckie, śląskie; Polish letters optional): a notice is kept when the buyer's seat or, for TED, the place of performance is in one of them. Empty = all Poland.

## `buyers` (type: `array`):

Keep notices whose buyer name contains any of these texts, or whose buyer national id (NIP or REGON) equals one of them (e.g. Gmina Kraków, 6762468658). Empty = all.

## `includeContractors` (type: `boolean`):

Add winning contractors (name; city and national id (NIP or REGON) as published, when they can be matched) to result notices.

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

Return only notices this actor has not returned to you before with the same filters (memory kept 60 days).

## `maxNotices` (type: `integer`):

Stop after saving this many notices. The form starts at 100 for a cheap first run; the API default is 5000.

## Actor input object example

```json
{
  "sources": [
    "bzp",
    "ted"
  ],
  "noticeTypes": [
    "contract",
    "result"
  ],
  "publishedWithinDays": 1,
  "keywords": [],
  "cpvCodes": [],
  "voivodeships": [],
  "buyers": [],
  "includeContractors": true,
  "onlyNew": false,
  "maxNotices": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

The run's notices in the Store table view.

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

Every field of every notice record.

# 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 = {
    "maxNotices": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("delfielectronics/poland-public-tenders").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 = { "maxNotices": 100 }

# Run the Actor and wait for it to finish
run = client.actor("delfielectronics/poland-public-tenders").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 '{
  "maxNotices": 100
}' |
apify call delfielectronics/poland-public-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,delfielectronics/poland-public-tenders"
        }
    }
}
```

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/apGYjJ2wg8NYrLg6e/builds/1U0PcJELmdYBRxEr2/openapi.json
