# e-Zamówienia Poland Scraper — Public Procurement Tenders (`studio-amba/ezamowienia-scraper`) Actor

Search and extract Polish public procurement notices from ezamowienia.gov.pl. Filter by keyword, buyer, voivodeship, or date. Returns buyer info, deadlines, CPV codes, and full notice descriptions. No API key, no login required.

- **URL**: https://apify.com/studio-amba/ezamowienia-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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

## e-Zamówienia Poland Scraper — Public Procurement Tenders

Search and extract Polish public procurement tender notices from ezamowienia.gov.pl, Poland's official national e-procurement platform run by the Public Procurement Office (Urząd Zamówień Publicznych, UZP). Filter by keyword, buyer name, buyer city, voivodeship, or date. Returns buyer details, submission deadlines, CPV classification codes, and full notice descriptions. No API key, no login required.

### How to scrape Polish public procurement data

This actor reads notices straight from ezamowienia.gov.pl's own read-model API — the same JSON endpoint the site's search page calls in the browser. Every Polish contracting authority (ministries, municipalities, hospitals, state agencies, state-owned companies) is legally required to publish its procurement notices here, making it the single most complete source for Polish public procurement activity, both above and below the EU notification threshold.

Enter your search keywords, pick optional filters, and run. The actor fetches the search results list, then — when full details are enabled — calls each notice's published BZP (Biuletyn Zamówień Publicznych) document to pull CPV codes, description, and buyer contact details that aren't returned in the list view.

#### Who benefits from this data?

- **Government contractors** — Monitor which tenders are open across Polish ministries, municipalities, hospitals, and state agencies, and track submission deadlines.
- **Market researchers** — Analyze Polish public spending patterns, tender volumes, and procurement activity by sector and voivodeship.
- **B2B sales teams** — Identify which Polish public bodies buy what you sell. Build targeted prospect lists across the Polish public sector.
- **Consultancies and advisory firms** — Track tender activity by CPV category, region, or buyer to advise clients on Polish market entry and bidding strategy.
- **Compliance and legal teams** — Monitor competitor bids, verify buyer details, and check procedural transparency.
- **Journalists and researchers** — Investigate public spending on a topic, ministry, or municipality.

#### Search by keyword

Enter any keyword to find relevant notices. The search matches against the tender title ("Nazwa zamówienia"). Examples: `informatyka` (IT), `sprzątanie` (cleaning), `budowa drogi` (road construction), `dostawa sprzętu` (equipment supply).

#### Filter by buyer

Use `organizationName` to filter by the contracting authority's name ("Nazwa Zamawiającego"), or `organizationCity` for the buyer's city.

#### Filter by voivodeship

Poland is divided into 16 voivodeships (administrative regions). Set `region` to one of them (e.g. `mazowieckie`, `małopolskie`, `śląskie`) to scope results to buyers in that region, or leave it empty to search nationwide.

#### Filter by date

