# OLX.pl Scraper | Listings, Prices & Seller Data (`solidcode/olx-pl-scraper`) Actor

\[💰 $3.00 / 1K] Scrape OLX.pl classified ads at scale. Extract titles, prices, locations, seller info, photos, descriptions, and category attributes from any keyword, category, or search URL on Poland's largest marketplace.

- **URL**: https://apify.com/solidcode/olx-pl-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Developer tools, Automation, E-commerce
- **Features:** Limited permissions
- **Stats:** 56 total users, 7 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.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.
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.pl Scraper

Pull classified ads from OLX.pl — Poland's largest marketplace — at scale across cars, real estate, electronics, furniture, fashion, jobs, and 15 top-level categories. Type a keyword like "iphone", pick a category and voivodeship, or paste any OLX.pl search, category, or ad URL, and get back the price, full location, seller, description, category-specific attributes, and every photo the ad carries. Built for resellers, market analysts, and lead-gen teams who need a clean, structured OLX.pl dataset without copying ads one page at a time.

### Why This Scraper?

- **Real classifieds schema, not a forced e-commerce template** — every row carries `sellerType` (private vs. business), `sellerName`, `sellerId`, and `sellerRegisteredAt`, so you know exactly who is selling. No empty SKU/GTIN/in-stock columns bolted onto a marketplace that never fills them.
- **Plain-text keyword search** — type "fotel" or "iPhone 15" and the actor builds the OLX query for you. Run several keywords in one go; ads matching more than one are deduplicated by ad ID.
- **8 filter dimensions pushed into the OLX search** — 15 top-level categories, 16 Polish voivodeships, PLN price floor and ceiling, seller type, item condition (new/used), and 4 sort orders. You only collect ads that match, never client-side throwaway.
- **Voivodeship-level location on every ad** — region (województwo), city, and district broken out as separate fields, plus latitude/longitude on big-city listings.
- **Flexible `params` attribute map** — mileage, year, and fuel for cars; area m² and rooms for property; size and brand for fashion — OLX's category-specific fields captured as clean key/value pairs instead of being dropped.
- **Posted and refreshed timestamps** — `postedAt` and `refreshedAt` on every ad, so you can sort by recency or track how often a seller bumps a listing.
- **Paste-a-URL power mode** — already filtered a search in your browser? Drop the OLX.pl URL into Start URLs and the actor honours every filter in it; individual ad URLs work too.
- **Up to 1,000 ads per query** — hits OLX's own per-search ceiling with smooth pagination, deduplicating the promoted ads OLX blends into every page.
- **No compute charges** — you only pay per result returned.

### Use Cases

**Market Research & Price Monitoring**

- Track the going rate for a product category over time across Poland
- Compare asking prices between private sellers and dealers for the same model
- Spot pricing gaps and arbitrage opportunities region by region
- Measure supply by voivodeship for any keyword or category

**Reselling & Sourcing**

- Find underpriced cars, electronics, or furniture filtered by condition and price band
- Monitor newest-first listings to be first to contact a seller
- Source inventory in a single region with the voivodeship filter
- Filter to private sellers only to avoid dealer markups

**Lead Generation & B2B**

- Build contact lists of businesses advertising on OLX for B2B outreach
- Identify active dealers in a category by filtering to business sellers
- Target sellers in a specific voivodeship or city

**Data Enrichment & Analytics**

- Populate internal databases with Polish second-hand market data
- Feed live OLX listings into pricing dashboards and comparison tools
- Enrich product catalogues with real-world resale valuations

**Research & Journalism**

- Study Poland's classifieds economy at scale
- Analyse regional supply-and-demand patterns by region
- Investigate category-level pricing and seller behaviour

### Getting Started

#### Keyword Search

The simplest way to start — just type what you are looking for:

```json
{
    "searchQueries": ["iphone"],
    "maxResults": 100
}
```

#### Category & Region with Price Range

Narrow a vertical to one voivodeship and a budget:

```json
{
    "searchQueries": ["fotel biurowy"],
    "category": "dom-ogrod",
    "region": "mazowieckie",
    "priceMin": 100,
    "priceMax": 500,
    "sortBy": "newest",
    "maxResults": 300
}
```

#### Paste an OLX.pl URL

Already filtered a search in your browser? Paste the URL directly:

