# Czech Jobs Aggregator: Jobs.cz, Prace.cz, Úřad práce & more (`tsutseisoftware/czech-jobs-aggregator`) Actor

All Czech job boards in one run: Jobs.cz, Prace.cz, Labour Office (Úřad práce), JenPráce, StartupJobs, Práce za rohem and Profesia.cz. One row per job with duplicates merged, salary, region, monitoring, market summary, notifications. Unofficial.

- **URL**: https://apify.com/tsutseisoftware/czech-jobs-aggregator.md
- **Developed by:** [Tomáš Buchta](https://apify.com/tsutseisoftware) (community)
- **Categories:** Jobs, Lead generation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.20 / 1,000 job (aggregation)s

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?

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 Jobs Aggregator: Jobs.cz, Prace.cz, Úřad práce & more

Get the jobs of **all big Czech job boards in one run**: **Jobs.cz**, **Prace.cz**, the **Czech Labour Office** (Úřad práce, all registered vacancies), **JenPráce.cz**, **StartupJobs.cz**, **Práce za rohem**, **Profesia.cz**, the temporary-job boards **Fajn-brigady.cz + INwork.cz** and the hospitality board **GastroJobs.cz**. Pick the portals, type your search once (keywords, towns, regions, minimum salary, posting date) and get **one row per job**: the same job found on several portals is **merged into one row** with all its portals and links. Every row has the same fields whatever the portal: title, company, town, district, region, salary as numbers with monthly and hourly equivalents, employment and contract types, work arrangement, dates, and with details the description.

Built for watching the Czech labour market: schedule it daily in **monitoring mode** and you get (and pay the full price for) only the jobs that are new or changed on any portal, with a **notification to Telegram, Slack, Discord or your webhook**. Every run also saves a free **market summary** (salary median and quartiles by region and category, top employers, and how many jobs came from each portal).

> **Česky:** Nabídky práce ze **všech velkých českých portálů v jednom běhu**: Jobs.cz, Prace.cz, Úřad práce (všechna volná místa MPSV), JenPráce, StartupJobs, Práce za rohem, Profesia.cz, brigády z Fajn-brigady.cz + INwork.cz a gastro nabídky z GastroJobs.cz. Portály si vyberete ze seznamu, hledání zadáte jednou a dostanete **jeden řádek za pracovní místo**: stejné místo z více portálů se sloučí s odkazy na všechny. Jednotná pole (mzda, kraj, úvazek), monitoring nových nabídek, upozornění do Telegramu, Slacku nebo Discordu a přehled trhu. Výstup do Excelu, CSV nebo JSON. Podporu poskytujeme i česky.

### Why use this Czech jobs aggregator?

- 🧭 **Every Czech job board at once.** No other Apify actor covers more than one Czech portal. Choose the portals from a list; each one is read with the code of our own single-portal actor, so you get the same filters, the same politeness and the same data quality as with each of them.
- 🔗 **Duplicates merged.** Jobs.cz and Prace.cz share many employers, Práce za rohem and JenPráce re-publish Labour Office vacancies. The same job (title, employer and town) is **one row** with `portals` and `sources` (every ad with its link), and you pay for it once, at the price of its cheapest portal.
- 📋 **One schema for all portals.** Salary as numbers (`salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`) with **monthly and hourly equivalents**, town, district and region, employment and contract types, work arrangement, posting date, description with details.
- 🏛️ **All Labour Office vacancies included.** The Czech Labour Office (MPSV open data, ~40 000 vacancies, every one with a salary) is a source like the others.
- 📬 **Monitoring across portals:** a daily feed of jobs that are new or changed on any portal.
- 🔔 **Notifications** to Telegram, Slack, Discord or any webhook after each run ($0.001 per run that sent one).
- 🤖 **Output for AI agents and spreadsheets:** **compact output** with the core fields only, and the description as **plain text, Markdown or HTML**, the same for every portal.
- 📊 **Free market summary** (`SUMMARY`): salary median and quartiles by region and category, top employers, remote share, and per portal the number of jobs read and saved.
- 🔒 **Privacy first.** No recruiter contacts; e-mails and phone numbers in descriptions are removed; the names of private employers (sole traders) are hidden, as in each portal's actor.

### Portals

| Portal | `sources` value | Price per 1 000 jobs | Notes |
|---|---|---|---|
| Jobs.cz | `jobs-cz` | $0.49 | the biggest Czech job board |
| Prace.cz | `prace-cz` | $0.49 | |
| Úřad práce ČR (MPSV open data) | `urad-prace` | $0.95 | all registered vacancies, always with a salary and the description |
| JenPráce.cz | `jenprace` | $1.44 | own ads and Labour Office vacancies |
| StartupJobs.cz | `startupjobs` | $1.45 | startups and IT |
| Práce za rohem | `pracezarohem` | $2.39 | mostly ads of the other portals, with GPS |
| Profesia.cz | `profesia-cz` | $1.29 | residential proxy included |
| Fajn-brigady.cz + INwork.cz | `fajn-brigady` | $1.75 | temporary jobs (brigády) and regular jobs, mostly with hourly wages; residential proxy included |
| GastroJobs.cz | `gastrojobs` | $1.75 | hotels, restaurants, bars and catering (about 430 jobs, mostly Prague); the type of venue is in `categories` |

By default the actor reads Jobs.cz, Prace.cz, the Labour Office, JenPráce and StartupJobs; Práce za rohem, Profesia.cz, Fajn-brigady.cz + INwork.cz and GastroJobs.cz are read when you pick them. The portals are read at the same time (Jobs.cz, Prace.cz and Práce za rohem, which have one operator, one after another), each up to **Max jobs per portal** (by default its share of **Max jobs**: Max jobs ÷ number of portals + 20 %).

### How to scrape all Czech job boards

1. Choose the **Job portals**.
2. Type **Search terms** (e.g. `skladník`, `účetní`, `python`) and optionally **Towns** or **Regions**, a **minimum salary** or **Posted within days**.
3. Set **Max jobs** (saved jobs after merging) and **Max jobs per portal**.
4. Run it and download the dataset as Excel, CSV or JSON, or schedule it daily with **Monitoring: only new or changed jobs** and a notification.

#### Merging duplicates

Rows are the same job when they have the same title, the same employer (IČO when both rows have it, else the name without its legal form) and the same town, compared without diacritics and case. The kept row is the richest one (with a description, salary, GPS, IČO), then the one of the portal listed first; values it misses are taken from the other ads. `portals` lists all portals of the job, `sources` every ad with its URL, `duplicates` how many ads were merged. Jobs of private employers (without a name) are never merged. Turn off **Merge duplicates across portals** for one row per ad.

The portals word the same job differently (the Labour Office uses its own titles), so not every duplicate is found. Two ads are merged only when title, employer and town are the same, so two different jobs are not joined.

#### Monitoring mode

With **Monitoring: only new or changed jobs** the actor remembers the merged jobs of the previous run with the same **Monitoring key** and saves only jobs that are new (`changeType: new`) or whose title, company, salary, town or portals changed (`updated`, with `changedFields`). Each portal is read completely up to its limit, so a job is new only if no portal had it before.

#### Notifications

Fill in one or more channels in the **Notifications** section (Telegram bot token and chat ID, Slack or Discord webhook, or any HTTPS webhook). After the run, the actor sends the title, company, place, salary and link of the saved jobs (at most **Notifications: max jobs per message**) and links to the run and the dataset; with **only when something was saved** (on by default) a run without new jobs sends nothing. Tokens and URLs are secret inputs, never logged. A run that sent its notification pays **$0.001** once (all channels together, ~$0.15 a month for a daily schedule); a run that sends nothing, or whose channels all fail, pays nothing.

#### Compact output and description format

**Compact output** saves only `id`, `portal`, `portals`, `url`, `title`, `company`, `location`, `region`, the salary fields, `employmentType`, `workArrangement`, `postedAt` and `scrapedAt`, plus the description and the monitoring fields when those are on. **Description format** gives `description` as plain text (default), **Markdown** (`### heading`, `- item`) or simple **HTML** (`<h3>`, `<ul>`, `<p>`), made the same way from every portal's description.

#### Market summary (SUMMARY)

Every run saves a free JSON record `SUMMARY` in the key-value store: jobs found, saved and merged, salary median and quartiles per month overall, by region and by category, top employers, work arrangement, employment types, and for every portal the jobs read, its status message and how many saved jobs were found there.

### How much does it cost?

Pay per result. Every saved job pays:

1. the price of **its portal** (the table above, the same as the portal's own actor; a job found on several portals pays its **cheapest** portal **once**, so merging never makes a job dearer), and
2. with **Add description and details**, the job page price of its portal's own actor where that actor charges for it: **Jobs.cz $0.45 per 1 000 from 23 December 2026**; Prace.cz, the Labour Office, JenPráce, StartupJobs, Práce za rohem, Fajn-brigady.cz + INwork.cz, GastroJobs.cz and (for now) Profesia.cz include it. A merged job pays the page once, at its cheapest portal whose page was read (free when that portal includes it), and
3. the **aggregation** (merging, one schema, monitoring across portals): **$0.30 per 1 000 jobs** ($0.28 Bronze, $0.25 Silver, $0.20 Gold and higher plans).

| Example (FREE plan) | Price |
|---|---|
| 1 000 jobs from Jobs.cz and Prace.cz | $0.49 + $0.30 = **$0.79** |
| 1 000 jobs from the Labour Office | $0.95 + $0.30 = **$1.25** |
| 100 jobs from the 5 default portals | between $0.08 and $0.17 |

**Start: $0.005 per run** (the fixed costs of reading several portals, e.g. the whole Labour Office file). Notifications: **$0.001 per run** that sent one (all channels together). **Monitoring:** an unchanged job is not saved, but it was read again, so it pays a small check fee per 1 000 jobs: $0.02 (Profesia.cz $0.05, Labour Office $0.01), with details +$0.10 (StartupJobs +$0.05, Profesia.cz +$0.35, Fajn-brigady.cz + INwork.cz +$0.15, Labour Office +$0.01), always much less than saving it. **Extra pages:** requests beyond what the rows read explain (pages a narrow filter read and threw away, searches without results) pay $0.10 (Profesia.cz $0.60, Fajn-brigady.cz + INwork.cz $0.70, GastroJobs.cz $0.15) per 1 000 requests, what such a page costs us; a normal run stays within it and pays nothing here. Merged duplicates, filtered-out jobs and the `SUMMARY` record are free. Platform usage and residential proxies are included. You can set a maximum cost per run: the portals then read only as many jobs as it pays for, and saving stops when it is reached.

### Input example

```json
{
  "sources": ["jobs-cz", "prace-cz", "urad-prace", "jenprace", "startupjobs"],
  "searchQueries": ["skladník"],
  "regions": ["jihomoravsky-kraj"],
  "maxItems": 200,
  "maxItemsPerSource": 100
}
```

### Output example

```json
{
  "id": "cz-jobs:3f1c9a2b7d4e5f60",
  "portal": "jobs-cz",
  "portals": ["jobs-cz", "prace-cz"],
  "sources": [
    {"portal": "jobs-cz", "url": "https://www.jobs.cz/rpd/2001524301/", "id": "jobs.cz:2001524301"},
    {"portal": "prace-cz", "url": "https://www.prace.cz/nabidka/9659817c-16d8-4bc0-80af-efa4a50a1b2c/", "id": "prace.cz:9659817c-16d8-4bc0-80af-efa4a50a1b2c"}
  ],
  "duplicates": 1,
  "url": "https://www.jobs.cz/rpd/2001524301/",
  "title": "Skladník/ce - Hodonín",
  "company": "SMERO, spol. s r.o.",
  "location": "Hodonín",
  "region": "Jihomoravský kraj",
  "salaryMin": 30000,
  "salaryMax": 36000,
  "salaryCurrency": "CZK",
  "salaryPeriod": "month",
  "employmentType": ["fullTime"],
  "workArrangement": "onsite",
  "postedAt": "2026-11-08T10:00:00Z",
  "country": "CZ",
  "scrapedAt": "2026-11-09T12:00:00Z"
}
```

See the **Output** tab for all fields. The dataset has views **Overview**, **Portals and duplicates**, **Salaries** and **Monitoring**.

### Limitations

- Each portal reads at most **Max pages per search** pages per search term and town (by default about twice what it needs for its share of **Max jobs**); raise it for narrow filters.

- Near the run's timeout the actor stops reading (keeping time to save and charge what it has read); a run restarted by the platform (migration) does not read again the sources it had finished, where reading them took 30 seconds or more or went through the residential proxy.

- Each portal searches the keywords its own way (the Labour Office data match words at the start of the title or profession), so the same search gives a different number of jobs on each portal.

- Profesia.cz has no Czech region filter, so with **Regions** it is read without them (the run log says so).

- **Fajn-brigady.cz + INwork.cz** have no search, the actor reads their job lists: without a place all temporary jobs of Fajn-brigady.cz and all jobs of INwork.cz, with **Regions** the two lists of each region, with **Towns** the town's list on both sites. A town the list of Czech municipalities does not know (or knows in several districts) is read on Fajn-brigady.cz only (temporary jobs; the run log says so), and a town without a list on a site gives no jobs from it, never the jobs of the whole country. **Search terms** keep the jobs with one of the terms in the **title** (not in the description), found on the pages read: raise **Max pages per search** for rare words. The wage, contract type and posting date are on the job page: without **Add description and details** a row has a wage only when the title states it, and with **Minimum monthly salary**, **Only with salary** or **Posted within days** the job pages of these two sites are read anyway (included in the price). Hourly wages are compared with the minimum monthly salary at 160 hours a month.

- **GastroJobs.cz** cannot be searched by URL: the actor reads its list of jobs (about 15 pages of 30) and applies your search terms (title, employer name or type of venue), towns, regions, salary and date to it. A general search (e.g. "skladník") reads the whole list and finds little, and the pages beyond the saved jobs pay the extra-page fee (15 pages = $0.00225), so pick this portal for hospitality searches. Its salaries can be per day (shift), week or year as well as per month or hour; monthly and hourly equivalents are always filled. **Max pages per search** limits its list only when you set it.

- Portals are read at the same time, each at its own polite rate (Jobs.cz, Prace.cz and Práce za rohem one after another); the jobs are saved in the order of the portals you chose. With a maximum cost per run each portal gets its share of it before the reading starts, and what a portal does not use is not passed on to the others. A portal that cannot be read (blocked, website change) is skipped and named in the status message, the others are saved.

- Removed jobs (monitoring) are not reported yet.

### For AI agents and API users

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("tsutseisoftware/czech-jobs-aggregator").call(run_input={
    "searchQueries": ["účetní"], "locations": ["Brno"], "maxItems": 200,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["company"], job["salaryMin"], job["portals"])
```

### Custom scrapers and changes

Need a custom version of this actor, another field or filter, or a scraper for a different website? Write to **info@tsutsei-software.com** with the website, the data you need and how often, and we will reply with a fixed quote. We work mainly with clients from the Czech Republic and from outside the EU.

More about us and all our actors: [tsutsei-software.com](https://tsutsei-software.com).

### More Czech job scrapers

The same output format for the other Czech job sources (many jobs are published on several of them):

- [Jobs.cz Scraper](https://apify.com/tsutseisoftware/jobs-cz-scraper): Czech jobs with salary, region, requirements, monitoring and optional ARES company data
- [Prace.cz Scraper](https://apify.com/tsutseisoftware/prace-cz-scraper): Czech jobs with salary, region, monitoring and optional ARES company data
- [Úřad práce Scraper](https://apify.com/tsutseisoftware/urad-prace-scraper): all Czech Labour Office vacancies (MPSV open data) with salary, profession, shifts and jobs for foreigners
- [Pracezarohem.cz Scraper](https://apify.com/tsutseisoftware/pracezarohem-scraper): jobs near a town (GPS distance search) from all big Czech job sources, with the portal of every ad
- [JenPráce.cz Scraper](https://apify.com/tsutseisoftware/jenprace-scraper): Czech jobs and side jobs with salary, own ads told apart from Labour Office vacancies
- [StartupJobs.cz Scraper](https://apify.com/tsutseisoftware/startupjobs-scraper): IT and startup jobs with salary, technologies, seniority, remote work, company profiles and an IT market overview
- [Profesia.sk & .cz Scraper](https://apify.com/tsutseisoftware/profesia-scraper): Slovak and Czech jobs from Profesia with salary, region and monitoring
- [Fajn-brigady.cz & INwork.cz Scraper](https://apify.com/tsutseisoftware/fajn-brigady-scraper): Czech temporary and part-time jobs from two websites: hourly wage, town, start date, monitoring
- [GastroJobs.cz Scraper](https://apify.com/tsutseisoftware/gastrojobs-scraper): Czech hotel, restaurant and catering jobs: salary, type of venue, employer company ID, monitoring

### FAQ

#### Is it legal to scrape Czech job boards?

The actor reads only job ads that the portals publish for everyone without logging in, at a moderate speed, and the Labour Office data are open data published for reuse. It returns no recruiter contacts, removes e-mails and phone numbers from descriptions and hides the names of private employers. You are responsible for how you use the data (GDPR, database rights and the websites' terms). This actor is not affiliated with any of the portals.

#### Why is a job not merged with its copy on another portal?

The portals often word the same job differently (another title, the employer's brand instead of its legal name, a district instead of the town). Merging needs the same title, employer and town, so that two different jobs are never joined.

#### Can I get one portal only?

Yes, choose one portal; you pay its price plus the aggregation. For one portal its own actor is cheaper, e.g. [Jobs.cz Scraper](https://apify.com/tsutseisoftware/jobs-cz-scraper) or [Prace.cz Scraper](https://apify.com/tsutseisoftware/prace-cz-scraper).

***

Also known as a Czech jobs API, "všechny nabídky práce na jednom místě", "agregátor pracovních nabídek" or "nabídky práce do Excelu".

# Actor input Schema

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

Portals to read, one after another. A job found on several portals is one row and pays the price of its cheapest portal once. Profesia.cz and Fajn-brigady.cz + INwork.cz (temporary jobs, brigády) use a residential proxy (included in the price). GastroJobs.cz (hotels, restaurants and catering) is read when you pick it.

## `searchQueries` (type: `array`):

Job titles or keywords, e.g. "skladník", "účetní", "python". Each portal searches them its own way (the Labour Office data: words at the start of the title or profession; Fajn-brigady.cz + INwork.cz: words in the title; GastroJobs.cz: words in the title, employer name or type of venue). Empty = the newest jobs.

## `locations` (type: `array`):

Czech towns, e.g. "Brno", "Ostrava", "Praha".

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

Czech regions.

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

Maximum number of jobs saved (after merging duplicates). 0 = no limit.

## `maxItemsPerSource` (type: `integer`):

How many jobs each portal reads at most. 0 = its share of "Max jobs" (Max jobs ÷ number of portals + 20 %).

## `maxPagesPerSearch` (type: `integer`):

How many result pages each portal reads per search term and town. Empty or 0 = about twice what the portal needs for its share of "Max jobs" (at most 50). Raise it for narrow filters (a company, words, "only with salary"): pages a portal reads beyond one per saved job pay a small fee of $0.10 per 1 000 (Profesia.cz $0.60, Fajn-brigady.cz + INwork.cz $0.70, GastroJobs.cz $0.15).

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

Only jobs published in the last N days. Empty = any age.

## `minSalary` (type: `integer`):

Only jobs with at least this monthly salary in CZK (Czech portals; jobs without a salary are kept by the portals that keep them, use "Only with salary" to drop them).

## `onlyWithSalary` (type: `boolean`):

Only jobs that show a salary.

## `excludeKeywords` (type: `array`):

Leave out jobs with one of these words in the title.

## `companies` (type: `array`):

Only jobs of companies whose name contains one of these.

## `excludeCompanies` (type: `array`):

Leave out jobs of companies whose name contains one of these (e.g. agencies).

## `includeDetails` (type: `boolean`):

Open each job page for the description and details (slower: one request per job). The Labour Office data always have them; Fajn-brigady.cz + INwork.cz show the wage only there. A job page pays what the portal's own scraper charges for it: Jobs.cz $0.45 per 1 000 from 23 December 2026, Profesia.cz $0.10; the other portals include it. A job on several portals pays its page once, at the cheapest portal whose page was read.

## `mergeDuplicates` (type: `boolean`):

One row per job when the same job (title, employer, town) is on several portals, with all its portals and links in "portals" and "sources". Off = one row per ad.

## `descriptionFormat` (type: `string`):

Format of "description", the same for every portal: plain text, Markdown (headings and lists, good for AI agents and Notion) or simple HTML (<h3>, <ul>, <p>).

## `compactOutput` (type: `boolean`):

Only the core fields (id, portals, URL, title, company, town, region, salary, employment type, work arrangement, dates), plus the description and the monitoring fields when those are on. Smaller rows for AI agents, MCP clients and spreadsheets.

## `onlyNewOrChanged` (type: `boolean`):

Return only jobs that are new or whose title, company, salary, town or portals changed since the previous run with the same Monitoring key. Unchanged jobs are not saved and pay only a small check fee ($0.02 per 1 000, see the README).

## `monitoringKey` (type: `string`):

Name of the remembered state; use a different key for each search you monitor.

## `telegramBotToken` (type: `string`):

Token of your Telegram bot (from @BotFather). Used with "Telegram chat ID".

## `telegramChatId` (type: `string`):

Chat, group or channel ID the bot writes to (e.g. -1001234567890).

## `slackWebhookUrl` (type: `string`):

Incoming webhook of your Slack channel (https://hooks.slack.com/services/...).

## `discordWebhookUrl` (type: `string`):

Webhook of your Discord channel (https://discord.com/api/webhooks/...).

## `webhookUrl` (type: `string`):

Any HTTPS URL: gets a POST with JSON {title, summary, totalSaved, runUrl, datasetUrl, items}.

## `notificationLimit` (type: `integer`):

How many jobs are listed in one notification (the rest as "…and N more").

## `notifyOnlyChanges` (type: `boolean`):

Send nothing when the run saved no job (e.g. a monitoring run without new jobs).

## Actor input object example

```json
{
  "sources": [
    "jobs-cz",
    "prace-cz",
    "urad-prace",
    "jenprace",
    "startupjobs"
  ],
  "searchQueries": [
    "skladník"
  ],
  "maxItems": 30,
  "maxItemsPerSource": 10,
  "onlyWithSalary": false,
  "includeDetails": false,
  "mergeDuplicates": true,
  "descriptionFormat": "text",
  "compactOutput": false,
  "onlyNewOrChanged": false,
  "notificationLimit": 10,
  "notifyOnlyChanges": true
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `summary` (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 = {
    "sources": [
        "jobs-cz",
        "prace-cz",
        "urad-prace",
        "jenprace",
        "startupjobs"
    ],
    "searchQueries": [
        "skladník"
    ],
    "maxItems": 30,
    "maxItemsPerSource": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("tsutseisoftware/czech-jobs-aggregator").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 = {
    "sources": [
        "jobs-cz",
        "prace-cz",
        "urad-prace",
        "jenprace",
        "startupjobs",
    ],
    "searchQueries": ["skladník"],
    "maxItems": 30,
    "maxItemsPerSource": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("tsutseisoftware/czech-jobs-aggregator").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 '{
  "sources": [
    "jobs-cz",
    "prace-cz",
    "urad-prace",
    "jenprace",
    "startupjobs"
  ],
  "searchQueries": [
    "skladník"
  ],
  "maxItems": 30,
  "maxItemsPerSource": 10
}' |
apify call tsutseisoftware/czech-jobs-aggregator --silent --output-dataset

```

## MCP server setup

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

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/5KbbPhPkOZ2sqD3D2/builds/XsxZmI0enIeVDnczW/openapi.json
