# Otomoto Scraper (`ribtools/otomoto-scraper`) Actor

Scrape Otomoto.pl car, motorcycle and van listings: type vehicles (Skoda Octavia) with filters for region, city, year, price and mileage, or paste any search, ad or dealer URL. Add-ons: ad details, dealer phones. Proxies included.

- **URL**: https://apify.com/ribtools/otomoto-scraper.md
- **Developed by:** [RibTools](https://apify.com/ribtools) (community)
- **Categories:** Automation, E-commerce, Lead generation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 vehicle data 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

## Otomoto Scraper

Extract car, motorcycle and van listings from **Otomoto**, Poland's largest vehicle marketplace — specs, price (gross or net), Otomoto's own market-price rating, location and dealer — plus optional ad details and dealer phone numbers. OLX.pl ads shown on Otomoto are included and flagged.

### What is Otomoto Scraper?

**Otomoto Scraper** is a powerful data extraction tool that automatically collects vehicle listings from [Otomoto](https://www.otomoto.pl/), Poland's largest marketplace for new and used cars, motorcycles, quads and vans. Simply type the vehicles you want (such as `Skoda Octavia`) or provide Otomoto URLs, and get structured data including make, model, generation, version, year, mileage, fuel, power, price (with or without VAT), the site's below/in/above-market price rating, price drops, location and seller — with optional add-ons for the full ad description, every photo and map coordinates, and the dealer's contact profile with phone numbers.

This scraper handles pagination, anti-bot protection, and data normalization automatically, delivering clean, structured datasets ready for analysis or integration into your systems.

### What can this Actor do?

- **Extract comprehensive vehicle data** — make, model, generation, version, year, mileage, fuel, gearbox, power, engine size, body type, color, doors, seats, drivetrain, country of origin, equipment and every listing attribute
- **Market-price insight** — Otomoto's own price rating (BELOW / IN / ABOVE market), price drops and the previous price
- **Three categories** — cars (`osobowe`), motorcycles and quads (`motocykle-i-quady`) and vans (`dostawcze`)
- **Search by typing vehicles** — a make, a model or both (`Skoda Octavia`, `skoda`, `BMW Seria 3`), matched against Otomoto's own catalog, with filters for vehicle type, condition, voivodeship, city, year, seller type, price and mileage
- **Handle multiple entry points** — category searches with any filters, single ad URLs (in every form the site uses) and dealer pages
- **OLX.pl cross-listings included** — the OLX.pl ads Otomoto shows in its results (about one in six on cheap cars) are returned and flagged with `is_crosslisted`
- **Automatic pagination** — crawls through all search result pages (32 vehicles per page)
- **Ad details add-on** — full description, all photos, original publication and update dates, map coordinates, negotiable flag
- **Seller data add-on** — dealer phone numbers, address, postal code, coordinates, website, number of active ads and member-since year
- **No duplicates** — each vehicle is returned (and charged) once per run, even when listings move between pages
- **Premium proxies included** — high-quality proxies built in at no additional cost
- **Structured output** — JSON, CSV, Excel formats available
- **API integration** — real-time data access through Apify API
- **Scheduled runs** — automated daily/weekly data collection

### What data can Otomoto Scraper extract?

| Field | Description | Example |
| ----- | ----------- | ------- |
| **ID** | Otomoto ad identifier | 6147033619 |
| **Title** | Ad title | Mercedes-Benz GLC |
| **Category** | Cars, motorcycles/quads or vans | osobowe, motocykle-i-quady, dostawcze |
| **Make / Model / Generation / Version** | Vehicle identity | Mercedes-Benz, GLC, II (2022-), 220 d 4MATIC |
| **Price** | Gross price in PLN, listed-gross flag, net price | 306900, true, null |
| **Price Evaluation** | Otomoto's market rating (cars) | BELOW, IN, ABOVE |
| **Price Drop** | Drop percentage and previous price | 5.8, 207000 |
| **Year** | Production year | 2025 |
| **Mileage** | Kilometers driven | 5 |
| **Fuel / Gearbox / Power** | Powertrain | Diesel, Automatyczna, 197 |
| **Body Type / Color / Doors / Seats** | Body | SUV, Biały, 4, 5 |
| **Drivetrain / Condition / Origin** | 4x4 (stały), Nowy, Polska | |
| **Features** | Equipment and offer flags | keyless_go, 360_view_camera, no_accident, financial_option |
| **Attributes** | Every listing parameter | has_vin: Tak, registered: Nie, engine_capacity: 1993 cm3 |
| **Location** | City and voivodeship | Poznań, Wielkopolskie |
| **Seller** | Type, dealer name and Otomoto page | dealer, MB Motors Poznań |
| **Cross-listed** | Whether the ad comes from OLX.pl | false |
| **Details** (add-on) | Description, photos, dates, coordinates | See below |
| **Seller profile** (add-on) | Dealer phones, address, website, active ads | See below |

### How to scrape Otomoto

#### Step-by-step tutorial:

1. **Type vehicles** — Add one make, model or both per line in *Search vehicles*, as you would in Otomoto's search box
2. **Or paste URLs** — Add Otomoto search, ad or dealer URLs in *Otomoto URLs* (see below). You can use both; each vehicle and each URL is its own search
3. **Set filters** (optional) — Vehicle type, condition, voivodeship, city, year, seller type, price and mileage. They apply to typed vehicles only; a URL keeps the filters it carries
4. **Enable add-ons** (optional) — Ad details and/or seller data
5. **Run the scraper** — Click "Start" and monitor progress in real-time
6. **Download results** — Export data in JSON, CSV, or Excel format

Proxies are included automatically — no setup required.

#### Search by vehicle

Typed text is matched against Otomoto's own catalog, so spelling does not have to be exact. The status message of the run shows what each line resolved to.

- `Skoda Octavia` — the model Octavia (Skoda)
- `skoda` — every model of the make Skoda
- `BMW Seria 3` — the model Seria 3 (BMW)
- `mercedes` — every model of the make Mercedes-Benz

Typed vehicles search cars by default; set *Vehicle type* to Motorcycles and quads (for example `Honda CBR`) or Vans for the other two. For vans only the make is matched, so type the make (`mercedes`, `renault`); a van model typed alone, such as `Sprinter`, is also a passenger-car model and gets a hint to set *Vehicle type* to Cars. *Voivodeship* narrows the search to one of the 16 voivodeships, and *City* searches the city and 50 km around it; a city Otomoto does not know is skipped and named in the status message. A vehicle Otomoto does not know is skipped the same way, never returning unrelated results. *Max results per search* caps each vehicle separately.

#### Compatible URL examples:

- **Cars search**: `https://www.otomoto.pl/osobowe`
- **Filtered search (make, model, price)**: `https://www.otomoto.pl/osobowe/bmw/seria-3?search[filter_float_price:to]=60000`
- **Filtered search (year, region, fuel, sort)**: `https://www.otomoto.pl/osobowe/mercedes-benz/od-2018/wielkopolskie?search[filter_enum_fuel_type]=diesel&search[order]=filter_float_price:asc`
- **Keyword search**: `https://www.otomoto.pl/osobowe/q-golf%20gti`
- **Motorcycles and quads search**: `https://www.otomoto.pl/motocykle-i-quady/honda`
- **Vans search**: `https://www.otomoto.pl/dostawcze/od-2018`
- **Single ad**: `https://www.otomoto.pl/osobowe/oferta/mercedes-benz-glc-ID6I0kfx.html`
- **Single ad, short form** (the one the site redirects): `https://www.otomoto.pl/oferta/mercedes-benz-glc-ID6I0kfx.html`
- **Single ad cross-listed from OLX.pl**: `https://www.otomoto.pl/osobowe/oferta/bmw-seria-3-OLX_ID6IgiJo.html`
- **Dealer page (whole inventory)**: `https://bmw-dobrzanski.otomoto.pl`

**Important**: Only URLs matching these patterns will work. Other categories (`ciezarowe` trucks, `przyczepy` trailers, `maszyny-budowlane` and `maszyny-rolnicze` machinery, `autobusy` buses, `czesci` parts) are not supported and are skipped.

### How much does it cost to scrape Otomoto?

Otomoto Scraper uses **pay-per-result (PPR)** pricing — you only pay for successfully extracted vehicles.

#### Is scraping Otomoto free?

The scraper follows Apify's PPR model with the following structure:

- **Base extraction**: one charge per scraped vehicle (specs, price, market rating, location, seller)
- **Ad details add-on**: one additional charge per vehicle when the details add-on is enabled and the ad returns data
- **Seller data add-on**: one additional charge per vehicle, but only when at least one dealer phone number is returned — private sellers, OLX.pl cross-listings and dealers without a published phone are never charged for this add-on

Pricing is optimized for efficiency, using minimal compute units while maintaining high success rates. Contact support for volume discounts on large-scale projects.

### Input configuration

The scraper accepts the following inputs:

Fields are listed in the order of the input form. A run needs at least one vehicle or one URL.

- **Search vehicles** (`vehicles`) — One make, model or both per line, e.g. `Skoda Octavia`, `skoda`, `BMW Seria 3`. Each line is its own search. For vans only the make is matched
- **Otomoto URLs** (`startUrls`) — Search, ad or dealer URLs (see the examples above). Plain strings or `{"url": ...}` objects
- **Max results per search** (`maxRequests`) — Cap on vehicles for each vehicle and each URL separately. Default 10. Pages of 32 vehicles are fetched until the cap is reached or the site's results end
- **Vehicle type** (`vehicleType`) — Cars, motorcycles and quads, or vans
- **Condition** (`condition`) — Used and new, used, or new
- **Voivodeship** (`region`) and **City** (`city`) — One of the 16 Polish voivodeships, and a city (searched with 50 km around it). A city Otomoto does not know, or one shared by several places when no voivodeship is picked, is skipped and named in the status message
- **Year from / to** (`yearFrom`, `yearTo`) — Production year range
- **Seller type** (`sellerType`) — Dealers (firms) and private sellers, dealers only, or private sellers only
- **Price from / to** (`priceFrom`, `priceTo`) — Asking price in złoty; "to" is 1 or more
- **Mileage from / to** (`kmFrom`, `kmTo`) — Kilometers driven; "to" is 1 km or more (for 0 km vehicles, set Condition to New)
- **Fetch ad details** (`detailsAddon`) and **Fetch seller data** (`sellerDataAddon`) — Optional add-ons, described below

The filters apply to typed vehicles only. Pasted URLs keep the filters they carry.

**Proxies included**: high-quality residential proxies are built into the Actor at no additional cost — no proxy configuration is required.

#### Fetch ad details (add-on)

Open each ad to add the full description (phone numbers, emails and VINs typed into it are hidden), every photo, publication and update dates, map coordinates and whether the price is negotiable. Charged per vehicle with details.

#### Fetch seller data (add-on)

Add the seller profile: dealer phone numbers, address, postal code, map coordinates, website, number of active ads and member-since year. Phone numbers and names are returned for dealers only; private sellers and OLX.pl cross-listings return the seller type and nothing personal. You are charged only when a phone number is returned.

### Output example

```json
{
  "type": "vehicle",
  "id": 6147033619,
  "url": "https://www.otomoto.pl/osobowe/oferta/mercedes-benz-glc-ID6I0kfx.html",
  "search": "Mercedes GLC",
  "title": "Mercedes-Benz GLC",
  "category": "osobowe",
  "price": 306900,
  "currency": "PLN",
  "make": "Mercedes-Benz",
  "model": "GLC",
  "price_is_gross": true,
  "net_price": null,
  "price_evaluation": null,
  "price_drop_pct": null,
  "lowest_price": null,
  "version": null,
  "generation": "II (2022-)",
  "year": 2025,
  "km": 5,
  "fuel": "Diesel",
  "gearbox": "Automatyczna",
  "engine_cc": 1993,
  "power_hp": 197,
  "body_type": "SUV",
  "color": "Biały",
  "doors": 4,
  "seats": 5,
  "drivetrain": "4x4 (stały)",
  "condition": "Nowy",
  "origin": "Polska",
  "features": [
    "heated_seat_passenger",
    "360_view_camera",
    "brake_assist",
    "roll_over_protection_system",
    "city_emergency_brake_assist",
    "acoustic_vehicle_alerting_system",
    "keyless_engine_start",
    "keyless_go"
  ],
  "attributes": {
    "make": "Mercedes-Benz",
    "model": "GLC",
    "generation": "II (2022-)",
    "year": "2025",
    "mileage": "5 km",
    "fuel_type": "Diesel",
    "engine_power": "197 KM",
    "engine_capacity": "1993 cm3",
    "gearbox": "Automatyczna",
    "body_type": "SUV",
    "color": "Biały",
    "door_count": "4",
    "nr_seats": "5",
    "transmission": "4x4 (stały)",
    "new_used": "Nowy",
    "country_origin": "Polska",
    "has_vin": "Tak",
    "registered": "Nie"
  },
  "city": "Poznań",
  "region": "Wielkopolskie",
  "seller_type": "dealer",
  "seller_id": "108668",
  "seller_name": "MB Motors Poznań Autoryzowany Dealer Mercedes-Benz Samochody Osobowe",
  "seller_url": "https://mbmotors-poznan.otomoto.pl",
  "is_crosslisted": false,
  "badges": [],
  "is_promoted": true,
  "is_highlighted": false,
  "thumbnail": "https://ireland.apollo.olxcdn.com/v1/files/unsjegp2pfou2-OTOMOTOPL/image;s=640x480",
  "listed_at": "2026-10-06T17:31:04Z",
  "bumped_at": "2026-09-30T17:21:00Z",
  "details": {
    "description": "MB Motors Sp. z o.o.\nAutoryzowany Salon i Serwis Mercedes-Benz\nBolesława Krzywoustego 71, 61-144 Poznań .\n\nMercedes-Benz   GLC 220 d 4MATIC Coupé\nWEWNĘTRZNY NUMER OFERTY: 0555908945\n\nCENA KATALOGOWA:…",
    "photos": [
      "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6InVuc2plZ3AycGZvdTItT1RPTU9UT1BMIiwidyI6W3siZm4iOiJ3ZzRnbnFwNnkxZi1PVE9NT1RPUEwiLCJzIjoiMTYiLCJhIjoiMCIsInAiOiIxMCwtMTAifV19.0_7mPkR3N0SMydbIj_jzdOyUokxDJSrFeG_aajTx3BU/image",
      "https://ireland.apollo.olxcdn.com/v1/files/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmbiI6Imw3OHVjbzBvMWJ1MS1PVE9NT1RPUEwiLCJ3IjpbeyJmbiI6IndnNGducXA2eTFmLU9UT01PVE9QTCIsInMiOiIxNiIsImEiOiIwIiwicCI6IjEwLC0xMCJ9XX0.h5GZr4dVGNcXHa1D245BEmuRcXjyrByzy_sb34ujOW8/image"
    ],
    "published_at": "2026-04-09T16:41:09Z",
    "updated_at": "2026-09-24T10:07:22.548581Z",
    "latitude": 52.374264,
    "longitude": 16.986261,
    "subregion": "poznan",
    "is_negotiable": false
  },
  "seller": {
    "id": "108668",
    "uuid": "816a9183-6517-408c-96de-79db3d00f934",
    "type": "dealer",
    "name": "MB Motors Poznań Autoryzowany Dealer Mercedes-Benz Samochody Osobowe",
    "business_name": "MB Motors Poznań Autoryzowany Dealer Mercedes-Benz Samochody Osobowe",
    "phones": [
      "781133994"
    ],
    "website": "http://www.mbmotors.pl",
    "profile_url": "https://mbmotors-poznan.otomoto.pl",
    "active_ads": 100,
    "address": null,
    "postal_code": "61-144",
    "city": "Poznań",
    "latitude": 52.37443838,
    "longitude": 16.98595694,
    "member_since": "2010"
  }
}
```

`features`, `attributes`, `description` and `photos` are shortened here; real items carry every equipment flag, every listing parameter, the full description and every photo. Prices are whole PLN: `price` is always the gross figure (what the listing card shows), `price_is_gross` is `false` when the seller lists the vehicle at a net price (VAT invoice, common on vans), and `net_price` then carries that net figure. A single ad URL yields the same price fields as the search card for the same vehicle. For single ad URLs, the search-only fields (`price_evaluation`, `price_drop_pct`, `lowest_price`, `badges`, `is_promoted`, `is_highlighted`, `listed_at`, `bumped_at`) are empty. The VIN, the licence plate and the first-registration date are never extracted. Phone numbers and email addresses that sellers type into the description are replaced with `[phone hidden]` and `[email hidden]` (the Otomoto ad page hides typed phone numbers too), and a VIN typed there with `[id hidden]`.

You can download the dataset extracted by **Otomoto Scraper** in various formats such as **JSON, HTML, CSV, or Excel**. The data is automatically cleaned and normalized for immediate use in analysis tools, databases, or business applications.

### Use cases and applications

- **Used-car market research** — track prices, mileage and supply by make, model, generation, year and voivodeship across Poland
- **Pricing and valuation** — benchmark against Otomoto's own below/in/above-market rating and price drops
- **Dealer lead generation** — build lists of dealers with phone numbers, addresses and inventory size
- **Inventory monitoring** — follow a dealer's whole stock or a filtered search on a schedule
- **Van and fleet sourcing** — compare net prices on commercial vehicles from VAT-registered dealers

### Integrations and API access

Otomoto Scraper seamlessly integrates with popular platforms:

- **Zapier** — Automate data workflows and notifications (via [Apify Zapier integration](https://docs.apify.com/platform/integrations/zapier))
- **Make (Integromat)** — Create complex automation scenarios (via [Apify Make integration](https://www.make.com/en/integrations/apify))
- **Google Sheets** — Direct data export for analysis
- **REST API** — Programmatic access to extracted data ([instructions here](https://docs.apify.com/academy/api/run-actor-and-retrieve-data-via-api))
- **Python/Node.js SDKs** — Easy integration into applications ([instructions here](https://docs.apify.com/academy/api/run-actor-and-retrieve-data-via-api#javascript-and-python-client))

### FAQ and Support

#### Do I need to configure a proxy?

No. Otomoto runs bot-protection services that can block direct requests, so the Actor includes high-quality proxies automatically at no additional cost. There's nothing to configure.

#### Why are there no phone numbers or names for private sellers?

To respect the privacy of private individuals under the EU's GDPR (RODO in Poland), the seller data add-on returns phone numbers and names for dealers (professional sellers) only, and the dealer name is the trading name, never the account holder's personal name. Private sellers and OLX.pl cross-listings come back with their seller type and nothing personal, and are not charged for the add-on. The VIN, the licence plate and the registration date are not extracted either, and a VIN typed into the description is hidden.

#### What is a cross-listed ad?

Otomoto shows some ads published on OLX.pl (both sites belong to the OLX Group) in its search results, with an `OLX_ID` in the URL. They are returned like any other vehicle with `is_crosslisted: true`. They are always private sellers, so no seller name, page or phone is returned for them.

#### What does the price evaluation mean?

It is Otomoto's own rating of the asking price against similar vehicles: `BELOW`, `IN` or `ABOVE` market. It appears on search results for cars; motorcycles, vans and vehicles without a rating return `null`.

#### Can I filter by specific brands or models?

Yes. Type the make or model in *Search vehicles* (for example `Skoda Octavia` or `skoda`); it is matched against Otomoto's own catalog, and the filters (vehicle type, condition, voivodeship, city, year, seller type, price, mileage) narrow it down. Or use Otomoto's search filters in your browser and copy the filtered URL into *Otomoto URLs*; the URL keeps every filter it carries.

#### How often is the data updated?

Otomoto updates listings in real-time. For fresh data, schedule regular scraper runs or use our API for on-demand extraction.

#### What if some URLs don't work?

The scraper only supports specific URL patterns from Otomoto. Ensure your URLs match the compatible formats listed above. URLs outside these patterns (trucks, trailers, machinery, buses, parts) are skipped with a warning in the log.

#### Do you offer custom solutions?

Absolutely! We can customize the scraper for specific requirements, additional data points, or integration with your existing systems. Contact us through the Issues tab for enterprise solutions.

#### Need help or have feedback?

- **Report issues**: Use the Issues tab for bug reports and feature requests
- **Custom development**: Contact us for tailored solutions and enterprise integrations

### Po polsku

**Otomoto Scraper** pobiera ogłoszenia samochodów osobowych, motocykli i quadów oraz samochodów dostawczych z [Otomoto](https://www.otomoto.pl/): marka, model, generacja, wersja, rok produkcji, przebieg, paliwo, moc, cena (brutto lub netto), ocena ceny samego Otomoto (poniżej / w granicach / powyżej rynku), obniżki ceny, lokalizacja i sprzedający. Ogłoszenia z OLX.pl wyświetlane na Otomoto są uwzględnione i oznaczone polem `is_crosslisted`. Proxy w cenie, bez konfiguracji.

**Wpisz pojazdy zamiast adresów:** w polu *Search vehicles* wystarczy wpisać markę, model lub oba (np. `Skoda Octavia`, `skoda`, `BMW Seria 3`); tekst jest dopasowywany do katalogu Otomoto, a filtry (typ pojazdu, stan, województwo, miasto, rok, sprzedający, cena, przebieg) zawężają wyniki.

**Akceptowane adresy URL:** wyszukiwania z `/osobowe`, `/motocykle-i-quady` lub `/dostawcze` z dowolnymi filtrami (marka, model, rok, województwo, cena, słowo kluczowe, sortowanie), pojedyncze ogłoszenia (`/osobowe/oferta/...-ID6I0kfx.html`, także krótka forma `/oferta/...` i ogłoszenia z OLX.pl `...-OLX_ID....html`) oraz strony dealerów (`https://bmw-dobrzanski.otomoto.pl`, cały stan magazynowy dealera). Inne kategorie (ciężarowe, przyczepy, maszyny, autobusy, części) nie są obsługiwane i są pomijane.

**Opcjonalne dodatki:**

- **Szczegóły ogłoszenia** — pełny opis (numery telefonów, adresy email i numery VIN wpisane w opis są ukryte), wszystkie zdjęcia, daty publikacji i aktualizacji, współrzędne i czy cena jest do negocjacji. Opłata za każdy pojazd ze szczegółami.
- **Dane sprzedającego** — telefony dealera, adres, kod pocztowy, współrzędne, strona www, liczba aktywnych ogłoszeń i rok rejestracji na Otomoto. Telefony i nazwy handlowe tylko dealerów (sprzedających profesjonalnych; nigdy imię i nazwisko właściciela konta), zgodnie z RODO: sprzedający prywatni i ogłoszenia z OLX.pl zwracają jedynie typ sprzedającego, bez danych osobowych, i nie są za ten dodatek rozliczani. Opłata tylko wtedy, gdy zwrócony jest co najmniej jeden numer telefonu.

Każdy pojazd jest zwracany (i rozliczany) tylko raz w jednym uruchomieniu. Numer VIN, numer rejestracyjny i data pierwszej rejestracji nie są pobierane; numer VIN wpisany w opis jest zastępowany przez `[id hidden]`. Dla pojedynczych ogłoszeń pola dostępne tylko w wynikach wyszukiwania (`price_evaluation`, `price_drop_pct`, `lowest_price`, `badges`, `is_promoted`, `is_highlighted`, `listed_at`, `bumped_at`) pozostają puste.

# Changelog

This Actor's version history is a separate document: https://apify.com/ribtools/otomoto-scraper/changelog.md

# Actor input Schema

## `vehicles` (type: `array`):

Type it the way you would in Otomoto's search box: a make (`skoda`), a model (`Octavia`) or both (`BMW Seria 3`). One per line, each becomes its own search. Spelling is matched against Otomoto's own catalog. For vans only the make is matched. Leave empty if you only paste URLs below.

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

Otomoto URLs from your browser: searches for cars (`/osobowe`), motorcycles and quads (`/motocykle-i-quady`) or vans (`/dostawcze`) with any filters, e.g. `https://www.otomoto.pl/osobowe/bmw/seria-3?search[filter_float_price:to]=60000`, single ads (`/osobowe/oferta/...-ID6I0kfx.html`, `/oferta/...`, OLX.pl `...-OLX_ID....html`) and dealer pages (`https://bmw-dobrzanski.otomoto.pl`).

## `maxRequests` (type: `integer`):

Maximum number of vehicles for each vehicle and each URL above. Each result is a charged event. Default 10.

## `vehicleType` (type: `string`):

Cars, motorcycles and quads, or vans. Applies to the vehicles typed above.

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

Used, new, or both.

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

Polish voivodeship. Leave empty to search the whole country.

## `city` (type: `string`):

A city, for example `Kraków`. Searches the city and 50 km around it, Otomoto's default radius; the name is checked against Otomoto's own location list, and an unknown name, or one shared by several places when no voivodeship is picked, is skipped and named in the status message. If you also pick a voivodeship, the city must be in it.

## `yearFrom` (type: `integer`):

Oldest production year to include.

## `yearTo` (type: `integer`):

Newest production year to include. Leave empty for no upper limit.

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

Dealers (firms), private sellers, or both.

## `priceFrom` (type: `integer`):

Lowest asking price to include, in złoty.

## `priceTo` (type: `integer`):

Highest asking price to include, in złoty: 1 or more (no vehicle is listed at 0).

## `kmFrom` (type: `integer`):

Lowest mileage to include.

## `kmTo` (type: `integer`):

Highest mileage to include: 1 km or more. For 0 km vehicles, set Condition to New instead.

## `detailsAddon` (type: `boolean`):

Open each ad to add the full description, every photo, publication and update dates, map coordinates and whether the price is negotiable. Charged per vehicle with details.

## `sellerDataAddon` (type: `boolean`):

Add the seller profile: dealer phone numbers, address, postal code, map coordinates, website, number of active ads and member-since year. Phone numbers and names are returned for dealers only; private sellers and OLX.pl cross-listings return the seller type and nothing personal. You are charged only when a phone number is returned.

## Actor input object example

```json
{
  "vehicles": [
    "Skoda Octavia",
    "Toyota Corolla"
  ],
  "startUrls": [
    "https://www.otomoto.pl/osobowe/bmw/seria-3?search[filter_float_price:to]=60000"
  ],
  "maxRequests": 10,
  "vehicleType": "car",
  "condition": "all",
  "sellerType": "all",
  "detailsAddon": false,
  "sellerDataAddon": false
}
```

# Actor output Schema

## `items` (type: `string`):

All scraped items.

# 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 = {
    "vehicles": [
        "Skoda Octavia",
        "Toyota Corolla"
    ],
    "maxRequests": 10,
    "detailsAddon": false,
    "sellerDataAddon": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("ribtools/otomoto-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 = {
    "vehicles": [
        "Skoda Octavia",
        "Toyota Corolla",
    ],
    "maxRequests": 10,
    "detailsAddon": False,
    "sellerDataAddon": False,
}

# Run the Actor and wait for it to finish
run = client.actor("ribtools/otomoto-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 '{
  "vehicles": [
    "Skoda Octavia",
    "Toyota Corolla"
  ],
  "maxRequests": 10,
  "detailsAddon": false,
  "sellerDataAddon": false
}' |
apify call ribtools/otomoto-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ribtools/otomoto-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/h6kJB1p1JDgWsCjsJ/builds/IJXw1Cbl8ao0854p6/openapi.json