```json
{
    "startUrls": [
        "https://www.olx.pl/motoryzacja/samochody/",
        "https://www.olx.pl/elektronika/telefony/?search%5Bfilter_float_price%3Afrom%5D=200"
    ],
    "maxResults": 500
}
```

#### Advanced: Filtered Multi-Keyword Run

```json
{
    "searchQueries": ["bmw e46", "audi a4 b7"],
    "category": "motoryzacja",
    "region": "slaskie",
    "priceMin": 5000,
    "priceMax": 25000,
    "sellerType": "private",
    "condition": "used",
    "sortBy": "price-asc",
    "maxResults": 1000
}
```

### Input Reference

#### Search

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQueries` | string\[] | `[]` | Keywords to search on OLX.pl (Polish or English). Each keyword runs as its own search; ads matching more than one are deduplicated by ad ID. Leave empty to collect the unfiltered listing for the chosen category and region. |
| `category` | select | `All categories` | Limit to one top-level OLX category: All categories, Motors (Motoryzacja), Real Estate (Nieruchomości), Jobs (Praca), Electronics (Elektronika), Home & Garden (Dom i Ogród), Fashion (Moda), Agriculture (Rolnictwo), Animals (Zwierzęta), For Kids (Dla Dzieci), Sport & Hobby (Sport i Hobby), Music & Education (Muzyka i Edukacja), Services (Usługi), Rentals (Wypożyczalnia), Accommodation (Noclegi), or Free / Giveaway (Oddam za darmo). |
| `region` | select | `All of Poland` | Restrict to a single Polish voivodeship (województwo) — all 16 are available, from Dolnośląskie to Zachodniopomorskie — or leave on All of Poland to search nationwide. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `priceMin` | integer | — | Only include ads priced at or above this amount in Polish złoty (PLN). Leave empty for no minimum. |
| `priceMax` | integer | — | Only include ads priced at or below this amount in Polish złoty (PLN). Leave empty for no maximum. |
| `sellerType` | select | `All sellers` | Filter by who is selling: All sellers, Private sellers only (Osoby prywatne), or Businesses only (Firmy). |
| `condition` | select | `Any condition` | Filter by item condition: Any condition, New (Nowe), or Used (Używane). This is a category-specific OLX filter — pair it with a keyword or a goods category for it to take effect. On an all-categories browse with no keyword, OLX ignores it. |
| `sortBy` | select | `Most relevant` | Order in which to collect results: Most relevant (default), Newest first, Cheapest first, or Most expensive first. |

#### Advanced Search

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | string\[] | `[]` | Paste OLX.pl URLs directly — search-result pages, category pages, or individual ad pages. When provided, these override the Search Keywords, Category, Region, and Filters fields above. |

#### Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Maximum number of ads to collect across all searches and URLs. Set to 0 for no cap (an internal safety limit of 100,000 still applies). Results are collected in full pages, so the final page of each search may overshoot by a few rows. |

### Output

Each ad is saved as one row in your dataset. Here is a representative car listing:

```json
{
    "id": "987654321",
    "url": "https://www.olx.pl/d/oferta/bmw-e46-320i-2003-CID5-ID1aibNd.html",
    "title": "BMW E46 320i 2003 — zadbany, serwisowany",
    "description": "Sprzedam BMW E46 320i, rok 2003. Auto zadbane, regularnie serwisowane...",
    "price": 12500.0,
    "currency": "PLN",
    "priceText": "12 500 zł",
    "negotiable": true,
    "category": "Samochody osobowe",
    "categoryId": 81,
    "region": "Śląskie",
    "city": "Katowice",
    "district": "Śródmieście",
    "latitude": 50.2599,
    "longitude": 19.0216,
    "sellerName": "Marek",
    "sellerType": "private",
    "sellerId": "12345678",
    "sellerRegisteredAt": "2017-03-12T09:41:00+01:00",
    "condition": "Używane",
    "imageUrl": "https://ireland.apollo.olxcdn.com/v1/files/abc123/image;s=800x600",
    "imageUrls": [
        "https://ireland.apollo.olxcdn.com/v1/files/abc123/image;s=800x600",
        "https://ireland.apollo.olxcdn.com/v1/files/def456/image;s=800x600"
    ],
    "params": {
        "make": "BMW",
        "model": "E46",
        "year": "2003",
        "mileage": "198000 km",
        "fuel_type": "Benzyna",
        "gearbox": "Manualna"
    },
    "postedAt": "2026-05-26T14:08:00+02:00",
    "refreshedAt": "2026-05-27T08:30:00+02:00",
    "isPromoted": false,
    "searchQuery": "bmw e46",
    "sourceUrl": null,
    "scrapedAt": "2026-05-28T10:15:00+00:00"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Unique OLX ad identifier |
| `url` | string | Direct link to the ad page |
| `title` | string | Ad title as shown on OLX |
| `description` | string | Full ad description, stripped to plain text |
| `condition` | string | Item condition ("Nowe" / "Używane"), when OLX exposes it |
| `params` | object | Category-specific attributes as key/value pairs (car mileage/year/fuel, property area/rooms, fashion size/brand, etc.) |
| `isPromoted` | boolean | `true` if the ad is a promoted / highlighted listing |
| `postedAt` | string | When the ad was posted (ISO timestamp) |
| `refreshedAt` | string | When the seller last refreshed the ad (ISO timestamp) |
| `scrapedAt` | string | ISO timestamp of data extraction |

#### Price

| Field | Type | Description |
|-------|------|-------------|
| `price` | number | Numeric price in PLN (null for free or exchange ads) |
| `currency` | string | Currency code (usually `"PLN"`) |
| `priceText` | string | Raw price label as shown ("12 500 zł", "Za darmo", "Zamienię") |
| `negotiable` | boolean | `true` if the price is marked negotiable ("do negocjacji") |

#### Category & Location

| Field | Type | Description |
|-------|------|-------------|
| `category` | string | Category name (e.g. "Samochody osobowe") |
| `categoryId` | number | OLX internal category ID |
| `region` | string | Voivodeship / region (województwo) |
| `city` | string | City |
| `district` | string | District or neighbourhood (big-city listings) |
| `latitude` | number | Listing latitude (when exposed) |
| `longitude` | number | Listing longitude (when exposed) |

#### Seller

| Field | Type | Description |
|-------|------|-------------|
| `sellerName` | string | Seller display name |
| `sellerType` | string | `"private"` or `"business"` |
| `sellerId` | string | Seller account identifier |
| `sellerRegisteredAt` | string | When the seller joined OLX |

#### Photos & Provenance

| Field | Type | Description |
|-------|------|-------------|
| `imageUrl` | string | Main photo URL |
| `imageUrls` | array | All photo URLs for the ad |
| `searchQuery` | string | The keyword that produced this row |
| `sourceUrl` | string | The search or category URL that produced this row |

Photo fields fill on goods categories — cars, property, electronics, furniture, fashion. Job ads (Praca) are published on OLX without images, so `imageUrl` and `imageUrls` come back empty for that category; use `params` for the salary, contract type, and working hours instead.

### Tips for Best Results

- **Search in Polish for the most results** — OLX is a Polish marketplace. Use "fotel" instead of "armchair" or "mieszkanie" instead of "apartment" to match how sellers title their ads.
- **Break past the 1,000-ad ceiling** — OLX caps a single search or URL at 1,000 ads regardless of how many exist. To gather more, split one broad search into several narrower ones: run separate keywords, categories, regions, or price bands. Each one gets its own 1,000-ad budget, so three price bands triple your reach.
- **Filter to private sellers** for second-hand sourcing, or to businesses for dealer and B2B lists — `sellerType` is pushed into the OLX query, so you only pull the side you want.
- **Use Newest first** when monitoring fresh listings as they appear, and **Cheapest first** to surface the best deals at the top of your results.
- **Paste filtered URLs from your browser** — apply category, region, and price filters on OLX.pl first, then copy the address bar into Start URLs. The actor honours every filter in the URL.
- **Start small** — run with `maxResults` of 50–100 to confirm the data matches your needs, then scale up.
- **Read the `params` map per category** — a car carries mileage and year, an apartment carries area and rooms; the keys differ by category, so inspect a sample row before building downstream logic.

### Pricing

**From $3.00 per 1,000 results** — pay only for the ads you collect, with no minimum. Apify loyalty discounts apply automatically, so Bronze, Silver, and Gold subscribers pay progressively less per result.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.35 | $0.34 | $0.32 | $0.30 |
| 1,000 | $3.55 | $3.40 | $3.20 | $3.00 |
| 10,000 | $35.50 | $34.00 | $32.00 | $30.00 |
| 100,000 | $355.00 | $340.00 | $320.00 | $300.00 |

These tiered rates take effect on 6 September 2026; until then every result is billed at the current flat $3.00 per 1,000, and the Gold rate stays at $3.00 either way. No compute charges — you only pay per result returned. A "result" is any ad row in the output dataset. Platform fees (storage, data transfer) depend on your Apify plan and are additional.

### Integrations

Export your data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Trigger workflows automatically when new ads appear
- **Google Sheets** — Export results directly to a spreadsheet for analysis
- **Slack** / **Email** — Get notified when new matching ads are found
- **Webhooks** — Push data to your own systems in real time
- **Apify API** — Full programmatic access to schedule runs and automate pipelines

### Legal & Ethical Use

This actor is designed for legitimate market research, price monitoring, sourcing, and lead generation. Users are responsible for complying with applicable laws and OLX.pl's Terms of Service. Do not use collected data for spam, harassment, or any unlawful purpose, and handle any personal data in line with GDPR and other applicable privacy regulations.

# Actor input Schema

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

Keywords to search for on OLX.pl (Polish or English). Each keyword runs as its own search; ads matching more than one keyword are deduplicated by ad ID. Leave empty to collect the unfiltered listing for the chosen category and region.

## `category` (type: `string`):

Limit results to a single top-level OLX category. Leave on 'All categories' to search across everything.

## `region` (type: `string`):

Restrict results to a single Polish voivodeship (województwo). Leave on 'All of Poland' to search nationwide.

## `priceMin` (type: `integer`):

Only include ads priced at or above this amount in Polish złoty (PLN). Leave empty for no minimum.

## `priceMax` (type: `integer`):

Only include ads priced at or below this amount in Polish złoty (PLN). Leave empty for no maximum.

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

Filter by who is selling — private individuals only, businesses only, or both.

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

Filter by item condition (new or used). This is a category-specific OLX filter, so it works best when paired with a Search Keyword or a goods Category (electronics, fashion, home, etc.). On an all-categories browse with no keyword, OLX ignores it and returns ads of every condition — combine it with a keyword or category for it to take effect.

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

Order in which to collect results from OLX. Newest first gives the most recent ads at the top.

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

Power-user input. Paste OLX.pl URLs directly — search-result pages, category pages (e.g. https://www.olx.pl/motoryzacja/samochody/), or individual ad pages (e.g. https://www.olx.pl/d/oferta/...). When provided, these override the Search Keywords / Category / Region / Filters fields above.

## `maxResults` (type: `integer`):

Maximum number of ads to collect across all searches and URLs. Set to 0 for no cap (an internal safety limit of 100,000 still applies). Results are collected in full pages, so the final page of each search may overshoot this number by a few rows. Note: OLX caps a single search or URL at 1,000 ads — to gather more, split your search across several keywords, categories, regions, or price ranges (each one gets its own 1,000-ad budget).

## Actor input object example

```json
{
  "searchQueries": [
    "iphone"
  ],
  "category": "all",
  "region": "all",
  "sellerType": "all",
  "condition": "any",
  "sortBy": "relevance",
  "startUrls": [],
  "maxResults": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of ads with the key fields at a glance — title, price, category, location, seller, posted date, and ad URL.

## `details` (type: `string`):

Full per-ad fields including description, photo URLs, seller details, coordinates, category attributes, and timestamps.

# 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"
    ],
    "category": "all",
    "region": "all",
    "sellerType": "all",
    "condition": "any",
    "sortBy": "relevance",
    "startUrls": [],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/olx-pl-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"],
    "category": "all",
    "region": "all",
    "sellerType": "all",
    "condition": "any",
    "sortBy": "relevance",
    "startUrls": [],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/olx-pl-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"
  ],
  "category": "all",
  "region": "all",
  "sellerType": "all",
  "condition": "any",
  "sortBy": "relevance",
  "startUrls": [],
  "maxResults": 100
}' |
apify call solidcode/olx-pl-scraper --silent --output-dataset

```

## MCP server setup

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