# OLX Poland Job Listings Scraper (`automation-lab/olx-poland-job-listings-scraper`) Actor

Search OLX Poland public jobs by keyword or exact results URL and export normalized vacancies with employer, location, salary, contract, dates, description, and URL.

- **URL**: https://apify.com/automation-lab/olx-poland-job-listings-scraper.md
- **Developed by:** [Automation Lab](https://apify.com/automation-lab) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.72 / 1,000 item extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## OLX Poland Job Listings Scraper

Build a structured vacancy feed from **OLX Poland job listings**. Search by Polish job keyword or paste exact OLX.pl jobs result URLs, then export normalized titles, employers, locations, salary ranges, contract details, descriptions, dates, and canonical URLs.

The Actor is designed for recurring recruitment feeds and Polish labor-market monitoring. It covers **OLX.pl jobs only**; it does not mix listings from other OLX countries or unrelated classified categories.

### What does this Actor do?

The Actor queries OLX Poland's public jobs data and writes one normalized vacancy per default-dataset item.

It supports two entry points:

1. `searchQuery` for a nationwide job-keyword search.
2. `startUrls` for exact OLX.pl `/praca/` result pages, including city and page filters.

For URL searches, the Actor reads OLX's own embedded data request so the selected location and supported filters remain intact. Multiple URLs are processed into one deduplicated feed.

### Who is it for?

- Recruiters building sourcing lists for a Polish role or city.
- Staffing agencies comparing vacancy demand between Polish regions.
- Labor-market analysts collecting repeatable job snapshots.
- Data teams feeding vacancy records into a warehouse, spreadsheet, or dashboard.
- Automation teams scheduling newest-first searches and detecting IDs that appeared or changed.

This is a data extractor, not an applicant-tracking system. It does not apply for jobs, contact employers, or maintain change history for you.

### Why use this OLX jobs scraper?

- Jobs-only scope prevents unrelated OLX classifieds from entering the feed.
- Exact URL mode preserves OLX location and supported search filters.
- Structured salary bounds, currency, and period avoid parsing one display string.
- Stable OLX IDs and canonical URLs make downstream deduplication straightforward.
- Multi-URL runs deduplicate repeated offers across overlapping searches.
- Fresh Poland residential sessions provide bounded recovery from transient blocks.
- HTTP and JSON extraction keeps memory and runtime below a browser workflow.

### What data can I extract?

| Field | Meaning |
| --- | --- |
| `jobId` | Stable OLX offer ID |
| `title` | Vacancy title |
| `employer` | Public company or advertiser name |
| `city`, `region` | Public job location |
| `salaryFrom`, `salaryTo` | Structured compensation bounds when advertised |
| `salaryCurrency`, `salaryPeriod`, `salaryGross` | Compensation context |
| `employmentType` | Full-time or part-time label |
| `contractType` | Contract label shown by OLX |
| `workMode` | Workplace mode when provided |
| `description` | Plain-text vacancy description |
| `publishedAt`, `refreshedAt`, `validTo` | OLX offer timestamps |
| `latitude`, `longitude` | Approximate public map coordinates |
| `isBusiness` | Whether OLX marks the advertiser as a business |
| `attributes` | Additional labeled job requirements and benefits |
| `url` | Canonical OLX job URL |
| `scrapedAt` | Extraction timestamp |

Fields that are not present on a source offer are returned as `null` or omitted from the `attributes` object.

### Getting started

1. Open the Actor input page.
2. Enter a Polish keyword such as `kierowca`, `magazynier`, or `programista`.
3. Alternatively, paste one or more public OLX Poland jobs result URLs.
4. Set `maxItems` to the maximum number of unique vacancies required.
5. Keep **Newest first** for scheduled monitoring, or choose relevance sorting.
6. Run the Actor and open the **Job listings** dataset.
7. Export the dataset as JSON, CSV, Excel, XML, or RSS through Apify.

A first test with 10–20 items is recommended before increasing the limit.

### Input parameters

| Input | Type | Default | Description |
| --- | --- | --- | --- |
| `searchQuery` | string | `kierowca` prefill | Nationwide Polish job keyword |
| `startUrls` | URL array | empty | Public `https://www.olx.pl/praca/` search/category URLs |
| `maxItems` | integer | `100` | Unique jobs to save, from 1 to 1,000 |
| `sortBy` | enum | `created_at:desc` | Newest-first or relevance ordering |
| `maxRequestRetries` | integer | `3` | Additional fresh proxy sessions after a failed request, from 0 to 5 |

Provide either `searchQuery` or at least one `startUrls` entry. When `startUrls` is present, its OLX-selected keyword, location, category, and filters define the search.

### Search by keyword

This input collects up to 20 newest driver vacancies nationwide:

```json
{
  "searchQuery": "kierowca",
  "maxItems": 20,
  "sortBy": "created_at:desc"
}
```

Keyword matching follows OLX's own search behavior. The Actor does not broaden, translate, stem, or reinterpret your phrase.

### Search by location and OLX filters

Copy a result URL from OLX Poland jobs after choosing the location and filters:

```json
{
  "startUrls": [
    { "url": "https://www.olx.pl/praca/warszawa/q-kierowca/" }
  ],
  "maxItems": 10
}
```

Only HTTPS OLX.pl jobs search/category URLs under `/praca/` are accepted. Individual offer URLs and other countries are rejected with a clear input error.

### Monitor several Polish job markets

Use multiple URL searches in one run:

```json
{
  "startUrls": [
    { "url": "https://www.olx.pl/praca/warszawa/q-magazynier/" },
    { "url": "https://www.olx.pl/praca/krakow/q-magazynier/" }
  ],
  "maxItems": 100,
  "sortBy": "created_at:desc"
}
```

The global limit applies across all URLs. Duplicate OLX IDs are stored once.

### Output example

A current result has this shape:

```json
{
  "jobId": 1097558571,
  "title": "Pracownik z kat. prawa jazdy C - przesyłki paletowe",
  "employer": "Example transport company",
  "city": "Mysłowice",
  "region": "Śląskie",
  "salaryFrom": 6000,
  "salaryTo": null,
  "salaryCurrency": "PLN",
  "salaryPeriod": "monthly",
  "salaryGross": true,
  "employmentType": "Pełny etat",
  "contractType": "Umowa o pracę",
  "workMode": null,
  "description": "Public vacancy description...",
  "publishedAt": "2026-09-12T10:00:00+02:00",
  "refreshedAt": "2026-09-13T10:00:00+02:00",
  "validTo": "2026-10-12T10:00:00+02:00",
  "isBusiness": true,
  "latitude": 50.2,
  "longitude": 19.1,
  "url": "https://www.olx.pl/oferta/praca/example-CID4-IDexample.html",
  "source": "olx.pl",
  "scrapedAt": "2026-09-14T10:00:00.000Z",
  "attributes": {
    "Wymiar pracy": "Pełny etat"
  }
}
```

The example employer and URL are anonymized. Dataset records contain the corresponding public source values.

### How much does it cost to extract OLX Poland job listings?

The Actor uses pay per event:

- **Start:** $0.005 once per run.
- **Item:** tiered per saved vacancy. The BRONZE rate is $0.001196 per job; higher account tiers receive the rates displayed in the Actor pricing tab.

At the BRONZE rate, 100 saved jobs cost about **$0.125** including the start event, and 1,000 saved jobs cost about **$1.201**. Apify platform usage is included under pay-per-event pricing. Failed requests and duplicate or rejected records do not create item events.

Always treat the live pricing tab as authoritative if Apify displays an applicable account tier.

### Scheduling and change detection

For a recurring feed:

1. Sort by newest first.
2. Schedule the Actor hourly, daily, or weekly in Apify Console.
3. Export `jobId`, `refreshedAt`, and the fields you monitor.
4. Upsert records in your database by `jobId`.
5. Compare the new ID set and selected field values with the previous snapshot.

The Actor itself returns the current public snapshot. It does not persist historical state or label records as new, changed, or removed.

### Integrations

Useful downstream options include:

- Apify schedules for periodic collection.
- Webhooks to start an ETL or notification after a run.
- Google Sheets, Make, Zapier, or n8n for operational workflows.
- Dataset API exports for Python, BI tools, or a data warehouse.
- Stable-ID upserts for a recruitment feed or labor-demand dashboard.

Avoid sending unsolicited messages or making automated employment decisions from scraped data.

### Run with the Apify API

Replace `YOUR_TOKEN` with an Apify API token.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~olx-poland-job-listings-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQuery":"kierowca","maxItems":20}'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/olx-poland-job-listings-scraper').call({
  searchQuery: 'kierowca',
  maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token="YOUR_TOKEN")