`initiationDateFrom`/`initiationDateTo` filter by when the procedure was published. `submissionDateFrom`/`submissionDateTo` filter by the bid submission deadline — useful for finding notices closing within a window.

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQuery` | String | `informatyka` | Keyword matched against the tender title |
| `organizationName` | String | — | Filter by contracting authority name |
| `organizationCity` | String | — | Filter by contracting authority city |
| `region` | Enum | all | One of Poland's 16 voivodeships, or empty for all |
| `initiationDateFrom` / `initiationDateTo` | String | — | Publication date range, `YYYY-MM-DD` |
| `submissionDateFrom` / `submissionDateTo` | String | — | Bid submission deadline range, `YYYY-MM-DD` |
| `fetchFullDetails` | Boolean | `true` | Fetch the full published notice (CPV codes, description, contact info) per result |
| `maxResults` | Integer | `50` | Maximum number of notices to return (1–5,000) |
| `proxyConfiguration` | Object | Apify proxy | Apify proxy settings |

### What data does this scraper extract?

| Field | Type | Description |
|-------|------|--------------|
| `itemTitle` | String | Tender title ("Nazwa zamówienia") |
| `referenceNumber` | String | BZP publication number, or the internal notice ID if unpublished |
| `organization` | String | Contracting authority / buyer name |
| `status` | String | `Open`, `Closed`, `Cancelled`, `Finished`, or `Unknown` |
| `publicationDate` | String | Date the procedure was initiated / published |
| `deadline` | String | Bid submission deadline |
| `estimatedValue` | String | Estimated contract value — usually blank; rarely disclosed on national-threshold notices |
| `currency` | String | Usually blank alongside `estimatedValue` |
| `category` | String | Procedure mode ("Tryb postępowania"), e.g. "Przetarg nieograniczony" (open tender) |
| `cpvCodes` | Array | CPV classification code(s) with descriptions (requires `fetchFullDetails`) |
| `region` | String | Buyer's voivodeship |
| `itemDescription` | String | Full notice description (requires `fetchFullDetails`) |
| `contactInfo` | Object | Buyer address, phone, email, website (requires `fetchFullDetails`) |
| `url` | String | Direct link to the notice on ezamowienia.gov.pl |
| `scrapedAt` | String | ISO timestamp of when the data was scraped |
| `bzpNumber` | String | BZP publication number, same as `referenceNumber` when present |
| `noticeType` | String | Same value as `category` |
| `isTenderAmountBelowEU` | Boolean | `true` if the procedure is below the EU notification threshold |
| `tedContractNoticeNumber` | String | Cross-reference number on TED (EU-wide portal), if published there too |
| `numberOfLots` | Integer | Number of lots in the tender (requires `fetchFullDetails`; `0` if details weren't fetched) |

### Example output

```json
{
    "itemTitle": "Świadczenie usług informatycznych w zakresie utrzymania systemów informatycznych",
    "referenceNumber": "2026/BZP 00123456/01",
    "organization": "Urząd Miasta Warszawy",
    "status": "Open",
    "publicationDate": "2026-08-20",
    "deadline": "2026-09-15T10:00:00.000Z",
    "estimatedValue": "",
    "currency": "",
    "category": "Przetarg nieograniczony",
    "cpvCodes": [
        { "code": "72267000-4", "description": "Usługi w zakresie konserwacji i napraw oprogramowania" }
    ],
    "region": "mazowieckie",
    "itemDescription": "Przedmiotem zamówienia jest świadczenie usług informatycznych...",
    "contactInfo": {
        "city": "Warszawa",
        "postalCode": "00-950",
        "country": "Polska",
        "email": "zamowienia@um.warszawa.pl"
    },
    "url": "https://ezamowienia.gov.pl/mp-client/search/list/abc123-def456",
    "scrapedAt": "2026-08-31T14:08:58.360Z",
    "bzpNumber": "2026/BZP 00123456/01",
    "noticeType": "Przetarg nieograniczony",
    "isTenderAmountBelowEU": false,
    "tedContractNoticeNumber": "",
    "numberOfLots": 1
}
```

### Tips for best results

- **Daily monitoring**: Run on a schedule to catch newly published notices. Set `initiationDateFrom` to yesterday's date for fresh publications only.
- **Faster runs**: Disable `fetchFullDetails` when you only need the buyer, dates, and status — this skips the extra per-result request and roughly halves the run time.
- **Closing-soon lists**: Use `submissionDateFrom`/`submissionDateTo` to build a list of tenders closing in the next week or month.
- **Nationwide vs regional**: Leave `region` empty to search all 16 voivodeships at once, or scope to one region to focus on local buyers.

### How much does it cost to run?

The ezamowienia.gov.pl data source is free and requires no login. Your only cost is Apify compute time and proxy usage. With `fetchFullDetails` enabled (default), each notice requires one extra request to the notice-board API for CPV codes, description, and contact info, so run time scales roughly linearly with `maxResults`.

| Search size | Estimated time | Estimated cost |
|-------------|---------------|----------------|
| 20 notices | ~30 seconds | ~$0.02 (~$0.001 per result) |
| 100 notices | ~2 minutes | ~$0.08 (~$0.001 per result) |
| 500 notices | ~10 minutes | ~$0.30 (~$0.001 per result) |

Disabling `fetchFullDetails` cuts these times roughly in half, since it skips the per-result detail fetch. Actual cost depends on Apify plan and proxy usage; a run's final usage cost only settles after the run reports SUCCEEDED — reading the dataset mid-run will undercount it.

### Use as an API

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("studio-amba/ezamowienia-scraper").call(run_input={
    "searchQuery": "budowa",
    "region": "mazowieckie",
    "maxResults": 50,
})

for notice in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{notice['itemTitle']} | {notice['organization']} | {notice['deadline']}")
```

