# OLX Scraper - Poland, Romania, Bulgaria, Portugal & Ukraine (`gololo/olx-scraper`) Actor

Scrape OLX listings from 7 countries with one Actor. Paste any OLX search URL or type keywords. Gets price, attributes, location, seller, photos and description. Breaks OLX's 1,000-result limit and supports new-listing monitoring.

- **URL**: https://apify.com/gololo/olx-scraper.md
- **Developed by:** [gol lol](https://apify.com/gololo) (community)
- **Categories:** E-commerce, Lead generation, Real estate
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 results

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## OLX Scraper — Poland, Romania, Bulgaria, Portugal, Ukraine, Kazakhstan & Uzbekistan

Extract structured classifieds, real estate, electronics, auto parts, and job listings from **7 OLX Group marketplaces** with a single fast, low-cost Actor.

Unlike browser-based scrapers that burn compute units and stop at page 25, **OLX Scraper** queries OLX's JSON API directly with TLS fingerprint impersonation, automatically **bypasses OLX's 1,000-result pagination cap**, and includes a built-in **monitoring mode** that only outputs (and only charges for) new listings since your last run.

***

### Supported OLX Marketplaces

| Country | Domain | Currency | Supported Input Modes |
| :--- | :--- | :---: | :--- |
| **Poland** | `www.olx.pl` | `PLN` | Search URLs + Keywords |
| **Romania** | `www.olx.ro` | `EUR` / `RON` | Search URLs + Keywords |
| **Bulgaria** | `www.olx.bg` | `EUR` / `BGN` | Search URLs + Keywords |
| **Portugal** | `www.olx.pt` | `EUR` | Search URLs + Keywords |
| **Ukraine** | `www.olx.ua` | `UAH` / `USD` / `EUR` | Search URLs + Keywords |
| **Kazakhstan** | `www.olx.kz` | `KZT` | Search URLs + Keywords |
| **Uzbekistan** | `www.olx.uz` | `UZS` / `USD` | Search URLs + Keywords |

***

### Key Features

- **Paste Any OLX Search URL or Direct Listing URL:** Filter by category, city, district, radius, price range, condition, or category-specific attributes in your browser on OLX, then paste the search URL—or any individual offer URL (`/d/oferta/...`, `/d/obyavlenie/...`, `/d/anuncio/...`)—into `startUrls`.
- **Breaks OLX's 1,000-Result Limit (`bypassResultCap`):** Standard OLX searches stop at offset `1,000` (25 pages × 40 ads). When `bypassResultCap` is enabled (default), any search with more than 1,000 listings is automatically split into price-range slices and deduplicated by listing ID so you can extract thousands of listings from a single search.
- **Cross-Run Price-Drop & Price-Change Tracking (`trackPriceChanges`):** Automatically remembers historical listing prices across runs in the `olx-scraper-monitor-state` Key-Value Store and populates `previousPrice`, `priceDelta`, and `priceChangePercent` whenever a seller lowers or raises their price.
- **Zero-Duplicate Deal & Price-Drop Monitoring (`onlyNewListings` + `includePriceDrops`):** Enable `onlyNewListings: true` and put the Actor on an Apify Schedule. The Actor only outputs—and only bills you for—brand-new listings and existing listings whose price dropped since your last run.
- **Ultra-Lightweight HTTP Engine (128 MB RAM):** Runs without headless Chrome/Playwright, scraping ~1,000 listings in ~30 seconds with minimal platform compute usage.

***

### Pricing & Volume Discounts (Pay Per Event)

This Actor uses Apify's **Pay-Per-Event (PPE)** model with automatic **tiered volume discounts**:

- **Actor start (`apify-actor-start`):** `$0.00005` per run
- **Listing scraped (`apify-default-dataset-item`):**
  - **Free tier:** `$0.0012` per listing (`$1.20 / 1,000`)
  - **Bronze tier:** `$0.0011` per listing (`$1.10 / 1,000`)
  - **Silver tier:** `$0.0010` per listing (`$1.00 / 1,000`)
  - **Gold / Platinum / Diamond:** `$0.0009` per listing (`$0.90 / 1,000`)

> **Free Tier Note:** Every Apify account includes **$5.00 in free monthly usage credits**, which covers over **4,000 scraped OLX listings every month** at zero cost.

***

### Input Examples

#### 1. Scrape Any Filtered OLX Search URL (`olx.pl`, `olx.ro`, `olx.bg`, `olx.pt`, `olx.ua`)

Go to your target OLX site, apply your category, city, and filters, copy the URL from your browser address bar, and paste it into `startUrls`:

```json
{
  "startUrls": [
    { "url": "https://www.olx.pl/elektronika/telefony/q-iphone-15/?search%5Border%5D=created_at%3Adesc" },
    { "url": "https://www.olx.ro/imobiliare/apartamente-garsoniere-de-inchiriat/cluj-napoca/" }
  ],
  "maxItems": 500,
  "includeDescription": true
}
```

#### 2. Keyword Search with Price Bounds

```json
{
  "searchQueries": ["playstation 5", "rtx 3090"],
  "country": "bg",
  "minPrice": 200,
  "maxPrice": 900,
  "sort": "newest",
  "maxItems": 200
}
```

#### 3. Scheduled Deal / Arbitrage Monitor (Only New Listings)

Combine `onlyNewListings: true`, `sort: "newest"`, and `maxListingAgeHours: 24` with an Apify Schedule + Webhook (Slack, Telegram, Discord, Make, or n8n):

```json
{
  "startUrls": [
    { "url": "https://www.olx.pl/elektronika/telefony/warszawa/q-iphone-16-pro/?search%5Border%5D=created_at%3Adesc" }
  ],
  "sort": "newest",
  "onlyNewListings": true,
  "maxListingAgeHours": 24,
  "skipPromoted": true,
  "sellerType": "private",
  "maxItems": 100
}
```

***

### Output Example

Each scraped listing is normalized into a flat, analysis-ready JSON object with clean plain-text descriptions, unpacked category attributes, high-resolution image URLs (`1280x960`), geolocation coordinates, and seller metadata:

```json
{
  "id": 310704287,
  "url": "https://www.olx.ro/d/oferta/2-camere-plopilor-semiluna-usamv-zona-calvaria-umf-IDl1Gnt.html",
  "title": "2 camere, Plopilor, Semiluna, USAMV, Zona Calvaria, UMF",
  "price": 649,
  "currency": "EUR",
  "priceLabel": "649 €",
  "priceType": "fixed",
  "negotiable": false,
  "previousPrice": null,
  "condition": null,
  "attributes": {
    "m": "67 m²",
    "floor": "7"
  },
  "description": "GOLDNESS Imobiliare vă propune spre închiriere un apartament cu 2 camere open-space complet mobilat și utilat, la etajul 7 într-un imobil de 10 etaje...",
  "categoryId": 1157,
  "categoryType": "real_estate",
  "offerType": "offer",
  "city": "Cluj-Napoca",
  "district": null,
  "region": "Cluj",
  "latitude": 46.763436,
  "longitude": 23.555461,
  "locationIsApproximate": true,
  "sellerId": 559215798,
  "sellerName": "Georgiana Cîmpean",
  "sellerCompanyName": null,
  "sellerType": "business",
  "sellerRegisteredAt": "2022-07-25T11:52:43+03:00",
  "sellerLastSeenAt": "2026-10-28T12:46:33+02:00",
  "hasPhone": true,
  "deliveryAvailable": false,
  "isPromoted": true,
  "isUrgent": false,
  "photoCount": 11,
  "mainPhoto": "https://frankfurt.apollo.olxcdn.com:443/v1/files/mhldocg79ck02-RO/image;s=1280x960",
  "photos": [
    "https://frankfurt.apollo.olxcdn.com:443/v1/files/mhldocg79ck02-RO/image;s=1280x960"
  ],
  "createdAt": "2026-10-16T11:02:26+03:00",
  "refreshedAt": "2026-11-03T14:44:31+02:00",
  "validUntil": "2026-11-15T11:02:21+02:00",
  "status": "active",
  "country": "RO",
  "source": "https://www.olx.ro/imobiliare/apartamente-garsoniere-de-inchiriat/cluj-napoca/",
  "scrapedAt": "2026-11-04T02:21:04+00:00"
}
```

# Actor input Schema

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

Paste one or more OLX search result URLs or direct single-listing offer URLs from olx.pl, olx.ro, olx.bg, olx.pt, olx.ua, olx.kz or olx.uz. Set up category, city, keyword, price and other filters on OLX first, then copy the URL from your browser. All filters are kept.

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

Search by keyword instead of URL. Each keyword is searched on the country selected below.

## `country` (type: `string`):

Which OLX site to search when you use keywords. Ignored for pasted URLs (the URL already tells us the country).

## `minPrice` (type: `integer`):

Only for keyword search. In the site's local currency.

## `maxPrice` (type: `integer`):

Only for keyword search. In the site's local currency.

## `sort` (type: `string`):

'Keep URL sort' uses the sorting from your pasted URL.

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

Stop after this many listings across all searches. 0 = no limit. You pay per listing, so this also caps your cost.

## `maxItemsPerSearch` (type: `integer`):

Optional cap for each URL / keyword. 0 = no limit.

## `includeDescription` (type: `boolean`):

Adds the listing description as clean plain text.

## `bypassResultCap` (type: `boolean`):

OLX only shows the first 1,000 results of any search. When enabled, large searches are automatically split into price ranges so every listing can be reached.

## `onlyNewListings` (type: `boolean`):

Remembers which listings this exact input already returned and skips them next time. Combine with an Apify Schedule to get alerts for fresh listings only. You are not charged for skipped listings.

## `trackPriceChanges` (type: `boolean`):

Remembers the last seen price of each listing across runs and populates previousPrice, priceDelta, and priceChangePercent whenever a seller changes their price.

## `includePriceDrops` (type: `boolean`):

When 'Only new listings since last run' is enabled, also emit previously seen listings if their price dropped since the last run.

## `maxListingAgeHours` (type: `integer`):

Skip listings created earlier than this. Leave empty for no age filter.

## `sellerType` (type: `string`):

Filter listings by private individual sellers or business/commercial accounts.

## `skipPromoted` (type: `boolean`):

Exclude paid/highlighted top ads so you only receive organic listings.

## `proxyConfiguration` (type: `object`):

OLX usually works fine with Apify datacenter proxies. Switch to residential only if you see repeated blocks.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.olx.pl/elektronika/telefony/q-iphone-15/?search%5Border%5D=created_at%3Adesc"
    }
  ],
  "country": "pl",
  "sort": "keep",
  "maxItems": 100,
  "maxItemsPerSearch": 0,
  "includeDescription": true,
  "bypassResultCap": true,
  "onlyNewListings": false,
  "trackPriceChanges": true,
  "includePriceDrops": true,
  "sellerType": "all",
  "skipPromoted": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Dataset containing all scraped OLX listings with price, attributes, location, seller info, photos, and description.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.olx.pl/elektronika/telefony/q-iphone-15/?search%5Border%5D=created_at%3Adesc"
        }
    ],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("gololo/olx-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 = {
    "startUrls": [{ "url": "https://www.olx.pl/elektronika/telefony/q-iphone-15/?search%5Border%5D=created_at%3Adesc" }],
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("gololo/olx-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 '{
  "startUrls": [
    {
      "url": "https://www.olx.pl/elektronika/telefony/q-iphone-15/?search%5Border%5D=created_at%3Adesc"
    }
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call gololo/olx-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gololo/olx-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/QApsiy3V2pY6Qsuu4/builds/eIu9nxU8EpNifWAHt/openapi.json
