OLX Poland Classifieds Scraper – olx.pl Ads, Prices & Sellers
Pricing
from $1.75 / 1,000 results
OLX Poland Classifieds Scraper – olx.pl Ads, Prices & Sellers
Scrape classified ads from OLX Poland (olx.pl): title, price, price drops, condition, all item attributes, seller, location and photos. Search by keyword with filters for price, region, condition and sort — or scrape specific listing URLs.
Pricing
from $1.75 / 1,000 results
Rating
0.0
(0)
Developer
Haketa
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Features
Share
OLX Poland Classifieds Scraper 🇵🇱 — Ads, Prices, Attributes & Sellers
Turn Poland's #1 classifieds marketplace into clean, structured, export-ready data — prices, price drops, category attributes, business seller leads, GPS coordinates, and high-res photos.
This OLX scraper extracts classified ads from OLX Poland (olx.pl) — Poland's largest marketplace for electronics, automotive, real estate, furniture, industrial equipment, fashion, jobs, and services. Scrape OLX by keyword with filters for price range (PLN), voivodeship (region), item condition, Category ID, and sort order, or paste direct offer/search URLs, and get back 39 structured fields per ad: current price, previous price & price-drop flags, every category-specific parameter, seller profile & business status, exact GPS coordinates, and full-resolution photos.
Fast, cost-effective, and with no login, no coding — bulk export to JSON, CSV, Excel, or API in seconds.
🇵🇱 Built for e-commerce resellers & arbitrage flippers hunting price drops, price-comparison & deal-alert apps, automotive & real-estate market analysts, and B2B lead-generation teams building directories of commercial sellers on OLX Poland.
⚡ At a glance
| Capability | Details |
|---|---|
| 🔎 Search & filters | Multiple keywords + Voivodeship (regionId 1–16) + Min/Max Price (PLN) + Condition (new/used) + Category ID + Sort |
| 💰 Prices & price drops | Numeric price, priceLabel, currency, negotiable, priceArranged, previousPrice, and priceDropped boolean |
| 🧩 Category parameters | Full parameters key-value map (phone storage/battery, car mileage/year/fuel, apartment m²/rooms, etc.) |
| 👤 Seller & B2B lead data | sellerName, sellerId, sellerUuid, isBusinessSeller, sellerCompanyName, sellerRegisteredAt, sellerLastSeen, hasPhone, allowsChat, courierAvailable |
| 📍 Location & GPS | city, district, region (voivodeship) + exact latitude and longitude coordinates |
| 🖼️ High-res photos | Configurable resolution (1000x1000, 800x600, 400x300) + photosCount |
| 🔄 1,000+ auto-expansion | Automatically expands across Poland's 16 voivodeships / sort orders when maxItems > 1000 to bypass OLX's single-query 1,000-offer cap |
| 💾 Export & integration | Bulk export Excel (XLSX), CSV, JSON, HTML, RSS, or stream via Apify API into Make, Zapier, n8n, Google Sheets, or PostgreSQL |
🔎 Why scrape OLX Poland?
OLX.pl is the dominant classifieds ecosystem in Poland, with millions of active listings spanning consumer electronics, used cars, apartments and houses, home & garden, agricultural machinery, fashion, and local services. Every listing contains rich structured metadata — asking price in PLN, historical price reductions, item condition, category-specific specs, seller account tenure, company registration name for commercial dealers, and exact location coordinates.
Collecting this intelligence manually is slow and fragile. OLX paginates search results in small batches, buries historical previousPrice values inside internal parameter structures, varies attribute schemas across hundreds of categories, and rate-limits repeated browsing from a single IP. This OLX Poland scraper handles all of that automatically: it queries OLX Poland's structured data endpoints with per-request proxy IP rotation, normalizes Polish condition labels into clean English (Nowe → New, Używane → Used), strips HTML from descriptions, and outputs a flat, deduplicated 39-column dataset ready for Excel, BI dashboards, or automated deal alerts.
Common reasons teams scrape OLX Poland:
- 💰 Price benchmarking & market intelligence — track real-time asking prices, median prices, and supply volume for specific smartphone models, laptops, vehicles, or machinery across Poland.
- 🔁 Reselling, flipping & arbitrage — filter by
priceDropped = trueorsortBy = "newest"to catch underpriced electronics, bikes, furniture, and cars the moment sellers lower their price. - 🚗 Automotive & real-estate datasets — extract structured car attributes (year, mileage, engine size, fuel type, gearbox) or property metrics (m², rooms, floor, rent) straight from the
parametersobject. - 🧲 B2B seller lead generation — filter
isBusinessSeller = trueandsellerCompanyName != nullto build targeted prospect lists of Polish merchants, dealerships, and real-estate agencies. - 🔔 Automated inventory & competitor monitoring — schedule recurring runs on Apify to track competitor listings, paid promotions (
isTopAd,isHighlighted,isUrgent), and stock turnover. - 🤖 Powering price-comparison & AI tools — feed marketplace aggregators, Telegram/Discord deal bots, or valuation models with live Polish classifieds data.
✨ What this OLX scraper does
- ✅ Multi-keyword search with fair-share budgeting — enter any number of Polish search keywords (
iphone,rower górski,opel astra); each query gets a fair share of yourmaxItemsbudget and all results are deduplicated byid. - ✅ Complete marketplace filters — narrow by Region / Voivodeship (dropdown of all 16 Polish voivodeships), Min/Max Price (
PLN), Condition (all,new,used), Category ID, and Sort Order (relevance,newest,price-asc,price-desc). - ✅ Direct Start URLs support — paste individual OLX offer URLs (
…/d/oferta/…-IDxxxx.html, automatically decoded via base62 to numeric offer IDs) or search URLs (…/oferty/q-…/). - ✅ Unlocked 1,000+ deep pagination — walks offset pagination (
40 offers/page) up to OLX's 1,000-offer per-query limit, and automatically shards searches across all 16 Polish voivodeships / sort orders whenmaxItems > 1000so you can collect 1,000–10,000+ unique ads in a single run. - ✅ Price-drop detection — captures both
priceandpreviousPriceand computespriceDropped: truewhenever a seller has discounted the listing. - ✅ 39 structured fields per ad — covering pricing, condition, category parameters, clean plain-text description, seller identity & business flags, contact capabilities, GPS coordinates, high-res photos, promotion flags, and lifecycle timestamps.
- ✅ Fast, browserless execution — runs over lightweight HTTP with per-request datacenter proxy rotation (
~100 ads in 15s,~500 ads in 65s) at a fraction of browser scraping costs.
🎯 Use cases
| Persona | How they use OLX Poland Classifieds Scraper |
|---|---|
| 🔁 Resellers & E-Commerce Flippers | Monitor iphone, macbook, ps5, or karta graficzna sorted by newest or filtered by priceDropped = true to buy undervalued items first. |
| 🚗 Auto Dealers & Fleet Analysts | Scrape used car searches (opel astra, vw golf, audi a4) with full parameters (mileage, year, fuel, power) and sellerCompanyName across all 16 voivodeships. |
| 🏠 Real-Estate & Rental Analysts | Extract apartment and house listings (mieszkanie, kawalerka, dom) with district, GPS coordinates (latitude/longitude), price per m², and agency status. |
| 🧲 B2B Sales & Partnership Teams | Filter isBusinessSeller = true and courierAvailable = true to onboard active Polish e-commerce sellers onto logistics, SaaS, or financing platforms. |
| 📊 Pricing & Retail Strategists | Benchmark second-hand vs. new (condition = "New" vs "Used") price depreciation curves for consumer brands in Poland. |
📥 Input
Configure a keyword search with optional filters, or paste OLX URLs directly. Every field is optional — running with an empty {} input automatically collects a 100-ad sample across popular Polish categories.
| Field | Type | Default | Description |
|---|---|---|---|
searchQueries | array of strings | ["iphone", "rower"] | Keywords or phrases to search (in Polish for best results). Leave blank for an automatic multi-category sample. |
regionId | string (select) | "" (All Poland) | Filter by any of Poland's 16 voivodeships (1 Wielkopolskie … 16 Podlaskie). |
priceMin | integer | — | Minimum asking price in Polish złoty (PLN). |
priceMax | integer | — | Maximum asking price in Polish złoty (PLN). |
condition | string (select) | "all" | Item condition filter: "all", "new", or "used". |
sortBy | string (select) | "relevance" | Sort order: "relevance", "newest", "price-asc", or "price-desc". |
categoryId | integer | — | Optional numeric OLX category ID to restrict searches to a specific vertical. |
startUrls | array of strings | [] | Optional direct OLX offer URLs (…-IDxxxx.html) or search URLs (…/oferty/q-…/). |
maxItems | integer | 0 (prefill: 100) | Maximum ads to collect (100 prefilled for fast preview; set 1000+ or 0 for unlimited deep extraction). |
photoSize | string (select) | "1000x1000" | Image resolution: "1000x1000", "800x600", or "400x300". |
proxyConfiguration | object | Datacenter Proxy | Apify Proxy configuration. Default datacenter proxies with per-request rotation work out of the box. |
maxConcurrency | integer | 5 | Parallel request concurrency (1–12, recommended 4–8). |
Example input — targeted regional search with price & condition filters
{"searchQueries": ["opel astra", "vw golf"],"regionId": "2","priceMin": 10000,"priceMax": 45000,"condition": "used","sortBy": "price-asc","maxItems": 500,"photoSize": "1000x1000","proxyConfiguration": { "useApifyProxy": true }}
Example input — 1,000+ nationwide electronics sweep
{"searchQueries": ["iphone 15", "macbook", "playstation 5"],"condition": "all","sortBy": "newest","maxItems": 2000,"photoSize": "1000x1000","proxyConfiguration": { "useApifyProxy": true }}
📤 Output
Each ad is emitted as a flat, 39-field JSON object. Below is a real record from a verified run on OLX Poland:
{"id": 1090633418,"url": "https://www.olx.pl/d/oferta/bateria-95-iphone-15-pro-128gb-white-titanium-idealny-CID99-ID1bObzA.html","title": "Bateria 95% iPhone 15 Pro 128gb White Titanium Idealny","price": 2550,"priceLabel": "2 550 zł","currency": "PLN","negotiable": false,"priceArranged": false,"previousPrice": 2700,"priceDropped": true,"condition": "Used","categoryId": 2298,"categoryType": "electronics","parameters": {"Stan": "Używane","Model telefonu": "iPhone 15 Pro","Wbudowana pamięć": "128GB","Pamięć RAM": "8 GB","Kolor": "Biały","Gwarancja": "Oferty z gwarancją","Opcje SIM": "Dual SIM (SIM + eSIM)"},"description": "iPhone 15 Pro 128gb, kolor Biały White Titanium, bateria 95% oryginalna …","city": "Warszawa","district": "Praga-Południe","region": "Mazowieckie","latitude": 52.23876,"longitude": 21.08553,"sellerId": 330413574,"sellerName": "iSuperMen","isBusinessSeller": false,"sellerCompanyName": null,"sellerRegisteredAt": "2018-12-20T18:51:40+01:00","sellerLastSeen": "2026-11-01T22:40:30+01:00","sellerUuid": "54e13866-777d-4661-853a-650118a63326","hasPhone": true,"allowsChat": true,"courierAvailable": false,"photos": ["https://ireland.apollo.olxcdn.com:443/v1/files/4cyc23mdoevm1-PL/image;s=1000x1000","https://ireland.apollo.olxcdn.com:443/v1/files/srmblryyre5j1-PL/image;s=1000x1000"],"photosCount": 8,"isTopAd": true,"isHighlighted": false,"isUrgent": false,"createdTime": "2026-08-11T19:17:29+02:00","lastRefreshTime": "2026-10-21T19:20:14+02:00","validToTime": "2026-11-09T18:17:29+01:00","scrapedAt": "2026-11-01T23:56:09.182Z"}
📋 Output field reference
💰 Pricing, Price Drops & Condition
| Field | Type | Coverage | Description |
|---|---|---|---|
id | integer | 🟢 High (100%) | Unique numeric OLX offer ID (primary deduplication key). |
url | string | 🟢 High (100%) | Canonical direct URL to the OLX.pl listing. |
title | string | 🟢 High (100%) | Listing headline. |
price | number | 🟢 High (~98%) | Numeric asking price (null only for unpriced job/service/exchange ads). |
priceLabel | string | 🟢 High (~98%) | Formatted display price (e.g. "2 550 zł"). |
currency | string | 🟢 High (~98%) | Currency code (typically "PLN"). |
negotiable | boolean | 🟢 High (~98%) | true when the seller marked the price as negotiable (do negocjacji). |
priceArranged | boolean | 🟢 High (~98%) | true when the price is marked "by agreement" (do uzgodnienia). |
previousPrice | number | 🟡 Conditional (~4%) | Prior numeric price — populated whenever the seller lowered the price. |
priceDropped | boolean | 🟢 High (100%) | true when previousPrice > price (instant bargain indicator). |
condition | string | 🟢 High (~77%) | Normalized English condition (New, Used, Like new, Refurbished, Open box, Damaged). |
🧩 Category, Attributes & Description
| Field | Type | Coverage | Description |
|---|---|---|---|
categoryId | integer | 🟢 High (100%) | Numeric OLX category identifier. |
categoryType | string | 🟢 High (100%) | High-level vertical (electronics, automotive, real_estate, house_and_garden, goods, jobs, services). |
parameters | object | 🟢 High (~96%) | Category-specific key-value attributes (e.g. Stan, Marka, Rok produkcji, Przebieg, Powierzchnia). |
description | string | 🟢 High (100%) | Full plain-text ad description with HTML tags stripped. |
👤 Seller Profile, B2B Lead Signals & Delivery
| Field | Type | Coverage | Description |
|---|---|---|---|
sellerId | integer | 🟢 High (100%) | Numeric OLX user ID of the seller. |
sellerUuid | string | 🟢 High (100%) | Unique UUID of the seller account. |
sellerName | string | 🟢 High (100%) | Display name of the seller on OLX. |
isBusinessSeller | boolean | 🟢 High (100%) | true for commercial/business accounts (Firma), false for private individuals (Prywatne). |
sellerCompanyName | string | 🟡 Conditional (~15%) | Official registered company name (populated for business sellers). |
sellerRegisteredAt | string | 🟢 High (100%) | ISO timestamp when the seller created their OLX account. |
sellerLastSeen | string | 🟢 High (100%) | ISO timestamp of the seller's most recent activity on OLX. |
hasPhone | boolean | 🟢 High (100%) | true if the seller attached a verified phone number to the ad. |
allowsChat | boolean | 🟢 High (100%) | true if OLX internal messaging is enabled for the ad. |
courierAvailable | boolean | 🟢 High (100%) | true if OLX Package (Przesyłka OLX) courier shipping is enabled. |
📍 Location, Media, Promotions & Timestamps
| Field | Type | Coverage | Description |
|---|---|---|---|
city | string | 🟢 High (100%) | Polish city or town name (e.g. Warszawa, Kraków, Wrocław, Poznań). |
district | string | 🟡 Conditional (~37%) | City district (dzielnica) when applicable (e.g. Mokotów, Praga-Południe, Krzyki). |
region | string | 🟢 High (100%) | Polish voivodeship name (e.g. Mazowieckie, Małopolskie, Śląskie). |
latitude / longitude | number | 🟢 High (100%) | GPS coordinates (lat / lon) of the listing location. |
photos | array of strings | 🟢 High (~97%) | Full-resolution image URLs scaled to your chosen photoSize. |
photosCount | integer | 🟢 High (100%) | Number of photos attached to the listing. |
isTopAd | boolean | 🟢 High (100%) | true if the ad has an active "Top Ad" (Wyróżnienie na górze listy) promotion. |
isHighlighted | boolean | 🟢 High (100%) | true if the ad has a highlighted background promotion. |
isUrgent | boolean | 🟢 High (100%) | true if the ad carries an urgent badge. |
createdTime | string | 🟢 High (100%) | ISO timestamp when the ad was originally published. |
lastRefreshTime | string | 🟢 High (100%) | ISO timestamp when the ad was last bumped/refreshed. |
validToTime | string | 🟢 High (100%) | ISO timestamp when the listing expires. |
scrapedAt | string | 🟢 High (100%) | ISO timestamp when this record was scraped. |
🔁 Pagination & 1,000+ auto-expansion
OLX Poland's search backend serves 40 offers per page (offset=0, 40, 80…) and caps any single query window at offset=1000 (~1,000 offers).
To make 1,000+ deep extraction effortless, this scraper includes automatic regional & sort expansion:
- Under 1,000 items: Paginates directly through your queries with fair-share budget allocation and per-request IP rotation.
- 1,000+ items (
maxItems > 1000or0unlimited): When your requestedmaxItemsexceeds what the initial query list can return (~850 unique items per single query), the planner automatically expands your searches across all 16 Polish voivodeships (Mazowieckie,Śląskie,Wielkopolskie,Małopolskie,Dolnośląskie, etc.) or across alternate sort orders (newest,price-asc,price-descwhen a single region is already locked). - Global deduplication: Every offer across all expanded shards is deduplicated in memory by numeric
id(0% duplicates), allowing you to collect 1,000 to 10,000+ unique ads from a single keyword in one run.
⚙️ How to use
- Open OLX Poland Classifieds Scraper in the Apify Console.
- Enter one or more Polish Search keywords (
searchQueries), or paste direct URLs into Start URLs. - Optionally select a Region (voivodeship), Min/Max price (PLN), Condition, and Sort by.
- Set Max results (
maxItems:100prefilled for a fast<20srun, or1000–5000+for deep market sweeps). - Click Start and export your results from the Dataset tab in Excel, CSV, JSON, HTML, or RSS.
Run via Apify API (cURL)
curl -X POST "https://api.apify.com/v2/acts/haketa~olx-poland-classifieds-scraper/runs?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQueries": ["iphone 15", "samsung s24"],"condition": "used","sortBy": "newest","maxItems": 1000}'
🐍 Programmatic usage (Python & Node.js)
Python (apify-client)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run_input = {"searchQueries": ["iphone 15", "macbook pro", "rower górski"],"regionId": "","condition": "used","sortBy": "newest","maxItems": 1000,"photoSize": "1000x1000",}run = client.actor("haketa/olx-poland-classifieds-scraper").call(run_input=run_input)for offer in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"[{offer.get('id')}] {offer.get('title')} - {offer.get('priceLabel')} ({offer.get('city')}, dropped={offer.get('priceDropped')})")
Node.js (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('haketa/olx-poland-classifieds-scraper').call({searchQueries: ['opel astra', 'vw golf'],regionId: '2',priceMin: 10000,priceMax: 45000,condition: 'used',sortBy: 'price-asc',maxItems: 500,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Collected ${items.length} OLX Poland offers:`, items[0]);
🔗 E-commerce, arbitrage & B2B integrations
Connect OLX Poland Classifieds Scraper to your data and automation tools:
- Telegram, Discord & Slack Deal Bots: Schedule recurring runs via Make, Zapier, or n8n and push instant notifications whenever a new ad appears with
priceDropped === trueor below your target PLN threshold. - Google Sheets & Looker Studio: Automatically log daily price distributions, condition breakdowns (
NewvsUsed), and regional supply across all 16 Polish voivodeships. - HubSpot, Pipedrive & Clay: Filter
isBusinessSeller === trueandsellerCompanyName != nullto feed verified Polish commercial merchants directly into B2B sales pipelines.
💡 Tips for best results
- 🇵🇱 Use Polish keywords: Search for
mieszkanie(apartment),samochód(car),rower górski(mountain bike), orkonsola(console) to match Polish seller titles. - 💸 Spot instant bargains: Filter your exported dataset by
priceDropped = trueto isolate sellers who recently cut their asking price (previousPriceshows the old price). - 🏢 Build B2B seller lists: Filter by
isBusinessSeller = trueto get commercial sellers along withsellerCompanyName,city,region, andsellerRegisteredAt. - ⚡ Keep default Datacenter proxies: The scraper rotates to a fresh datacenter proxy IP on every API request, avoiding rate limits while keeping compute + proxy costs near zero (
~$0.006 per 1,000 ads).
⚠️ Honest limitations
- Gated phone numbers: OLX Poland requires an interactive logged-in user session with anti-bot challenges to reveal raw phone digits, so the raw phone string is not included. Use
hasPhone(true/false),allowsChat,sellerName,sellerCompanyName, andurlfor lead qualification. - Category-dependent fields: Unpriced job/exchange ads have
price: null, and categories without item state (e.g. real estate or jobs) havecondition: null.
❓ FAQ
How many ads can I scrape in a single run?
Thousands. While OLX caps a single query at 1,000 results, this scraper automatically shards queries across Poland's 16 voivodeships and sort orders whenever maxItems > 1000 (or maxItems: 0), deduplicating everything by offer id.
How fast is the scraper?
Because it uses OLX Poland's structured JSON endpoints with parallel HTTP workers (512 MB memory is plenty), 100 ads finish in ~12–20 seconds, 500 ads finish in ~65 seconds, and 1,000+ ads finish in ~2–3 minutes.
Do I need residential proxies? No! Built-in per-request Apify Datacenter proxy rotation handles OLX Poland's per-IP rate limiting reliably at minimal cost.
Can I scrape individual offer URLs?
Yes — paste any https://www.olx.pl/d/oferta/...-IDxxxx.html URLs into startUrls. The scraper decodes the base62 offer code (IDxxxx) and fetches the exact offer record.
🔗 Related scrapers
- 🇧🇷 OLX Brasil Scraper — classified ads, prices, and seller data from OLX Brazil.
- 🇳🇱 Marktplaats Scraper — scrape the Netherlands' #1 classifieds marketplace.
- 🇩🇪 Kleinanzeigen Scraper — ads, prices, and sellers from Germany's Kleinanzeigen.
- 🇨🇦 Kijiji Scraper — Canada's leading classifieds platform.
- 🇺🇸 OfferUp Scraper — local marketplace listings across the United States.
📋 Changelog
v1.2 (2026-11) — Auto-Regional Expansion for 1,000+ Ads
- Unlocked 1,000+ single-keyword scaling: Added automatic search expansion across Poland's 16 voivodeships (
regionId1–16) and sort orders whenmaxItems > 1000(or0unlimited), overcoming OLX'soffset=1000single-query ceiling. - Enhanced empty-run & status reporting: Empty
{}runs honor explicitmaxItemswhen provided (or return a 100-offer sample across 6 categories when omitted) and set a final summary status message before exit.
v1.1 (2026-10) — Per-Request IP Rotation & 39-Field Parity
- Added per-request fresh proxy IP rotation (
fetchJson) with empty-page retry to prevent datacenter IP throttling. - Added
priceArranged,previousPrice,priceDropped,isTopAd,isHighlighted,isUrgent, and Polish-to-Englishconditionnormalization.
v1.0 (2026-09) — Initial Release
- Initial release supporting keyword search, voivodeship/price/condition/sort filters, base62 offer URL decoding, and 39-field JSON output.