### Limitations

- **Estimated value is usually blank**: unlike awarded-contract portals, most national-threshold notices on ezamowienia.gov.pl don't disclose an estimated or contract value in the fields this actor extracts.
- **Search matches the tender title only**: the `searchQuery` field matches "Nazwa zamówienia", not buyer or supplier names — use `organizationName` to filter by buyer.
- **CPV codes and description require `fetchFullDetails`**: with it disabled, `cpvCodes`, `itemDescription`, `contactInfo`, and `numberOfLots` come back empty.
- **Covers the notice lifecycle, not just open tenders**: results include open, closed, finished, and cancelled procedures — filter or check the `status` field if you only want currently open tenders.

### Other European procurement scrapers

Check the [Studio AMBA actor catalog](https://apify.com/studio-amba) for more European public procurement data, including eTenders (Ireland), DOFFIN (Norway), TenderNed (Netherlands), TED (EU-wide), BASE.gov.pt (Portugal), evergabe-online (Germany), and Belgian public procurement.

### Your feedback

Found a bug or want a feature? Open an issue on the [Issues tab](https://console.apify.com/actors/studio-amba~ezamowienia-scraper/issues).

# Actor input Schema

## `searchQuery` (type: `string`):

Search notices by tender name (order name). Matched against the tender title. Examples: 'informatyka' (IT), 'sprzątanie' (cleaning), 'budowa drogi' (road construction), 'dostawa sprzętu' (equipment supply).

## `organizationName` (type: `string`):

Filter by the contracting authority's name (Nazwa Zamawiającego). Examples: 'Gmina Warszawa', 'Szpital'.

## `organizationCity` (type: `string`):

Filter by the contracting authority's city (Miejscowość Zamawiającego).

## `region` (type: `string`):

Filter by the contracting authority's voivodeship (Polish administrative region).

## `initiationDateFrom` (type: `string`):

Only notices whose procedure was initiated (published) on or after this date. Format: YYYY-MM-DD.

## `initiationDateTo` (type: `string`):

Only notices whose procedure was initiated (published) on or before this date. Format: YYYY-MM-DD.

## `submissionDateFrom` (type: `string`):

Only notices with a bid submission deadline on or after this date. Format: YYYY-MM-DD.

## `submissionDateTo` (type: `string`):

Only notices with a bid submission deadline on or before this date. Format: YYYY-MM-DD.

## `fetchFullDetails` (type: `boolean`):

When enabled (default), fetches the full published BZP notice for each result to extract CPV codes, description, and contact details — one extra request per result. Disable for a faster run that only returns the basic search fields.

## `maxResults` (type: `integer`):

Maximum number of notices to return.

## `proxyConfiguration` (type: `object`):

Apify proxy configuration.

## Actor input object example

```json
{
  "searchQuery": "informatyka",
  "region": "",
  "fetchFullDetails": true,
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchQuery": "informatyka",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/ezamowienia-scraper").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 = {
    "searchQuery": "informatyka",
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/ezamowienia-scraper").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 '{
  "searchQuery": "informatyka",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/ezamowienia-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/ezamowienia-scraper"
        }
    }
}

```

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/xlijkxXCluaXwagPA/builds/R8GE5Y72DceCClfKj/openapi.json
