# Czech Republic Jobs Scraper: Vacancies & Employers (`responsible_front_evw/czech-jobs-labour-office`) Actor

Job vacancies registered with the Czech Labour Office (Urad prace CR, MPSV open data), about 40,000 ads, no key. Filter by region, CZ-ISCO, salary, employee card, blue card or accommodation. Hiring companies mode with ICO, legal form and NACE from ARES. Contact names, phones and emails removed.

- **URL**: https://apify.com/responsible_front_evw/czech-jobs-labour-office.md
- **Developed by:** [Open Data Tools](https://apify.com/responsible_front_evw) (community)
- **Categories:** Jobs, 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

from $1.00 / 1,000 results

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

## Czech Republic Jobs Scraper: Vacancies & Employers

Get every job vacancy registered with the **Czech Labour Office (Úřad práce ČR)**, about 40,000 ads and 100,000 open positions, from the **official open data of the Czech Ministry of Labour (MPSV)**. Updated daily. No API key, no login, no scraping of job boards.

**Contact data removed.** The open data file contains the name, phone and email of each ad's contact person: this Actor never returns them. Contact lines, names, phone numbers and emails are also removed from the job description. Employers who are self-employed persons (sole traders) are returned without name, company number or street.

### What you can do

- **Vacancies:** filter by region (kraj), district (okres), town, CZ-ISCO occupation (same codes as ISCO-08), keywords, minimum salary, contract type (full-time, part-time, DPP, DPČ) and posting date. Every ad has a salary range in CZK.
- **Foreign-worker recruitment:** keep only vacancies open to non-EU citizens, listed for the **employee card** (zaměstnanecká karta) or the **EU Blue Card**, or offering accommodation. Over half of all Labour Office vacancies accept non-EU workers.
- **Hiring companies:** switch `mode` to `companies` and get one row per employer: ICO (company number), legal form and registered NACE activities from the official **ARES** register, number of open vacancies and positions, top occupations, towns, salary range, how many ads accept non-EU workers, latest ad date and a website when an ad gives one. A list of employers for staffing agencies and B2B sales, without contact people.
- **Alerts:** turn on *Only new since last run* and schedule it daily: you only get (and pay for) vacancies or companies you have not seen before.

### Input example

```json
{
  "regions": ["Plzen"],
  "occupationCodes": ["8", "93"],
  "openToNonEuForeignersOnly": true,
  "employeeCardOnly": true,
  "sortBy": "positions",
  "maxItems": 100
}
```

Regions: Prague, Central Bohemian, South Bohemian, Plzen, Karlovy Vary, Usti nad Labem, Liberec, Hradec Kralove, Pardubice, Vysocina, South Moravian, Olomouc, Moravian-Silesian, Zlin. Czech names and NUTS 3 codes (CZ064) also work.

### Output example (vacancy, shortened)

```json
{
  "vacancyId": "67306336",
  "title": "správce IT provozu",
  "occupationCode": "35130",
  "occupationName": "Technici počítačových sítí a systémů",
  "iscoMajorGroup": "Technicians and associate professionals",
  "positions": 1,
  "salaryFrom": 28000,
  "salaryTo": 37000,
  "salaryPeriod": "month",
  "currency": "CZK",
  "contractTypes": ["Full-time"],
  "shifts": "Single shift",
  "minEducation": "Vocational certificate",
  "openToNonEuForeigners": false,
  "employeeCard": false,
  "blueCard": false,
  "employerName": "HD pro, s.r.o.",
  "employerIco": "08012032",
  "employerType": "Limited liability company (s.r.o.)",
  "workplaceTown": "Rousínov",
  "workplaceDistricts": ["Vyškov"],
  "region": "South Moravian",
  "regionNuts3": "CZ064",
  "postedAt": "2026-10-29",
  "description": "...",
  "url": "https://www.uradprace.cz/web/cz/vyhledani-volneho-mista#/volna-mista-detail/67306336",
  "source": "Urad prace CR / MPSV open data (data.mpsv.cz), 'Volna mista za celou CR'. Not affiliated with MPSV or Urad prace CR."
}
```

### Output example (company, shortened)

```json
{
  "employerIco": "08121427",
  "employerName": "Stavby DVD s.r.o.",
  "legalForm": "Limited liability company (s.r.o.)",
  "nace": ["4120", "433", "439"],
  "openVacancies": 1,
  "openPositions": 1,
  "topOccupations": ["Obsluha vysokozdvižných a jiných vozíků a skladníci"],
  "regions": ["Prague"],
  "monthlySalaryMin": 22400,
  "monthlySalaryMax": 22400,
  "vacanciesOpenToNonEu": 1,
  "latestPostedAt": "2026-10-30"
}
```

### Pricing

Pay per result:

| Event | Price |
|---|---|
| Actor start | $0.00005 |
| Each vacancy or company returned | $0.001 ($1 per 1,000) |

Vacancies outside your filters, self-employed employers in companies mode and already-seen results in alert mode are never charged.

### How it works and limits

- One download of the official daily file (about 18 MB compressed) per run, read as a stream with little memory. A typical run takes 10 to 20 seconds.
- Job titles and descriptions are in Czech, as filed by employers. Codes and labels (contract, shifts, education, benefits, regions) are in English.
- The `nace` field lists the activities registered in ARES, not only the main one.
- Removing names from free text is automatic: a name written in an unusual way may remain, and some words may be removed by mistake. Street names that honour a person (for example "Jana Opletala") stay.
- Company legal names may include the founder's name (for example "Martin Kolek s.r.o."): that is the company's official name.
- Self-employed employers are detected with ARES. If ARES does not respond, a rule based on the name is used and one could slip through. The `url` field opens the official ad on the Labour Office site, which shows what the employer published.
- Alert mode saves what it has seen when a run finishes: if a run is aborted or times out, rows it already returned can come again in the next run and are charged again.
- The Labour Office register is not every job in the country: it is strong in manufacturing, logistics, construction, healthcare, social care and public administration.
- If the data cannot be read and no result was returned, the run ends as **failed** with a clear message. A search with no matches ends as succeeded with 0 results.

### Source and legal

Vacancies: "Volná místa za celou ČR", open data of the Czech Ministry of Labour and Social Affairs (MPSV) and the Labour Office (Úřad práce ČR), data.mpsv.cz. According to the MPSV terms of use, the dataset is not protected by copyright or by the database right. Legal form and NACE codes: ARES, Czech Ministry of Finance. This Actor is not affiliated with or endorsed by MPSV, Úřad práce ČR or the Ministry of Finance, and it does not use their logos.

### FAQ

#### What is the source of these Czech jobs?

The official open data of the Czech Labour Office (Úřad práce ČR, Urad prace CR) and the Ministry of Labour (MPSV): every vacancy registered with the public employment service, updated daily.

#### Can I find jobs open to foreign workers?

Yes. Filter by employee card (zaměstnanecká karta), blue card and accommodation offered. Useful for agencies that place non-EU workers in the Czech Republic.

#### Can I get a list of hiring companies?

Yes. Companies mode returns one row per employer with ICO, legal form and NACE code from ARES.

#### How much does it cost?

$1 per 1,000 vacancies or companies.

#### Does it return personal data?

Contact names, phones and emails are removed, and self-employed employers are anonymised. Removing names from free text is automatic, so an unusual one may remain. To avoid free text entirely, turn off the description.

### Questions or a missing field?

Open an issue in the **Issues** tab. Feature requests are welcome.

# Actor input Schema

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

One row per vacancy, or one row per hiring company (with its number of open vacancies, positions, occupations, salary range, legal form and NACE codes).

## `regions` (type: `array`):

English or Czech name, or NUTS 3 code: Prague, Central Bohemian, South Bohemian, Plzen, Karlovy Vary, Usti nad Labem, Liberec, Hradec Kralove, Pardubice, Vysocina, South Moravian, Olomouc, Moravian-Silesian, Zlin (or CZ010 ... CZ080).

## `districts` (type: `array`):

Optional: district names, for example Brno-mesto, Ostrava-mesto, Plzen-mesto. Accents are optional.

## `towns` (type: `array`):

Optional: municipality of the workplace, for example Brno, Kladno, Mlada Boleslav.

## `occupationCodes` (type: `array`):

Optional: CZ-ISCO codes or their first digits (same as ISCO-08). Examples: 25 (ICT professionals), 2221 (nurses), 7 (craft and trades), 8 (machine operators and assemblers), 8322 (car drivers), 9 (elementary occupations).

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

Optional: any of these words in the job title or occupation name (Czech or English titles, accents optional), for example svarec, ridic, developer.

## `contractTypes` (type: `array`):

Contract types.

## `minMonthlySalary` (type: `integer`):

Optional: keeps vacancies whose top of the salary range is at least this amount. Hourly wages count as 160 hours a month.

## `postedWithinDays` (type: `integer`):

Posted in the last N days.

## `postedSince` (type: `string`):

Optional: YYYY-MM-DD.

## `openToNonEuForeignersOnly` (type: `boolean`):

The employer agrees to hire citizens of non-EU countries (over half of all vacancies).

## `employeeCardOnly` (type: `boolean`):

Vacancies in the central register for the Czech employee card (zamestnanecka karta) for non-EU workers.

## `blueCardOnly` (type: `boolean`):

Only vacancies listed for the EU Blue Card.

## `withAccommodationOnly` (type: `boolean`):

Only vacancies offering accommodation.

## `employerIcos` (type: `array`):

Optional: only these employers (8-digit Czech company numbers).

## `includeDescription` (type: `boolean`):

The employer's free text, with contact lines, names, phones and emails removed.

## `sortBy` (type: `string`):

Sort by.

## `onlyNewSinceLastRun` (type: `boolean`):

Skip vacancies (or companies) this same search already returned in earlier runs, so you do not pay twice. Ideal for a daily schedule: the data is updated once a day.

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

Maximum number of vacancies or companies to return (you pay per result).

## `requestDelaySecs` (type: `integer`):

Pause between requests (seconds).

## Actor input object example

```json
{
  "mode": "jobs",
  "regions": [
    "South Moravian"
  ],
  "postedWithinDays": 30,
  "openToNonEuForeignersOnly": false,
  "employeeCardOnly": false,
  "blueCardOnly": false,
  "withAccommodationOnly": false,
  "includeDescription": true,
  "sortBy": "newest",
  "onlyNewSinceLastRun": false,
  "maxItems": 100,
  "requestDelaySecs": 1
}
```

# Actor output Schema

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

No description

## `companies` (type: `string`):

No description

## `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 = {
    "regions": [
        "South Moravian"
    ],
    "postedWithinDays": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("responsible_front_evw/czech-jobs-labour-office").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 = {
    "regions": ["South Moravian"],
    "postedWithinDays": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("responsible_front_evw/czech-jobs-labour-office").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 '{
  "regions": [
    "South Moravian"
  ],
  "postedWithinDays": 30
}' |
apify call responsible_front_evw/czech-jobs-labour-office --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,responsible_front_evw/czech-jobs-labour-office"
        }
    }
}
```

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/95rVNuyEsKRbJFQvu/builds/rSRxQZBxuIIUFeqH0/openapi.json
