# Work.ua Scraper: Ukraine Jobs, Salaries & Companies (`santamaria-automations/work-ua-scraper`) Actor

Scrape job listings from Work.ua, Ukraine's largest private job board (9M+ monthly visitors). Returns title, company, city, oblast, UAH salary, employment type, remote type, wartime deferment flag, and full description.

- **URL**: https://apify.com/santamaria-automations/work-ua-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs
- **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

## Work.ua Scraper: Ukraine Jobs, Salaries & Companies

Extract job listings from **Work.ua** (work.ua), Ukraine's largest private job board with 9 million monthly visitors and 106,000+ active vacancies. Returns structured data on title, company, city, UAH salary, employment type, remote/hybrid type, wartime deferment flag, experience requirements, accessibility flags, full job description, and company profile details (website, employee count, industry, open positions).

### What you get

Each row in the output dataset includes:

| Field | Source | Description |
|---|---|---|
| `title` | SERP / detail | Job title in Ukrainian or Russian |
| `company_name` | SERP | Hiring company name (correctly separated from salary display) |
| `company_verified` | SERP | true when Work.ua has verified the company identity |
| `company_website` | detail | Company external website URL (e.g. https://bogemia.com/) |
| `company_logo_url` | SERP | Employer logo from Work.ua CDN |
| `company_employee_count` | detail | Headcount range string (e.g. "10-50", "250-1000") |
| `company_industry` | detail | Industry category from company card (e.g. "Оптова торгівля, дистрибуція") |
| `company_profile_url` | detail | Work.ua company page URL (/jobs/by-company/<id>/) |
| `company_about` | company | About-company description text (requires `includeCompanyDetails`) |
| `company_active_jobs_count` | company | Total open positions at this company (requires `includeCompanyDetails`) |
| `company_active_jobs` | company | Array of {title, job\_url, snippet} for open positions (requires `includeCompanyDetails`) |
| `location` | SERP | City (e.g. Київ, Харків, Одеса) |
| `region` | detail | Ukrainian oblast from JSON-LD |
| `salary_min` / `salary_max` | SERP / detail | Numeric salary range |
| `salary_currency` | SERP / detail | Typically UAH, sometimes USD/EUR |
| `salary_text` | SERP | Raw salary string (e.g. "45 000 – 55 000 грн") |
| `salary_above_average` | SERP | true when Work.ua displays "Вища за середню" badge |
| `employment_type` | SERP / detail | Full-time, Part-time, Contract, Internship |
| `remote_type` | SERP / detail | Remote, Hybrid, On-site |
| `experience_years_min` | SERP | Minimum years experience required (e.g. 2) |
| `education_level_required` | SERP | e.g. "Вища освіта", "Базова вища освіта" |
| `wartime_deferment` | SERP | true when employer offers бронювання (military deferment) |
| `is_hot_job` | SERP | true when Work.ua marks the listing as "Гаряча" (hot/urgent) |
| `suitable_for_students` | SERP | true when listing accepts students without experience |
| `suitable_for_disabilities` | SERP | true when listing accepts people with disabilities |
| `suitable_for_pensioners` | SERP | true when listing accepts pensioners |
| `posted_at_datetime` | SERP / detail | ISO date (YYYY-MM-DD) |
| `description_full` | detail | Full plain-text description (with details mode) |
| `description_html` | detail | Full HTML description (scripts/styles stripped) |
| `contact_emails` / `contact_phones` | detail | Extracted contact info |
| `contact_urls` | detail | External URLs found in description |
| `apply_url` | SERP | Direct application URL on Work.ua |

### Why Work.ua

Work.ua is the dominant private job board in Ukraine by traffic and listing volume, covering all sectors and experience levels. Unlike Robota.ua (a separate platform), Work.ua operates independently and caters to both Ukrainian-language and Russian-language job seekers. The platform covers all 24 oblasts plus Kyiv city and is widely used by IT companies, manufacturing, retail, logistics, and wartime-related industries.

### How to use

#### Basic search (SERP only, fastest)

```json
{
  "searchQueries": ["програміст", "менеджер з продажу"],
  "location": "Київ",
  "maxResults": 100
}
```

#### With job detail page enrichment (recommended)

Fetches company website, employee count, industry, company profile URL, and full description:

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

#### With full company profile enrichment

Also fetches company about text, open positions count, and job list from the company profile page:

```json
{
  "searchQueries": ["менеджер"],
  "location": "Харків",
  "maxResults": 20,
  "includeJobDetails": true,
  "includeCompanyDetails": true
}
```

#### Search all of Ukraine

```json
{
  "searchQueries": ["бухгалтер"],
  "maxResults": 200
}
```

#### Remote jobs only

```json
{
  "searchQueries": ["developer"],
  "location": "Дистанційно",
  "maxResults": 50,
  "includeJobDetails": true
}
```

#### Use a direct search URL

```json
{
  "searchUrls": ["https://www.work.ua/jobs/?search=php&region=39"],
  "maxResults": 30
}
```

### Supported cities

The `location` field accepts Ukrainian or English city names:

| Ukrainian | English | Notes |
|---|---|---|
| Київ | Kyiv | Capital, largest market |
| Харків | Kharkiv | Second largest |
| Одеса | Odesa | Port city |
| Дніпро | Dnipro | Industrial center |
| Запоріжжя | Zaporizhzhia | |
| Львів | Lviv | Western Ukraine hub |
| Миколаїв | Mykolaiv | |
| Херсон | Kherson | |
| Полтава | Poltava | |
| Вінниця | Vinnytsia | |
| Дистанційно | Remote | Remote-only jobs |

Leave `location` empty to search all of Ukraine.

### PPE pricing

| Event | Price | When |
|---|---|---|
| `actor-start` | $0.001 | Once per run |
| `job-serp-result` | $0.003 | Per job from SERP (no details) |
| `job-detail-result` | $0.005 | Per job with full detail page |
| `company-detail-result` | $0.005 | Per unique company profile page fetched |

### Input schema

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchQueries` | string\[] | | Job keywords in Ukrainian or English |
| `searchUrls` | string\[] | | Direct Work.ua search URLs |
| `location` | string | | City filter (Ukrainian or English name) |
| `includeJobDetails` | boolean | false | Fetch detail page for company website, employee count, industry, profile URL, and full description |
| `includeCompanyDetails` | boolean | false | Also fetch company profile page for about text and open positions list (auto-enables `includeJobDetails`) |
| `maxResults` | integer | 5 | Total cap across all queries |
| `maxResultsPerQuery` | integer | 5 | Cap per individual keyword |
| `maxConcurrency` | integer | 1 | Concurrent browser sessions |

### Sample output

```json
{
  "_type": "job",
  "id": "8942156",
  "title": "Програміст Python (Middle/Senior)",
  "job_url": "https://www.work.ua/jobs/8942156/",
  "source_platform": "work.ua",
  "company_name": "GlobalLogic Ukraine",
  "company_verified": true,
  "company_website": "https://www.globallogic.com/ua/",
  "company_logo_url": "https://i.work.ua/employer_design/...",
  "company_employee_count": "1000-5000",
  "company_industry": "IT, телекомунікації, зв'язок, Інтернет",
  "company_profile_url": "https://www.work.ua/jobs/by-company/12345/",
  "company_about": "GlobalLogic — провідна компанія цифрової трансформації...",
  "company_active_jobs_count": 47,
  "company_active_jobs": [
    {
      "title": "Senior Python Developer",
      "job_url": "https://www.work.ua/jobs/8942157/",
      "snippet": "Досвід від 5 років, Київ, 120 000 – 180 000 грн"
    }
  ],
  "location": "Київ",
  "country": "UA",
  "city": "Київ",
  "region": "Kyivska oblast",
  "posted_at_text": "20 серпня 2026",
  "posted_at_datetime": "2026-08-20",
  "employment_type": "Full-time",
  "remote_type": "Hybrid",
  "experience_years_min": 3,
  "education_level_required": "Вища освіта",
  "wartime_deferment": true,
  "is_hot_job": true,
  "salary_min": 80000,
  "salary_max": 120000,
  "salary_currency": "UAH",
  "salary_period": "month",
  "salary_text": "80 000 – 120 000 грн",
  "salary_above_average": true,
  "suitable_for_students": null,
  "suitable_for_disabilities": null,
  "suitable_for_pensioners": null,
  "industry": "IT, телекомунікації, зв'язок, Інтернет",
  "description": "Шукаємо досвідченого Python-розробника для роботи над хмарними проектами. Вимоги: Python 3.10+, FastAPI або Django, PostgreSQL, Docker...",
  "description_full": "Шукаємо досвідченого Python-розробника...\n\nВимоги:\n- Python 3.10+\n- FastAPI або Django\n- PostgreSQL\n- Docker / Kubernetes",
  "contact_emails": [],
  "contact_phones": [],
  "contact_urls": [],
  "apply_url": "https://www.work.ua/jobs/8942156/",
  "search_query": "програміст",
  "scraped_at": "2026-08-25T10:30:00Z"
}
```

### Related actors

- [NanoScrape Job Feed](https://apify.com/nanoscrape/job-feed) - Aggregated job feed across all NanoScrape scrapers
- [Career Site Jobs Scraper](https://apify.com/nanoscrape/career-site-jobs-scraper) - Scrape company career pages
- [Website Job Extractor](https://apify.com/nanoscrape/website-job-extractor) - AI-powered job extraction from any page
- [Indeed Scraper](https://apify.com/nanoscrape/indeed-scraper) - Global job board with Ukrainian postings
- [Robota.ua / DCZ Gov UA Scraper](https://apify.com/nanoscrape/dcz-gov-ua-scraper) - Ukrainian state employment service
- [eJobs.ro Scraper](https://apify.com/nanoscrape/ejobs-ro-scraper) - Romania's largest job board

### Support

Questions or issues? Open the Issues tab or contact contact@nanoscrape.com.

# Actor input Schema

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

One or more job titles or keywords to search on Work.ua. Each entry runs as a separate search. Ukrainian keywords give best results. Examples: 'програміст', 'менеджер', 'бухгалтер', 'маркетолог', 'водій'.

## `searchUrls` (type: `array`):

Direct Work.ua search result URLs to crawl. Example: https://www.work.ua/jobs/?search=developer\&region=39

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

Ukrainian city to filter results. Accepts Ukrainian or English names. Examples: 'Київ', 'Kyiv', 'Харків', 'Kharkiv', 'Одеса', 'Одеса', 'Дніпро', 'Львів', 'Запоріжжя'. Leave empty for all of Ukraine. Use 'Дистанційно' or 'Remote' for remote-only jobs.

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

When enabled, fetches the full job detail page for each listing to populate description\_full, description\_html, company\_website, employment\_type, remote\_type, contact emails/phones. Charges the job-detail-result PPE event instead of job-serp-result.

## `includeCompanyDetails` (type: `boolean`):

Surface company website from the job detail page. Requires includeJobDetails.

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

Total cap across all search queries.

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

Maximum results per individual search keyword or URL.

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

Reserved for future parallel-task support. Camoufox is memory-heavy so tasks run sequentially today.

## Actor input object example

```json
{
  "searchQueries": [
    "програміст"
  ],
  "location": "Київ",
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 1
}
```

# Actor output Schema

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

Dataset containing scraped Work.ua job listings. Each row includes title, company\_name, company\_verified, company\_website, company\_employee\_count, company\_industry, company\_profile\_url, company\_about (includeCompanyDetails), company\_active\_jobs\_count (includeCompanyDetails), company\_active\_jobs\[] (includeCompanyDetails), city, region, salary\_min/max in UAH, salary\_above\_average, employment\_type, remote\_type, wartime\_deferment, is\_hot\_job, experience\_years\_min, education\_level\_required, suitable\_for\_students, suitable\_for\_disabilities, suitable\_for\_pensioners, and description\_full.

# 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": [
        "програміст"
    ],
    "includeJobDetails": false,
    "includeCompanyDetails": false,
    "maxResults": 5,
    "maxResultsPerQuery": 5
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/work-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/Zfp5NuwyRtMmZDfp0/builds/OJfMFPaJSG9FAdks8/openapi.json
