# OLX Romania Scraper — Any Keyword (`reventadata/olx-ro-scraper`) Actor

Searches OLX.ro (Romania) for any keyword and returns priced listings with location, condition and promoted-placement status. No proxy required, any category.

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

## Pricing

from $1.00 / 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?

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

> **Unofficial.** This Actor is not affiliated with, authorised by, endorsed by, or in any
> way officially connected to OLX. "OLX" is a trademark of its respective owner and is used
> here only to describe what this tool reads. It reads the same public pages a browser does.

OLX Romania Scraper searches **any category** on [OLX.ro](https://www.olx.ro) - electronics,
vehicles, real estate, jobs, fashion - and returns priced listings with location, condition
and promoted-placement status.

### What data can you extract from OLX Romania (olx.ro)?

OLX.ro server-renders its search results, so this Actor reads the tiles directly rather than
driving a browser. It sends the price and condition filters OLX.ro itself supports, then
applies keyword and promoted-placement filters after fetching.

### Why scrape OLX Romania (olx.ro)?

- **Every category, one Actor.** No category lock-in - search any keyword across the whole
  site.
- **No proxy needed.** Measured over 25 sequential pages, OLX.ro let every request through
  with no proxy at all - this Actor runs cheaper than most classifieds scrapers as a result.
- **Condition filter is exact.** `new`/`used` returned a completely clean split in testing -
  no leaked cross-condition rows.
- **Promoted placements are labelled, not hidden.** A small number of paid listings are
  interspersed regardless of sort order. `isFeatured` marks them, and `excludeFeatured` drops
  them if you only want organic results (off by default, so they are returned).
- **The site's own "no results" fallback doesn't fool it.** A search with zero real matches
  still renders dozens of unrelated "similar ads" - this Actor detects the page's own
  "0 results" text and reports nothing, rather than returning those as fake matches.

### How to scrape OLX Romania (olx.ro)

1. Put one or more search terms in `searchQueries`. There is no default.
2. Optionally narrow with `condition`, a price range, or `sortBy`.
3. Run it. Results land in the dataset.

#### Input

| Field | Type | Meaning |
|---|---|---|
| `searchQueries` | array | One search per term. Required, no default. |
| `condition` | string | `any` | `new` | `used`. Verified as a clean filter - no cross-condition leakage. |
| `minPrice` / `maxPrice` | integer | Optional, in RON. Omitted from the request entirely when empty - never defaulted. |
| `sortBy` | string | `relevance` | `priceAsc` | `priceDesc` | `newest`. A handful of promoted listings ignore the sort regardless of value, so treat this as best-effort ordering, not an exact guarantee. |
| `excludeFeatured` | boolean | Drops paid promoted placements. Off by default. |
| `requireKeywordMatch` | boolean | Drop items whose title is missing **any word** of the query. OLX.ro's own search is fuzzy - a "laptop" search also returns laptop-repair services. Default on. |
| `maxItems` | integer | Hard cap on rows pushed. Default 1000. |
| `maxPages` | integer | Pages per term, clamped to the site's ceiling of 25. |
| `proxyConfiguration` | object | Off by default - OLX.ro completed 24 of 24 sequential page fetches with no proxy in testing. Turn it on only if you see request failures. |

```json
{
    "searchQueries": ["laptop"],
    "condition": "used",
    "maxPrice": 1500,
    "maxItems": 200
}
```

#### Output

```json
{
    "id": "308383611",
    "title": "Laptop hp in stare foarte bună",
    "url": "https://www.olx.ro/d/oferta/laptop-hp-in-stare-foarte-buna-IDkRVFd.html",
    "imageUrl": "https://frankfurt.apollo.olxcdn.com/v1/files/apzaizvc7upt-RO/image;s=216x152;q=50",
    "price": 250,
    "priceNegotiable": false,
    "currency": "RON",
    "location": "Buzau",
    "postedAt": "21 august 2026",
    "condition": "Utilizat",
    "isFeatured": false,
    "matchedKeyword": "laptop"
}
```

### Notes and limits

- **25 pages per search, roughly 1,300 ads.** OLX.ro's own ceiling: page 26 silently redirects
  back to page 1 rather than serving more, and pages further out serve a genuine error page.
  Narrow with `condition` or a price range to get past it.
- **No proxy is required.** Only Apify's datacenter proxy failed in testing; plain requests
  and every other transport worked. `proxyConfiguration` defaults to off.
- **Seller identity is never collected.** OLX.ro's search tiles publish no seller name, phone
  number or profile link anywhere in the markup, and this Actor does not fetch listing pages
  to find one.
- **Prices are seller-stated asking prices**, in RON, with the thousands-space stripped.
  `priceNegotiable` reflects the "Prețul e negociabil" tag some ads carry.
- **`condition` and `price` are both `null`, never 0/empty-string, when the ad states
  neither** - a listing with no visible price is not a free listing.
- **A run that returns zero rows fails rather than succeeding empty.** If every listing is
  filtered out, the Actor raises instead of writing an empty dataset, so a silent
  misconfiguration cannot look like "no stock today".
- **Sort order is best-effort.** A small number of paid promoted listings sit out of order
  regardless of `sortBy`; the organic listings trend in the requested direction but exact
  monotonic ordering was not proven end-to-end.
- Reads the same public page a browser does. See the disclaimer at the top.

### How much does it cost to scrape OLX Romania (olx.ro)?

Pricing is pay-per-event: **$0.001 per result** written to the dataset (**$1.00 per 1,000
results**), plus **$0.00005** charged once when the run starts. There is no subscription —
you pay only for what you get.

### FAQ

**Is a proxy required to scrape OLX Romania?** No. Measured over 25 sequential pages,
OLX.ro let every request through with no proxy at all, so `proxyConfiguration` defaults to
off.

**Is seller identity collected?** No. OLX.ro's search tiles publish no seller name, phone
number or profile link anywhere in the markup, and this Actor does not fetch listing pages
to find one.

**How many listings can one search return?** Up to 25 pages per search, roughly 1,300 ads —
OLX.ro's own ceiling. Page 26 silently redirects back to page 1 rather than serving more.

### More second-hand marketplace scrapers

| Actor | What it scrapes |
|---|---|
| [Wallapop Scraper](https://apify.com/reventadata/wallapop-scraper) | Wallapop, Spain — any keyword, phone mode with battery-health parsing |
| [Wallapop + Vinted + Milanuncios Scraper — Spain](https://apify.com/reventadata/wallapop-vinted-milanuncios-scraper) | Wallapop, Vinted and Milanuncios in Spain — one keyword, one merged table |
| [Cash Converters Spain Scraper](https://apify.com/reventadata/cashconverters-scraper) | Cash Converters Spain — graded second-hand stock with price when new |
| [Milanuncios Scraper](https://apify.com/reventadata/milanuncios-scraper) | Milanuncios — 17 categories, condition, storage and battery-health filters |
| [Gumtree UK Scraper](https://apify.com/reventadata/gumtree-scraper) | Gumtree UK — any category, vehicle and phone details parsed from the ad's own text |
| [OLX Brazil Scraper](https://apify.com/reventadata/olx-scraper) | OLX Brazil (olx.com.br) — any category, structured attributes from the site's own detail chips |
| [Vinted Spain Scraper](https://apify.com/reventadata/vinted-scraper) | Vinted Spain (vinted.es) — any keyword or category, no proxy required |
| [Todocolección Scraper](https://apify.com/reventadata/todocoleccion-scraper) | Todocolección — collectibles, antiques and auctions, fixed-price and bidding modelled apart |
| [Back Market Spain Scraper](https://apify.com/reventadata/backmarket-scraper) | Back Market Spain — refurbished phones, laptops and tablets, priced against new |
| [eBay Spain Scraper](https://apify.com/reventadata/ebay-scraper) | eBay Spain (ebay.es) — active listings with seller type |

# Actor input Schema

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

One search per term. Required, with no default — the Actor never guesses what to look for. Works across any OLX.ro category.

## `condition` (type: `string`):

Nou (new) or Utilizat (used). Verified as a clean filter: applying it returned only matching-condition cards in testing, no leakage.

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

Order only; changes nothing about which ads exist. A small number of paid promoted listings are interspersed regardless of sort order, so priceAsc/priceDesc/newest are best-effort, not an exact guarantee.

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

Optional. Omitted from the request entirely when empty — never defaulted to 0, which would drop every free listing.

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

Optional. Omitted from the request entirely when empty.

## `excludeFeatured` (type: `boolean`):

Drops listings whose card link is tagged search\_reason=promoted. Off by default, so they are returned and labelled with isFeatured.

## `requireKeywordMatch` (type: `boolean`):

Drop items whose title is missing any word of the query. OLX.ro search is fuzzy — a 'laptop' search also returns laptop-repair services and unrelated ads.

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

Hard cap on rows pushed across all search terms.

## `maxPages` (type: `integer`):

OLX.ro serves at most 25 pages per search (roughly 1,300 ads at ~52 per page); page 26 silently redirects back to page 1 rather than serving more. Clamped to that ceiling.

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

Optional. Measured over 25 sequential pages, OLX.ro needed no proxy at all — plain requests completed 24/24. Left off by default; only turn this on if you see request failures.

## Actor input object example

```json
{
  "searchQueries": [
    "laptop"
  ],
  "condition": "any",
  "sortBy": "relevance",
  "excludeFeatured": false,
  "requireKeywordMatch": true,
  "maxItems": 1000,
  "maxPages": 25,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `matches` (type: `string`):

Matching listings: price, location, condition, promoted status, and a link to the ad.

# 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": [
        "laptop"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("reventadata/olx-ro-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": ["laptop"] }

# Run the Actor and wait for it to finish
run = client.actor("reventadata/olx-ro-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": [
    "laptop"
  ]
}' |
apify call reventadata/olx-ro-scraper --silent --output-dataset

```

## MCP server setup

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