# OLX Scraper (`mina_safwat/olx-scraper`) Actor

Scrapes OLX classified ads — price, location, seller and full listing details — across Poland, Ukraine, Romania, Portugal, Pakistan, Kazakhstan and more.

- **URL**: https://apify.com/mina_safwat/olx-scraper.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.

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

### What does OLX Scraper do?

**OLX Scraper** collects classified ads from [OLX](https://www.olx.pl/), one of
the world's largest classifieds networks. For every listing you get the
**price, location, map coordinates, category, seller and every detail the
seller filled in**, plus photos and posting dates.

It works with **OLX Poland, Portugal, Romania, Ukraine, Bulgaria, Kazakhstan,
Uzbekistan and Pakistan**, and with **dubizzle Egypt** (OLX Egypt's new name).
It covers every category: property, cars, electronics, jobs, furniture and the
rest.

Paste a search link from OLX and press Start. Because it runs on the Apify
platform, you also get API access, scheduled runs, integrations (Google
Sheets, Zapier, Make, webhooks), managed residential proxies and run
monitoring.

> **Dubizzle Egypt:** since October 2026 dubizzle.com.eg shows a browser check to automated visitors, so its links may come back blocked (listed in `FAILED_INPUTS`, never billed). Every other OLX site works as usual.

### Why use OLX Scraper?

- **Track asking prices** in a category or city and see how they move over time.
- **Spot new listings** that match a narrow brief, on a daily or hourly schedule.
- **Compare private sellers with dealers** in the same market.
- **Measure supply**: how much is listed in a city, in which categories, at what price.
- **Feed market research and pricing models** with clean, structured data
  instead of copy-pasting from the site.

### How to scrape OLX listings

1. Open OLX (for example [olx.pl](https://www.olx.pl/) or
   [dubizzle.com.eg](https://www.dubizzle.com.eg/)) and search, or open a category.
2. Narrow it down with the filters on the page: price range, location,
   condition, or any category-specific filter.
3. Copy the address from your browser's address bar.
4. Paste it into **OLX links** and set **Max results per link**.
5. Click **Start**, then download your data from the **Output** tab.

Every filter you set is kept, because the Actor follows the exact link you
give it. You can paste several links at once, one per line, and mix
countries: a Warsaw car search and a Cairo apartment search land in the same
table.

To collect one seller's ads, open the seller's page of ads (on olx.pl,
the link looks like `https://www.olx.pl/oferty/uzytkownik/1qBDW/`) and paste
that link instead.

### Input

Fill in the fields on the **Input** tab, or send JSON through the API:

```json
{
    "search_urls": [
        "https://www.olx.pl/nieruchomosci/mieszkania/",
        "https://www.olx.com.pk/cars_c84"
    ],
    "max_results_per_search": 30
}
```

| Field | What it does |
| --- | --- |
| `search_urls` | **Required.** OLX search or category links, or a seller's page of ads, one per line. Old `olx.com.eg` links work too. |
| `max_results_per_search` | Stops after this many listings for each link. Default 200. OLX shows 24 to 52 listings per page, depending on the country, and 10 to 12 on a seller's page. |
| `proxy_country` | Optional 2-letter country code. Leave empty and each link runs from an address in its own country. |

### Output

Each listing becomes one row. Here is a simplified example (the description
and photo list are shortened):

```json
{
    "id": "1098870000",
    "title": "Mieszkanie 67m2 w kamienicy z garażem",
    "description": "Mieszkanie własnościowe 67,11 m2, na 2 piętrze kamienicy...",
    "url": "https://www.olx.pl/d/oferta/mieszkanie-67m2-w-kamienicy-z-garazem-CID3-ID1abCDE.html",
    "price": 190000,
    "currency": "PLN",
    "price_display": "190 000 zł",
    "is_negotiable": false,
    "city": "Radomsko",
    "region": "Łódzkie",
    "location": "Łódzkie, Radomsko",
    "latitude": 51.06754,
    "longitude": 19.44224,
    "category": "real_estate",
    "attributes": {
        "Powierzchnia": "67,11 m²",
        "Liczba pokoi": "2 pokoje",
        "Rynek": "Wtórny"
    },
    "is_business": false,
    "is_promoted": false,
    "seller_name": "Jacek",
    "created_at": "2026-09-17T12:35:28+02:00",
    "refreshed_at": "2026-10-01T12:42:53+02:00",
    "photo_count": 8,
    "image": "https://ireland.apollo.olxcdn.com:443/v1/files/abc123example-PL/image;s=4096x3072",
    "photos": ["https://ireland.apollo.olxcdn.com:443/v1/files/abc123example-PL/image;s=4096x3072"],
    "country": "PL",
    "domain": "olx.pl",
    "position": 6,
    "search_url": "https://www.olx.pl/nieruchomosci/mieszkania/"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or
Excel.

### OLX data fields

| Field | Description |
| --- | --- |
| `id` | OLX listing id |
| `title` | Listing title |
| `description` | Full listing text, with markup removed |
| `url` | Direct link to the ad |
| `price` | Asking price as a number, in local currency |
| `currency` | Currency code, such as PLN, RON, UAH, EGP or PKR |
| `price_display` | The price as the site shows it |
| `is_negotiable` | Whether the seller marked the price as negotiable |
| `is_free` | Whether the item is offered for free (always `false` on Egypt and Pakistan, which don't mark free items) |
| `salary_from`, `salary_to`, `salary_period` | Pay range and period of a job ad, which has no price. On Egypt and Pakistan, pay is listed in `attributes` instead |
| `city`, `region` | City and region or province |
| `location` | Full place path, such as "Łódzkie, Radomsko" |
| `latitude`, `longitude` | Map position of the listing |
| `category` | Category of the listing |
| `attributes` | Every detail the seller filled in: rooms and floor area, mileage and year, size, and so on |
| `is_business` | Whether the ad comes from a business seller |
| `is_promoted` | Whether the ad is a paid, promoted placement |
| `seller_name` | Seller's display name |
| `created_at`, `refreshed_at` | When the ad was posted and last refreshed |
| `photo_count`, `image`, `photos` | Number of photos, the main photo and all photo links |
| `country`, `domain` | Country code and site the listing came from |
| `position`, `search_url` | Rank within your link and the link it came from |

Some fields are filled only where the site provides them: `district` (when the
seller gave a neighbourhood), `condition` (not used for property), and on
Egypt and Pakistan `shop_name`, `purpose` and `is_seller_verified` (the
other sites leave these empty or leave them out). In Pakistan, a few ads give
only the country as their location.

### How much does it cost to scrape OLX?

OLX Scraper uses **pay-per-event** pricing, so you pay only for listings
you get:

- **$0.0015 per listing** in the dataset, which is **about $1.50 per 1,000 results**
- **$0.00005 per run** for starting the Actor at the default 1 GB of memory
  (the start fee is charged per GB, so it grows if you give a run more)

There are no separate platform or proxy charges. A run with the default
example input (2 links, 30 listings each) costs about **$0.09**. Apify's free
plan includes $5 of monthly usage, enough for about 3,300 listings.

### Tips for faster, cheaper OLX scraping

- **Filter on OLX first.** A narrow search link gives you exactly the listings
  you want, so you don't pay for ones you would throw away.
- **Use Max results per link** to cap each link. Each page of 24 to 52
  listings (10 to 12 on a seller's page) takes a few seconds.
- **Check keyword searches on OLX first.** OLX's keyword search also returns
  loose matches, so even a word no ad contains can bring back dozens of
  loosely related listings, and those are collected and charged like any
  other. Category links and filters give tighter results.
- **Split broad searches.** On the European and Central Asian sites, OLX lets
  one search page through at most 1,000 listings. To get more, split it into
  several links by region or price range.
- **Schedule runs** to watch for new listings: sort the search by newest on
  OLX before copying the link, then run it daily with a small limit.
- Promoted ads that repeat across pages are removed, so each listing appears
  once per link.
- Listing text and details come in the language of the site, because that is
  how sellers wrote them. On dubizzle Egypt, detail names are given in English,
  and so are places and categories on a seller's page.

### FAQ, disclaimers, and support

**Is it legal to scrape OLX?** This Actor collects only publicly visible
listing data and does not log in. Check OLX's terms of service for the
countries you scrape, and use the data responsibly.

**Personal data (GDPR).** `seller_name` is often a private person's name, and
free-text `description` fields can contain phone numbers or other personal
details. If you store or process this data, especially in the EU, you need a
lawful basis under GDPR and similar laws. Drop the fields you don't need, and
don't use the data for unsolicited contact.

**Why did a link return nothing?** Links that give no listings are never
added to the dataset, so you aren't charged for them. They are listed with
the reason in the `FAILED_INPUTS` record of the run's key-value store, and the
run's status message gives the counts. When OLX reports no matches, or a
seller has no ads left, that is a normal answer, so a scheduled run that finds
none still succeeds (keyword searches rarely come back empty; see the tips
above). The Actor reads search, category and seller pages only: links to a
single ad are turned away before any request, and shop, saved-search and
account pages after one request. A run fails only when every link was blocked
or hit an error. If the run reaches the maximum cost you set, it stops and
keeps what it collected; links it didn't get to are listed in `FAILED_INPUTS`.

**Which sites are supported?** olx.pl, olx.pt, olx.ro, olx.ua, olx.kz,
olx.uz, olx.bg, olx.com.pk and dubizzle.com.eg (including old olx.com.eg
links). Other OLX-branded sites, such as olx.com.br and olx.in, run on
different software and aren't supported.

**Found a bug or need a feature?** Open an issue on the **Issues** tab. For a
custom scraper or a different data shape, get in touch through the Issues tab
as well.

# Actor input Schema

## `search_urls` (type: `array`):

Search or category links, or a seller's page of ads, one per line. Search or browse on OLX with whatever filters you want — price, location, condition, category — then copy the address bar. Every filter in the link is honoured, and the country is taken from the link too, so you can mix Poland, Ukraine, Egypt and the rest in one run. Supported sites: olx.pl, olx.pt, olx.ro, olx.ua, olx.kz, olx.uz, olx.bg, olx.com.pk and dubizzle.com.eg (OLX Egypt's new name; old olx.com.eg links work too). Dubizzle Egypt currently shows a browser check to automated visitors, so its links may come back blocked.

## `max_results_per_search` (type: `integer`):

Stops after this many listings for each link. OLX shows 24 to 52 per page depending on the country (10 to 12 on a seller's page), so each extra page adds a few seconds.

## `proxy_country` (type: `string`):

A 2-letter country code. Leave empty and each link runs from an address in its own country.

## Actor input object example

```json
{
  "search_urls": [
    "https://www.olx.pl/nieruchomosci/mieszkania/",
    "https://www.olx.com.pk/cars_c84"
  ],
  "max_results_per_search": 30
}
```

# Actor output Schema

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

No 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 = {
    "search_urls": [
        "https://www.olx.pl/nieruchomosci/mieszkania/",
        "https://www.olx.com.pk/cars_c84"
    ],
    "max_results_per_search": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/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 = {
    "search_urls": [
        "https://www.olx.pl/nieruchomosci/mieszkania/",
        "https://www.olx.com.pk/cars_c84",
    ],
    "max_results_per_search": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/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 '{
  "search_urls": [
    "https://www.olx.pl/nieruchomosci/mieszkania/",
    "https://www.olx.com.pk/cars_c84"
  ],
  "max_results_per_search": 30
}' |
apify call mina_safwat/olx-scraper --silent --output-dataset

```

## MCP server setup

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