# DCZ.gov.ua Scraper: Ukraine Government Jobs & Vacancies (`santamaria-automations/dcz-gov-ua-scraper`) Actor

Scrape official job listings from dcz.gov.ua, Ukraine's State Employment Service. Returns vacancy title, employer, oblast, city, salary in UAH, employment type, industry, veteran/IDP flags, and job URL. Covers 230,000+ active vacancies across all Ukrainian oblasts.

- **URL**: https://apify.com/santamaria-automations/dcz-gov-ua-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## DCZ.gov.ua Scraper: Ukraine Government Jobs & Vacancies

Collect official job listings from [dcz.gov.ua](https://dcz.gov.ua), the web portal of Ukraine's State Employment Service (Державна служба зайнятості України). Every employer operating in Ukraine is required to register vacancies with the State Employment Service before filling them, making DCZ the most authoritative and complete source of official open positions in the country. The portal lists 230,000+ active vacancies registered by employers across all 25 Ukrainian oblasts and Kyiv city.

### Important: Angular SPA — no permanent job URLs

dcz.gov.ua is built on Angular and runs as a single-page application. Every URL on the domain — including `/job/single/{vacid}` — serves the identical Angular shell (102 KB HTML, zero vacancy-specific content). There are no server-rendered job detail pages, no hash routes, and no query-parameter deep links.

As a result, `job_url` and `source_url` both point to `https://www.dcz.gov.ua/job` (the job search page) for every listing. Use the unique `vac_id` field to identify and cross-reference a specific vacancy on the portal.

### What you get

Each result contains:

- **Vacancy**: title in Ukrainian, DCZ vacancy reference code (`vac_id`), and `job_url` pointing to the DCZ job search page (see note above)
- **Employer**: registered company or institution name as entered in the DCZ system
- **Location**: city, oblast (region), KATOTTG administrative code (`city_id`), country code UA
- **Compensation**: salary in UAH (Ukrainian hryvnia), period "на місяць" (monthly); both a normalized numeric `salary_min` and the raw `salary_raw` string as returned by the API
- **Employment details**: normalized `employment_type` (Full-time / Part-time / Temporary / Remote / Full-time (shift) / Full-time (rotational)) plus `employment_type_raw` preserving the original Ukrainian compound value (e.g. `повна, позмінна`, `повна, вахтова`); industry branch with numeric `branch_id`
- **Office phones**: `office_phones` — DCZ employment centre phone numbers extracted from the description. Application is made by calling these numbers; the portal has no online application form.
- **Special flags**: `is_disability_accessible` (listing accessible for people with disabilities), `is_veteran_priority` (veteran-priority listing), `is_idp` (internally displaced persons / VPO listing), `is_housing_provided`
- **Registration date**: when the vacancy was registered with the State Employment Service
- **Description**: plain-text job description extracted from the DCZ posting (HTML stripped)

### How to apply for DCZ vacancies

DCZ.gov.ua does not provide an online application form. The standard application workflow is:

1. Note the vacancy number (`vac_id`) from the result
2. Call the DCZ employment centre phone number listed in `office_phones`
3. Reference the vacancy number when speaking to the centre agent

Every DCZ description follows the template: "Якщо Вас зацікавила дана вакансія, зверніться до Центру зайнятості, що її зареєстрував, вказавши номер вакансії. Телефон для отримання додаткової інформації: +380XXXXXXXXX"

### Use cases

- Ukraine labor market research: identify which sectors and oblasts have the most open positions
- Salary benchmarking: compare UAH salary levels across occupations, industries, and regions
- Wartime employment monitoring: track vacancies tagged for veterans (учасники бойових дій) and internally displaced persons (ВПО), plus disability-accessible listings
- Government procurement intelligence: identify which state institutions and state-owned enterprises are actively hiring
- HR analytics: cross-reference DCZ postings with private job boards to measure formal vs. informal labor market
- Academic research: analyze Ukraine's official labor market using the government's own registry
- JobFeed aggregation: source for the nanoscrape job-feed service covering the UA market

### Pricing

This actor uses Pay-Per-Event (PPE) pricing:

| Event | Cost |
|---|---|
| Actor start | $0.001 |
| Job result (SERP mode) | $0.003 |
| Full job detail | $0.005 |

**$5 free monthly credit** is included with every Apify account: enough for roughly 1,600 standard job results per month.

Enable `includeJobDetails: true` to charge the detail-result event rate and surface the full description and contact fields. The DCZ API returns all fields in a single request regardless, so there is no extra HTTP cost.

### Input

```json
{
  "searchQueries": ["програміст", "водій", "лікар"],
  "location": "Київ",
  "maxResults": 100,
  "maxResultsPerQuery": 50,
  "includeJobDetails": true
}
```

| Field | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | string\[] | | Job title keywords in Ukrainian. Examples: `програміст` (programmer), `водій` (driver), `лікар` (doctor), `вчитель` (teacher), `бухгалтер` (accountant), `медсестра` (nurse). Leave empty to retrieve all open vacancies. |
| `startUrls` | string\[] | | Direct DCZ job page URLs. Example: `https://www.dcz.gov.ua/job/single/05252608200011` (vacid is extracted and used for API lookup; the URL itself is an Angular SPA page with no unique content) |
| `location` | string | | Ukrainian oblast or major city. Examples: `Київ`, `Харківська`, `Львів`, `Одеська`, `Дніпропетровська`. English transliterations accepted: `Kyiv`, `Kharkiv`, `Lviv`, `Odesa`, `Dnipro`. Leave empty for all Ukraine. |
| `branch` | string | | Industry branch filter using DCZ label. Examples: `ІТ`, `медицина`, `освіта`, `будівництво`, `транспорт`. Leave empty for all industries. |
| `workCondition` | string | | Employment type: `повна` (full-time), `неповна` (part-time), `тимчасова` (temporary), `дистанційна` (remote). Leave empty for all types. |
| `minSalary` | integer | 0 | Minimum salary in UAH. 0 = no filter. Ukraine minimum wage 2026 is approximately 8,000 UAH/month. |
| `filterVeteran` | boolean | false | When true, surface only veteran-priority listings. |
| `filterInvalid` | boolean | false | When true, surface only disability-accessible listings (is\_disability\_accessible=true). |
| `includeJobDetails` | boolean | false | Charges `job-detail-result` event instead of `job-serp-result`. Fields are identical since DCZ returns all data in one request. |
| `maxResults` | integer | 5 | Total results cap across all queries. |
| `maxResultsPerQuery` | integer | 5 | Cap per search keyword. |
| `maxConcurrency` | integer | 3 | Parallel requests. Keep at 3-5 to be respectful to the government API. |

### Output sample

```json
{
  "_type": "job",
  "id": "420287049",
  "vac_id": "19012605070026",
  "title": "оператор заправних станцій",
  "job_url": "https://www.dcz.gov.ua/job",
  "source_url": "https://www.dcz.gov.ua/job",
  "source_platform": "dcz.gov.ua",
  "company_name": "ТОВ \"ОККО-ДРАЙВ\"",
  "location": "Гаї-Гречинські, Тернопільська область",
  "country": "UA",
  "region": "Тернопільська область",
  "city": "Гаї-Гречинські",
  "city_id": "UA61040010030080699",
  "posted_at_text": "2026-08-31T21:00:00.000Z",
  "posted_at_datetime": "2026-08-31T21:00:00Z",
  "employment_type": "Full-time (shift)",
  "employment_type_raw": "повна, позмінна",
  "industry": "маркетинг/реклама",
  "branch_id": "20",
  "salary_min": 20000.0,
  "salary_currency": "UAH",
  "salary_period": "month",
  "salary_text": "20000 UAH / на місяць",
  "salary_raw": "20000.00",
  "description": "№ вакансії: 19012605070026 Якщо Вас зацікавила дана вакансія, зверніться до Центру зайнятості...",
  "office_phones": ["+380673132283"],
  "contact_info": null,
  "source": "dcz",
  "is_disability_accessible": false,
  "is_idp": false,
  "is_veteran_priority": false,
  "is_housing_provided": false,
  "search_query": null,
  "scraped_at": "2026-09-01T10:00:00Z"
}
```

### Special flags explained

| Flag | DCZ API field | Meaning |
|---|---|---|
| `is_disability_accessible` | `is_f3pn in {1, 5}` | Vacancy is accessible for people with disabilities. is\_f3pn==1 confirmed via Angular source (isInv flag); is\_f3pn==5 is a disability subvariant surfaced only by filterInvalid. Use `filterInvalid: true` input option to retrieve only these listings. |
| `is_idp` | `is_f3pn == 2` | Vacancy tagged for internally displaced persons (ВПО / тимчасово переміщені особи). |
| `is_veteran_priority` | `badgeveteran == 1` | Employer has flagged this as a priority vacancy for Ukrainian veterans (учасники бойових дій). |
| `is_housing_provided` | `badgehousing == 1` | Employer provides housing for this position. |

Note: `can_apply_online` is not emitted. The API's `canReply` field is `true` for all sampled listings and reflects active-listing status, not the existence of an online apply form. DCZ has no online apply mechanism — use `office_phones` to contact the responsible employment centre.

### Employment type values

| `employment_type` | Ukrainian (`employment_type_raw`) | Notes |
|---|---|---|
| Full-time | повна | Standard 5-day / 40-hour week |
| Full-time (shift) | повна, позмінна | Full-time with rotating shift schedule |
| Full-time (rotational) | повна, вахтова | Rotational/watch schedule (вахтовий метод) |
| Part-time | неповна / Часткова | Reduced hours |
| Temporary | тимчасова | Fixed-term contract |
| Remote | дистанційна | Remote work |

### Region reference

The `location` field accepts Ukrainian oblast names, their English transliterations, or major city names. All 25 Ukrainian oblasts and Kyiv city are supported:

| Ukrainian | English | Code |
|---|---|---|
| Вінницька область | Vinnytsia | UA05 |
| Волинська область | Volyn | UA07 |
| Дніпропетровська область | Dnipropetrovsk / Dnipro | UA12 |
| Донецька область | Donetsk | UA14 |
| Житомирська область | Zhytomyr | UA18 |
| Закарпатська область | Zakarpattia / Transcarpathia | UA21 |
| Запорізька область | Zaporizhzhia | UA23 |
| Івано-Франківська область | Ivano-Frankivsk | UA26 |
| м. Київ | Kyiv (city) | UA80 |
| Київська область | Kyiv oblast | UA32 |
| Кіровоградська область | Kirovohrad | UA35 |
| Луганська область | Luhansk | UA44 |
| Львівська область | Lviv | UA46 |
| Миколаївська область | Mykolaiv | UA48 |
| Одеська область | Odesa | UA51 |
| Полтавська область | Poltava | UA53 |
| Рівненська область | Rivne | UA56 |
| Сумська область | Sumy | UA59 |
| Тернопільська область | Ternopil | UA61 |
| Харківська область | Kharkiv | UA63 |
| Херсонська область | Kherson | UA65 |
| Хмельницька область | Khmelnytskyi | UA68 |
| Черкаська область | Cherkasy | UA71 |
| Чернівецька область | Chernivtsi | UA73 |
| Чернігівська область | Chernihiv | UA74 |

### Related actors

- [job-feed](https://apify.com/nanoscrape/job-feed) - Ukrainian and global job aggregation service
- [career-site-jobs-scraper](https://apify.com/nanoscrape/career-site-jobs-scraper) - Scrape any company career page
- [website-job-extractor](https://apify.com/nanoscrape/website-job-extractor) - Extract jobs from any URL
- [indeed-scraper](https://apify.com/nanoscrape/indeed-scraper) - Indeed.com job listings
- [anofm-ro-scraper](https://apify.com/nanoscrape/anofm-ro-scraper) - Romania's official government job board (ANOFM)
- [trudvsem-ru-scraper](https://apify.com/nanoscrape/trudvsem-ru-scraper) - Russia's official government job board
- [sepe-es-scraper](https://apify.com/nanoscrape/sepe-es-scraper) - Spain's official government job board (SEPE)

### Issues

Found a bug or need a feature? Open an issue on the [Issues tab](../../issues).

# Actor input Schema

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

One or more job title keywords to search on DCZ.gov.ua. Use Ukrainian language for best results. Examples: 'програміст' (programmer), 'водій' (driver), 'лікар' (doctor), 'вчитель' (teacher), 'бухгалтер' (accountant). Leave empty to retrieve all open vacancies.

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

Direct DCZ.gov.ua job page URLs. Example: https://www.dcz.gov.ua/job/single/05252608200011

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

Ukrainian oblast (region) or major city to filter results. Examples: 'Київ', 'Харківська', 'Львів', 'Одеська', 'Дніпропетровська'. English transliterations also accepted: 'Kyiv', 'Kharkiv', 'Lviv', 'Odesa', 'Dnipro'. Leave empty for all of Ukraine.

## `branch` (type: `string`):

Filter by industry sector using Ukrainian DCZ branch label. Examples: 'ІТ', 'медицина', 'освіта', 'будівництво', 'транспорт', 'торгівля', 'державна служба'. Leave empty for all industries.

## `workCondition` (type: `string`):

Filter by employment type using DCZ values: 'повна' (full-time), 'неповна' (part-time), 'тимчасова' (temporary), 'дистанційна' (remote). Leave empty for all types.

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

Only return vacancies with salary at or above this value in Ukrainian hryvnia (UAH). 0 = no filter. Ukraine minimum wage 2026 is approximately 8000 UAH/month.

## `filterVeteran` (type: `boolean`):

When enabled, returns only vacancies flagged as priority for Ukrainian veterans (учасники бойових дій).

## `filterInvalid` (type: `boolean`):

When enabled, returns only vacancies marked as accessible for people with disabilities.

## `includeJobDetails` (type: `boolean`):

The DCZ API returns all available fields in a single request. Enabling this flag charges the higher job-detail-result PPE event rate instead of job-serp-result. Use when you need the description and contact fields.

## `maxResults` (type: `integer`):

Total results cap across all search queries. DCZ has 230,000+ active vacancies.

## `maxResultsPerQuery` (type: `integer`):

Maximum results returned per individual search keyword.

## `maxConcurrency` (type: `integer`):

Maximum parallel requests. Keep at 3-5 to be respectful to the government API.

## Actor input object example

```json
{
  "searchQueries": [
    "програміст"
  ],
  "location": "Київ",
  "branch": "ІТ",
  "workCondition": "",
  "minSalary": 15000,
  "filterVeteran": false,
  "filterInvalid": false,
  "includeJobDetails": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 3
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset containing scraped DCZ.gov.ua job listings. Each row includes vacancy title, employer, Ukrainian oblast, salary in UAH, normalized and raw employment type, industry branch with numeric branch\_id, office\_phones (phone numbers of the responsible DCZ employment centre — extracted from description, normalized to +380XXXXXXXXX), and special program flags (disability-accessible, veteran priority, IDP/VPO listings, housing). v0.2.1 adds: is\_disability\_accessible, employment\_type\_raw, branch\_id, salary\_raw. v0.3.0 adds: office\_phones; removes misleading can\_apply\_online; fixes job\_url/source\_url to point to search page (Angular SPA — no per-vacancy deep links).

# 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 = {
    "searchQueries": [
        "програміст"
    ],
    "filterVeteran": false,
    "filterInvalid": false,
    "includeJobDetails": false,
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/dcz-gov-ua-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 = {
    "searchQueries": ["програміст"],
    "filterVeteran": False,
    "filterInvalid": False,
    "includeJobDetails": False,
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/dcz-gov-ua-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 '{
  "searchQueries": [
    "програміст"
  ],
  "filterVeteran": false,
  "filterInvalid": false,
  "includeJobDetails": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 3
}' |
apify call santamaria-automations/dcz-gov-ua-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/dcz-gov-ua-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/oVeBejdjdCb2ZedGD/builds/8VICPy40F95ZgRLek/openapi.json
