# Jobs.cz Scraper — Czech Job Offers with Salary (`eudatalab/jobs-cz-scraper`) Actor

Scrape jobs.cz, the Czech job board: title, company, location, salary range, remote option, employment type, education, benefits and full description for any keyword and region. HTTP-only, pay per offer.

- **URL**: https://apify.com/eudatalab/jobs-cz-scraper.md
- **Developed by:** [Ihor Hrypas](https://apify.com/eudatalab) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 66.7% 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

## Jobs.cz Scraper — Czech Job Offers with Salary

Get job offers from **jobs.cz**, the Czech job board run by Alma Career, as a clean table: title, company, location, salary range (from/to, currency), remote option, response time, status (new / updated / ending soon), the company's number of Atmoskop reviews — and from each offer page the full description, workplace address, employment type, contract duration, required education and languages, job categories, benefits and the company's address. Search any keyword in any city or region, or the whole Czech Republic. Pay only per offer returned.

No browser: the Actor reads the same result and offer pages you see, so it is fast (25 offers with details in about 11 seconds on the platform).

### Sample output

Real rows from a staged run ("python" in Praha):

| title | company | location | salaryMin | salaryMax | remote | employmentType |
|---|---|---|---|---|---|---|
| DevOps Engineer with Python – Praha | teamIT s.r.o. | Praha | 120000 | 140000 | — | Práce na plný úvazek |
| Senior Machine Learning Engineer – Conversational AI | Agnostix, s.r.o. | Praha – Nové Město | 120000 | 160000 | partial | — |
| SENIOR VÝVOJÁŘ/KA DATOVÉ PLATFORMY | Digitální a informační agentura | Praha – Vršovice | 44000 | — | — | Práce na zkrácený úvazek |
| AI/ML Python developer / Data science / Data engineer/ - full remote | BARTON Consulting s.r.o. | Praha | — | — | — | Práce na plný úvazek |

One full record (description shortened here):

```json
{
  "url": "https://www.jobs.cz/rpd/2001466458/",
  "id": "2001466458",
  "title": "AI/ML Python developer / Data science / Data engineer/ - full remote",
  "company": "BARTON Consulting s.r.o.",
  "location": "Praha",
  "salaryText": null,
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryPeriod": null,
  "remote": null,
  "responseTime": "Odpověď do 2 týdnů",
  "status": "20. října",
  "tags": [
    "Odpověď do 2 týdnů"
  ],
  "companyRatingsCount": null,
  "logo": null,
  "detailSource": "jobs.cz",
  "description": "Pracovní nabídka\nAI/ML Python developer / Data science engineer / Data engineer - full remote\nPro našeho klienta, velmi prestižní, mezinárodní společnost, která zřídila své vývojové centrum v ČR, hled …",
  "workplace": "Praha",
  "employmentType": "Práce na plný úvazek",
  "contractDuration": "Na dobu neurčitou",
  "education": "Bakalářské",
  "languages": "Čeština (Základní), Angličtina (Pokročilá)",
  "categories": [
    "IS/IT: Konzultace",
    "analýzy a projektové řízení",
    "IS/IT: Vývoj aplikací a systémů",
    "IS/IT: Správa systémů a HW",
    "Data scientist",
    "Datový analytik",
    "Machine Learning Engineer",
    "Databázový specialista",
    "JavaScript vývojář",
    "Python vývojář"
  ],
  "postedBy": "Personální agentura",
  "benefits": [],
  "companyAddress": "V jámě 699, 11000 Praha – Nové Město, Česká republika"
}
```

Offers hosted on an employer's own career site (12 of 25 in the staged "python" run — mostly banks and large corporations) load their text with JavaScript. For those you get everything from the result list plus a ~300-character `summary` and `detailSource: "employer-site"`:

```json
{
  "id": "2001357841",
  "title": "Portfolio Manager - Power",
  "company": "MVM CEEnergy CZ s.r.o.",
  "location": "Praha – Strašnice",
  "remote": "partial",
  "summary": "MVM CEEnergy CZ, a sister company of the innogy group, is looking for fresh talent to join our trading team. In this role, you’ll be responsible for developing a new electric power trading portfolio. Including taking part in trading on the commodity exchange, meeting relevant people on the Czech……",
  "detailSource": "employer-site",
  "url": "https://www.jobs.cz/rpd/2001357841/"
}
```

### Use cases

- **Salary benchmarks**: salary ranges by keyword, city and employment type.
- **Recruitment and sales leads**: which companies hire which roles right now, with company address and Atmoskop review count.
- **Job market monitoring**: run daily on a schedule and track new offers for your skills or competitors' hiring.
- Feed live Czech job offers to an AI agent via the Apify MCP server (e.g. "find remote-friendly Python jobs in Prague with a salary").

### Pricing

Pay per event: **$0.001 per offer**. No offer, no charge. Set **Max offers** to cap the cost of a run.

### Input

| Field | Meaning | Default |
|---|---|---|
| Keyword | job title, skill or company: `python`, `účetní`, `řidič`; empty = all offers | python (form prefill) |
| Location | city or region: `Praha`, `Brno`, `Ostrava`, `Jihomoravský kraj`; empty = whole Czech Republic | Praha (form prefill) |
| Start URLs | any jobs.cz result URL with the site's own filters; overrides keyword and location | — |
| Max offers | stop after N offers (= cost cap) | 100 (form: 25) |
| Open offer pages | add description, workplace, employment type, education, languages, categories, benefits, company address | on |
| Proxy | not needed | off |

**The 1 350 limit.** jobs.cz shows at most 45 pages (1 350 offers) for one search. Whole-country runs without a keyword, or with a keyword and more than 1 350 wanted, are split into the 14 regions automatically and merged without duplicates.

### Output fields

`id`, `url`, `title`, `company`, `location`, `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `remote` (`partial` / `mostly`), `responseTime`, `status`, `tags`, `companyRatingsCount`, `logo`, `detailSource` (`jobs.cz`, `jobs.cz-beta`, `employer-site`), and with offer pages on: `description`, `workplace`, `employmentType`, `contractDuration`, `education`, `languages`, `categories`, `postedBy` (employer or agency), `benefits`, `companyAddress`, `datePosted` and `validThrough` (beta pages), `summary` (employer sites), `scrapedAt`

### Limits and fair use

Only public result and offer pages are read; pages excluded by robots.txt are never requested. Recruiters' names and phone numbers shown on offer pages are not exported. Respect the GDPR and jobs.cz terms when reusing the data.

### Problems?

Open an issue on the **Issues** tab — median response time is under 6 hours. Include the run ID.

# Actor input Schema

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

Job title, skill or company, e.g. `python`, `účetní`, `řidič`, `project manager`. Leave empty for all offers.

## `location` (type: `string`):

City or region as on jobs.cz, e.g. `Praha`, `Brno`, `Ostrava`, `Hradec Králové`, `Jihomoravský kraj`, `Vysočina kraj` (diacritics and case do not matter). Leave empty for the whole Czech Republic.

## `startUrls` (type: `array`):

Any jobs.cz result URL (https://www.jobs.cz/prace/…) with the site's own filters, e.g. salary or field. Overrides keyword and location.

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

Stop after this many offers. One offer = one charged event, so this is your cost cap. jobs.cz shows at most 1 350 offers per search; whole-country runs above that are split by region automatically.

## `followDetails` (type: `boolean`):

Visit each offer to add the full description, workplace, employment type, contract duration, education, languages, categories, benefits and company address. Offers hosted on an employer's own career site keep the result-list data. Slower, same price per offer.

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

Not needed: jobs.cz answers the platform directly, while Apify datacenter proxies made runs ~7× slower (2026-10-22). Turn on only if you get blocked.

## Actor input object example

```json
{
  "keyword": "python",
  "location": "Praha",
  "startUrls": [],
  "maxItems": 25,
  "followDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "keyword": "python",
    "location": "Praha",
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("eudatalab/jobs-cz-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 = {
    "keyword": "python",
    "location": "Praha",
    "maxItems": 25,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("eudatalab/jobs-cz-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 '{
  "keyword": "python",
  "location": "Praha",
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call eudatalab/jobs-cz-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,eudatalab/jobs-cz-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/Wa5z06ii1Eafh4LUv/builds/jgni63REs6BPcRfyT/openapi.json
