# Robota Jobs Search Scraper (`alexist/robota-jobs-search-scraper`) Actor

Scrape job listings from Robota.ua with targeted search parameters. Collect 20+ data fields including job titles, salaries, companies, cities, and application URLs — designed for recruiters, researchers, and job aggregator platforms.

- **URL**: https://apify.com/alexist/robota-jobs-search-scraper.md
- **Developed by:** [Alex](https://apify.com/alexist) (community)
- **Categories:** Automation, Developer tools, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

## Robota.ua Jobs Search Scraper: Extract Ukrainian Job Listings at Scale

***

### What Is Robota.ua?

Robota.ua is Ukraine's largest and most-visited job portal, hosting hundreds of thousands of active job listings across all industries and regions. The platform enables employers to post opportunities and job seekers to search by category, location, and experience level. Manually collecting and organizing this data is tedious — the **Robota.ua Jobs Search Scraper** automates the extraction of structured job records from search results pages, enabling bulk data analysis and integration into recruitment workflows.

***

### Overview

The **Robota Jobs Search Scraper** extracts job listings from Robota.ua search results pages, converting dynamic HTML into clean, structured data records. It is built for:

- **Recruitment agencies** aggregating Ukrainian job market data
- **HR researchers** analyzing salary trends and hiring demand by region
- **Job board operators** feeding data into multi-source aggregators
- **Market analysts** studying labor supply across industries and cities
- **Career planners** building datasets for job market insights

The scraper captures 20 essential fields per listing, handles pagination automatically, and offers flexible configuration to control data volume and resilience during collection runs.

***

### Input Format

The scraper accepts a JSON configuration object with three main parameters:

```json
{
  "urls": [
    "https://robota.ua/zapros/design/ukraine/params;page=2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

#### Input Parameters Explained

| Parameter | Type | Description | Example |
|---|---|---|---|
| `urls` | Array | List of Robota.ua job search result URLs to scrape. Include the full URL with search parameters and pagination page number. | `["https://robota.ua/zapros/design/ukraine/params;page=2"]` |
| `ignore_url_failures` | Boolean | If `true`, the scraper continues running even if some URLs fail to load or timeout. If `false`, the run stops on the first error. | `true` |
| `max_items_per_url` | Integer | Maximum number of job listings to extract from each URL. Limits data volume and runtime. | `20` |

#### Tips for Building URLs

- **Search-based URLs:** Navigate to Robota.ua, apply filters (category, city, experience level), then copy the resulting URL from your browser address bar.
- **Pagination:** URLs typically include `page=1`, `page=2`, etc. Increase the page number in multiple URLs to collect more results.
- **Category examples:** `design`, `development`, `marketing`, `sales`, etc.
- **Multi-city searches:** Build separate URLs for each city or use search parameters that include multiple locations.

***

### Output Format

**Sample output**

```json
{
  "id": "11272805",
  "schedules": [
    {
      "id": "9",
      "__typename": "Schedule"
    },
    {
      "id": "1",
      "__typename": "Schedule"
    }
  ],
  "title": "Вантажник",
  "distance_text": "",
  "description": "Ми — компанія Daylight, яка 25 років працює у сфері преміального інтер'єрного текстилю та шпалер, співпрацює з провідними європейськими брендами та допомагає дизайнерам та архітекторам створювати красиві інтер'єри.Шукаємо в нашу команду вантажника.Об...",
  "show_logo": false,
  "sort_date_text": "6 годин тому",
  "hot": false,
  "design_banner_url": null,
  "is_publication_in_all_cities": false,
  "badges": [],
  "salary": {
    "amount": 27000,
    "comment": "",
    "amount_from": 27000,
    "amount_to": 0,
    "__typename": "VacancySalary"
  },
  "company": {
    "id": "1977803",
    "logo_url": "https://company-logo-frankfurt.rabota.ua/1977803_20200423210932.png",
    "name": "Daylight Design Group",
    "honors": [],
    "__typename": "Company"
  },
  "city": {
    "id": "1",
    "name": "Київ",
    "__typename": "City"
  },
  "show_profile": false,
  "seeker_favorite": null,
  "seeker_disliked": null,
  "form_apply_custom_url": "",
  "anonymous": false,
  "is_active": true,
  "publication_type": "BASE",
  "branding": null,
  "from_url": "https://robota.ua/zapros/design/ukraine/params;page=2"
}
```

Each scraped job listing returns a record with 20 structured fields:

#### Identification & Status

| Field | Meaning | Example |
|---|---|---|
| `ID` | Unique identifier for the job listing in Robota's database | `12345678` |
| `Is Active` | Boolean flag indicating whether the listing is currently active or expired | `true` |
| `Is Publication In All Cities` | Whether the job is open in multiple Ukrainian cities or one specific location | `false` |
| `Publication Type` | Type of publication (standard, premium, featured, etc.) | `standard` |

#### Job Details

| Field | Meaning | Example |
|---|---|---|
| `Title` | Official job title as displayed on the listing | `Senior UX Designer` |
| `Description` | Full job description including responsibilities and requirements | `We are looking for an experienced UX designer...` |
| `Schedules` | Work schedule type (full-time, part-time, flexible, remote, etc.) | `Full-time` |
| `Salary` | Offered salary or salary range in UAH (sometimes omitted if not specified by employer) | `30,000 - 50,000 UAH` |

#### Location & Company

| Field | Meaning | Example |
|---|---|---|
| `City` | Primary Ukrainian city where the position is based | `Kyiv`, `Lviv`, `Kharkiv` |
| `Distance Text` | Distance from the job seeker's saved location (if applicable), or distance description | `5 km away` |
| `Company` | Employer name | `TechCorp Ukraine` |
| `Show Profile` | Boolean indicating if the company profile is publicly visible on Robota | `true` |
| `Show Logo` | Whether the company logo is displayed with the listing | `true` |

#### Features & Engagement

| Field | Meaning | Example |
|---|---|---|
| `Hot` | Boolean flag indicating if the listing is marked as "Hot" or promoted | `true` |
| `Design Banner URL` | URL to a custom banner or promotional image for the listing | `https://robota.ua/images/banner-12345.jpg` |
| `Badges` | Array of labels or badges (e.g., "Top Employer", "New", "Hiring Fast") | `["Top Employer", "New"]` |
| `Branding` | Company branding elements (logo, colors, custom styling) | `{"logoUrl": "...", "color": "#FF5733"}` |

#### Application & Preferences

| Field | Meaning | Example |
|---|---|---|
| `Form Apply Custom URL` | Custom application URL if the employer uses an external form instead of Robota's system | `https://company.com/careers/apply` |
| `Anonymous` | Boolean indicating if the employer posted anonymously (job seeker does not see company name initially) | `false` |
| `Seeker Favorite` | Whether a specific job seeker saved the listing to favorites | `true` |
| `Seeker Disliked` | Whether a job seeker marked the listing as disliked | `false` |

#### Metadata

| Field | Meaning | Example |
|---|---|---|
| `Sort Date Text` | Human-readable posting date or "last updated" timestamp | `Posted 2 days ago`, `Updated today` |

***

### How to Use

1. **Find search URLs** — Go to Robota.ua, apply filters (category, city, salary, schedule), and copy the resulting URL.
2. **Add pagination** — To collect more listings, create multiple URLs with different page numbers (page=1, page=2, etc.).
3. **Configure input** — Paste URLs into the `urls` array. Set `max_items_per_url` to limit records per page (e.g., 20, 50, or 100).
4. **Enable error handling** — Set `ignore_url_failures: true` for large bulk runs to skip temporarily unavailable pages.
5. **Run the scraper** — Start the actor and monitor progress in the log.
6. **Export data** — Download results as JSON, CSV, or Excel for analysis or database import.

**Best practices:**

- Test with 1–2 URLs first to verify data quality before running large batches.
- Use specific search filters to reduce noise (e.g., filter by salary range, experience level).
- Set reasonable `max_items_per_url` limits to avoid excessive runtime (20–50 is typical).
- For multi-page collection, increase the page parameter gradually rather than requesting all pages at once.

***

### Use Cases & Business Value

- **Market intelligence:** Track hiring trends across Ukrainian industries and regions in real-time
- **Salary benchmarking:** Analyze compensation data by role, city, and experience level
- **Competitor tracking:** Monitor when competitors post new roles and what they're hiring for
- **Job aggregation:** Feed Robota listings into multi-source job boards or internal databases
- **Academic research:** Study labor market dynamics, skills demand, and geographic distribution
- **Recruitment automation:** Integrate live job data into CRM or recruitment workflow systems

The Robota Jobs Search Scraper eliminates manual browsing, delivering ready-to-use data that scales from single searches to hundreds of pages in minutes.

***

### Conclusion

The **Robota.ua Jobs Search Scraper** is an efficient solution for anyone needing structured Ukrainian job market data. With 20 fields per listing, flexible pagination, and robust error handling, it transforms unstructured search results into actionable intelligence. Whether you're a recruiter, researcher, or platform developer, this scraper accelerates data collection and enables data-driven decisions.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the Jobs list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://robota.ua/zapros/design/ukraine/params;page=2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://robota.ua/zapros/design/ukraine/params;page=2"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("alexist/robota-jobs-search-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 = {
    "urls": ["https://robota.ua/zapros/design/ukraine/params;page=2"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("alexist/robota-jobs-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://robota.ua/zapros/design/ukraine/params;page=2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call alexist/robota-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=alexist/robota-jobs-search-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/7e1pUNMZz2cp1UJRy/builds/6dTMUV6pOXoDvLlfB/openapi.json
