{
  "data": {
    "id": "BrN1c4fDavcIJtqXr",
    "actId": "x1vYR6ixAeVfHRs61",
    "userId": "tnBVjt3CXmcUrEE3L",
    "startedAt": "2026-11-02T05:23:47.254Z",
    "finishedAt": "2026-11-02T05:23:50.898Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 3473,
      "runTimeSecs": 3.473,
      "computeUnits": 0.0038588888888888887,
      "imageSizeBytes": 322121728
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "F2Aeb3gE2syjqz9xC",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Jobs.cz Scraper Input\",\n  \"description\": \"Search jobs.cz by keyword, browse a city/region or profession, browse part-time brigady gigs, or scrape pasted URLs. Add salary, date, contract, education, language, remote-work and employer filters.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to fetch. Search by keyword, browse a city/region, browse a profession, browse the separate part-time brigady board, or scrape specific jobs.cz search and job URLs.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"byLocation\",\n        \"byCategory\",\n        \"brigady\",\n        \"byUrls\"\n      ],\n      \"enumTitles\": [\n        \"Keyword search\",\n        \"Browse by region/city\",\n        \"Browse by category/profession\",\n        \"Part-time / temp gigs (brigády)\",\n        \"Scrape these URLs\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"search\"\n    },\n    \"searchQueries\": {\n      \"title\": \"Search keywords (mode=search)\",\n      \"type\": \"array\",\n      \"description\": \"One or more free-text keywords, e.g. `python`, `účetní`, `řidič`. Each query is paginated and results are de-duplicated. The old `searchQuery` key is still accepted for saved tasks.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": [\n        \"python\"\n      ]\n    },\n    \"startUrls\": {\n      \"title\": \"Start URLs (mode=byUrls)\",\n      \"type\": \"array\",\n      \"description\": \"jobs.cz search pages, job detail pages, brigady pages, or employer-branded job URLs. Job URLs return full detail when the page publishes it; employer pages return title, company and URL.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"location\": {\n      \"title\": \"Region/city\",\n      \"type\": \"string\",\n      \"description\": \"Curated city/region. Required for mode=byLocation; narrows keyword and category searches; limits brigady to a 10-50 km radius. Pick `(none)` for no restriction.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"praha\",\n        \"brno\",\n        \"ostrava\",\n        \"plzen\",\n        \"liberec\",\n        \"olomouc\",\n        \"ceske-budejovice\",\n        \"hradec-kralove\",\n        \"pardubice\",\n        \"zlin\",\n        \"karlovy-vary\",\n        \"jihlava\",\n        \"usti-nad-labem\",\n        \"kladno\",\n        \"most\",\n        \"opava\",\n        \"frydek-mistek\",\n        \"decin\",\n        \"teplice\",\n        \"karvina\",\n        \"chomutov\",\n        \"jablonec-nad-nisou\",\n        \"mlada-boleslav\",\n        \"prostejov\",\n        \"prerov\",\n        \"ceska-lipa\",\n        \"trebic\",\n        \"tabor\",\n        \"znojmo\",\n        \"kolin\"\n      ],\n      \"enumTitles\": [\n        \"(none)\",\n        \"Praha\",\n        \"Brno\",\n        \"Ostrava\",\n        \"Plzeň\",\n        \"Liberec\",\n        \"Olomouc\",\n        \"České Budějovice\",\n        \"Hradec Králové\",\n        \"Pardubice\",\n        \"Zlín\",\n        \"Karlovy Vary\",\n        \"Jihlava\",\n        \"Ústí nad Labem\",\n        \"Kladno\",\n        \"Most\",\n        \"Opava\",\n        \"Frýdek-Místek\",\n        \"Děčín\",\n        \"Teplice\",\n        \"Karviná\",\n        \"Chomutov\",\n        \"Jablonec nad Nisou\",\n        \"Mladá Boleslav\",\n        \"Prostějov\",\n        \"Přerov\",\n        \"Česká Lípa\",\n        \"Třebíč\",\n        \"Tábor\",\n        \"Znojmo\",\n        \"Kolín\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"locationSlugCustom\": {\n      \"title\": \"Custom region/city slug (advanced)\",\n      \"type\": \"string\",\n      \"description\": \"jobs.cz URL slug for a city not in the dropdown, e.g. `vsetin` or `havirov`. Overrides `location`. Use lowercase, no diacritics, hyphens for spaces. Not supported in mode=brigady.\",\n      \"editor\": \"textfield\"\n    },\n    \"category\": {\n      \"title\": \"Category/profession\",\n      \"type\": \"string\",\n      \"description\": \"Curated profession/category. Required for mode=byCategory; narrows a city browse. Pick `(none)` for no restriction. Not applied in mode=brigady.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"programator\",\n        \"tester\",\n        \"webdesigner\",\n        \"grafik\",\n        \"designer\",\n        \"copywriter\",\n        \"marketing\",\n        \"obchodni-zastupce\",\n        \"personalista\",\n        \"hr-specialista\",\n        \"ucetni\",\n        \"pravnik\",\n        \"reditel\",\n        \"technik\",\n        \"mechanik\",\n        \"elektrikar\",\n        \"svarec\",\n        \"operator-vyroby\",\n        \"skladnik\",\n        \"ridic\",\n        \"kuchar\",\n        \"recepcni\",\n        \"prodavac\",\n        \"administrativa\",\n        \"zdravotni-sestra\"\n      ],\n      \"enumTitles\": [\n        \"(none)\",\n        \"Programátor / Developer\",\n        \"Tester\",\n        \"Webdesignér\",\n        \"Grafik\",\n        \"Designér\",\n        \"Copywriter\",\n        \"Marketing\",\n        \"Obchodní zástupce\",\n        \"Personalista\",\n        \"HR specialista\",\n        \"Účetní\",\n        \"Právník\",\n        \"Ředitel\",\n        \"Technik\",\n        \"Mechanik\",\n        \"Elektrikář\",\n        \"Svářeč\",\n        \"Operátor výroby\",\n        \"Skladník\",\n        \"Řidič\",\n        \"Kuchař\",\n        \"Recepční\",\n        \"Prodavač\",\n        \"Administrativa\",\n        \"Zdravotní sestra\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"categorySlugCustom\": {\n      \"title\": \"Custom category slug (advanced)\",\n      \"type\": \"string\",\n      \"description\": \"jobs.cz URL slug for a profession not in the dropdown, e.g. `architekt` or `ucitel`. Overrides `category`. Use the slug exactly as jobs.cz shows it. Not applied in mode=brigady.\",\n      \"editor\": \"textfield\"\n    },\n    \"salaryMinCzk\": {\n      \"title\": \"Minimum monthly salary (Kč)\",\n      \"type\": \"integer\",\n      \"description\": \"Only return main-board jobs at or above this gross monthly salary in Czech crowns. jobs.cz filters on each ad's internal salary data, so non-disclosing ads are not excluded and can still match. Ignored in mode=brigady.\",\n      \"minimum\": 0,\n      \"maximum\": 200000,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"hourlyRateMin\": {\n      \"title\": \"Minimum hourly rate (Kč/h; brigady only)\",\n      \"type\": \"string\",\n      \"description\": \"Only return brigady gigs at or above this hourly rate. jobs.cz offers exactly these five fixed thresholds. Ignored in every other mode; use `salaryMinCzk` there.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"100\",\n        \"200\",\n        \"300\",\n        \"400\",\n        \"500\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"From 100 Kč/h\",\n        \"From 200 Kč/h\",\n        \"From 300 Kč/h\",\n        \"From 400 Kč/h\",\n        \"From 500 Kč/h\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"radiusKm\": {\n      \"title\": \"Search radius around location (km)\",\n      \"type\": \"string\",\n      \"description\": \"Widen or narrow the distance match around a location. Has no effect without a location. The current jobs.cz search app ignores radius, so these runs use the legacy jobs.cz pages.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"0\",\n        \"10\",\n        \"20\",\n        \"30\",\n        \"40\",\n        \"50\"\n      ],\n      \"enumTitles\": [\n        \"(jobs.cz default)\",\n        \"0 km (city only)\",\n        \"10 km\",\n        \"20 km\",\n        \"30 km\",\n        \"40 km\",\n        \"50 km\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"datePosted\": {\n      \"title\": \"Posted within\",\n      \"type\": \"string\",\n      \"description\": \"Restrict results to jobs posted or updated within this window. Works in every mode, including brigady.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"24h\",\n        \"3d\",\n        \"7d\"\n      ],\n      \"enumTitles\": [\n        \"Any time\",\n        \"Last 24 hours\",\n        \"Last 3 days\",\n        \"Last 7 days\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"employmentTypes\": {\n      \"title\": \"Employment type\",\n      \"type\": \"array\",\n      \"description\": \"Full-time, part-time, internship/trainee or temporary work. Leave empty for any. Ignored in mode=brigady.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"full\",\n          \"part\",\n          \"internships\",\n          \"temporary\"\n        ],\n        \"enumTitles\": [\n          \"Full-time\",\n          \"Part-time\",\n          \"Internships / trainee programs\",\n          \"Temporary / seasonal\"\n        ]\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"contractTypes\": {\n      \"title\": \"Contract type\",\n      \"type\": \"array\",\n      \"description\": \"Type of legal working relationship. Leave empty for any. Ignored in mode=brigady.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"employment_contract\",\n          \"identification_number\",\n          \"agreement\"\n        ],\n        \"enumTitles\": [\n          \"Employment contract (HPP/VPP)\",\n          \"Trade license (freelance)\",\n          \"Agreement (DPP/DPČ)\"\n        ]\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"education\": {\n      \"title\": \"Minimum education\",\n      \"type\": \"string\",\n      \"description\": \"Required education level. Ignored in mode=brigady.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"primary\",\n        \"high\",\n        \"uni\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"No high-school diploma required\",\n        \"High-school diploma (maturita)\",\n        \"University degree\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"languageSkills\": {\n      \"title\": \"Required language skills\",\n      \"type\": \"array\",\n      \"description\": \"Only return jobs requiring these languages. Leave empty for any. Ignored in mode=brigady.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"cs\",\n          \"en\",\n          \"de\",\n          \"fr\",\n          \"ru\",\n          \"pl\",\n          \"it\",\n          \"es\"\n        ],\n        \"enumTitles\": [\n          \"Czech only\",\n          \"English\",\n          \"German\",\n          \"French\",\n          \"Russian\",\n          \"Polish\",\n          \"Italian\",\n          \"Spanish\"\n        ]\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"homeOffice\": {\n      \"title\": \"Home office / arrangement\",\n      \"type\": \"string\",\n      \"description\": \"Remote-work arrangement. `Flexible hours` is only available on legacy jobs.cz pages, so selecting it switches the run to those pages. Ignored in mode=brigady.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"partial-work-from-home\",\n        \"work-mostly-from-home\",\n        \"flexible-hours\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"Occasional home office possible\",\n        \"Mostly remote\",\n        \"Flexible hours\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"suitableFor\": {\n      \"title\": \"Suitable for\",\n      \"type\": \"string\",\n      \"description\": \"Only return jobs explicitly marked suitable for this group. Ignored in mode=brigady.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"graduates\",\n        \"students\",\n        \"retired\",\n        \"maternity\",\n        \"disabled\",\n        \"ukraine_refugees\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"Graduates\",\n        \"Students\",\n        \"Retirees\",\n        \"Parental leave\",\n        \"People with disabilities\",\n        \"Refugees from Ukraine\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"employerType\": {\n      \"title\": \"Employer type\",\n      \"type\": \"string\",\n      \"description\": \"Whether the ad was posted by the direct employer or a recruitment agency/NGO. Ignored in mode=brigady.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"direct\",\n        \"agency\",\n        \"ngo\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"Direct employer\",\n        \"Recruitment agency\",\n        \"Non-profit organization\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"includeDetails\": {\n      \"title\": \"Include full job details\",\n      \"type\": \"boolean\",\n      \"description\": \"Open each job page for description, structured salary, education, languages, contract, benefits and public contact details. Turn off for faster list-only runs.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"maxItems\": {\n      \"title\": \"Max items\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on emitted records (1-10,000). Above 9,990 the run is split by location or category to pass jobs.cz's per-query ceiling; duplicates are removed.\",\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"default\": 30,\n      \"prefill\": 3\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Czech Jobs.cz Postings, Salary & Brigady Finder\n\nScrape **Jobs.cz** — one of the largest Czech job boards — with one actor. Search by keyword, browse a city/region or profession, browse the separate part-time/temp gig board (**brigády**), or paste jobs.cz search and job URLs. Get salary (including structured ranges that the listing hides), full descriptions, benefits, education, languages, contract type, dates, remote-work type, categories, company logo, Atmoskop profile and public contact details.\n\nThe actor is HTTP-only, anonymous and cookieless. No login, API key, cookie or proxy setup is required.\n\n## What this actor does\n\n- **Five modes**\n  - **Keyword search** — one or more free-text queries, optionally narrowed to a city or profession.\n  - **Browse by region/city** — every open role in a city or region.\n  - **Browse by category/profession** — every open role in a profession.\n  - **Brigády** — jobs.cz's separate board for part-time, temporary, student and seasonal gigs.\n  - **Scrape these URLs** — paste jobs.cz search pages, job detail pages, brigady pages, or employer-branded job pages.\n- **Rich filters** — minimum monthly salary, posted-within window, employment type (full-time, part-time, internship, temporary), contract type, education, required languages, home-office arrangement, suitable-for group, employer type (direct/agency/NGO), minimum hourly rate (brigády), and search radius around a city.\n- **Full detail enrichment** — description (plain text and HTML), structured salary with a hidden-salary flag, employment and contract details, education, languages, categories/professions, benefits, posted/updated/expiry dates, remote type, company logo, Atmoskop review count, and public contact name/phone when the listing shows them.\n- **Large runs** — up to 10,000 records per run. Above 9,990 rows the actor splits a query by location or category and de-duplicates the results.\n- **Omit-empty output** — fields the source does not expose are omitted, never filled with `null` or a placeholder.\n\n## Output per job\n\n| Field | What it contains |\n|---|---|\n| `jobId` | jobs.cz recruitment ID (or ad UUID for URL-only job pages) |\n| `title`, `company`, `location`, `locations[]` | Job title, employer, and city/cities |\n| `url` | Canonical jobs.cz job URL |\n| `salaryText` | Visible salary label (e.g. `\"30 000 – 32 000 Kč/měsíc\"`) |\n| `salaryMinCzk`, `salaryMaxCzk`, `salaryPeriod` | Visible salary bounds and period |\n| `salary` | Structured salary: `minCzk`, `maxCzk`, `currency`, `period`, `visible`, `source` |\n| `description`, `descriptionHtml` | Full job description, plain text and HTML |\n| `detailSource` | `job-page`, `employer-site` or `listing` |\n| `employmentTypes[]` | `full-time`, `part-time`, `internship`, `temporary` |\n| `contractType`, `contractTypeText` | Normalised contract type and the original Czech label |\n| `education`, `educationText` | Normalised education level and the original label |\n| `languages[]` | Required languages as shown on the job page |\n| `categories[]`, `professions[]` | Work areas and profession titles |\n| `benefits[]` | Benefit list when published |\n| `workLocationType` | `on-site`, `partially-remote` or `full-remote` |\n| `suitableFor[]` | `graduates`, `students`, `retired`, `maternity`, `disabled`, `ukraine-refugees`, `entry-level`, `senior` |\n| `postedDate`, `postedAt`, `updatedAt`, `validThrough` | ISO posting/update/expiry dates |\n| `postedDateText`, `badge`, `tags[]` | Legacy listing labels (old-board rows only) |\n| `isPromoted`, `adLanguage` | Promoted-slot flag and ad language (`cs`/`en`) |\n| `companyLogoUrl` | Employer logo URL |\n| `atmoskopRating`, `atmoskopUrl`, `atmoskopReviewCount` | Atmoskop employer-review data |\n| `contactName`, `contactPhone` | Public contact shown on the listing (never email) |\n| `searchQuery`, `searchLocation`, `searchUrl` | Traceability for the query that produced the row |\n| `recordType`, `scrapedAt` | `\"job\"` and the scrape timestamp |\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select | `search` | `search` / `byLocation` / `byCategory` / `brigady` / `byUrls` |\n| `searchQueries` | string array | `[]` (Console prefill `[\"python\"]`) | One or more keywords (mode=search). The legacy `searchQuery` key is still accepted. |\n| `startUrls` | string array | – | jobs.cz search/job/brigady/employer URLs (mode=byUrls) |\n| `location` | select | none | Curated city/region |\n| `locationSlugCustom` | string | – | Custom jobs.cz city slug |\n| `category` | select | none | Curated profession/category |\n| `categorySlugCustom` | string | – | Custom jobs.cz profession slug |\n| `salaryMinCzk` | integer | `0` | Minimum gross monthly salary (0–200,000 Kč) |\n| `hourlyRateMin` | select | `any` | Minimum hourly rate for brigády |\n| `radiusKm` | select | jobs.cz default | 0–50 km around a location (legacy pages) |\n| `datePosted` | select | `any` | `any` / `24h` / `3d` / `7d` |\n| `employmentTypes` | array | – | `full`, `part`, `internships`, `temporary` |\n| `contractTypes` | array | – | `employment_contract`, `identification_number`, `agreement` |\n| `education` | select | `any` | `any` / `primary` / `high` / `uni` |\n| `languageSkills` | array | – | `cs`, `en`, `de`, `fr`, `ru`, `pl`, `it`, `es` |\n| `homeOffice` | select | `any` | `partial-work-from-home`, `work-mostly-from-home`, `flexible-hours` |\n| `suitableFor` | select | `any` | `graduates`, `students`, `retired`, `maternity`, `disabled`, `ukraine_refugees` |\n| `employerType` | select | `any` | `direct`, `agency`, `ngo` |\n| `includeDetails` | boolean | `true` | Open each job page for full details; off = faster list-only run |\n| `maxItems` | integer | `30` (prefill 3) | Hard cap, 1–10,000 |\n\n### Example: keyword search in a city, with full details\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"python\", \"data engineer\"],\n  \"location\": \"praha\",\n  \"datePosted\": \"7d\",\n  \"includeDetails\": true,\n  \"maxItems\": 100\n}\n```\n\n### Example: browse a profession with a salary floor\n\n```json\n{\n  \"mode\": \"byCategory\",\n  \"category\": \"programator\",\n  \"salaryMinCzk\": 60000,\n  \"employmentTypes\": [\"full\"],\n  \"maxItems\": 250\n}\n```\n\n### Example: part-time gigs in Brno\n\n```json\n{\n  \"mode\": \"brigady\",\n  \"location\": \"brno\",\n  \"hourlyRateMin\": \"200\",\n  \"datePosted\": \"7d\",\n  \"maxItems\": 50\n}\n```\n\n### Example: scrape specific job and search URLs\n\n```json\n{\n  \"mode\": \"byUrls\",\n  \"startUrls\": [\n    \"https://www.jobs.cz/rpd/2001506751/\",\n    \"https://beta.jobs.cz/prace/praha/?keywords%5B%5D=ucetni\",\n    \"https://csg.jobs.cz/detail-pozice?r=detail&id=1634646597\"\n  ],\n  \"maxItems\": 100\n}\n```\n\n### Example: large list-only run\n\n```json\n{\n  \"mode\": \"byLocation\",\n  \"location\": \"praha\",\n  \"includeDetails\": false,\n  \"maxItems\": 10000\n}\n```\n\n## Use cases\n\n- **Salary benchmarking** — compare advertised Kč ranges by profession, city or seniority.\n- **Labor-market research** — measure hiring volume by category and region over time.\n- **Recruitment intelligence** — monitor competitors' open roles and posting velocity.\n- **Job aggregators / HR tech** — feed structured Czech listings into a meta-search product.\n- **Relocation and expat services** — surface English-friendly and remote-eligible roles.\n- **Part-time work discovery** — collect brigády shifts by city and hourly rate.\n\n## How it handles the site\n\n- The main board is read from jobs.cz's current search application, which exposes the full result set as structured JSON. The older jobs.cz pages are used for brigády, radius filtering, flexible-hours filtering, and benefit/contact enrichment.\n- If the older pages are blocked from the current network, the actor retries them through a rate-limited public mirror. Requests are paced so a long run does not turn into a burst.\n- Page 333 (9,990 rows) is the current per-query ceiling. Larger requests are split by city or profession and de-duplicated.\n- Each job page is opened only when `includeDetails` is on. After six consecutive detail failures the actor stops enrichment and returns list-level rows rather than failing the run.\n\n## Limitations and notes\n\n- **Hidden salary** — some employers publish a salary range in the job's structured data while the listing says \"Plat neuveden\" (salary not stated). The `salary` object includes it with `\"visible\": false`; the legacy flat salary fields stay visible-only.\n- **External employer pages** — when a jobs.cz ad redirects to an employer's own career site, the actor returns the search-level fields and sets `detailSource: \"employer-site\"`. Many employer sites publish no job description in a machine-readable block, so `description` may be absent.\n- **Benefits and contact** — these come from the public older job page. A listing that does not show them, or a page that is temporarily unavailable, simply omits those fields. Very large detailed runs are capped at 1,000 job-page enrichments, and benefits/contact at 200 older pages, so a 10,000-row run cannot time out; later rows keep every list-level field. Use `includeDetails: false` for maximum speed.\n- **Beta job links** — a pasted `beta.jobs.cz/nabidka/<uuid>/` URL returns the beta detail fields (description, salary, dates, contract, education, languages) but not the older-page benefits/contact block, because that block is keyed by numeric jobs.cz ID. Use a numeric `www.jobs.cz/rpd/<id>/` URL when you need those two fields.\n- **Radius and flexible hours** — these two filters are not supported by the current search application, so runs that use them switch to the older jobs.cz pages. If those pages are unreachable, the run reports it in the status message.\n- **Search-plus-category** — the current jobs.cz search supports a keyword together with a city and a category. The older pages do not, so legacy-path runs ignore the keyword when a category is set.\n- **Brigády filters** — the brigády board only supports keyword, city, date and hourly-rate filters. The remaining main-board filters are logged and ignored in that mode.\n- **No GPS coordinates** — jobs.cz does not publish coordinates for these listings, so no fabricated location data is emitted.\n- **Contract duration and change tracking** — jobs.cz publishes contract type but not a reliable contract duration, and there is no public incremental `changeType` field. The actor returns current listings rather than change deltas.\n\n## FAQ\n\n**What is the data source, and how fresh is it?**\nThe actor reads jobs.cz's public search and job pages at request time — there is no cache. It is an independent third-party scraper and is not affiliated with or endorsed by jobs.cz or LMC.\n\n**Do I need a proxy, cookies or an account?**\nNo. The actor is anonymous, cookieless and proxy-free. If a page is blocked from the current network, it retries through a paced public mirror.\n\n**Why do some rows have no salary?**\nMany Czech employers do not disclose pay. `salaryText` and the flat `salaryMinCzk`/`salaryMaxCzk` fields are only filled when the listing shows a figure. The `salary` object can still contain a structured range with `\"visible\": false` when the site publishes it in machine-readable data but hides it on the page.\n\n**Why is `description` missing on some rows?**\nDescriptions are available for jobs hosted on jobs.cz. When an ad redirects to an employer's own career site, the actor sets `detailSource: \"employer-site\"` and returns the fields the search page exposes. It does not invent a description.\n\n**What does `includeDetails` change?**\nWith `true` (default), the actor opens each job page for description, structured salary, contract, education, languages, benefits and public contact. With `false`, it returns list-level rows only — faster and cheaper for large volume runs or when you only need titles, companies, locations and salaries.\n\n**Can I get more than 10,000 jobs?**\nThe actor caps a run at 10,000. jobs.cz itself serves at most 9,990 rows per query; the actor splits larger requests by city or profession to get past that ceiling. If the source has fewer matching jobs than requested, the status message reports the actual count.\n\n**Why do brigády results ignore some filters?**\njobs.cz's brigády board is a separate product with a smaller filter set: keyword, city, date and minimum hourly rate. Main-board filters such as salary, contract type, education and employer type do not exist there, so the actor logs and ignores them in that mode.\n\n**Can I paste a job URL instead of using a search mode?**\nYes. Use `mode: \"byUrls\"` and add search pages, job detail pages, brigády pages or employer-branded job pages to `startUrls`. Numeric job URLs return the listing plus benefit/contact enrichment; beta UUID links return the beta detail fields and omit the older-page benefit/contact block.\n\n**Why does a keyword search sometimes include a loosely related job?**\njobs.cz's own relevance ranking can surface broad matches for single-word queries. Adding a city, category or a more specific phrase improves precision. Promoted search slots are skipped for keyword searches.\n\n**Are contact details included?**\nOnly the public contact name and phone number that the listing itself displays. The actor does not collect or emit email addresses.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "czech-jobs-cz-postings-salary-and-brigady-finder",
      "title": "Czech Jobs.cz Postings, Salary & Brigady Finder",
      "description": "Search Jobs.cz postings and brigady gigs by keyword, city or profession. Get salary (including hidden ranges), full descriptions, benefits, education, languages, contract, remote type, dates, logo, Atmoskop and contact details.",
      "version": "1.0",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Czech Jobs.cz Postings, Salary & Brigady Finder\n\nScrape **Jobs.cz** — one of the largest Czech job boards — with one actor. Search by keyword, browse a city/region or profession, browse the separate part-time/temp gig board (**brigády**), or paste jobs.cz search and job URLs. Get salary (including structured ranges that the listing hides), full descriptions, benefits, education, languages, contract type, dates, remote-work type, categories, company logo, Atmoskop profile and public contact details.\n\nThe actor is HTTP-only, anonymous and cookieless. No login, API key, cookie or proxy setup is required.\n\n## What this actor does\n\n- **Five modes**\n  - **Keyword search** — one or more free-text queries, optionally narrowed to a city or profession.\n  - **Browse by region/city** — every open role in a city or region.\n  - **Browse by category/profession** — every open role in a profession.\n  - **Brigády** — jobs.cz's separate board for part-time, temporary, student and seasonal gigs.\n  - **Scrape these URLs** — paste jobs.cz search pages, job detail pages, brigady pages, or employer-branded job pages.\n- **Rich filters** — minimum monthly salary, posted-within window, employment type (full-time, part-time, internship, temporary), contract type, education, required languages, home-office arrangement, suitable-for group, employer type (direct/agency/NGO), minimum hourly rate (brigády), and search radius around a city.\n- **Full detail enrichment** — description (plain text and HTML), structured salary with a hidden-salary flag, employment and contract details, education, languages, categories/professions, benefits, posted/updated/expiry dates, remote type, company logo, Atmoskop review count, and public contact name/phone when the listing shows them.\n- **Large runs** — up to 10,000 records per run. Above 9,990 rows the actor splits a query by location or category and de-duplicates the results.\n- **Omit-empty output** — fields the source does not expose are omitted, never filled with `null` or a placeholder.\n\n## Output per job\n\n| Field | What it contains |\n|---|---|\n| `jobId` | jobs.cz recruitment ID (or ad UUID for URL-only job pages) |\n| `title`, `company`, `location`, `locations[]` | Job title, employer, and city/cities |\n| `url` | Canonical jobs.cz job URL |\n| `salaryText` | Visible salary label (e.g. `\"30 000 – 32 000 Kč/měsíc\"`) |\n| `salaryMinCzk`, `salaryMaxCzk`, `salaryPeriod` | Visible salary bounds and period |\n| `salary` | Structured salary: `minCzk`, `maxCzk`, `currency`, `period`, `visible`, `source` |\n| `description`, `descriptionHtml` | Full job description, plain text and HTML |\n| `detailSource` | `job-page`, `employer-site` or `listing` |\n| `employmentTypes[]` | `full-time`, `part-time`, `internship`, `temporary` |\n| `contractType`, `contractTypeText` | Normalised contract type and the original Czech label |\n| `education`, `educationText` | Normalised education level and the original label |\n| `languages[]` | Required languages as shown on the job page |\n| `categories[]`, `professions[]` | Work areas and profession titles |\n| `benefits[]` | Benefit list when published |\n| `workLocationType` | `on-site`, `partially-remote` or `full-remote` |\n| `suitableFor[]` | `graduates`, `students`, `retired`, `maternity`, `disabled`, `ukraine-refugees`, `entry-level`, `senior` |\n| `postedDate`, `postedAt`, `updatedAt`, `validThrough` | ISO posting/update/expiry dates |\n| `postedDateText`, `badge`, `tags[]` | Legacy listing labels (old-board rows only) |\n| `isPromoted`, `adLanguage` | Promoted-slot flag and ad language (`cs`/`en`) |\n| `companyLogoUrl` | Employer logo URL |\n| `atmoskopRating`, `atmoskopUrl`, `atmoskopReviewCount` | Atmoskop employer-review data |\n| `contactName`, `contactPhone` | Public contact shown on the listing (never email) |\n| `searchQuery`, `searchLocation`, `searchUrl` | Traceability for the query that produced the row |\n| `recordType`, `scrapedAt` | `\"job\"` and the scrape timestamp |\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select | `search` | `search` / `byLocation` / `byCategory` / `brigady` / `byUrls` |\n| `searchQueries` | string array | `[]` (Console prefill `[\"python\"]`) | One or more keywords (mode=search). The legacy `searchQuery` key is still accepted. |\n| `startUrls` | string array | – | jobs.cz search/job/brigady/employer URLs (mode=byUrls) |\n| `location` | select | none | Curated city/region |\n| `locationSlugCustom` | string | – | Custom jobs.cz city slug |\n| `category` | select | none | Curated profession/category |\n| `categorySlugCustom` | string | – | Custom jobs.cz profession slug |\n| `salaryMinCzk` | integer | `0` | Minimum gross monthly salary (0–200,000 Kč) |\n| `hourlyRateMin` | select | `any` | Minimum hourly rate for brigády |\n| `radiusKm` | select | jobs.cz default | 0–50 km around a location (legacy pages) |\n| `datePosted` | select | `any` | `any` / `24h` / `3d` / `7d` |\n| `employmentTypes` | array | – | `full`, `part`, `internships`, `temporary` |\n| `contractTypes` | array | – | `employment_contract`, `identification_number`, `agreement` |\n| `education` | select | `any` | `any` / `primary` / `high` / `uni` |\n| `languageSkills` | array | – | `cs`, `en`, `de`, `fr`, `ru`, `pl`, `it`, `es` |\n| `homeOffice` | select | `any` | `partial-work-from-home`, `work-mostly-from-home`, `flexible-hours` |\n| `suitableFor` | select | `any` | `graduates`, `students`, `retired`, `maternity`, `disabled`, `ukraine_refugees` |\n| `employerType` | select | `any` | `direct`, `agency`, `ngo` |\n| `includeDetails` | boolean | `true` | Open each job page for full details; off = faster list-only run |\n| `maxItems` | integer | `30` (prefill 3) | Hard cap, 1–10,000 |\n\n### Example: keyword search in a city, with full details\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"python\", \"data engineer\"],\n  \"location\": \"praha\",\n  \"datePosted\": \"7d\",\n  \"includeDetails\": true,\n  \"maxItems\": 100\n}\n```\n\n### Example: browse a profession with a salary floor\n\n```json\n{\n  \"mode\": \"byCategory\",\n  \"category\": \"programator\",\n  \"salaryMinCzk\": 60000,\n  \"employmentTypes\": [\"full\"],\n  \"maxItems\": 250\n}\n```\n\n### Example: part-time gigs in Brno\n\n```json\n{\n  \"mode\": \"brigady\",\n  \"location\": \"brno\",\n  \"hourlyRateMin\": \"200\",\n  \"datePosted\": \"7d\",\n  \"maxItems\": 50\n}\n```\n\n### Example: scrape specific job and search URLs\n\n```json\n{\n  \"mode\": \"byUrls\",\n  \"startUrls\": [\n    \"https://www.jobs.cz/rpd/2001506751/\",\n    \"https://beta.jobs.cz/prace/praha/?keywords%5B%5D=ucetni\",\n    \"https://csg.jobs.cz/detail-pozice?r=detail&id=1634646597\"\n  ],\n  \"maxItems\": 100\n}\n```\n\n### Example: large list-only run\n\n```json\n{\n  \"mode\": \"byLocation\",\n  \"location\": \"praha\",\n  \"includeDetails\": false,\n  \"maxItems\": 10000\n}\n```\n\n## Use cases\n\n- **Salary benchmarking** — compare advertised Kč ranges by profession, city or seniority.\n- **Labor-market research** — measure hiring volume by category and region over time.\n- **Recruitment intelligence** — monitor competitors' open roles and posting velocity.\n- **Job aggregators / HR tech** — feed structured Czech listings into a meta-search product.\n- **Relocation and expat services** — surface English-friendly and remote-eligible roles.\n- **Part-time work discovery** — collect brigády shifts by city and hourly rate.\n\n## How it handles the site\n\n- The main board is read from jobs.cz's current search application, which exposes the full result set as structured JSON. The older jobs.cz pages are used for brigády, radius filtering, flexible-hours filtering, and benefit/contact enrichment.\n- If the older pages are blocked from the current network, the actor retries them through a rate-limited public mirror. Requests are paced so a long run does not turn into a burst.\n- Page 333 (9,990 rows) is the current per-query ceiling. Larger requests are split by city or profession and de-duplicated.\n- Each job page is opened only when `includeDetails` is on. After six consecutive detail failures the actor stops enrichment and returns list-level rows rather than failing the run.\n\n## Limitations and notes\n\n- **Hidden salary** — some employers publish a salary range in the job's structured data while the listing says \"Plat neuveden\" (salary not stated). The `salary` object includes it with `\"visible\": false`; the legacy flat salary fields stay visible-only.\n- **External employer pages** — when a jobs.cz ad redirects to an employer's own career site, the actor returns the search-level fields and sets `detailSource: \"employer-site\"`. Many employer sites publish no job description in a machine-readable block, so `description` may be absent.\n- **Benefits and contact** — these come from the public older job page. A listing that does not show them, or a page that is temporarily unavailable, simply omits those fields. Very large detailed runs are capped at 1,000 job-page enrichments, and benefits/contact at 200 older pages, so a 10,000-row run cannot time out; later rows keep every list-level field. Use `includeDetails: false` for maximum speed.\n- **Beta job links** — a pasted `beta.jobs.cz/nabidka/<uuid>/` URL returns the beta detail fields (description, salary, dates, contract, education, languages) but not the older-page benefits/contact block, because that block is keyed by numeric jobs.cz ID. Use a numeric `www.jobs.cz/rpd/<id>/` URL when you need those two fields.\n- **Radius and flexible hours** — these two filters are not supported by the current search application, so runs that use them switch to the older jobs.cz pages. If those pages are unreachable, the run reports it in the status message.\n- **Search-plus-category** — the current jobs.cz search supports a keyword together with a city and a category. The older pages do not, so legacy-path runs ignore the keyword when a category is set.\n- **Brigády filters** — the brigády board only supports keyword, city, date and hourly-rate filters. The remaining main-board filters are logged and ignored in that mode.\n- **No GPS coordinates** — jobs.cz does not publish coordinates for these listings, so no fabricated location data is emitted.\n- **Contract duration and change tracking** — jobs.cz publishes contract type but not a reliable contract duration, and there is no public incremental `changeType` field. The actor returns current listings rather than change deltas.\n\n## FAQ\n\n**What is the data source, and how fresh is it?**\nThe actor reads jobs.cz's public search and job pages at request time — there is no cache. It is an independent third-party scraper and is not affiliated with or endorsed by jobs.cz or LMC.\n\n**Do I need a proxy, cookies or an account?**\nNo. The actor is anonymous, cookieless and proxy-free. If a page is blocked from the current network, it retries through a paced public mirror.\n\n**Why do some rows have no salary?**\nMany Czech employers do not disclose pay. `salaryText` and the flat `salaryMinCzk`/`salaryMaxCzk` fields are only filled when the listing shows a figure. The `salary` object can still contain a structured range with `\"visible\": false` when the site publishes it in machine-readable data but hides it on the page.\n\n**Why is `description` missing on some rows?**\nDescriptions are available for jobs hosted on jobs.cz. When an ad redirects to an employer's own career site, the actor sets `detailSource: \"employer-site\"` and returns the fields the search page exposes. It does not invent a description.\n\n**What does `includeDetails` change?**\nWith `true` (default), the actor opens each job page for description, structured salary, contract, education, languages, benefits and public contact. With `false`, it returns list-level rows only — faster and cheaper for large volume runs or when you only need titles, companies, locations and salaries.\n\n**Can I get more than 10,000 jobs?**\nThe actor caps a run at 10,000. jobs.cz itself serves at most 9,990 rows per query; the actor splits larger requests by city or profession to get past that ceiling. If the source has fewer matching jobs than requested, the status message reports the actual count.\n\n**Why do brigády results ignore some filters?**\njobs.cz's brigády board is a separate product with a smaller filter set: keyword, city, date and minimum hourly rate. Main-board filters such as salary, contract type, education and employer type do not exist there, so the actor logs and ignores them in that mode.\n\n**Can I paste a job URL instead of using a search mode?**\nYes. Use `mode: \"byUrls\"` and add search pages, job detail pages, brigády pages or employer-branded job pages to `startUrls`. Numeric job URLs return the listing plus benefit/contact enrichment; beta UUID links return the beta detail fields and omit the older-page benefit/contact block.\n\n**Why does a keyword search sometimes include a loosely related job?**\njobs.cz's own relevance ranking can surface broad matches for single-word queries. Adding a city, category or a more specific phrase improves precision. Promoted search slots are skipped for keyword searches.\n\n**Are contact details included?**\nOnly the public contact name and phone number that the listing itself displays. The actor does not collect or emit email addresses.\n",
      "input": {
        "title": "Jobs.cz Scraper Input",
        "description": "Search jobs.cz by keyword, browse a city/region or profession, browse part-time brigady gigs, or scrape pasted URLs. Add salary, date, contract, education, language, remote-work and employer filters.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to fetch. Search by keyword, browse a city/region, browse a profession, browse the separate part-time brigady board, or scrape specific jobs.cz search and job URLs.",
            "editor": "select",
            "enum": [
              "search",
              "byLocation",
              "byCategory",
              "brigady",
              "byUrls"
            ],
            "enumTitles": [
              "Keyword search",
              "Browse by region/city",
              "Browse by category/profession",
              "Part-time / temp gigs (brigády)",
              "Scrape these URLs"
            ],
            "default": "search",
            "prefill": "search"
          },
          "searchQueries": {
            "title": "Search keywords (mode=search)",
            "type": "array",
            "description": "One or more free-text keywords, e.g. `python`, `účetní`, `řidič`. Each query is paginated and results are de-duplicated. The old `searchQuery` key is still accepted for saved tasks.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": [
              "python"
            ]
          },
          "startUrls": {
            "title": "Start URLs (mode=byUrls)",
            "type": "array",
            "description": "jobs.cz search pages, job detail pages, brigady pages, or employer-branded job URLs. Job URLs return full detail when the page publishes it; employer pages return title, company and URL.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [],
            "prefill": []
          },
          "location": {
            "title": "Region/city",
            "type": "string",
            "description": "Curated city/region. Required for mode=byLocation; narrows keyword and category searches; limits brigady to a 10-50 km radius. Pick `(none)` for no restriction.",
            "editor": "select",
            "enum": [
              "",
              "praha",
              "brno",
              "ostrava",
              "plzen",
              "liberec",
              "olomouc",
              "ceske-budejovice",
              "hradec-kralove",
              "pardubice",
              "zlin",
              "karlovy-vary",
              "jihlava",
              "usti-nad-labem",
              "kladno",
              "most",
              "opava",
              "frydek-mistek",
              "decin",
              "teplice",
              "karvina",
              "chomutov",
              "jablonec-nad-nisou",
              "mlada-boleslav",
              "prostejov",
              "prerov",
              "ceska-lipa",
              "trebic",
              "tabor",
              "znojmo",
              "kolin"
            ],
            "enumTitles": [
              "(none)",
              "Praha",
              "Brno",
              "Ostrava",
              "Plzeň",
              "Liberec",
              "Olomouc",
              "České Budějovice",
              "Hradec Králové",
              "Pardubice",
              "Zlín",
              "Karlovy Vary",
              "Jihlava",
              "Ústí nad Labem",
              "Kladno",
              "Most",
              "Opava",
              "Frýdek-Místek",
              "Děčín",
              "Teplice",
              "Karviná",
              "Chomutov",
              "Jablonec nad Nisou",
              "Mladá Boleslav",
              "Prostějov",
              "Přerov",
              "Česká Lípa",
              "Třebíč",
              "Tábor",
              "Znojmo",
              "Kolín"
            ],
            "default": "",
            "prefill": ""
          },
          "locationSlugCustom": {
            "title": "Custom region/city slug (advanced)",
            "type": "string",
            "description": "jobs.cz URL slug for a city not in the dropdown, e.g. `vsetin` or `havirov`. Overrides `location`. Use lowercase, no diacritics, hyphens for spaces. Not supported in mode=brigady.",
            "editor": "textfield"
          },
          "category": {
            "title": "Category/profession",
            "type": "string",
            "description": "Curated profession/category. Required for mode=byCategory; narrows a city browse. Pick `(none)` for no restriction. Not applied in mode=brigady.",
            "editor": "select",
            "enum": [
              "",
              "programator",
              "tester",
              "webdesigner",
              "grafik",
              "designer",
              "copywriter",
              "marketing",
              "obchodni-zastupce",
              "personalista",
              "hr-specialista",
              "ucetni",
              "pravnik",
              "reditel",
              "technik",
              "mechanik",
              "elektrikar",
              "svarec",
              "operator-vyroby",
              "skladnik",
              "ridic",
              "kuchar",
              "recepcni",
              "prodavac",
              "administrativa",
              "zdravotni-sestra"
            ],
            "enumTitles": [
              "(none)",
              "Programátor / Developer",
              "Tester",
              "Webdesignér",
              "Grafik",
              "Designér",
              "Copywriter",
              "Marketing",
              "Obchodní zástupce",
              "Personalista",
              "HR specialista",
              "Účetní",
              "Právník",
              "Ředitel",
              "Technik",
              "Mechanik",
              "Elektrikář",
              "Svářeč",
              "Operátor výroby",
              "Skladník",
              "Řidič",
              "Kuchař",
              "Recepční",
              "Prodavač",
              "Administrativa",
              "Zdravotní sestra"
            ],
            "default": "",
            "prefill": ""
          },
          "categorySlugCustom": {
            "title": "Custom category slug (advanced)",
            "type": "string",
            "description": "jobs.cz URL slug for a profession not in the dropdown, e.g. `architekt` or `ucitel`. Overrides `category`. Use the slug exactly as jobs.cz shows it. Not applied in mode=brigady.",
            "editor": "textfield"
          },
          "salaryMinCzk": {
            "title": "Minimum monthly salary (Kč)",
            "type": "integer",
            "description": "Only return main-board jobs at or above this gross monthly salary in Czech crowns. jobs.cz filters on each ad's internal salary data, so non-disclosing ads are not excluded and can still match. Ignored in mode=brigady.",
            "minimum": 0,
            "maximum": 200000,
            "default": 0,
            "prefill": 0
          },
          "hourlyRateMin": {
            "title": "Minimum hourly rate (Kč/h; brigady only)",
            "type": "string",
            "description": "Only return brigady gigs at or above this hourly rate. jobs.cz offers exactly these five fixed thresholds. Ignored in every other mode; use `salaryMinCzk` there.",
            "editor": "select",
            "enum": [
              "any",
              "100",
              "200",
              "300",
              "400",
              "500"
            ],
            "enumTitles": [
              "Any",
              "From 100 Kč/h",
              "From 200 Kč/h",
              "From 300 Kč/h",
              "From 400 Kč/h",
              "From 500 Kč/h"
            ],
            "default": "any",
            "prefill": "any"
          },
          "radiusKm": {
            "title": "Search radius around location (km)",
            "type": "string",
            "description": "Widen or narrow the distance match around a location. Has no effect without a location. The current jobs.cz search app ignores radius, so these runs use the legacy jobs.cz pages.",
            "editor": "select",
            "enum": [
              "",
              "0",
              "10",
              "20",
              "30",
              "40",
              "50"
            ],
            "enumTitles": [
              "(jobs.cz default)",
              "0 km (city only)",
              "10 km",
              "20 km",
              "30 km",
              "40 km",
              "50 km"
            ],
            "default": "",
            "prefill": ""
          },
          "datePosted": {
            "title": "Posted within",
            "type": "string",
            "description": "Restrict results to jobs posted or updated within this window. Works in every mode, including brigady.",
            "editor": "select",
            "enum": [
              "any",
              "24h",
              "3d",
              "7d"
            ],
            "enumTitles": [
              "Any time",
              "Last 24 hours",
              "Last 3 days",
              "Last 7 days"
            ],
            "default": "any",
            "prefill": "any"
          },
          "employmentTypes": {
            "title": "Employment type",
            "type": "array",
            "description": "Full-time, part-time, internship/trainee or temporary work. Leave empty for any. Ignored in mode=brigady.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "full",
                "part",
                "internships",
                "temporary"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Internships / trainee programs",
                "Temporary / seasonal"
              ]
            },
            "default": [],
            "prefill": []
          },
          "contractTypes": {
            "title": "Contract type",
            "type": "array",
            "description": "Type of legal working relationship. Leave empty for any. Ignored in mode=brigady.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "employment_contract",
                "identification_number",
                "agreement"
              ],
              "enumTitles": [
                "Employment contract (HPP/VPP)",
                "Trade license (freelance)",
                "Agreement (DPP/DPČ)"
              ]
            },
            "default": [],
            "prefill": []
          },
          "education": {
            "title": "Minimum education",
            "type": "string",
            "description": "Required education level. Ignored in mode=brigady.",
            "editor": "select",
            "enum": [
              "any",
              "primary",
              "high",
              "uni"
            ],
            "enumTitles": [
              "Any",
              "No high-school diploma required",
              "High-school diploma (maturita)",
              "University degree"
            ],
            "default": "any",
            "prefill": "any"
          },
          "languageSkills": {
            "title": "Required language skills",
            "type": "array",
            "description": "Only return jobs requiring these languages. Leave empty for any. Ignored in mode=brigady.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "cs",
                "en",
                "de",
                "fr",
                "ru",
                "pl",
                "it",
                "es"
              ],
              "enumTitles": [
                "Czech only",
                "English",
                "German",
                "French",
                "Russian",
                "Polish",
                "Italian",
                "Spanish"
              ]
            },
            "default": [],
            "prefill": []
          },
          "homeOffice": {
            "title": "Home office / arrangement",
            "type": "string",
            "description": "Remote-work arrangement. `Flexible hours` is only available on legacy jobs.cz pages, so selecting it switches the run to those pages. Ignored in mode=brigady.",
            "editor": "select",
            "enum": [
              "any",
              "partial-work-from-home",
              "work-mostly-from-home",
              "flexible-hours"
            ],
            "enumTitles": [
              "Any",
              "Occasional home office possible",
              "Mostly remote",
              "Flexible hours"
            ],
            "default": "any",
            "prefill": "any"
          },
          "suitableFor": {
            "title": "Suitable for",
            "type": "string",
            "description": "Only return jobs explicitly marked suitable for this group. Ignored in mode=brigady.",
            "editor": "select",
            "enum": [
              "any",
              "graduates",
              "students",
              "retired",
              "maternity",
              "disabled",
              "ukraine_refugees"
            ],
            "enumTitles": [
              "Any",
              "Graduates",
              "Students",
              "Retirees",
              "Parental leave",
              "People with disabilities",
              "Refugees from Ukraine"
            ],
            "default": "any",
            "prefill": "any"
          },
          "employerType": {
            "title": "Employer type",
            "type": "string",
            "description": "Whether the ad was posted by the direct employer or a recruitment agency/NGO. Ignored in mode=brigady.",
            "editor": "select",
            "enum": [
              "any",
              "direct",
              "agency",
              "ngo"
            ],
            "enumTitles": [
              "Any",
              "Direct employer",
              "Recruitment agency",
              "Non-profit organization"
            ],
            "default": "any",
            "prefill": "any"
          },
          "includeDetails": {
            "title": "Include full job details",
            "type": "boolean",
            "description": "Open each job page for description, structured salary, education, languages, contract, benefits and public contact details. Turn off for faster list-only runs.",
            "default": true,
            "prefill": true
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "Hard cap on emitted records (1-10,000). Above 9,990 the run is split by location or category to pass jobs.cz's per-query ceiling; duplicates are removed.",
            "minimum": 1,
            "maximum": 10000,
            "default": 30,
            "prefill": 3
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Czech Jobs.cz Postings, Salary & Brigady Finder Output",
        "description": "Jobs.cz listings with salary (visible and hidden structured ranges), descriptions, benefits, education, languages, contract, dates, remote type, categories, logo, Atmoskop and public contact details.",
        "properties": {
          "jobs": {
            "type": "string",
            "title": "Jobs.cz job listings",
            "description": "Dataset containing all scraped Jobs.cz job and brigady listings.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Jobs",
              "transformation": {
                "fields": [
                  "title",
                  "company",
                  "location",
                  "salaryText",
                  "employmentTypes",
                  "postedDate",
                  "url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            },
            "details": {
              "title": "Full details",
              "transformation": {
                "fields": [
                  "title",
                  "company",
                  "location",
                  "salary",
                  "employmentTypes",
                  "contractType",
                  "education",
                  "languages",
                  "workLocationType",
                  "postedDate",
                  "validThrough",
                  "description",
                  "url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.0.2",
    "imageDigest": "df9408e579f1b0852c96a8b36cd95c0698420ca4b4254f4f53238a9b86151b0a",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.0038588888888888887
    }
  }
}