# Czech public tenders (zakazky.gov.cz / NEN) (`makeme200k/czech-public-tenders`) Actor

Structured Czech public tender notices from the official open data of the Registr veřejných zakázek (VVZ, NEN, Tender arena, TENDERMARKET), with keyword, CPV, date and incremental filters.

- **URL**: https://apify.com/makeme200k/czech-public-tenders.md
- **Developed by:** [Lukáš Březina](https://apify.com/makeme200k) (community)
- **Categories:** Business, Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 tender returneds

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?

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

## Czech public tenders (zakazky.gov.cz / NEN)

Structured Czech public procurement notices as clean JSON. One dataset item per tender: title, contracting authority with ICO, CPV codes, estimated value, procedure type, status, publication date, bid deadline, place of performance, description, winners with contract prices, and document metadata.

The data comes from the official machine readable channels of the Czech Ministry of Regional Development (MMR), not from scraping web pages:

1. **Bulk mode (default):** the open data of the Registr verejnych zakazek, published monthly at isvz.nipez.cz. It is the central register behind zakazky.gov.cz and aggregates the Vestnik verejnych zakazek (VVZ), the national tool NEN, Tender arena and TENDERMARKET, which together cover essentially the whole Czech public procurement market including below threshold contracts.
2. **Profiles mode:** the standard XML export that every certified Czech procurement tool must serve for each contracting authority profile (decree 345/2023 Sb.). Use it to get same day data for specific authorities you care about.

### What you get

Sample item (shortened):

```json
{
  "id": "RVZ2400000649",
  "title": "ZZS ZK - injekcni a infuzni technika 2024",
  "contractingAuthority": {
    "name": "Zdravotnicka zachranna sluzba Zlinskeho kraje",
    "ico": "62182137",
    "nuts": "CZ072",
    "address": "Peroutkovo nabrezi 434, Zlin 76001",
    "profileUrl": "https://nen.nipez.cz/profil/ZZSZK"
  },
  "cpvCodes": ["33141310"],
  "kind": "Dodavky",
  "regime": "Podlimitni",
  "estimatedValueCzk": null,
  "procedureType": "Zjednodusene podlimitni rizeni",
  "status": "Dokoncen/Zadan",
  "publicationDate": "2024-02-13T15:52:04",
  "bidDeadline": "2024-03-11T13:00:00",
  "updatedAt": "2026-07-08T17:50:19",
  "url": "https://nen.nipez.cz/Zadavaci_postup/N006-24-V00003893",
  "aggregatorUrl": "https://zakazky.gov.cz/verejne-zakazky/detail-zakazky/RVZ2400000649",
  "vvzNumbers": ["Z2024-021134"],
  "sourceSystem": "Narodni elektronicky nastroj",
  "placeOfPerformanceNuts": ["CZ072"],
  "description": "Predmetem verejne zakazky je uzavreni ramcove smlouvy...",
  "partsCount": 1,
  "parts": [{ "id": "RVZ2400000649/001", "status": "Dokoncen/Zadan", "bidDeadline": "2024-03-11T13:00:00" }],
  "winners": [{ "name": "Perfect Distribution a.s.", "ico": "47675934", "contractPriceNoVat": null }],
  "documents": [{ "documentId": "4e3f630f-...", "name": "priloha3-ramcova smlouva.docx", "type": "Vysvetleni zadavaci dokumentace", "createdAt": "2024-02-22T14:58:29" }]
}
```

All timestamps are Europe/Prague local time in the format `YYYY-MM-DDTHH:MM:SS`.

### Inputs

| Field | Meaning |
| --- | --- |
| `mode` | `bulk` (whole market, monthly open data) or `profiles` (fresh data for chosen authorities) |
| `publishedSince` | Only tenders whose procedure started on or after this date (`YYYY-MM-DD`) |
| `keyword` | Case and diacritics insensitive substring over title, description and authority name |
| `cpvPrefix` | CPV code prefix, for example `45` construction, `72` IT services |
| `maxItems` | Maximum number of tenders to return |
| `newerThan` | Incremental mode, see below |
| `categories` | Bulk mode: `VZ` (default), `DNS`, `SON`, `SK`, `RVP` |
| `profileUrls` | Profiles mode: authority profile URLs, for example `https://nen.nipez.cz/profil/CzechInvest` |

### Incremental mode

Every item carries `updatedAt`, the official timestamp of its last change in the register. To get only what changed since your last run:

1. Run the Actor. After it finishes, read the `maxUpdatedAt` value from the `LAST_RUN_INFO` record in the run's key-value store (also printed in the log).
2. Pass that value as `newerThan` in the next run. Only tenders with `updatedAt` strictly newer are returned.

Tenders are deduplicated by their NIPEZ id and you always get the newest published version of each tender.

### Data freshness and limits

- Bulk open data for a month is published around the 5th day of the following month. It is the complete official record, but do not expect it to contain yesterday's tender. For same day data on specific authorities, use profiles mode.
- Bulk open data starts in February 2024. One run reads at most 14 months.
- Profiles mode covers a window of at most the last 366 days per the decree, and the Actor waits 10 seconds between requests to nen.nipez.cz, as its robots.txt requests. Expect roughly one authority profile per 10 to 15 seconds.
- `documents` entries from the bulk source often carry an internal `documentId` instead of a direct URL; the tender's `url` or `aggregatorUrl` page links the actual files. Profiles mode returns direct document URLs.
- The Actor identifies itself with a descriptive User-Agent, uses only interfaces designated by MMR for machine processing, and does not output personal data about individuals beyond what the public notice itself contains (authority and company names as published).

### Caching

Bulk mode caches each month's normalized records in a named key-value store that persists across runs (see NOTES.md "Cache design"). The first run that needs a given month downloads and parses the archive as before; every later run for that month reuses the cache and never re-downloads. A month still being published (the current month, and briefly after it closes, to allow for corrections) is re-checked periodically rather than cached forever; closed past months are cached permanently.

### Running on the Apify platform

- The Czech government data infrastructure rejects connections from datacenter IP ranges, so the Actor uses Czech residential proxies through Apify Proxy by default when it runs on the platform. Leave the proxy setting as it is unless you know what you are doing. Local runs from a regular connection work without a proxy.
- Memory: on a cache hit, well under 200 MB and a few seconds. On a cache miss (the archive must be downloaded and normalized), the Actor streams the raw JSON and flushes normalized records to the cache in ~4 MB chunks as it goes rather than holding a whole month in memory, but a full VZ month is 20-35k tenders and measured peak RSS was about 1 GB (see NOTES.md "Memory: real numbers"). Default run memory is 2048 MB for headroom; do not lower it below 1536 MB.
- A bulk run downloads about 63 MB per monthly file it needs, only on a cache miss (verified on the platform: USD 0.51 for a miss, USD 0.001 for a hit on the same input — see NOTES.md). Downloads resume automatically if a proxy connection drops mid transfer.

### Typical uses

- Tender alerts for a sales team: run daily in profiles mode over the authorities in your segment, or monthly in bulk mode with `keyword` or `cpvPrefix` filters.
- Market analysis: pull whole months of awarded contracts with winners and contract prices.
- Enrichment: match `winners[].ico` and `contractingAuthority.ico` against your CRM.

# Actor input Schema

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

bulk: read the official monthly open data of the Registr verejnych zakazek (covers VVZ, NEN, Tender arena and TENDERMARKET; a month is published around the 5th day of the following month). profiles: read fresh, same-day data directly from the machine-readable XML export of specific contracting authority profiles listed in profileUrls.

## `publishedSince` (type: `string`):

Only return tenders whose procedure started on or after this date (YYYY-MM-DD). Also determines how many monthly open data files are read. Bulk open data starts in February 2024. Default: the first day of the previous month.

## `keyword` (type: `string`):

Case and diacritics insensitive substring matched against the tender title, description and contracting authority name. Example: rekonstrukce, software, uklid.

## `cpvPrefix` (type: `string`):

Only return tenders whose main or part CPV code starts with these digits. Example: 45 for construction works, 72 for IT services, 33 for medical equipment.

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

Stop after this many tenders have been returned. Each returned tender is one dataset item.

## `newerThan` (type: `string`):

Incremental mode. Only return tenders whose last change timestamp (updatedAt, Europe/Prague local time) is strictly newer than this value. Use the maxUpdatedAt value stored in the LAST\_RUN\_INFO record of the previous run, or the highest updatedAt you have already processed. Format: 2026-07-31T23:59:59.

## `categories` (type: `array`):

Which open data categories to read in bulk mode. VZ: public contracts (default and recommended). DNS: dynamic purchasing systems. SON: design contests. SK: qualification systems. RVP: subcontractor selection procedures.

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

The Czech government data infrastructure sits behind a firewall that rejects datacenter IP ranges, so Czech residential proxies are used by default when running on the Apify platform. Verified: direct datacenter connections and datacenter proxies are refused, residential CZ works. Change only if you know you need to.

## `profileUrls` (type: `array`):

Contracting authority profile URLs for profiles mode, for example https://nen.nipez.cz/profil/CzechInvest. Every certified Czech procurement tool must serve the standard XML export at <profile URL>/XMLdataVZ, so profiles hosted on NEN, E-ZAK, Tender arena and others all work. The actor waits 10 seconds between requests to nen.nipez.cz as its robots.txt requests.

## Actor input object example

```json
{
  "mode": "bulk",
  "publishedSince": "2026-06-01",
  "keyword": "software",
  "cpvPrefix": "72",
  "maxItems": 100,
  "newerThan": "2026-07-31T23:59:59",
  "categories": [
    "VZ"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CZ"
  },
  "profileUrls": [
    "https://nen.nipez.cz/profil/CzechInvest"
  ]
}
```

# Actor output Schema

## `tenders` (type: `string`):

All tender notices matched by this run, as JSON — id, title, contracting authority, CPV codes, estimated value, deadlines, winners and documents.

## `tendersCsv` (type: `string`):

The same tenders as a flat CSV for Excel, Google Sheets or a BI import.

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

The run's dataset in the Console, using the Overview table view (authority, CPV, value, deadline).

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CZ"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("makeme200k/czech-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 = { "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "CZ",
    } }

# Run the Actor and wait for it to finish
run = client.actor("makeme200k/czech-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 '{
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CZ"
  }
}' |
apify call makeme200k/czech-public-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,makeme200k/czech-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/IwSM2N4XcjH6VbkbZ/builds/KnPuEh2V6JfX0kIE3/openapi.json
