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

Scrape OLX ads from Ukraine, Poland, Romania, Kazakhstan, Portugal, Bulgaria, and Uzbekistan: prices, descriptions, photos, sellers, locations. No login.

- **URL**: https://apify.com/donjuan_mime/olx-scraper.md
- **Developed by:** [Donjuan](https://apify.com/donjuan_mime) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.75 / 1,000 ads

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

## OLX Scraper: ads, prices, sellers, and photos from 7 countries

OLX Scraper collects ads from OLX in Ukraine, Poland, Romania, Kazakhstan, Portugal, Bulgaria, and Uzbekistan. For every ad you get the title, full description, price and currency, all category attributes (condition, brand, mileage, area, and so on), location with city, district, and region, photos, publish and refresh dates, promotion flags, and the seller's name, type, and account age.

You don't need an OLX account or any code. Paste a link to any OLX search or category page with your filters, or type a keyword, press **Start**, and download the results as JSON, CSV, Excel, XML, or HTML.

### What can you do with OLX data?

- **Monitor prices.** Track what a phone, a car model, or a flat costs in each city and how prices change week to week.
- **Find deals first.** Run a search sorted by newest every hour and get new ads before other buyers see them.
- **Research a market.** Count ads per category, city, or condition, and compare private sellers with businesses.
- **Watch competitors.** See what other shops sell on OLX, at what prices, and how often they pay for promotion.
- **Generate leads.** Collect business sellers in your niche with their company names and shop links.
- **Build datasets.** Export thousands of real listings with prices and attributes for analysis or machine learning.

### What data does OLX Scraper extract?

| Group | Fields |
|---|---|
| Ad | ID, URL, title, full description, publish time, last refresh time, expiry time |
| Price | value, currency, negotiable flag, price as shown on OLX, previous price after a discount |
| Attributes | every category attribute with its key, name, and value (for example condition, brand, year, mileage, rooms, area) |
| Location | city, district, region, approximate coordinates |
| Photos | links to every photo in full size |
| Promotion | promoted flag, highlighted, urgent, and top ad features |
| Seller | ID, UUID, name, company name, business or private, about text, on OLX since, last seen, shop link |
| Contact options | whether the seller enabled phone, chat, OLX delivery, and price offers |
| Category | ID, type, name, and path |
| Source | country and the URL or keyword that found the ad |

### How to scrape OLX

1. Open the actor and go to the **Input** tab.
2. Either paste OLX links into **OLX search or category URLs**, or add keywords to **Search queries** and pick a country.
3. Set **Max ads per URL or query**.
4. Press **Start**. When the run finishes, open the **Output** tab to preview the table, or press **Export** to download the data.

The easiest way to use filters is to set them up on the OLX site: choose a category, a city, a price range, a condition, and a sort order, then copy the address from your browser. The actor reads all of those filters from the link.

### Input

| Field | Type | Description |
|---|---|---|
| `startUrls` | array | Links to OLX search or category pages from any supported country. Filters, sorting, and location come from the link. |
| `searchQueries` | array of strings | Keywords to search for. |
| `country` | string | Where to run the search queries: `ua`, `pl`, `ro`, `kz`, `pt`, `bg`, or `uz`. Start URLs use the country of their own link. |
| `sortBy` | string | Order for search queries: `relevance`, `newest`, `cheapest`, or `most_expensive`. |
| `maxItems` | integer | The maximum number of ads from each start URL and each search query. |
| `excludePromoted` | boolean | Skip the paid ads OLX places on top of every results page. |
| `proxyCountryCode` | string | A two-letter country code to use Apify residential proxy in that country. `None` uses Apify datacenter proxy. |

#### Input example

```json
{
  "startUrls": [
    { "url": "https://www.olx.ua/uk/elektronika/telefony-i-aksesuary/mobilnye-telefony-smartfony/kiev/?search%5Bfilter_float_price:from%5D=10000&search%5Border%5D=created_at:desc" },
    { "url": "https://www.olx.pl/motoryzacja/samochody/warszawa/?search%5Bfilter_float_price:to%5D=30000" }
  ],
  "searchQueries": ["iphone 15", "macbook air"],
  "country": "ua",
  "sortBy": "newest",
  "maxItems": 200,
  "excludePromoted": false,
  "proxyCountryCode": "None"
}
```

### Output

Every ad becomes one item in the dataset.

#### Output example

A real ad from olx.ua. Long texts are shortened.

```json
{
  "id": 936142003,
  "url": "https://www.olx.ua/d/uk/obyavlenie/iphone-14-plus-128-gb-neverlock-magazin-garantya-ID11lXiz.html",
  "title": "iPhone 14 Plus 128 GB Neverlock | Магазин | Гарантія",
  "description": "iPhone 14 Plus 128 GB neverlock | Айфон 14 Плюс 128 ГБ Неверлок\n\nЄмність акумулятора: 92%\n\nПрацює з усіма операторами\n\n...",
  "price": {
    "value": 15900,
    "currency": "UAH",
    "negotiable": false,
    "label": "15 900 грн."
  },
  "params": [
    { "key": "mobile_phone_manufacturer", "name": "Марка телефону", "value": "Apple" },
    { "key": "state", "name": "Стан", "value": "Вживане" },
    { "key": "mobile_phone_diagonal", "name": "Діагональ екрану", "value": "Більше 6\"" },
    { "key": "operating_system", "name": "Операційна система", "value": "iOS" }
  ],
  "location": {
    "city": "Київ",
    "district": "Дніпровський",
    "region": "Київська область",
    "lat": 50.45964,
    "lon": 30.61717
  },
  "createdTime": "2026-09-27T14:00:46.000Z",
  "lastRefreshTime": "2026-10-18T14:00:51.000Z",
  "validToTime": "2026-10-27T14:00:47.000Z",
  "promoted": false,
  "promotion": { "highlighted": false, "urgent": false, "topAd": false },
  "photos": [
    "https://ireland.apollo.olxcdn.com:443/v1/files/93kincz1b5mv-UA/image;s=4032x3024",
    "https://ireland.apollo.olxcdn.com:443/v1/files/6ar2uqi11k86-UA/image;s=4032x3024"
  ],
  "seller": {
    "id": 71943176,
    "uuid": "b4496579-245b-4a3e-886a-3d7f4a4298c2",
    "name": "Apple Space",
    "companyName": "Apple Space",
    "type": "business",
    "about": "Вас Вітає Apple Space, в нас Ви можете придбати iPhone...",
    "created": "2016-11-26T08:38:10.000Z",
    "lastSeen": "2026-10-18T13:46:40.000Z",
    "shopUrl": "https://applespace.olx.ua"
  },
  "contact": {
    "phoneAvailable": true,
    "chat": true,
    "courier": true,
    "negotiation": false
  },
  "category": {
    "id": 85,
    "type": "electronics",
    "name": "Смартфони / мобільні телефони",
    "path": "elektronika/telefony-i-aksesuary/mobilnye-telefony-smartfony"
  },
  "country": "ua",
  "input": "https://www.olx.ua/uk/elektronika/telefony-i-aksesuary/mobilnye-telefony-smartfony/kiev/?search%5Bfilter_float_price:from%5D=10000&search%5Border%5D=created_at:desc"
}
```

#### Output fields

| Field | Description |
|---|---|
| `id`, `url`, `title` | The ad's OLX ID, link, and title. |
| `description` | The full ad text with line breaks kept and HTML removed. |
| `price` | Value, currency, negotiable flag, and the price as OLX shows it. `previousValue` appears when the seller lowered the price. Ads without a price, such as some jobs and services, have no `price`. |
| `params` | All category attributes. Keys stay the same across languages, names and values come in the site's language. |
| `location` | City, district (in large cities), region, and approximate coordinates. OLX blurs the exact spot. |
| `createdTime`, `lastRefreshTime`, `validToTime` | Publish time, last renewal or bump, and expiry, as ISO 8601 strings in UTC. |
| `promoted`, `promotion` | Whether the ad is one of the paid ads on top of the results page, and which paid features it has. |
| `photos` | Full-size photo links. |
| `seller` | Seller ID, name, company name, `business` or `private`, about text, account creation time, last seen time, and shop link when the seller has an OLX shop. |
| `contact` | Which contact options the seller enabled. |
| `category` | Category ID, type, name, and path in the site's language. |
| `country`, `input` | The OLX country and the start URL or keyword that found the ad. |

### How many ads can I get?

OLX shows up to about 1,000 regular ads per search, plus the promoted ads on each page. In our tests a broad search for `iphone` on olx.ua returned 1,244 unique ads. To collect more, split the search: add one start URL per city, per category, or per price range.

### How fast is it?

The actor reads OLX's own data feed instead of loading pages in a browser. In our tests 100 ads took 1 to 2 seconds, and 1,244 ads took 11 seconds. Runs need little memory, so they stay cheap.

### Does it scrape phone numbers?

No. OLX shows phone numbers only to logged-in users after a click, and the actor doesn't log in. `contact.phoneAvailable` tells you whether the seller added a phone number.

### How much does it cost?

You pay $1.00 per 1,000 ads saved to the dataset. Proxy and platform usage are included.

### Export and integrations

The results go into an Apify dataset. From there you can:

- download them as JSON, CSV, Excel, XML, HTML, or RSS from the **Output** tab;
- send them to Google Sheets, Slack, Zapier, Make, and other tools through Apify integrations;
- schedule runs, for example every hour, to catch new ads;
- start runs and read the results from your own code through the Apify API.

#### Run it through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/<username>~olx-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries": ["iphone"], "country": "pl", "maxItems": 100}'
```

The call waits for the run to finish and returns the ads as a JSON array.

### FAQ

#### Do I need an OLX account?

No. The actor reads public ads the same way a logged-out visitor sees them.

#### Which OLX sites are supported?

olx.ua, olx.pl, olx.ro, olx.kz, olx.pt, olx.bg, and olx.uz. They run on the same engine, so every feature works on all of them.

#### Can I scrape a single ad?

Start URLs take search and category pages. Links to single ads are skipped with a note in the log.

#### Why do some ads have no district or no price?

OLX shows districts only in large cities, and some categories, such as jobs or free items, have no price.

#### What language is the data in?

Titles and descriptions come as the seller wrote them. Category names and attribute names come in the language of the OLX site.

#### Is it legal to scrape OLX?

The actor collects only public data that anyone can see without logging in. Ads can still contain personal data, such as seller names, so make sure you have a legitimate reason to collect it and follow the GDPR and other laws that apply to you. If you're not sure, ask a lawyer.

### Disclaimer

This actor is provided as is, without warranty. You're responsible for how you use it and for following OLX's terms of service and the laws that apply to you. OLX isn't affiliated with this actor.

# Actor input Schema

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

Links to OLX search results or category pages from any supported country. Set up filters, sorting, and location on the OLX site, then paste the URL here.

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

Keywords to search for in the country chosen below.

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

The OLX site to run the search queries on. Start URLs use the country of their own link.

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

Order of results for search queries. Start URLs keep the sorting from their link.

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

The maximum number of ads to scrape from each start URL and each search query. OLX shows up to about 1,000 regular ads per search.

## `excludePromoted` (type: `boolean`):

Skip the paid ads OLX places on top of every results page.

## `proxyCountryCode` (type: `string`):

Two-letter country code (UA, PL, ...) to use Apify residential proxy in that country. "None" uses Apify datacenter proxy.

## Actor input object example

```json
{
  "searchQueries": [
    "iphone"
  ],
  "country": "ua",
  "sortBy": "relevance",
  "maxItems": 50,
  "excludePromoted": false,
  "proxyCountryCode": "None"
}
```

# Actor output Schema

## `ads` (type: `string`):

One item per OLX ad found by the start URLs and search queries.

# 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": [
        "iphone"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("donjuan_mime/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 = {
    "searchQueries": ["iphone"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("donjuan_mime/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 '{
  "searchQueries": [
    "iphone"
  ],
  "maxItems": 50
}' |
apify call donjuan_mime/olx-scraper --silent --output-dataset

```

## MCP server setup

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