OTOMOTO Poland Car Scraper
Pricing
Pay per event
OTOMOTO Poland Car Scraper
Scrape used-car listings from otomoto.pl, Poland's #1 car marketplace — price (PLN), make, model, year, mileage, fuel, transmission, engine power, body type, colour, seller type, location, and photos. Export to JSON or CSV.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
🎯 What this scrapes
otomoto.pl is Poland's largest car marketplace and the default place Poles buy and sell used cars, part of the OLX/Adevinta group with over 200,000 live listings. It publishes no public API. This Actor wraps a polite scrape of the osobowe (passenger cars) section — paste a filtered otomoto search URL or use the default listing page, and pull every listing's price, make/model, year, mileage (km), fuel, transmission, engine power & capacity, body type, colour, seller type, and photos. Flip on detail enrichment and we fetch each listing's page for the full Polish description, colour, body type, drivetrain, and complete spec sheet. Built on curl-cffi with browser TLS impersonation and residential-proxy rotation to ride past DataDome.
🔥 What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes so the target sees a browser, not Python. - 🌐 Residential proxy rotation via Apify Proxy — fresh session and exit IP on every block.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per page,Retry-Afterhonoured. - 🧱 Rate-limit-aware pacing — when the target pushes back, we slow down instead of getting banned.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, stable IDs, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge.
💡 Use cases
- Used-car price analytics — track asking prices by make/model/year across the Polish market in PLN.
- Dealer inventory monitoring — diff successive runs to spot new arrivals and price cuts at specific dealers.
- Market research — aggregate fuel-type and transmission mix to gauge EV/hybrid adoption in Poland.
- Lead generation — build a directory of car dealers from
seller_name+location. - Arbitrage / cross-border sourcing — find under-priced Polish listings filtered by mileage, year, and power for import.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
searchUrl | string | no | '' | Full otomoto.pl search/results URL with your filters already applied (e.g. https://www.otomoto.pl/osobowe/bmw?sear |
maxResults | integer | no | 50 | Hard cap on dataset rows. otomoto.pl paginates 32 listings per page; the Actor walks pages until this cap or the last pa |
enrichDetails | boolean | no | True | Fetch each listing's detail page for the full Polish description, colour, body type, drivetrain, and complete spec sheet |
proxyConfiguration | object | no | {'useApifyProxy': True, 'apifyProxyGroups': ['RESIDENTIAL']} | Apify Proxy spec. otomoto.pl is fronted by DataDome — residential exits are required for reliable access. |
Example input
{"searchUrl": "","maxResults": 5,"enrichDetails": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
listing_id | string | OTOMOTO advert ID. |
listing_url | string | Absolute URL to the listing detail page. |
title | string | Listing headline (make + model + version). |
make | ['string', 'null'] | Car manufacturer (e.g. BMW, Audi, Peugeot). |
model | ['string', 'null'] | Model name (e.g. iOn, A4, Golf). |
version | ['string', 'null'] | Version / trim line. |
year | ['integer', 'null'] | Year of production (Rok produkcji). |
price | ['integer', 'null'] | Asking price as an integer in the listing currency. |
currency | ['string', 'null'] | ISO-4217 currency code — typically PLN for otomoto.pl. |
mileage_km | ['integer', 'null'] | Odometer reading in kilometres (Przebieg). |
fuel_type | ['string', 'null'] | Fuel type (Benzyna, Diesel, Hybryda, Elektryczny). |
transmission | ['string', 'null'] | Gearbox (Manualna / Automatyczna). |
engine_power_hp | ['integer', 'null'] | Engine power in metric horsepower (KM). |
engine_size_cc | ['integer', 'null'] | Engine displacement in cubic centimetres (cm3). |
body_type | ['string', 'null'] | Body / car type (e.g. Auta małe, SUV, Kombi). Enrichment-only. |
color | ['string', 'null'] | Exterior colour (e.g. Czarny, Biały). Enrichment-only. |
first_registration | ['string', 'null'] | Production year as a string. |
location | ['string', 'null'] | Town / city of the listing. |
region | ['string', 'null'] | Polish voivodeship (województwo). |
seller_type | ['string', 'null'] | private or dealer. |
seller_name | ['string', 'null'] | Dealer / seller name when present. Enrichment-only at listing level. |
photo_urls | array | List of listing photo URLs. |
description | ['string', 'null'] | Full Polish listing description (plain text). Enrichment-only. |
posted_date | ['string', 'null'] | ISO timestamp when the listing was created. |
scraped_at | string | ISO timestamp when this row was recorded. |
Example output
{"listing_id": "6148377492","listing_url": "https://www.otomoto.pl/osobowe/oferta/peugeot-ion-ID6I5XQU.html","title": "Peugeot iOn Standard","make": "Peugeot","model": "iOn","version": "Standard","year": 2012,"price": 15990,"currency": "PLN","mileage_km": 92650,"fuel_type": "Elektryczny","transmission": "Automatyczna","engine_power_hp": 67,"engine_size_cc": null,"body_type": "Auta ma\u0142e","color": "Czarny","first_registration": "2012","location": "Brzeziny","region": "\u015awi\u0119tokrzyskie","seller_type": "private","seller_name": "Marcin","photo_urls": ["https://ireland.apollo.olxcdn.com/v1/files/afggi2qvxjw1-OTOMOTOPL/image"],"description": "Witam, Mam do sprzedania Peugeota iOn \u2013 samoch\u00f3d elektryczny, idealny do miasta.","posted_date": "2026-06-01T21:24:15Z","scraped_at": "2026-06-02T00:00:00+00:00"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.05 | One-off warm-up charge per run |
result-row | $0.002 | PPE event |
Example: 1 000 results at the rates above ≈ $2.05. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
otomoto.pl is fronted by DataDome bot protection — a residential proxy is required and the Actor rotates its session on any block. Pagination is 32 listings per page and very deep result sets eventually stop returning new pages, so large queries cap out well before the full 200k+ inventory. Colour, body type, drivetrain, and the full description are only available with detail enrichment (one extra request per listing). The seller name is often hidden in the search payload and surfaced only on enrichment.
❓ FAQ
Do I need an OTOMOTO account or API key?
No. otomoto.pl offers no public API. This Actor scrapes the public passenger-car listings politely — see the ToS Notice in the README.
How do I scrape a filtered search?
Apply your filters on otomoto.pl, copy the resulting URL from your browser, and paste it into searchUrl. We walk the result pages from there.
Why does this need a residential proxy?
otomoto.pl is fronted by DataDome bot protection. Datacenter IPs get challenged or blocked; Apify residential exits ride past it reliably. The default proxy config already requests RESIDENTIAL.
Is the detail enrichment worth it?
It adds the full Polish description, colour, body type, drivetrain, and complete spec sheet per listing at the cost of one extra request each. Price, make/model, year, mileage, fuel, transmission, and power all come from the search payload — set enrichDetails to false to halve requests.
What currency are prices in?
Read from the listing — typically PLN (Polish złoty). price is an integer; mileage is always in kilometres.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.