# OLX.ro Scraper (`ribtools/olxro-scraper`) Actor

Scrape OLX.ro listings in every category (goods, cars, property, jobs, services) from any search, seller or ad URL: price in EUR or RON, attributes, photos, location. Optional add-on: business seller contacts. Proxies included.

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

## Pricing

from $1.99 / 1,000 listing data 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.ro Scraper

Scrape OLX.ro, Romania's largest classifieds site, in every category (electronics, cars, property, jobs, services, animals and more): prices in EUR or RON, salaries, attributes, photos, location and business seller contacts.

### What is OLX.ro Scraper?

**OLX.ro Scraper** is a data extraction tool that automatically collects listings (anunturi) from [OLX.ro](https://www.olx.ro), OLX Romania, the country's biggest marketplace for new and used goods, cars (autoturisme), property (imobiliare), jobs (locuri de munca) and services. Simply provide starting URLs and get structured data including title, description, price or salary, category attributes, photos, city, county, map location, seller type and listing dates.

This scraper handles pagination, searches larger than OLX.ro's 1,000-result limit and data normalization automatically, delivering clean, structured datasets ready for analysis or integration into your systems.

### What can this Actor do?

- **Extract comprehensive listing data** — title, description, price and currency (EUR or RON), the price converted to the search's display currency, negotiable flag, old price and price drop, job salaries, category attributes (model, year, mileage, area, rooms, condition...), photos, city, county, district, map location, promotion flags, OLX delivery and listing dates
- **Handle multiple entry points** — search, category, county and city pages with any filter, sort and currency, single ads, seller pages and seller shops
- **Automatic pagination** — crawls through every page of results, and splits searches with more than 1,000 results by county and price band, so you are not stuck at OLX.ro's 1,000-result cap
- **Business seller contacts (add-on)** — the company profile a business seller published on OLX: trading name, address, office phones, website, logo and shop page
- **Premium proxies included** — high-quality Romanian residential proxies built in at no additional cost
- **Structured output** — JSON, CSV, Excel formats available
- **API integration** — real-time data access through Apify API
- **Scheduled runs** — automated daily/weekly data collection

### What data can OLX.ro Scraper extract?

| Field | Description | Example |
| ----- | ----------- | ------- |
| **id** | OLX.ro ad identifier | `275845049` |
| **url** | Ad URL | `https://www.olx.ro/d/oferta/...-IDiFpTH.html` |
| **title** | Ad title (typed phone numbers and emails hidden) | `Iphone 15 Pro / Garantie 2 Ani` |
| **description** | Ad description as plain text (typed phone numbers and emails hidden) | `iPhone 15 Pro / Stare utilizat / 128gb...` |
| **category_id** / **category_type** | OLX.ro category id and family | `948` / `electronics` |
| **price** / **currency** | Asking price as the seller set it, EUR or RON (null on jobs, most services and "budget" prices) | `695` / `EUR` |
| **price_label** / **price_type** | Price as shown in the search's display currency, and its kind (price, arranged, exchange, budget, free) | `3 707,72 lei` / `price` |
| **price_converted** / **price_converted_currency** | The price in the search's display currency when the ad is priced in the other one | `3707.72` / `RON` |
| **is_negotiable** | Price marked negotiable | `false` |
| **old_price** / **price_drop_pct** | Previous price and the drop in % | `3000` / `10.0` |
| **salary_from** / **salary_to** / **salary_period** / **salary_is_gross** | Job ads: salary range, the site's salary type, gross or net | `3500` / `4000` / `min` / `false` |
| **photos** | Full-size photo URLs | `["https://frankfurt.apollo.olxcdn.com/..."]` |
| **city** / **region** / **neighborhood** | City, county and district | `Cluj-Napoca` / `Cluj` / `null` |
| **latitude** / **longitude** / **location_radius_km** | Map location as OLX.ro publishes it, and the radius it is blurred to | `45.750` / `21.229` / `3` |
| **seller_type** | business or private | `business` |
| **seller_id** | OLX.ro seller account id | `218919920` |
| **seller_name** / **seller_url** | Business trading name and OLX shop page | `Seria9.ro` |
| **is_promoted** / **is_highlighted** / **badges** | Paid promotion flags, "urgent" badge | `false` / `true` / `[]` |
| **attributes** | Category attributes by key | `{"model": "iPhone 15 Pro"}` |
| **has_phone** / **has_delivery** | Phone reveal offered, OLX delivery offered | `true` / `false` |
| **partner** / **external_url** | Source and link of a cross-posted ad (Autovit, Storia, job feeds) | `autovit` |
| **listed_at** / **first_listed_at** / **bumped_at** / **expires_at** | Listing dates, ISO 8601 UTC | `2026-10-14T09:25:34Z` |
| **seller** | Business seller's company profile (add-on) | see the output example |

### How to scrape OLX.ro

#### Step-by-step tutorial:

1. **Add starting URLs** — Enter OLX.ro search, ad, seller or shop URLs (see compatible formats below)
2. **Configure options** (optional) — set the maximum number of listings and turn on the business seller data add-on
3. **Run the scraper** — Click "Start" and monitor progress in real-time
4. **Download results** — Export data in JSON, CSV, or Excel format

Proxies are included automatically — no setup required.

#### Compatible URL examples:

- **Search with filters, sort and currency**: `https://www.olx.ro/imobiliare/apartamente-garsoniere-de-vanzare/bucuresti/?currency=RON&search[filter_float_price:to]=100000&search[order]=filter_float_price:asc`
- **Keyword search in every category**: `https://www.olx.ro/oferte/q-bicicleta/`
- **Category**: `https://www.olx.ro/auto-masini-moto-ambarcatiuni/autoturisme/`
- **Brand in a city**: `https://www.olx.ro/auto-masini-moto-ambarcatiuni/autoturisme/volvo/bacau/`
- **County**: `https://www.olx.ro/bucuresti-ilfov-judet/`
- **Jobs**: `https://www.olx.ro/locuri-de-munca/iasi_39939/`
- **Single ad**: `https://www.olx.ro/d/oferta/iphone-15-pro-garantie-2-ani-seria9-ro-IDiFpTH.html`
- **Job ad**: `https://www.olx.ro/oferta/loc-de-munca/...-IDl14aH.html`
- **Seller page**: `https://www.olx.ro/oferte/user/xpziy/`
- **Seller shop**: `https://autoluxuri.olx.ro/home/`

The `/d/...` links, paged links (`?page=3`) and the `olx.ro` and `m.olx.ro` hosts work too. A pasted `currency=RON` or `currency=EUR` is kept: it sets the unit of the price filters and the currency of `price_label` and `price_converted`.

**Important**: Only URLs matching these patterns will work. Autovit (autovit.ro) and Storia (storia.ro) URLs are not OLX.ro and are skipped; their ads cross-posted on OLX.ro are returned with `partner` set.

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

OLX.ro Scraper uses **pay-per-event** pricing — you only pay for listings it returns.

#### Is scraping OLX.ro free?

The scraper follows Apify's pay-per-event model with the following structure:

- **Base extraction**: one charge per listing returned ($2.99 per 1,000 on the free plan, $1.99 per 1,000 on GOLD and above), plus a tiny charge per Actor start
- **Business seller data add-on**: one additional charge per listing returned with the seller's company profile ($1.99 per 1,000 on the free plan, $0.99 per 1,000 on GOLD and above), only when the profile has a trading name, phone, address or website; private sellers are never charged for it

Pricing is optimized for efficiency, using minimal compute units while maintaining high success rates. Contact support for volume discounts on large-scale projects.

### Input configuration

The scraper accepts the following inputs:

#### Start URLs

OLX.ro URLs copied from your browser: search, category, county and city pages with any filter, sort and currency, single ads, seller pages and seller shops (see the compatible formats above). Searches with more than 1,000 results are split automatically by county and price band.

#### Maximum items

The maximum number of listings to scrape across all URLs (each listing is a charged event). Leave it empty to scrape everything the URLs list.

#### Fetch business seller data (add-on)

Adds the company profile of business sellers in the `seller` field: trading name, business type, address, postal code, city, office phones, website, logo, profile and shop page, member-since date and the company description, as the company published them on OLX.ro. Private sellers never return personal data. Charged only when the profile has a name, phone, address or website.

### Output example

```json
{
  "type": "listing",
  "id": 275845049,
  "url": "https://www.olx.ro/d/oferta/iphone-15-pro-garantie-2-ani-seria9-ro-IDiFpTH.html",
  "title": "Iphone 15 Pro / Garantie 2 Ani / Seria9.ro",
  "category_id": 948,
  "category_type": "electronics",
  "seller_type": "business",
  "description": "Vezi dacă mai e disponibil pe seria9.ro\n\n- iPhone 15 Pro / Stare utilizat / 128gb / de la 2700 lei\n\n- iPhone 15 Pro / Stare utilizat / 256gb / de la 3000 lei",
  "price": 2699.99,
  "currency": "RON",
  "price_label": "2 699,99 lei",
  "price_type": "price",
  "is_negotiable": false,
  "old_price": null,
  "price_drop_pct": null,
  "price_converted": null,
  "price_converted_currency": null,
  "salary_from": null,
  "salary_to": null,
  "salary_period": null,
  "salary_is_gross": null,
  "photos": [
    "https://frankfurt.apollo.olxcdn.com:443/v1/files/iqjf3x01csw61-RO/image;s=2250x1875",
    "https://frankfurt.apollo.olxcdn.com:443/v1/files/9voz93tgmqot2-RO/image;s=1512x2016"
  ],
  "city": "Timisoara",
  "region": "Timis",
  "neighborhood": null,
  "latitude": 45.75015,
  "longitude": 21.22929,
  "location_radius_km": 3,
  "seller_id": "218919920",
  "seller_name": "Seria9.ro",
  "seller_url": "https://seria9.olx.ro/home/",
  "is_promoted": false,
  "is_highlighted": true,
  "badges": [],
  "attributes": {
    "model": "iPhone 15 Pro",
    "state": "Utilizat"
  },
  "has_phone": false,
  "has_delivery": false,
  "partner": null,
  "external_url": null,
  "listed_at": "2026-10-14T09:25:34Z",
  "first_listed_at": "2024-09-26T09:04:59Z",
  "bumped_at": "2026-10-14T09:25:34Z",
  "expires_at": "2026-11-07T17:04:41Z",
  "seller": {
    "id": "218919920",
    "business_name": "Seria9.ro",
    "business_type": "premium",
    "address": "Bulevardul Cetatii 9",
    "postal_code": "300389",
    "city": "Timisoara",
    "phones": [],
    "website": "https://seria9.ro/",
    "logo": "https://img-resizer.prd.01.eu-west-1.eu.olx.org/img-eu-olxro-production/289665053_1_94x72_rev016.jpg",
    "profile_url": "https://www.olx.ro/oferte/user/eOz4s/",
    "shop_url": "https://seria9.olx.ro/home/",
    "member_since": "2019-06-21",
    "about": "Descoperă avantajele exclusiviste pe care le oferă Seria9 în lumea telefoanelor second-hand..."
  }
}
```

A rent ad priced at 695 EUR, scraped from a search in lei (`currency=RON`), comes back with `"price": 695`, `"currency": "EUR"`, `"price_label": "3 707,72 lei"`, `"price_converted": 3707.72` and `"price_converted_currency": "RON"`.

You can download the dataset extracted by **OLX.ro Scraper** in various formats such as **JSON, HTML, CSV, or Excel**. The data is automatically cleaned and normalized for immediate use in analysis tools, databases, or business applications.

### Use cases and applications

- **Price monitoring** — track asking prices in EUR and RON, price drops and exchange offers for any product or category
- **Real estate analysis** — collect apartments (apartamente), houses and rentals by city and district from OLX.ro Imobiliare
- **Market research** — measure supply by category, city and county across Romania
- **Lead generation** — find business sellers and shops with their published company contacts
- **Job market analysis** — collect salary ranges by role and city from OLX.ro Locuri de munca

### Integrations and API access

OLX.ro Scraper seamlessly integrates with popular platforms:

- **Zapier** — Automate data workflows and notifications (via [Apify Zapier integration](https://docs.apify.com/platform/integrations/zapier))
- **Make (Integromat)** — Create complex automation scenarios (via [Apify Make integration](https://www.make.com/en/integrations/apify))
- **Google Sheets** — Direct data export for analysis
- **REST API** — Programmatic access to extracted data ([instructions here](https://docs.apify.com/academy/api/run-actor-and-retrieve-data-via-api))
- **Python/Node.js SDKs** — Easy integration into applications ([instructions here](https://docs.apify.com/academy/api/run-actor-and-retrieve-data-via-api#javascript-and-python-client))

### FAQ and Support

#### Do I need to configure a proxy?

No. The Actor includes high-quality Romanian residential proxies automatically at no additional cost. There's nothing to configure.

#### Which currency are prices in?

`price` and `currency` are the ad's own figure, in EUR or RON as the seller set it (cars and property are mostly in EUR, goods mostly in RON). OLX.ro shows every price of a search in one display currency and converts the ads priced in the other one: that figure comes back in `price_converted` and `price_converted_currency`, and `price_label` is the price as OLX.ro shows it. Add `currency=RON` or `currency=EUR` to the search URL to choose the display currency.

#### Why are there no names or phone numbers for private sellers?

To respect the privacy of private individuals under the EU's GDPR, private sellers come back with their seller type and account id only: no name, no phone, no shop. When a private seller pins the exact address of a property on the map, its coordinates are left empty; locations OLX.ro blurs to a circle are returned as published. Business sellers return their trading name, never the account holder's personal name. Phone numbers are never revealed: the business seller add-on returns only the office phones a company published in its OLX profile. VINs, dog microchip and pedigree numbers and CUI/CIF tax ids are not extracted either. Phone numbers and email addresses typed into a title or description are replaced with `[phone hidden]` and `[email hidden]` for every seller type, including foreign numbers and the forms sellers use to get past OLX.ro's own masking (`0 7 4 4 - 1 2 3 - 4 5 6`, `0744 si 123 si 456`, `ion(arond)gmail.com`). Numbers OLX.ro already masks (`07******34`) come back as OLX.ro shows them.

#### Can I scrape more than 1,000 results from one search?

Yes. OLX.ro shows at most 1,000 results per search. When a search has more, the scraper splits it by county and then by price band, walks each slice, and drops the duplicates, so you get the whole search.

#### How often is the data updated?

OLX.ro updates listings in real-time. For fresh data, schedule regular scraper runs or use our API for on-demand extraction.

#### What if some URLs don't work?

The scraper only supports specific URL patterns from OLX.ro. Ensure your URLs match the compatible formats listed above. A URL OLX.ro doesn't know, or a filter it rejects, is skipped, the run goes on with the other URLs, and the run's status message says what was skipped and why.

#### Do you offer custom solutions?

Absolutely! We can customize the scraper for specific requirements, additional data points, or integration with your existing systems. Contact us through the Issues tab for enterprise solutions.

#### Need help or have feedback?

- **Report issues**: Use the Issues tab for bug reports and feature requests
- **Custom development**: Contact us for tailored solutions and enterprise integrations

# Changelog

This Actor's version history is a separate document: https://apify.com/ribtools/olxro-scraper/changelog.md

# Actor input Schema

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

OLX.ro URLs copied from your browser: any search or category page with its filters, sort and currency (`/imobiliare/apartamente-garsoniere-de-vanzare/bucuresti/?currency=RON&search[filter_float_price:to]=100000`, `/oferte/q-bicicleta/`, `/auto-masini-moto-ambarcatiuni/autoturisme/`, `/locuri-de-munca/bucuresti/`), single ads (`/d/oferta/...-IDkO7AA.html`), seller pages (`/oferte/user/...`) and shops (`<shop>.olx.ro/home/`). Searches with more than 1,000 results are split automatically. Autovit and Storia URLs are not OLX.ro.

## `maxRequests` (type: `integer`):

Maximum number of listings to scrape (each result is a charged event). Leave empty for no limit.

## `sellerDataAddon` (type: `boolean`):

Add the company profile of business sellers: trading name, address, office phones, website, logo and shop page, as the company published them on OLX. Private sellers never return personal data. Charged only when the profile has a name, phone, address or website.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.olx.ro/electronice-si-electrocasnice/telefoane-mobile/q-iphone/"
    }
  ],
  "maxRequests": 10,
  "sellerDataAddon": false
}
```

# Actor output Schema

## `items` (type: `string`):

All scraped listings.

# 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.ro/electronice-si-electrocasnice/telefoane-mobile/q-iphone/"
        }
    ],
    "maxRequests": 10,
    "sellerDataAddon": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("ribtools/olxro-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.ro/electronice-si-electrocasnice/telefoane-mobile/q-iphone/" }],
    "maxRequests": 10,
    "sellerDataAddon": False,
}

# Run the Actor and wait for it to finish
run = client.actor("ribtools/olxro-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.ro/electronice-si-electrocasnice/telefoane-mobile/q-iphone/"
    }
  ],
  "maxRequests": 10,
  "sellerDataAddon": false
}' |
apify call ribtools/olxro-scraper --silent --output-dataset

```

## MCP server setup

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