run = client.actor("automation-lab/olx-poland-job-listings-scraper").call(
    run_input={"searchQuery": "kierowca", "maxItems": 20}
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

For production, keep tokens in secrets or environment variables rather than source code.

### Use with Apify MCP

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/olx-poland-job-listings-scraper"
```

#### Claude Desktop, Cursor, and VS Code setup

Use this equivalent MCP configuration in Claude Desktop, Cursor, or VS Code:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/olx-poland-job-listings-scraper"
    }
  }
}
```

Example prompts:

- "Find the 20 newest OLX Poland driver jobs and summarize salary ranges by region."
- "Run this OLX Warsaw jobs URL and export title, employer, contract type, and URL."
- "Collect warehouse vacancies in Warsaw and Kraków for my weekly demand dashboard."

### Reliability and retries

OLX may block individual proxy identities. Each request uses a coherent Poland residential session. A blocked or transient response rotates to a fresh session, up to `maxRequestRetries` additional attempts.

The Actor validates status, content type, JSON shape, and jobs category. If retries are exhausted, it fails rather than returning a misleading empty dataset. Start with the default retry value unless a support diagnosis suggests changing it.

### Limits

- Source scope is OLX.pl public jobs.
- Other OLX countries are unsupported.
- `maxItems` is capped at 1,000 per run.
- Search behavior and availability follow OLX's current public data.
- Some offers omit salary, employer company name, work mode, or other optional fields.
- Approximate map coordinates should not be treated as exact workplace addresses.
- Deleted or expired offers may disappear between scheduled snapshots.
- URL mode depends on OLX continuing to expose its selected search request in result-page data.

### Troubleshooting

**The run says I must provide a search.**

Set a non-empty `searchQuery` or add at least one supported `/praca/` result URL.

**My URL is rejected.**

Open a public OLX Poland jobs results page. Do not paste a detail offer, another OLX country, or a general classified category.

**The dataset has fewer records than requested.**

The source may have fewer matching jobs, overlapping URLs may return duplicates, or OLX may end pagination. `maxItems` is a ceiling, not a promised count.

**The run failed after several OLX requests.**

Review the run log for status/content-type evidence. Retry later rather than increasing retries without a bound; persistent source changes may require an Actor update.

### Responsible use and legality

This Actor extracts publicly visible job-listing information. You are responsible for complying with OLX terms, applicable copyright/database rights, privacy law, employment law, and your organization's policies.

Collect only the fields you need. Do not use public contact or profile details for spam, harassment, discrimination, or automated decisions about individuals. Respect deletion requests and appropriate retention periods. This documentation is not legal advice.

### Related Automation Lab Actors

- [OLX Poland Classifieds Scraper](https://apify.com/automation-lab/olx-poland-classifieds-scraper) for general OLX Poland categories beyond jobs.
- [Pracuj.pl Jobs Scraper](https://apify.com/automation-lab/pracuj-pl-jobs-scraper) for a separate Polish vacancy source.
- [Remote OK Jobs Feed Scraper](https://apify.com/automation-lab/remoteok-remote-jobs-feed) for remote-first vacancies from another source.

Each related Actor has its own input, output, and pricing contract. This Actor does not aggregate those sources.

### FAQ

**Does this Actor require an OLX account?**

No. It accesses public OLX Poland job search data.

**Can it scrape job detail URLs directly?**

No. Use a keyword or jobs result URL. The public search data already contains the normalized fields documented above.

**Can it monitor only Warsaw or Kraków?**

Yes. Configure the city on OLX.pl and paste the resulting `/praca/` URL.

**Does it track changes between runs?**

It supplies stable IDs and timestamps for downstream comparison, but it does not maintain historical state itself.

**Can I export CSV or Excel?**

Yes. Use the dataset export controls or API format parameters after the run.

**Can I scrape Romania, Portugal, Ukraine, or another OLX country?**

No. This Actor intentionally supports Poland only.

**Are all salary fields always present?**

No. Salary and other optional fields are `null` when the advertiser did not provide them.

# Actor input Schema

## `searchQuery` (type: `string`):

Polish job keyword, for example kierowca, magazynier, or programista.

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

Optional public https://www.olx.pl/praca/ search or category URLs. URL location and filter settings are preserved.

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

Stop after this many unique job records across all searches.

## `sortBy` (type: `string`):

Newest first is best for recurring monitoring.

## `maxRequestRetries` (type: `integer`):

Fresh Poland residential proxy sessions tried after a blocked or transient response.

## Actor input object example

```json
{
  "searchQuery": "kierowca",
  "startUrls": [],
  "maxItems": 20,
  "sortBy": "created_at:desc",
  "maxRequestRetries": 3
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing normalized OLX Poland job records.

# 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 = {
    "searchQuery": "kierowca",
    "startUrls": [],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/olx-poland-job-listings-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 = {
    "searchQuery": "kierowca",
    "startUrls": [],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/olx-poland-job-listings-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 '{
  "searchQuery": "kierowca",
  "startUrls": [],
  "maxItems": 20
}' |
apify call automation-lab/olx-poland-job-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/olx-poland-job-listings-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/aKfNpijQ3OeWx0Pbm/builds/fz7Ibzauva5Gbmu9c/openapi.json
