Otomoto Car Scraper: Poland Listing Price & Specs
Pricing
from $0.65 / 1,000 successful lookups
Otomoto Car Scraper: Poland Listing Price & Specs
Look up vehicle listings on otomoto.pl, Poland's dominant car marketplace, by URL: check price and mileage before buying a car on Otomoto, or whether Otomoto listings are still live. Get price, make, model, year, mileage, fuel type, engine, gearbox, condition, seller type and city.
Pricing
from $0.65 / 1,000 successful lookups
Rating
0.0
(0)
Developer
Adriana Voss
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Otomoto Listing Lookup
Look up any vehicle listing on otomoto.pl, Poland's dominant
car marketplace, by URL — price, make, model, year, mileage, fuel type, engine,
gearbox, body type, condition, seller, and location. The listing's full detail set is
embedded server-side in a __NEXT_DATA__ JSON payload, so this reads structured data
directly rather than scraping rendered HTML.
Features
- URL → full listing record. Title, price, currency, and status straight from the page's own data, not parsed from visible text.
- Full vehicle spec. Make, model, year, mileage, fuel type, engine power and capacity, gearbox, body type, color, condition, and accident-free flag.
- Seller & location. Seller type (private/dealer), seller name, city, region, and photo count.
- Pay only for hits. Listings that don't resolve — sold, removed, or malformed URLs — cost nothing; see Pricing.
- Built for bulk. Feed in thousands of listing URLs; concurrency, keyword filtering, and column selection are all configurable.
How to use Otomoto Listing Lookup — Poland's Dominant Car Marketplace API
- In the Apify Console. Open the actor page and click Start — the
listingUrlsfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~otomoto-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"listingUrls":["https://www.otomoto.pl/osobowe/oferta/bmw-seria-5-ID6I3va0.html"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Input
{"listingUrls": ["https://www.otomoto.pl/osobowe/oferta/bmw-seria-5-ID6I3va0.html"]}
One otomoto.pl vehicle listing URL per line (the /osobowe/oferta/... page). Accepted formats: https://www.otomoto.pl/osobowe/oferta/bmw-seria-5-ID6I3va0.html.
{"listingUrls": ["https://www.otomoto.pl/osobowe/oferta/bmw-seria-5-ID6I3va0.html"],"testRun": false,"onlyFound": false,"maxConcurrency": 5}
listingUrls is a list of otomoto.pl vehicle listing URLs (the /osobowe/oferta/...
page). One dataset row is returned per URL; rows with "found": false are never
charged. Turn on testRun to try your list against just the first 5 URLs before
running the full batch. Optional includeKeywords / excludeKeywords filter rows by
content, maxResults caps the run early, and columns lets you pick which fields to
return. proxyConfiguration defaults to Residential proxies — this is a defended
marketplace at scale, so a plain datacenter IP risks getting blocked.
Output
| query | found | status | title | price | currency | make | model | year | mileageKm | fuelType | enginePower | engineCapacity | gearbox | bodyType | color | condition | accidentFree | sellerType | sellerName | city | region | photoCount | listingId | url | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| https://www.otomoto.pl/osobowe/oferta/bmw-seria-5-ID6I3va0.html | true | OK | BMW Seria 5 | 49000 | PLN | BMW | Seria 5 | 2019 | 98000 | Benzyna | 245 KM | 1 998 cm3 | Automatyczna | Sedan | Biały | Używany | true | PRIVATE | Olek | Wrocław | Dolnośląskie | 10 | 6147794388 | https://www.otomoto.pl/osobowe/oferta/bmw-seria-5-ID6I3va0.html | 2026-08-31T07:10:15.700Z |
One row per listing URL, for example:
{"query": "https://www.otomoto.pl/osobowe/oferta/bmw-seria-5-ID6I3va0.html","found": true,"status": "OK","listingId": "6I3va0","title": "BMW Seria 5 520d xDrive","url": "https://www.otomoto.pl/osobowe/oferta/bmw-seria-5-ID6I3va0.html","price": 129900,"currency": "PLN","make": "BMW","model": "Seria 5","year": 2019,"mileageKm": 98000,"fuelType": "Diesel","enginePower": "190 KM","engineCapacity": "1995 cm3","gearbox": "Automatyczna","bodyType": "Sedan","color": "Czarny","condition": "Używane","accidentFree": true,"sellerType": "Dealer","sellerName": "Auto Centrum Warszawa","city": "Warszawa","region": "mazowieckie","photoCount": 24,"scrapedAt": "2026-08-21T10:00:00.000Z"}
Listings that no longer exist — sold or removed — still get a row ("found": false,
"status": "NOT_FOUND"), so you always get one row per input URL, but you're never
charged for those.
Use cases
- Price monitoring — track asking prices on a watchlist of listings over time.
- Inventory enrichment — attach full vehicle spec to a list of listing URLs pulled from search results or a lead list.
- Dealer research — compare seller type, pricing, and mileage across listings from a specific dealer or region.
- Market analysis — build a dataset of make/model/year/price combinations for valuation or trend work.
- Listing health checks — confirm which URLs in a saved list are still live before reaching out to a seller.
Pricing
$1.3 per 1,000 listings, plus a $0.00005 start fee. Misses (found:false) are never charged.
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~otomoto-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"listingUrls":["https://www.otomoto.pl/osobowe/oferta/bmw-seria-5-ID6I3va0.html"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~otomoto-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"listingUrls":["https://www.otomoto.pl/osobowe/oferta/bmw-seria-5-ID6I3va0.html"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~otomoto-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"listingUrls":["{{listing}}"]}, mapping the row's listing into the listingUrls array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Otomoto Scraper: Car Listing Price & Specs by URL" — the agent will find and run this actor.
FAQ
Do I need to log in to Otomoto to look up a listing? No. This actor reads the listing's own embedded page data over a plain HTTP request — no account or API key involved.
What happens if a listing has sold or been removed?
You get a dataset row with "found": false and "status": "NOT_FOUND" — Otomoto
returns HTTP 404 or 410 for gone listings, and that row is never charged.
Why does this default to Residential proxies?
Otomoto is a large, actively defended marketplace. A plain datacenter IP risks getting
blocked at any real volume, so Residential is the safer default — you can override it
in proxyConfiguration if you have your own proxy setup.
Can I look up listings in bulk?
Yes. Turn on testRun first to sanity-check your list against 5 URLs, then run the
full batch — maxConcurrency controls how many requests run in parallel (keep it
conservative; this target has no browser fallback, so getting blocked costs more than
slow-and-steady).
What URL format does it accept?
The full listing page URL, e.g.
https://www.otomoto.pl/osobowe/oferta/bmw-seria-5-ID6I3va0.html. A bare listing slug
also works — it gets expanded to the full URL automatically.
Does the price field include currency conversion?
No — price and currency are returned exactly as Otomoto lists them (almost always
PLN), with no conversion applied.