
CJ Dropshipping Scraper
scrape.ly/store/shelfbright/cj-dropshipping-scraperE-commerce
2 monthly users

Scrape vehicle listings from otomoto.pl search, category and listing pages or by keyword: price, year, mileage, fuel, gearbox, engine, location and seller, plus optional full details (description, VIN, photos, equipment) and seller phone numbers.
Scrape car, van, motorcycle and truck listings from otomoto.pl, Poland's largest vehicle marketplace. Paste any otomoto.pl search, category or listing URL (or just type a keyword) and get clean rows with price, year, mileage, engine, fuel, gearbox, location and seller. Turn on one switch for the full listing page (description, VIN, first registration, every photo, equipment, address) and another for the seller's phone numbers. No login, no browser, from $0.80 per 1,000 listings.
| Field | What it does |
|---|---|
startUrls | otomoto.pl search, category or listing URLs. Filters and sorting in the URL are kept. |
searchQueries | Free-text keywords, searched in the category set by searchCategory (cars by default). |
maxItems | How many listings to save in total. |
maxItemsPerInput | Optional cap per URL or keyword. |
minPrice / maxPrice, minYear / maxYear, minMileage / maxMileage | Optional filters applied to every URL and keyword. |
sortBy | Newest, price, mileage or engine power, or keep the URL's order. |
includeDetails | Also read each listing page for the full details. |
includePhones | Also collect the seller's phone numbers (turns on full details). |
proxyConfiguration | Datacenter proxy by default. |
{
"startUrls": ["https://www.otomoto.pl/osobowe/bmw"],
"searchQueries": ["golf gti"],
"maxItems": 100,
"minYear": 2018,
"sortBy": "newest",
"includeDetails": true,
"includePhones": true
}
One row per listing. The most used fields:
| Field | Example |
|---|---|
title, url, id | Volkswagen Golf, listing link, 6151263497 |
price, currency, priceIsGross, priceEvaluation | 199900, PLN, true, BELOW / IN / ABOVE |
make, model, version, generation, year | Volkswagen, Golf, VIII (2020-), 2026 |
mileageKm, fuelType, gearbox, engineCapacityCc, enginePowerHp | 1, Benzyna, Automatyczna, 1998, 333 |
bodyType, color, drive, condition, accidentFree | Auta małe, Czarny, 4x4, Nowy, true |
city, region | Elbląg, Warmińsko-mazurskie |
sellerType, sellerName, sellerUrl | dealer, dealer name, dealer page |
imageUrl, createdAt, promoted | main photo, listing date, promoted flag |
description, vin, firstRegistrationDate, imageUrls, equipment, details, fullAddress, latitude, longitude | with Include full listing details |
phone, phoneNumbers | with Include seller phone numbers |
Example (from a test run, trimmed; seller name and numbers replaced with fictional ones):
{
"id": "6151263497",
"url": "https://www.otomoto.pl/osobowe/oferta/volkswagen-golf-ID6Ii4Dn.html",
"title": "Volkswagen Golf",
"shortDescription": "Volkswagen Golf R Black Edition 2.0 TSI 4MOTION 245 kW / 333 KM DSG, 7",
"price": 199900,
"currency": "PLN",
"priceIsGross": true,
"make": "Volkswagen",
"model": "Golf",
"generation": "VIII (2020-)",
"year": 2026,
"mileageKm": 1,
"fuelType": "Benzyna",
"gearbox": "Automatyczna",
"engineCapacityCc": 1998,
"enginePowerHp": 333,
"drive": "4x4 (dołączany automatycznie)",
"condition": "Nowy",
"city": "Elbląg",
"region": "Warmińsko-mazurskie",
"sellerType": "dealer",
"sellerName": "Auto Przykład Elbląg",
"imageUrl": "https://ireland.apollo.olxcdn.com/v1/files/s3lvip8nq8w32-OTOMOTOPL/image;s=640x480",
"promoted": true,
"createdAt": "2026-10-22T11:47:15Z",
"detailsIncluded": true,
"vin": "WVWZZZCDXVW160374",
"imageCount": 22,
"equipment": ["Apple CarPlay", "Interfejs Bluetooth", "Radio"],
"fullAddress": "Warszawska 47 - 82-300 Elbląg, Warmińsko-mazurskie (Polska)",
"latitude": 54.15700233,
"longitude": 19.39110001,
"sellerActiveListings": 10,
"phone": "600 100 200",
"phoneNumbers": ["600 100 200", "600 100 201"],
"scrapedAt": "2026-10-22T11:51:30Z"
}
Labels such as fuel type, gearbox and colour are kept in Polish, exactly as otomoto.pl shows them.
Pay per event, plus the platform usage of the run (compute and proxy data):
Worked examples from our test runs:
Is it legal to scrape otomoto.pl? The scraper only reads public listing pages that anyone can open without an account. Check that your use of the data, especially of sellers' phone numbers, complies with the GDPR and otomoto.pl's terms.
Do I need an otomoto.pl account or my own proxy? No. No login is used, and the default datacenter proxy works well.
How many results can I get?
As many as the search has: the scraper pages until your maxItems or the end of the results. A whole category such as all cars (about 260,000 listings) works, it just takes longer.
Why is a field empty? Sellers fill in different fields. VIN, first registration date and plate number appear only when the seller published them; search rows of private sellers have no seller name until you turn on full details; phone numbers need Include seller phone numbers.
Why do I see a listing outside my price filter? Some listings are priced in EUR. otomoto.pl converts them for its price filter, and the row shows the price in the seller's currency.
Can I schedule it or use it through the API? Yes. Schedule the actor to watch prices or new listings, and start runs and read results through the API or an integration.
<dealer>.otomoto.pl and spare parts (/czesci) are not supported as input URLs.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalOtomoto.pl URLs
Search, category or listing URLs from otomoto.pl, e.g. https://www.otomoto.pl/osobowe/bmw, https://www.otomoto.pl/osobowe/volkswagen/golf/od-2018?search%5Bfilter_enum_fuel_type%5D=diesel or https://www.otomoto.pl/osobowe/oferta/...-ID6Iha1F.html. Filters and sorting already in a URL are kept. Listing URLs always return full details.
searchQueriesarrayOptionalSearch keywords
Free-text keywords for the otomoto.pl search, e.g. 'golf gti' or 'audi a4 avant'. Each keyword is searched in the category chosen below.
searchCategoryenumOptionaldefault "osobowe"Category for keywords
Which otomoto.pl category the search keywords run in.
maxItemsintegerOptionaldefault 20Maximum listings
How many listings to save in total across all URLs and keywords. The scraper pages through every result of a search until this limit or the end of the results.
maxItemsPerInputintegerOptionalMaximum listings per URL or keyword
Optional cap for each URL or keyword, so that one big search doesn't use up the whole maximum. Leave empty for no per-input cap.
Optional. They apply to every URL and keyword and replace the same filter in a URL.
minPriceintegerOptionalMinimum price (PLN)
Only listings priced at or above this amount in Polish złoty.
maxPriceintegerOptionalMaximum price (PLN)
Only listings priced at or below this amount in Polish złoty.
minYearintegerOptionalProduction year from
Only vehicles made in this year or later.
maxYearintegerOptionalProduction year to
Only vehicles made in this year or earlier.
minMileageintegerOptionalMinimum mileage (km)
Only vehicles with at least this many kilometres.
maxMileageintegerOptionalMaximum mileage (km)
Only vehicles with at most this many kilometres.
sortByenumOptionaldefault "default"Sort by
Order of the results. 'Keep the URL's order' uses the sorting in the URL, or the site's default (featured first).
includeDetailsbooleanOptionaldefault falseInclude full listing details
Also open every listing page for the seller's description, the VIN, first registration date, all photos, the equipment list, the seller's address and map position, seller badges and every technical detail. Costs an extra event per listing.
includePhonesbooleanOptionaldefault falseInclude seller phone numbers
Also collect the seller's phone numbers shown on the listing page (dealers and private sellers). Turns on full listing details. Costs an extra event per listing where at least one phone number was found.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
otomoto.pl answers datacenter proxies well, so the default is the datacenter pool.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| id | string | otomoto.pl listing number. |
| url | string | Listing URL |
| title | string | null | The seller's headline. |
| shortDescription | string | null | The one-line teaser shown in search results. |
| price | number | null | Asking price as a number. |
| currency | string | null | Usually PLN. |
| priceIsGross | boolean | null | Price includes VAT |
| priceNet | number | null | When the seller shows a net price too. |
| priceGross | number | null | Gross price |
| priceBadges | array | null | e.g. INVOICE_ISSUED (VAT invoice), NEGOTIABLE. |
| priceEvaluation | string | null | otomoto.pl's market price indicator: BELOW, IN or ABOVE the market range. |
| priceDropPercent | number | null | Price drop (%) |
| lowestPrice | number | null | Lowest price in 30 days |
| make | string | null | Make |
| model | string | null | Model |
| version | string | null | Version |
| generation | string | null | Generation |
| year | number | null | Production year |
| mileageKm | number | null | Mileage (km) |
| fuelType | string | null | Fuel |
| gearbox | string | null | Gearbox |
| engineCapacityCc | number | null | Engine size (cm3) |
| enginePowerHp | number | null | Engine power (hp) |
| bodyType | string | null | Body type |
| color | string | null | Color |
| doorCount | number | null | Doors |
| seatCount | number | null | Seats |
| drive | string | null | e.g. front-wheel, 4x4. |
| condition | string | null | New or used. |
| countryOfOrigin | string | null | Country of origin |
| accidentFree | boolean | null | Accident-free |
| damaged | boolean | null | Damaged |
| registeredInPoland | boolean | null | Registered in Poland |
| city | string | null | City |
| region | string | null | Region (voivodeship) |
| sellerType | string | null | dealer or private. |
| sellerName | string | null | Seller name |
| sellerId | string | null | Seller ID |
| sellerUuid | string | null | Seller UUID |
| sellerUrl | string | null | Dealer page |
| imageUrl | string | null | Main photo |
| promoted | boolean | null | Promoted |
| highlighted | boolean | null | Highlighted |
| cepikVerified | boolean | null | History checked against Poland's vehicle register. |
| createdAt | string | null | Listed at |
| bumpedAt | string | null | Bumped at |
| categoryId | string | null | Category ID |
| category | string | null | Category |
| parameters | object | null | Every parameter of the search result, keyed by otomoto.pl's parameter name. |
| detailsIncluded | boolean | null | True when the listing page was read (full details). |
| status | string | null | Listing status |
| description | string | null | The seller's full description as plain text. |
| vin | string | null | As published by the seller. |
| firstRegistrationDate | string | null | First registration |
| registrationNumber | string | null | Registration number |
| originalOwner | boolean | null | First owner |
| serviceRecord | boolean | null | Serviced at an authorised workshop |
| priceNegotiable | boolean | null | Price negotiable |
| imageUrls | array | null | All photos |
| imageCount | number | null | Photo count |
| equipment | array | null | Equipment |
| equipmentGroups | array | null | Equipment by group |
| details | object | null | Every detail row of the listing page, keyed by its Polish label. |
| address | string | null | Address |
| postalCode | string | null | Postal code |
| fullAddress | string | null | Full address |
| latitude | number | null | Latitude |
| longitude | number | null | Longitude |
| sellerBadges | array | null | Seller badges |
| sellerOnSiteSince | number | null | Seller on otomoto.pl since |
| sellerWebsite | string | null | Seller website |
| sellerActiveListings | number | null | Seller's active listings |
| updatedAt | string | null | Updated at |
| originalCreatedAt | string | null | First published at |
| mainFeatures | array | null | Main features |
| phone | string | null | The seller's first phone number. |
| phoneNumbers | array | null | Every phone number shown for the listing. |
| sourceUrl | string | null | The URL or keyword that found the listing. |
| scrapedAt | string | null | Scraped at |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Listing | One vehicle listing saved to the dataset. | $0.0008 |
| Full listing details | Description, VIN, first registration, all photos, equipment, address and every technical detail from the listing page (only with 'Include full listing details' or phone numbers). | $0.00065 |
| Seller phone numbers | The seller's phone numbers for one listing (only with 'Include seller phone numbers' and only when at least one number was found). | $0.00065 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('roamandroof/otomoto-scraper').call({
"startUrls": [
"https://www.otomoto.pl/osobowe/bmw"
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run roamandroof/otomoto-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=roamandroof/otomoto-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
No examples yet
The developer hasn't published example inputs for this actor.

Scrape Google Maps places for any search term and city, with no code or with one API call. A real run, its output, its log and its exact cost, plus the limits and the legal side.
Read the article
Paste an Amazon search or product URL into a ready-made Actor and get one row per product with price, ASIN, rating and review count. This guide covers the no-code steps, the API, ZIP code pricing, a real run and its cost.
Read the article
Scrape Google search results by query and country and get each results page as JSON: organic results with positions, People Also Ask and related searches. Run it without code or from Python, with a real run, the cost per page and Google's terms.
Read the articleScrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.