# Mobile.de Scraper — Cars, Vans & Bikes Listings (`nice_dev/mobile-de-listings-scraper`) Actor

Scrape mobile.de listings: cars, vans, bikes and 9 more classes, every search filter of the site, price rating, dealer data, price tracking. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/nice_dev/mobile-de-listings-scraper.md
- **Developed by:** [Nice Dev](https://apify.com/nice_dev) (community)
- **Categories:** E-commerce, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.19 / 1,000 listings

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

### 🚗 What is Mobile.de Scraper?

**Mobile.de Scraper** extracts **vehicle listings from [mobile.de](https://www.mobile.de)**: **price, mobile.de price rating with its euro limits, mileage, power, first registration, fuel, gearbox, equipment, photos, financing, dealer name, address and rating**, for cars, motorbikes, motorhomes, vans, trucks, trailers and 6 more vehicle types. It works as a **mobile.de API alternative**: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.

Type a **make and model** (`BMW` + `3er`), a postcode or a town with a radius, or paste any mobile.de search URL, click **Start**, and download the listings in JSON, CSV or Excel. No login, nothing to set up.&#x20;

### 📋 What data can you extract from mobile.de?

One item per listing, 168 fields:

| Category | What you get |
| --- | --- |
| 🏷️ **Listing** | title, link, mobile.de id, make, model, trim line, vehicle type, body type, new or used — `Volkswagen T-Roc 2.0 TDI DSG 4-MOTION R-Line` |
| 💰 **Price** | gross price, net price and VAT rate for business buyers, price on request, crossed-out old price — `€28,950` (`€24,327.73` net) |
| 📊 **Price rating** | mobile.de's rating (very good to high price), the 6 euro limits of its rating bands for this vehicle, where the price sits on the scale — `Fair price: €28,100 to €31,300` |
| 🚘 **Vehicle** | first registration, mileage, power in kW and hp, fuel, gearbox, engine size, doors, seats, colour, Euro class, previous owners, HU / TÜV date — `07/2022, 31,000 km, 150 hp, diesel, automatic` |
| 🔧 **Equipment and condition** | full equipment list, every technical attribute, CO₂ and consumption, range and battery of electric cars, accident-free or damaged, HSN / TSN keys, last service — `Accident-free, 1 previous owner` |
| 📝 **Text and photos** | full description (text and HTML), the summary of the listing provided by mobile.de, highlights, every photo in the size you choose, video and 360° flags |
| 💶 **Financing and leasing** | monthly rate, down payment, term, interest rate and bank of each financing offer; leasing rates — `€292 a month over 60 months` |
| 🏢 **Seller** | dealer or private, dealer name, address and GPS point, rating with its sub-scores, number of reviews, opening hours, languages, website — `Schreiner Automobile, Bonn, rated 5 / 5, 85 reviews` |
| 📞 **Phone numbers** | every phone number and WhatsApp, with the **Seller phone numbers** option |
| 🗂️ **Dealer profile** | e-mail, imprint (legal name, managing director, register), VAT id, number of vehicles offered, latest customer reviews, with the **Dealer profiles** option |
| 🔔 **Monitoring** | new listing or price changed, the price delivered before, the change in euros and in % |
| 🕒 **Dates and search** | first put online, last change, last push to the top, days online, the search that found the listing and its rank |

Every field, with an example, is listed in the **Output** section below.

The fields whose description says **Detail** come from the listing page: they are filled when **Extract details** is on (a paid option, off by default). Without it, every listing still has its price, price rating with its limits, mileage, power, first registration, fuel, gearbox, photos, dealer name, address and rating.

### ✅ Why use Mobile.de Scraper?

- 🎯 **Search by make and model, not only by URL**: `BMW 3er`, `Golf` or `A-Klasse`, a German postcode or town with a radius, and the filters of mobile.de's search form as fields (price, year, mileage, power, fuel, gearbox, body, colour, price rating, Euro class, HU, leasing, equipment…). Any other filter of the site goes in **Other mobile.de filters**, by its mobile.de code.
- 🧩 **Past the 2,000 limit**: mobile.de returns at most 2,000 listings per search. The Actor cuts a bigger search into price bands by itself, for free, and the bands add up to the search's total.
- 📊 **The price rating in numbers**: not only "good price", but the 6 euro limits of mobile.de's rating bands for that vehicle and where its price sits, on every rated listing.
- 🔔 **Monitoring and price tracking**: **Only new listings** returns only what earlier runs never delivered (free); **Report price changes** also brings back a listing whose price moved, with the old price and the change in euros and in %.
- 🏢 **Dealer data**: rating with its sub-scores, opening hours, languages, website; with **Dealer profiles**, the e-mail, the imprint with the VAT id and the latest customer reviews.
- 🚚 **12 vehicle types**: cars, motorbikes, motorhomes, vans, trucks, semi-trailer trucks, trailers, buses, agricultural vehicles, construction machines, forklifts and e-bikes.
- 🗂️ **Several searches in one run**: make / model lines × keywords × locations × sellers, with a cap per search; a listing found by several searches is saved once.
- 🔌 API, scheduling, monitoring, integrations (Make, Zapier, n8n, Google Sheets…), proxy rotation and JSON/CSV/Excel export via the Apify platform.

### 🚀 How to scrape mobile.de

1. Create a free Apify account.
2. Open **Mobile.de Scraper**, keep **Vehicle type** on `Car` (or pick another section) and type a **Make** and a **Model** (e.g. `BMW` and `3er`); add a **Location** and a **Radius** if you want.
3. Or paste your own mobile.de URLs into **Start URLs**: a search results page (every filter set on the site is kept, pagination is automatic), a listing page or a dealer page.
4. Set **Max listings** (100 by default, 0 = no limit) — and **Max listings per search** when you run several searches — then click **Start**.
5. Download the dataset in JSON, CSV, Excel or via API.

### 💰 How much does it cost to scrape mobile.de?

This Actor uses **pay per event** pricing (see the **Pricing** tab): you pay for the listings saved, plus the options you tick.

| What you pay for | Event | Free plan | Bronze | Silver | Gold |
| --- | --- | --- | --- | --- | --- |
| 1,000 listings with every field of the results list | `apify-default-dataset-item` | $0.29 | $0.24 | $0.22 | $0.19 |
| 1,000 listings with their page read (description, equipment, technical data), on top of the listing | `listing-details` | $0.089 | $0.088 | $0.087 | $0.086 |
| 1,000 listings with at least one seller phone number, only with **Seller phone numbers** | `phone-found` | $0.045 | $0.044 | $0.043 | $0.042 |
| 1,000 dealer profiles (once per dealer and run, reviews included), only with **Dealer profiles** | `dealer-profile` | $22.99 | $21.99 | $19.99 | $17.99 |
| 1,000 listings already delivered that come back because their price changed, only with **Report price changes** (on top of the listing) | `price-change` | $0.59 | $0.54 | $0.49 | $0.42 |
| 1,000 listings already delivered, read again only to check their price, only with **Report price changes** | `price-check` | $0.018 | $0.018 | $0.018 | $0.018 |
| 1,000 listings dropped on the results list by one of the Actor's own filters | `filter-check` | $0.19 | $0.18 | $0.17 | $0.16 |
| 1,000 listing pages read, then dropped by a filter decided on them (**With phone only**) | `detail-filter-check` | $0.089 | $0.088 | $0.087 | $0.086 |
| Run start | `apify-actor-start` | $0.01 per run | $0.01 per run | $0.01 per run | $0.01 per run |

Two examples: 1,000 listings on the Gold plan, no option = $0.01 + $0.19 = **$0.20**. 1,000 listings on the Free plan with **Extract details** and **Seller phone numbers**, 700 of them with a number = $0.01 + $0.29 + $0.089 + $0.032 = **$0.42**.

What is charged, in detail:

- each **listing** saved in the dataset, with every field of the results list (price rating, mileage, power, photos, dealer name and address included);
- each **listing with details**, on top of the listing, when its listing page was read: with **Extract details**, and for every listing given by **Listing IDs** or by a listing URL (`listing-details`);
- each listing delivered with at least one **phone number**, with **Seller phone numbers** (`phone-found`), however many numbers it has; a listing without a number costs nothing more, and a private seller's listing page read only for its number is not charged as details;
- each **dealer profile**, once per dealer and run, its reviews included, with **Dealer profiles** (`dealer-profile`); private sellers have none and cost nothing more;
- each listing that comes back because its **price changed**, with **Report price changes** (`price-change`), and a small fee for each listing already delivered that the run reads again only to check its price (`price-check`);
- a small fee per run start, and a small fee for each listing that a filter of the Actor checks and drops (`filter-check`; `detail-filter-check` when the filter needs the listing page) — filtering never costs more than taking everything.

The vehicle filters of the form are applied by mobile.de itself: the listings they leave out are never read and cost nothing. Only the fields of the **Filters** section (posted after / before, exclude keywords, with phone only) are checked by the Actor. Going past 2,000 listings per search is free. Platform usage (compute, proxy) is included in the price.

### ⚙️ Input

A make and model around a postcode, with a few vehicle filters:

```json
{
    "make": "BMW",
    "model": "3er",
    "location": "10115",
    "radiusKm": 100,
    "maxPrice": 30000,
    "minYear": 2019,
    "maxItems": 200
}
```

Several searches, a cap per search, only the deals, only the listings not delivered before, and their price changes:

```json
{
    "models": ["Volkswagen Golf", "Audi A4", "Tesla"],
    "locations": ["Berlin", "München"],
    "maxItems": 1000,
    "maxItemsPerQuery": 100,
    "priceRatings": ["VERY_GOOD_PRICE", "GOOD_PRICE"],
    "onlyNew": true,
    "includePriceChanges": true,
    "stateKey": "deals-berlin-munich"
}
```

Equipment codes, another mobile.de filter, a keyword to leave out, the last 7 days, with the listing details:

```json
{
    "make": "Mercedes-Benz",
    "fuelTypes": ["ELECTRICITY"],
    "minPowerHp": 200,
    "features": ["HEAD_UP_DISPLAY", "PANORAMIC_GLASS_ROOF"],
    "customFilters": { "clim": "AUTOMATIC_CLIMATISATION", "it": ["LEATHER", "ALCANTARA"] },
    "excludeKeywords": ["Motorschaden", "Export"],
    "postedAfter": "7 days",
    "extractDetails": true
}
```

Every vehicle of two dealers, with their profile and their 10 latest reviews:

```json
{
    "sellerIds": ["466818", "462978"],
    "includeDealerProfiles": true,
    "reviewLimit": 10,
    "maxItems": 0
}
```

Or with your own URLs and listing ids:

```json
{
    "startUrls": [
        { "url": "https://suchen.mobile.de/fahrzeuge/search.html?vc=Car&ms=25200%3B65%3B%3B" },
        { "url": "https://home.mobile.de/home/index.html?customerId=466818" }
    ],
    "listingIds": ["349006704"],
    "includePhones": true,
    "maxItems": 500
}
```

| Field | Notes |
| --- | --- |
| `vehicleType` | The mobile.de section to search: `Car` (default), `Motorbike`, `Motorhome`, `VanUpTo7500`, `TruckOver7500`, `SemiTrailerTruck`, `Trailer`, `Bus`, `AgriculturalVehicle`, `ConstructionMachine`, `ForkliftTruck` or `EBike`. Some filters exist only for cars: mobile.de ignores a filter its section does not have, and the run log says so. |
| `make` | Make as written on mobile.de: `BMW`, `Volkswagen`, `Mercedes-Benz` (case and accents ignored), or its mobile.de id (`3500`). An unknown make stops the run with the closest names, instead of searching every make. Empty = all makes. |
| `model`, `modelDescription` | Model of the make: one model (`Golf`, `320`) or a series (`3er`, `3 Series`, `A-Klasse` = all its models), or its mobile.de id. `modelDescription` = words of the version searched by mobile.de (`xDrive`, `GTI`). Both need `make`. |
| `models` | Several make + model searches, one per line: `BMW 3er`, `Audi A4`, `Tesla` (a make alone = all its models). Added to `make` / `model`; each line is a search of its own. |
| `query`, `searchQueries` | Free text mobile.de looks for in the listing (title, description, equipment): `xenon`, `scheckheft`. `searchQueries` adds more keywords, one search each. |
| `location`, `locations`, `radiusKm` | Centre of a radius search: a German postcode (`10115`), a German town (`Berlin`, `München`) or GPS coordinates (`52.52,13.40`); `locations` adds more places, `radiusKm` is the distance around each one (50 km by default). Every search is run around every location (max 500 searches per run). |
| `country` | Only vehicles offered in these countries (`DE`, `AT`, `NL`…): mobile.de also lists vehicles of dealers abroad. Empty = all countries. |
| `sellerIds` | Every vehicle of these sellers: the seller id this Actor returns (`sellerId`, e.g. `466818`) or a dealer page URL (`https://home.mobile.de/home/index.html?customerId=466818`), up to 500 sellers. Each seller is a search of its own; the filters still apply. |
| `listingIds` | These listings, by id (`349006704`) or listing URL (`https://suchen.mobile.de/auto-inserat/volkswagen-t-roc/349006704.html`), up to 1,000 ids. Always added to the searches, and always read with their details. |
| `startUrls` | mobile.de links as they are in your browser: a search (`https://suchen.mobile.de/fahrzeuge/search.html?vc=Car&ms=25200%3B65%3B%3B`, every filter set on the site is kept), a listing or a dealer page (`https://home.mobile.de/home/index.html?customerId=466818` = all its vehicles), up to 1,000 URLs. A search is read from its first page: page numbers in a pasted link are ignored (the log says so). When this list is not empty, the search fields above and the vehicle filters (price, fuel, year, sort order, country, vehicle type…) are ignored: set them on mobile.de before copying the link. The Actor's own filters (`excludeKeywords`, dates, `requirePhone`), the caps and monitoring still apply. |
| `maxItems` | Stop after this many listings for the whole run (`0` = no limit). |
| `maxItemsPerQuery` | Cap for EACH search (make / model × keyword × location × seller, or start URL), so that the first search cannot use up the whole budget. `0` = no per-search cap. |
| `splitLargeSearches` | On by default and free: a search over mobile.de's limit is cut into price bands, read one after the other (see Tips; unless sorted by price, the listings then come band by band, not in the order of the sort). Off: the first listings of the search only. |
| `extractDetails` | Paid option, off by default: open each listing for the full description, all equipment, every technical attribute, the summary provided by mobile.de, financing details, the dealer's website, languages and opening hours. |
| `includePhones`, `requirePhone` | Paid option, off by default: the seller's phone and WhatsApp numbers (a dealer's come with the results list, a private seller's are read on the listing page). `requirePhone` keeps only the listings that have one and needs `includePhones`. |
| `includeDealerProfiles`, `reviewLimit` | Paid option, off by default: each dealer's mobile.de page, read once per run (e-mail, own website, imprint with legal name, managing director, register and VAT id, number of vehicles); `reviewLimit` adds up to that many of its latest customer reviews (up to 100), included in the profile. |
| `minPrice`, `maxPrice`, `minYear`, `maxYear`, `minMileage`, `maxMileage`, `minEngineSize`, `maxEngineSize` | Ranges: gross price in euros, year of first registration, mileage in km, engine size in cm³. Leave a bound empty for no limit. |
| `minPowerKw`, `maxPowerKw`, `minPowerHp`, `maxPowerHp` | Engine power in kW or in hp (PS), one or the other, not both. |
| `fuelTypes` | Any of `PETROL`, `DIESEL`, `ELECTRICITY`, `HYBRID`, `HYBRID_DIESEL`, `LPG`, `CNG`, `HYDROGENIUM`, `ETHANOL`, `OTHER`. |
| `transmission` | Any of `AUTOMATIC_GEAR`, `MANUAL_GEAR`, `SEMIAUTOMATIC_GEAR`. |
| `bodyTypes` | Cars: `Limousine` (saloon), `EstateCar`, `SmallCar`, `OffRoad` (SUV, off-road, pick-up), `Cabrio`, `SportsCar`, `Van`, `OtherCar`. |
| `condition` | `ANY` (default), `NEW` or `USED`. |
| `sellerType` | `ANY` (default), `DEALER`, `PRIVATE` or `COMMERCIAL_PRIVATE` (a private seller flagged by mobile.de as selling commercially). |
| `exteriorColors` | Any of `BLACK`, `WHITE`, `GREY`, `SILVER`, `BLUE`, `RED`, `GREEN`, `BROWN`, `BEIGE`, `YELLOW`, `ORANGE`, `GOLD`, `PURPLE`. |
| `priceRatings` | Any of `VERY_GOOD_PRICE`, `GOOD_PRICE`, `REASONABLE_PRICE`, `INCREASED_PRICE`, `HIGH_PRICE`, `NO_RATING` — the first two are the deals. |
| `maxPreviousOwners`, `minSeats`, `maxSeats` | At most this many previous owners; number of seats. |
| `doors` | `TWO_OR_THREE`, `FOUR_OR_FIVE` or `SIX_OR_SEVEN`. |
| `driveType` | `ALL_WHEEL`, `FRONT` or `REAR`. |
| `emissionClass` | This Euro class or a better one: `EURO1`, `EURO2`, `EURO3`, `EURO4`, `EURO5`, `EURO6`, `EURO6C`, `EURO6D_TEMP`, `EURO6D`, `EURO6E`, `EURO7`. |
| `emissionSticker` | German low-emission sticker, this one or better: `EMISSIONSSTICKER_RED`, `EMISSIONSSTICKER_YELLOW`, `EMISSIONSSTICKER_GREEN` (`EMISSIONSSTICKER_NONE` = no filter). |
| `excludeDamaged`, `damagedOnly`, `roadworthyOnly`, `vatReclaimable`, `withPicturesOnly`, `withVideoOnly`, `priceReducedOnly`, `qualitySealOnly`, `excludeExportOffers` | Tick-boxes of mobile.de's form: no unrepaired damage or damaged only (not both), ready to drive, VAT deductible (net price shown), with photos, with a video, price lowered, certified used cars (quality seal), no export offers. |
| `onlineSinceDays` | `1`, `3`, `7` or `14`: listings put online in the last N days, filtered by mobile.de itself (for any other period: `postedAfter`). |
| `huValidMonths` | `0`, `3`, `6`, `9`, `12` or `18`: German general inspection (HU / TÜV) still valid for at least this many months (`0` = a new HU). |
| `minSellerRating` | Dealers rated at least this many stars on mobile.de. |
| `leasingOnly`, `maxLeasingRate` | `PRIVATE` or `BUSINESS`: only listings with a leasing offer for that use; `maxLeasingRate` = highest monthly rate in euros. |
| `usageTypes` | Any of `PRE_REGISTRATION`, `EMPLOYEES_CAR`, `DEMONSTRATION`, `CLASSIC`. |
| `features` | Required equipment, ALL of it, as mobile.de codes: `NAVIGATION_SYSTEM`, `CARPLAY`, `HEAD_UP_DISPLAY`, `PANORAMIC_GLASS_ROOF`, `ELECTRIC_HEATED_SEATS`, `FULL_SERVICE_HISTORY` — the 111 codes are listed under Tips. An unknown code stops the run with the closest codes. |
| `customFilters` | Any other filter of mobile.de's search form, as parameter: value (a list for several values), like the third example above; every parameter and its values are listed under Tips. An unknown parameter or value stops the run, instead of being ignored by mobile.de. |
| `sortBy` | `NEWEST` (default, the order that lets `onlyNew` stop early), `RELEVANCE`, `PRICE_ASC`, `PRICE_DESC`, `MILEAGE_ASC`, `MILEAGE_DESC`, `YEAR_DESC`, `YEAR_ASC`, `POWER_DESC`, `POWER_ASC`. |
| `postedAfter`, `postedBefore` | Date the listing was first put online on mobile.de: `2026-09-01`, or a period before now (`7 days`, `2 weeks`, `1 month`, `24 hours`). A `postedAfter` within the last 13 days is also sent to mobile.de as its **Online since** window, so older listings are not read nor charged; an older one reads the whole search. |
| `excludeKeywords` | Drop the listings whose title or subtitle contains one of these words (case and German umlauts ignored): `Motorschaden`, `Export`, `defekt`, or a model to leave out (`M3`). A word also counts inside a longer word: `unfall` also matches `unfallfrei`. |
| `onlyNew`, `stateKey`, `resetState` | Monitoring: only the listings never delivered under this memory key (`golf-berlin`: letters, digits, `-` and `_`); `resetState` forgets the memory once. |
| `includePriceChanges`, `minPriceChangePercent` | Paid option, off by default, needs `onlyNew`: a listing already delivered comes back when its price changed; `minPriceChangePercent` ignores the smaller changes. |
| `language` | `en` (default) or `de`: language of the texts mobile.de writes (fuel, gearbox, colour, equipment, attribute labels, its summary). The codes (`fuelType`, `priceRating`…) and the numbers are the same in both; the sellers' own texts are never translated. |
| `imageSize` | `small`, `medium` or `large` (default): width of the photo URLs. |
| `includeRaw` | Add a column with the untouched mobile.de data of each listing (results card and detail), to recover a field this Actor does not map yet. |
| Advanced | `proxyConfiguration` (no proxy by default; turn the Apify proxy on if your runs get blocked, its usage is included in the price; the residential proxy is not available), `maxConcurrency`, `maxRequestsPerMinute`, `minRequestIntervalMs`, `maxRequestRetries`, `debugLog`. |

Place and postcode data: [GeoNames](https://www.geonames.org), licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) (German postcodes and towns, filtered, coordinates rounded).

### 📦 Output

One listing as the Actor returns it, with **Extract details** on (shortened: only some of the fields, and the description, the summary, the equipment and the photos cut):

```json
{
    "id": "349006704",
    "url": "https://suchen.mobile.de/auto-inserat/volkswagen-t-roc-2-0-tdi-dsg-4-motion-r-line-navi-sofort-bonn/349006704.html",
    "title": "Volkswagen T-Roc 2.0 TDI DSG 4-MOTION R-Line Navi SOFORT !",
    "vehicleType": "Car",
    "make": "Volkswagen",
    "model": "T-Roc",
    "trimLine": "R-Line",
    "bodyType": "OffRoad",
    "condition": "USED",
    "price": 28950,
    "currency": "EUR",
    "priceType": "FIXED",
    "priceNet": 24327.73,
    "vatRate": 19,
    "priceRating": "REASONABLE_PRICE",
    "priceRatingLabel": "Fair price",
    "priceRatingThresholds": [
        20100,
        26100,
        28100,
        31300,
        33600,
        37300
    ],
    "priceRatingPosition": 26,
    "firstRegistration": "07/2022",
    "mileageKm": 31000,
    "powerKw": 110,
    "powerHp": 150,
    "fuelType": "DIESEL",
    "transmission": "AUTOMATIC_GEAR",
    "cubicCapacityCc": 1968,
    "driveType": "Four-wheel drive",
    "exteriorColor": "Black",
    "emissionClass": "Euro6",
    "previousOwners": 1,
    "generalInspection": "06/2027",
    "accidentFree": true,
    "usageType": "DEMONSTRATION",
    "kbaHsn": "0603",
    "kbaTsn": "CEC",
    "description": "• SOFORT LIEFERBAR !!!\n• .\n• R-Line Ausstattung\n• 4-Motion Allrad !!!\n…",
    "features": [
        "ABS",
        "Adaptive Cruise Control",
        "Alloy wheels",
        "Ambient lighting",
        "Android Auto",
        "Apple CarPlay"
    ],
    "aiSummary": "This accident-free first-owner vehicle impresses with low mileage and TÜV until summer 2027. …",
    "images": [
        "https://img.classistatic.de/api/v1/mo-prod/images/70/70d6e7cb-54a4-4fe5-bffd-ba3ef05ded7a?rule=mo-1024.jpg",
        "https://img.classistatic.de/api/v1/mo-prod/images/46/46902afa-0a5f-4d12-9609-678aec214a64?rule=mo-1024.jpg"
    ],
    "imageCount": 16,
    "financeMonthlyInstallment": 292,
    "financeTermMonths": 60,
    "financeInterestRate": 7.99,
    "publishedAt": "2022-07-20T12:31:00.000Z",
    "renewedAt": "2026-10-21T15:08:15.000Z",
    "postalCode": "53225",
    "city": "Bonn",
    "sellerId": "466818",
    "sellerType": "DEALER",
    "sellerName": "Schreiner Automobile",
    "sellerRating": 5,
    "sellerReviewCount": 85,
    "detailsIncluded": true,
    "searchUrl": "https://suchen.mobile.de/fahrzeuge/search.html?vc=Car&ms=25200%3B65%3B%3B",
    "searchQuery": "Volkswagen T-Roc",
    "searchRank": 1,
    "scrapedAt": "2026-10-21T16:20:00.000Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV or Excel.

#### All 168 fields

| Fields | What you get |
| --- | --- |
| `id`, `url`, `title`, `shortTitle`, `subTitle` | **Listing**: mobile.de id, listing page, title, make and model as on the results card, the rest of the title — `349006704`, `Volkswagen T-Roc`, `2.0 TDI DSG 4-MOTION R-Line Navi SOFORT !` |
| `vehicleType`, `make`, `makeId`, `model`, `modelId`, `modelRange`, `trimLine` | section (`Car`…), make and model with their mobile.de ids (usable in **Make** / **Model**), model range or generation, trim line — `Volkswagen` (`25200`), `T-Roc` (`65`), `R-Line` |
| `bodyType`, `bodyTypeLabel`, `condition`, `isNew` | body type code and label (`OffRoad`, `SUV/Off-road Vehicle/Pickup Truck`), `NEW` or `USED`, mobile.de's "new listing" badge (also on used cars) |
| `price`, `currency`, `priceType`, `priceText` | **Price**: gross price in euros (null when on request), currency, `FIXED`, `NEGOTIABLE`, `ON_REQUEST` or `LEASING_ONLY`, the price as displayed — `28950`, `EUR`, `€28,950` |
| `priceNet`, `vatRate`, `vatReclaimable` | net price and VAT rate when the VAT is deductible — `24327.73`, `19`, `true` |
| `previousPrice`, `priceReduced` | the old price mobile.de shows crossed out when the seller lowered it |
| `priceRating`, `priceRatingLabel`, `priceRatingThresholds`, `priceRatingRanges`, `priceRatingPosition`, `noRatingReason` | **Price rating**: code and label, the 6 euro limits of the rating bands for this vehicle, the same as bands `{rating, minPrice, maxPrice}`, where the price sits on the scale (0-100), why a price is not rated — `REASONABLE_PRICE`, `Fair price`, `[20100, 26100, 28100, 31300, 33600, 37300]`, `26` |
| `firstRegistration`, `firstRegistrationYear`, `constructionYear`, `mileageKm` | **Vehicle**: first registration (`07/2022`, `2022`), construction year (machines, trailers), mileage in km — `31000` |
| `powerKw`, `powerHp`, `fuelType`, `fuelTypeLabel`, `transmission`, `transmissionLabel`, `cubicCapacityCc`, `cylinders`, `engineType`, `driveType` | power, fuel and gearbox (code and label), engine size in cm³, cylinders, engine type, driven wheels — `110`, `150`, `DIESEL`, `AUTOMATIC_GEAR`, `1968`, `Four-wheel drive` |
| `doors`, `seats`, `exteriorColor`, `manufacturerColor`, `interior` | `4/5`, `5`, `Black`, `deepblack perleffekt`, `Part leather, Black` |
| `emissionClass`, `emissionSticker`, `co2EmissionsGKm`, `co2Class`, `fuelConsumptionL100km`, `energyConsumptionKwh100km`, `electricRangeKm`, `batteryCapacityKwh`, `batteryWarranty` | Euro class, low-emission sticker, CO₂ in g/km and its German efficiency class, consumption, electric consumption, range, battery capacity and battery warranty — `Euro6`, `4 (Green)`, `122` |
| `previousOwners`, `generalInspection`, `countryVersion`, `lastServiceDate`, `lastServiceMileageKm`, `availability` | previous owners, HU / TÜV valid until (`06/2027`, or `New`), market version, last service and its mileage, when the vehicle is available — `1`, `EU edition`, `09/2024`, `Now` |
| `netWeightKg`, `fuelTankVolumeL`, `trailerLoadBrakedKg`, `trailerLoadUnbrakedKg` | kerb weight, tank volume, braked and unbraked trailer load |
| `climatisation`, `airbags`, `parkAssists` | `Automatic air conditioning`, `Front and Side and More Airbags`, `Front, Rear, Self-steering systems` |
| `damageCondition`, `hasDamage`, `isDamageCase`, `accidentFree`, `readyToDrive`, `isExport`, `usageType` | **Condition**: as written by mobile.de (`Used vehicle, Accident-free`), unrepaired damage, past damage, accident-free, ready to drive, export only, special usage (`DEMONSTRATION`…) |
| `kbaHsn`, `kbaTsn`, `dealerStockNumber`, `carfaxEligible` | German manufacturer and type keys (`0603`, `CEC`), the dealer's own reference, vehicle history report offered |
| `qualitySeal`, `qualitySealId` | the manufacturer's or dealer's used-car quality seal and its code (`BMW_PREMIUM_SELECTION`…) |
| `description`, `descriptionHtml`, `features`, `highlights`, `attributes` | **Text**: full description as text and as HTML, equipment list, highlight lines of the results card, every attribute of the listing page `{tag, label, value}` |
| `aiSummary`, `aiHighlights`, `aiInsights` | the summary of the listing provided by mobile.de, its short tags and its points `{title, subtitle}` — `Long TÜV until 2027` |
| `images`, `imageUrl`, `imageCount`, `hasVideo`, `has360View` | **Photos**: every photo URL in the chosen size, the first one, how many, video and 360° view — `16` |
| `financingAvailable`, `financeMonthlyInstallment`, `financeDownPayment`, `financeTermMonths`, `financeInterestRate`, `financeFinalInstallment`, `financeLoanType`, `financeBank`, `financePlans` | **Financing**: monthly rate, down payment, term in months, effective rate, final instalment, loan type, bank, and every financing offer in full — `292`, `5790`, `60`, `7.99`, `BALLOON` |
| `leasingAvailable`, `leasingRateMonthly`, `leasing` | **Leasing**: a leasing offer or not, the lowest monthly rate, the full offer with its rates |
| `isEyeCatcher`, `listingPackage`, `partnerName`, `partnerUrl` | paid eye-catcher placement, advertising package (`silver`, `fsbo` = private seller…), partner marketplace and its link |
| `publishedAt`, `modifiedAt`, `renewedAt`, `daysOnline` | **Dates**: first put online (what the date filters read), last change, last push to the top, days online — `2022-07-20T12:31:00.000Z`, `1554` |
| `vehicleCountry`, `postalCode`, `city`, `latitude`, `longitude` | **Location**: country, postcode, town, GPS point (approximate for a private seller) — `DE`, `53225`, `Bonn` |
| `sellerId`, `sellerType`, `sellerTypeLabel`, `sellerName`, `sellerStreet`, `sellerPostalCode`, `sellerCity`, `sellerCountry` | **Seller**: id (usable in **Dealers / sellers**), `DEALER`, `PRIVATE` or `COMMERCIAL_PRIVATE`, dealer name and address — `466818`, `Schreiner Automobile` |
| `sellerRating`, `sellerRatingCount`, `sellerReviewCount`, `sellerRecommendationRate`, `sellerAdRealityRate`, `sellerConsultingScore`, `sellerFriendlinessScore`, `sellerResponseTimeScore`, `sellerReviewsUrl` | rating out of 5 and its counts, share of buyers who recommend the dealer, share who found the vehicle as described, sub-scores for advice, friendliness and response time, the reviews page — `5`, `85`, `100` |
| `sellerPageUrl`, `sellerLogo`, `sellerWebsite`, `sellerLanguages`, `sellerMemberSince`, `sellerOpeningHours` | dealer page, logo, website, languages spoken, on mobile.de since, opening hours `{day, hours}` |
| `sellerContactPerson` | name of the contact person, filled only with **Seller phone numbers** (like the phone columns) |
| `sellerPhone`, `sellerPhones`, `sellerWhatsapp` | **Phone numbers** (with **Seller phone numbers**): the first one in international format, every number `{type, number}`, WhatsApp |
| `sellerEmail`, `sellerImprint`, `sellerVatId`, `sellerExternalWebsite`, `sellerListingCount`, `sellerReviews`, `dealerProfileFetched` | **Dealer profile** (with **Dealer profiles**): e-mail, imprint (legal name, managing director, register), VAT id, website, number of vehicles offered, latest reviews, the one row of the dealer that carries the profile charge |
| `changeType`, `lastDeliveredPrice`, `priceChange`, `priceChangePct`, `priceChangedAt` | **Monitoring**: `NEW` or `PRICE_CHANGED`, the price delivered before, the change in euros and in %, when the new price was seen |
| `detailsIncluded`, `searchUrl`, `searchQuery`, `searchRank`, `raw`, `scrapedAt` | **Run**: listing page read or not, the search (web link) and the search of your input that found the listing, its rank, the untouched mobile.de data (with **Include raw data**), extraction time |

### 💡 Tips

#### How to get more results

Set `maxItems` to `0`, leave **Go past 2,000 listings per search** on, and use broad searches (a make without a model, no location). For monitoring, schedule the Actor with **Only new listings** and the default sort, newest first.

#### How to reduce costs

The price is per listing, so the levers are `maxItems`, `maxItemsPerQuery`, the vehicle filters (applied by mobile.de: the listings they leave out cost nothing), the filters of the Actor (a filtered-out listing costs only the filter fee, lower than a listing) and `onlyNew` for recurring runs (you never pay twice for the same listing). Leave the paid options off when you do not need their data: the results list already gives the price, the price rating with its limits, mileage, power, first registration, photos, dealer name, address and rating.

#### Several searches in one run

Fill `models`, `searchQueries`, `locations` and / or `sellerIds`: the Actor runs one search per make / model line × keyword × location × seller (3 models × 4 cities = 12 searches, up to 500 per run). The single `make` / `model`, `query` and `location` fields still work and are added to the lists. A listing found by several searches is saved — and charged — once. Set `maxItemsPerQuery` to give every search its own cap: without it the first searches can use up the whole `maxItems` budget. You can also paste several search URLs into `startUrls`: each one is a search of its own, with the same cap.

#### Going past 2,000 listings per search

mobile.de returns at most 2,000 listings per search, however many it counts. With **Go past 2,000 listings per search** (`splitLargeSearches`, on by default, free), a bigger search is cut into price bands of fewer listings, read one after the other, and a band still too big is cut again. There is no separate band for the listings with a price on request: the two halves of each cut add up to exactly the search's total. A band that cannot be cut any more (a single price held by more listings than the limit) is read up to the limit, and the log says so. Sorted by price, the bands are read in the order of the sort, so a cap keeps the cheapest (or dearest) listings of the whole search; with any other sort (newest first, mileage, year…), the listings come price band by price band, not in the order of the sort across the whole search, and the log warns you.

#### Monitoring: only the new listings

Tick **Only new listings** (`onlyNew`) and schedule the Actor. The first run returns everything; each later run skips the listings already delivered: they are not saved, not charged, and their page is not even opened. The memory lives in a named key-value store of your account (`mobile-de-listings-scraper-seen`, up to 150,000 listings per key) and is only updated with listings that really reached the dataset, so a failed run never hides anything. Give each schedule its own `stateKey` (two schedules sharing a key would hide each other's listings), and tick `resetState` once to start over. With the default sort, newest first, a search stops once it meets a long run of listings you already have (500 in a row, fewer under a small **Max listings**; the paid eye-catcher listings pinned at the top are not counted). A listing its seller pushed back to the top is skipped like the others, without being charged.

#### Price changes

Tick **Report price changes** (`includePriceChanges`, with `onlyNew`): a listing already delivered under the memory key comes back, whole, when its price has moved since it was delivered, with `changeType` = `PRICE_CHANGED`, `lastDeliveredPrice`, `priceChange`, `priceChangePct` and `priceChangedAt`. Set `minPriceChangePercent` to ignore the small moves. The first run after you tick it learns the prices and reports no change. The search is then read to its end (up to **Max listings** delivered), because an older listing can change its price too: each listing already delivered that is read past the point where `onlyNew` alone would stop costs a small price check (see Pricing), and the run stops when its maximum cost cannot pay one more.

#### Filter by publication date

`postedAfter` and `postedBefore` take a date (`2026-09-01`, the whole day is included, German time) or a period before now (`7 days`, `2 weeks`, `1 month`; via the API also `24 hours` or a full ISO date-time). The filter reads `publishedAt`, the day the listing was first put online: a later price change or push to the top does not make it newer. A listing without a publication date is dropped as soon as a date bound is set. Filtered-out listings are not saved and do not count in `maxItems` (each one dropped costs the filter fee, see Pricing); the run summary tells how many were filtered. mobile.de's newest-first order follows the last push to the top, not the first publication, so a search cannot stop at the first old listing. When `postedAfter` is within the last 13 days, the Actor therefore also asks mobile.de for the smallest of its **Online since** windows (for the last 1, 3, 7 or 14 days) that still holds your date, and mobile.de leaves the older listings out before they are read: they cost nothing (`24 hours` and `1 day` use the 3-day window, `7 days` the 14-day one; if you also set `onlineSinceDays`, the smaller window is used). The date filter then keeps exactly the listings first put online after your date. A `postedAfter` older than 13 days, or `postedBefore` alone, makes the Actor read the whole search and pay the filter fee for each listing it drops, so narrow such a search with a make, a model or a price range.

#### Equipment codes and other mobile.de filters

`features` takes the equipment codes below (a vehicle must have all of the codes you give). `customFilters` takes the other filters of mobile.de's search form, by their parameter: one value, a list of values, or a range written `from:to` (`6:` = 6 or more), as in the third Input example.

<details>
<summary>The 111 equipment codes of <code>features</code></summary>

| Code | Label on mobile.de (German) |
| --- | --- |
| `ABS` | ABS |
| `AIR_SUSPENSION` | Luftfederung |
| `ALARM_SYSTEM` | Alarmanlage |
| `ALLOY_WHEELS` | Leichtmetallfelgen |
| `ALL_SEASON_TIRES` | Allwetterreifen |
| `AMBIENT_LIGHTING` | Ambiente-Beleuchtung |
| `ANDROID_AUTO` | Android Auto |
| `ARM_REST` | Armlehne |
| `AUTOMATIC_RAIN_SENSOR` | Regensensor |
| `AUXILIARY_HEATING` | Standheizung |
| `BATTERY_HEALTH_CERT` | Mit Batterie-Zertifikat |
| `BENDING_LIGHTS` | Kurvenlicht |
| `BIDIRECTIONAL_CHARGING` | Bidirektionales Laden |
| `BIODIESEL_SUITABLE` | Biodiesel geeignet |
| `BLIND_SPOT_MONITOR` | Totwinkelassistent |
| `BLUETOOTH` | Bluetooth |
| `CARGO_BARRIER` | Gepäckraumabtrennung |
| `CARPLAY` | Apple CarPlay |
| `CD_MULTICHANGER` | Multi-CD-Wechsler |
| `CD_PLAYER` | CD-Spieler |
| `CENTRAL_LOCKING` | Zentralverriegelung |
| `COLLISION_AVOIDANCE` | Notbremsassistent |
| `DIGITAL_COCKPIT` | Volldigitales Kombiinstrument |
| `DIMMING_INTERIOR_MIRROR` | Innenspiegel autom. abblendend |
| `DISABLED_ACCESSIBLE` | Behindertengerecht |
| `DISTANCE_WARNING_SYSTEM` | Abstandswarner |
| `DYNAMIC_CHASSIS_CONTROL` | Adaptives Fahrwerk |
| `E10_ENABLED` | E10-geeignet |
| `ELECTRIC_ADJUSTABLE_SEATS` | Elektr. Sitzeinstellung |
| `ELECTRIC_BACKSEAT_ADJUSTMENT` | Elektr. Sitzeinstellung, hinten |
| `ELECTRIC_EXTERIOR_MIRRORS` | Elektr. Seitenspiegel |
| `ELECTRIC_HEATED_REAR_SEATS` | Sitzheizung hinten |
| `ELECTRIC_HEATED_SEATS` | Sitzheizung |
| `ELECTRIC_TAILGATE` | Elektr. Heckklappe |
| `ELECTRIC_WINDOWS` | Elektr. Fensterheber |
| `EMERGENCY_CALL_SYSTEM` | Notrufsystem |
| `ESP` | ESP |
| `EXPORT` | Nur anzeigen |
| `FATIGUE_WARNING_SYSTEM` | Müdigkeitswarner |
| `FOLDING_EXTERIOR_MIRRORS` | Elektr. Seitenspiegel anklappbar |
| `FOLDING_ROOF` | Faltdach |
| `FOLD_FLAT_PASSENGER_SEAT` | Umklappbarer Beifahrersitz |
| `FRONT_FOG_LIGHTS` | Nebelscheinwerfer |
| `FULL_SERVICE_HISTORY` | Scheckheftgepflegt |
| `GLARE_FREE_HIGH_BEAM` | Blendfreies Fernlicht |
| `HANDS_FREE_PHONE_SYSTEM` | Freisprecheinrichtung |
| `HEADLIGHT_WASHER_SYSTEM` | Scheinwerferreinigung |
| `HEAD_UP_DISPLAY` | Head-Up Display |
| `HEATED_STEERING_WHEEL` | Beheizbares Lenkrad |
| `HEATED_WINDSHIELD` | Beheizbare Frontscheibe |
| `HEAT_PUMP` | Wärmepumpe |
| `HIGH_BEAM_ASSIST` | Fernlichtassistent |
| `HILL_START_ASSIST` | Berganfahrassistent |
| `HU_AU_NEU` | HU neu |
| `HYBRID_PLUGIN` | Plug-in-Hybrid |
| `IMMOBILIZER` | Elektr. Wegfahrsperre |
| `INTEGRATED_MUSIC_STREAMING` | Musikstreaming integriert |
| `ISOFIX` | Isofix |
| `KEYLESS_ENTRY` | Schlüssellose Zentralverriegelung (Keyless) |
| `LANE_DEPARTURE_WARNING` | Spurhalteassistent |
| `LEATHER_STEERING_WHEEL` | Lederlenkrad |
| `LIGHT_SENSOR` | Lichtsensor |
| `LUMBAR_SUPPORT` | Lordosenstütze |
| `MASSAGE_SEATS` | Massagesitze |
| `MATTE_COLOR` | Matt |
| `MEMORY_SEATS` | Elektr. Sitzeinstellung mit Memory-Funktion |
| `METALLIC` | Metallic |
| `MULTIFUNCTIONAL_WHEEL` | Multifunktionslenkrad |
| `NAVIGATION_SYSTEM` | Navigationssystem |
| `NEW_SERVICE` | Inspektion neu |
| `NIGHT_VISION_ASSIST` | Nachtsichtassistent |
| `NONSMOKER_VEHICLE` | Nichtraucherfahrzeug |
| `ON_BOARD_COMPUTER` | Bordcomputer |
| `PADDLE_SHIFTERS` | Schaltwippen |
| `PANORAMIC_GLASS_ROOF` | Panoramadach |
| `PARTICULATE_FILTER_DIESEL` | Partikelfilter |
| `PASSENGER_SEAT_ISOFIX_POINT` | Isofix Beifahrersitz |
| `PERFORMANCE_HANDLING_SYSTEM` | Sportfahrwerk |
| `POWER_ASSISTED_STEERING` | Servolenkung |
| `RANGE_EXTENDER` | Range Extender |
| `REAR_TRAFFIC_ALERT` | Ausparkassistent |
| `RIGHT_HAND_DRIVE` | Rechtslenker anzeigen |
| `ROOF_RAILS` | Dachreling |
| `SKI_BAG` | Skisack |
| `SMOKERS_PACKAGE` | Raucherpaket |
| `SOUND_SYSTEM` | Soundsystem |
| `SPEED_LIMITER` | Geschwindigkeits- begrenzungsanlage |
| `SPORT_PACKAGE` | Sportpaket |
| `SPORT_SEATS` | Sportsitze |
| `START_STOP_SYSTEM` | Start/Stopp-Automatik |
| `STEEL_WHEELS` | Stahlfelgen |
| `SUMMER_TIRES` | Sommerreifen |
| `SUNROOF` | Schiebedach |
| `TAXI` | Taxi |
| `TINTED_WINDOWS` | Abgedunkelte Scheiben |
| `TIRE_PRESSURE_MONITORING` | Reifendruckkontrolle |
| `TOUCHSCREEN` | Touchscreen |
| `TRACTION_CONTROL_SYSTEM` | Traktionskontrolle |
| `TRAFFIC_SIGN_RECOGNITION` | Verkehrszeichenerkennung |
| `TRAILER_ASSIST` | Anhängerrangierassistent |
| `TV` | TV |
| `USB` | USB |
| `VEGETABLEOILFUEL_SUITABLE` | Pflanzenöl geeignet |
| `VENTILATED_SEATS` | Sitzbelüftung |
| `VIRTUAL_SIDE_MIRROR` | Virtuelle Seitenspiegel |
| `VOICE_CONTROL` | Sprachsteuerung |
| `WARRANTY` | Garantie |
| `WIFI_HOTSPOT` | WLAN / Wifi Hotspot |
| `WINTER_PACKAGE` | Winterpaket |
| `WINTER_TIRES` | Winterreifen |
| `WIRELESS_CHARGING` | Induktionsladen für Smartphones |

</details>

<details>
<summary>The parameters of <code>customFilters</code> and their values</summary>

| Parameter | Filter on mobile.de | Takes | Values |
| --- | --- | --- | --- |
| `ab` | AIRBAGS | one | DRIVER_AIRBAG, FRONT_AIRBAGS, FRONT_AND_SIDE_AIRBAGS, FRONT_AND_SIDE_AND_MORE_AIRBAGS |
| `ao` | AD_OPTIONS, ANY_OEM_SEAL | one or several | PICTURES, VIDEO, PRICE_REDUCED, QUALITY_SEAL, CERTIFICATE |
| `av` | AVAILABILITY | one | INSTANT, LATER |
| `bat` | BATTERY | one or several | BATTERY_PURCHASED, BATTERY_RENTED, BATTERY_MISSING |
| `bc` | BATTERY_CAPACITY | range from:to | 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150 |
| `bds` | BREAKDOWN_SERVICE | one or several | EMERGENCY_WHEEL, REPAIR_KIT, SPARE_WHEEL |
| `blt` | BENDING_LIGHTS_TYPE | one or several | ADAPTIVE_BENDING_LIGHTS, BENDING_LIGHTS |
| `bw` | BATTERY_WARRANTY | range from:to | 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 |
| `cht` | CHARGE_TIME | range from:to | :180, :360, :540, :720, :900 |
| `chtf` | CHARGE_TIME_FAST | range from:to | :30, :60, :120 |
| `clim` | CLIMATISATION | one | NO_CLIMATISATION, MANUAL_CLIMATISATION, AUTOMATIC_CLIMATISATION, AUTOMATIC_CLIMATISATION_2_ZONES, AUTOMATIC_CLIMATISATION_3_ZONES, AUTOMATIC_CLIMATISATION_4_ZONES |
| `cnc` | FUEL_CONSUMPTION_COMBINED | range from:to | :3, :5, :6, :7, :8, :9, :10, :12, :15 |
| `cy` | CYLINDER | range from:to | 3, 4, 6, 8, 10, 12 |
| `dlt` | DEAL_TYPE | one or several | DEAL, TOP_PRICE, LEASING |
| `drl` | DAYTIME_RUNNING_LAMPS | one or several | LED_RUNNING_LIGHTS, DAYTIME_RUNNING_LIGHTS |
| `fe` | BIDIRECTIONAL_CHARGING, EV_BATTERY_CERTIFICATE, EV_BIDIRECTIONAL_CHARGING, EXPORT, EXTERIOR_FEATURES, INTERIOR_FEATURES, MORE_EV_FILTERS, NEW_SERVICE, OFFER_DETAILS_FEATURES, PARKING_FEATURES, PARTICULATE_FILTER, PLUGIN_HYBRID, SEARCHCOLUMN_FEATURES, SERVICE_HISTORY, TRAILER_ASSIST | one or several | feature codes (see "features") |
| `fe!` |  | one or several | feature codes (see "features") |
| `ftv` | FUEL_TANK_VOLUME | range from:to | 30, 50, 80, 100, 150 |
| `hlt` | HEADLIGHT_TYPE | one or several | BI_XENON_HEADLIGHTS, LASER_HEADLIGHTS, LED_HEADLIGHTS, XENON_HEADLIGHTS |
| `icol` |  | one or several | BEIGE, BLUE, BROWN, GREY, RED, BLACK, OTHER_INTERIOR_COLOR |
| `it` | INTERIOR_MATERIAL | one or several | ALCANTARA, IMITATION_LEATHER, FABRIC, PARTIAL_LEATHER, VELOUR, LEATHER, OTHER_INTERIOR_TYPE |
| `lsdt` | LEASING_DEAL_TYPE | one or several | BUILD_TO_ORDER, bt, ch, cl |
| `lsml` | LEASING_MILEAGE | range from:to | 5000, 10000, 15000, 20000, 25000, 30000, 40000 |
| `lstm` | LEASING_TERM | range from:to | 12, 18, 24, 30, 36, 42, 48, 54, 60, 72 |
| `mnw` | NOSE_WEIGHT | range from:to | 50, 100, 150, 200 |
| `nw` | NET_WEIGHT | range from:to | 400, 500, 600, 700, 800, 900, 1000, 1500, 2000, 2500, 3000 |
| `pa` | PARKING_ASSISTANT | one or several | CAM_360_DEGREES, REAR_SENSORS, REAR_VIEW_CAM, AUTOMATIC_PARKING, FRONT_SENSORS |
| `rad` | RADIO | one or several | DAB_RADIO, TUNER |
| `re` | RANGE_ELECTRIC | range from:to | 50:, 100:, 200:, 300:, 400:, 500:, 600: |
| `sld` | SLIDING_DOOR | one | SLIDING_DOOR_RIGHT, SLIDING_DOOR_LEFT, SLIDING_DOOR_BOTH_SIDED |
| `spc` | CRUISE_CONTROL | one | CRUISE_CONTROL, ADAPTIVE_CRUISE_CONTROL |
| `tct` | TRAILER_COUPLING_TYPE | one | TRAILER_COUPLING_FIX, TRAILER_COUPLING_DETACHABLE, TRAILER_COUPLING_SWIVELING |
| `tlb` | TRAILER_LOAD_BRAKED | range from:to | 500, 1000, 1500, 2000, 2500, 3000, 3500 |
| `tlu` | TRAILER_LOAD_UNBRAKED | range from:to | 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800 |
| `ucs` | OEM_SEAL | one | FCA, ASTON_MARTIN, BENTLEY, BMW, CUPRA_APPROVED, DS_CERTIFIED, FERRARI, HYUNDAI_PROMISE, JAGUAR, KIA_ZERTIFIZIERTE_GEBRAUCHTWAGEN, LAMBORGHINI, LANDROVER, MINI, NISSAN, PORSCHE, ROLLS_ROYCE, SEAT_ZERTIFIZIERTE_GEBRAUCHTWAGEN, SKODA, SPOTICAR, TOYOTA, VW, VW_TRADEPORT, VOLVO |
| `ucsa` | UCSA_ANY_USED_CAR_SEAL | one or several | true |
| `vat` | VAT_RECLAIMABILITY | one or several | 1, 0 |

</details>

### 🔌 Integrations and API

Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.

### 🤖 Use with AI agents (MCP)

AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the [Apify MCP server](https://mcp.apify.com), billed to their Apify account like any run. It returns one item per mobile.de listing. Actor id: `nice_dev/mobile-de-listings-scraper`; MCP server with this Actor only: `https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/mobile-de-listings-scraper`.

Smallest input, for a cheap first call:

```json
{
    "make": "Volkswagen",
    "model": "Golf",
    "maxItems": 10
}
```

Key output fields: `url`, `title`, `price`, `priceRating`, `mileageKm`, `firstRegistrationYear`, `powerHp`, `sellerName`, and `description` and `features` with `extractDetails`.

Cost: from $0.19 to $0.29 per 1,000 listings saved depending on your plan, plus $0.01 per run and the options you tick (see the pricing section above). Cap each call with `maxItems` and, through the API, with the run option `maxTotalChargeUsd`.

### ❓ FAQ

#### Is it legal to scrape mobile.de?

The Actor only reads what mobile.de shows publicly to any anonymous visitor. It logs in to nothing and solves no captcha. Results can contain personal data — a private seller's phone number and approximate location, a dealer's contact person — which is protected by GDPR: phone numbers are only read when you tick **Seller phone numbers**, and you should not store personal data without a legitimate reason. You are responsible for using the data in compliance with mobile.de's Terms of Use and applicable law. This Actor is not affiliated with mobile.de.

#### Does it need a login or a proxy?

No login and no proxy by default: mobile.de answers the Apify platform directly. Turn the Apify proxy on in the proxy setting only if your runs get blocked; its usage is included in the price (the residential proxy is not available). A request the site turns away is retried after a pause of 5 seconds, doubled at each retry up to 150 seconds; with the Apify proxy on, it is retried at once on a new proxy session, up to 10 times on top of the retries.

#### Is the data safe to open in Excel or to show on a web page?

Titles and descriptions are the sellers' own words, copied as they are. A text can begin with `-`, `+`, `=` or `@` (a title such as `-20% today`), and phone numbers are written in international format (`+49…`): Excel and Google Sheets may read such a cell of a CSV file as a formula or as a number. The Actor leaves the text as it is, so that the JSON and the API give the real value: when you open a CSV, import these columns as text. `descriptionHtml` is the seller's HTML as mobile.de serves it, without its scripts, styles and comments but not otherwise cleaned: on a web page, sanitize it, and escape every other field like any text written by a stranger.

#### Known limitations

- mobile.de serves at most 2,000 listings per search: a bigger search needs **Go past 2,000 listings per search** (on by default), and a single price held by more listings than that is read up to the limit.
- Site filters that are not in the form can still be used through `customFilters`, or by pasting a filtered search URL into `startUrls`.
- The description, the equipment list, the technical attributes, the summary provided by mobile.de and the financing details come from the listing page: they are empty when `extractDetails` is off.
- Private sellers have no name on mobile.de, and their location is approximate.
- `onlyNew` remembers listing ids, not their content: a listing whose price changed comes back only with `includePriceChanges`.
- Two runs sharing the same `stateKey` at the same time may both return the same new listing.

**A run that reaches its timeout** stops itself about 45 seconds before it: no new page is asked, what it read is saved and, with `onlyNew`, remembered, and the run ends *Succeeded* with "Stopped before the run's timeout". Resurrect it to go on from there, or give the next run a longer timeout (Run options).

**A run the platform stops without warning** (out of memory)

- Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the listings already saved are skipped: none is delivered or charged twice, and `maxItems` still counts them.
- With `onlyNew`, the memory is saved after each write (at most once every 2 seconds): resurrect the stopped run and the listings it had saved meanwhile join the memory; leave it stopped for good, and the next run may return the listings of its last 2 seconds once more.

#### Something doesn't work?

The last line of the log counts the listings saved, filtered out and no longer on mobile.de (removed while the run was reading them), and the requests that failed after every retry. Those requests and the removed listings are listed, with the reason, in the `FAILED_REQUESTS` record of the run's key-value store. A run that saved nothing and had failed requests fails, and its last message gives the cause (a search URL that does not exist says so, instead of "run it again").

If mobile.de changes its pages, you are told instead of paying for blank rows. A results page that counts listings but gives none the Actor can read is an error (listed in `FAILED_REQUESTS`), never a quiet "No listings found". If the first 20 listings read all lack their title, publication date, make, price (a price on request apart) or seller id — or, when the listing page is read, their list of attributes — the run saves nothing more, stops and fails, and its last message names the missing field: at most those first listings are charged. A listing that `postedAfter` / `postedBefore` drops because it has no date at all counts among those 20. A run of fewer listings (a scheduled `onlyNew` run that finds a few new ones, a small **Max listings**) is checked at its end, from 5 listings: its listings are already saved, and the run fails with the missing field instead of ending green.

### 🛟 Support

Open an issue in the **Issues** tab with a link to your run: the run log and the `FAILED_REQUESTS` record of the key-value store show exactly which URLs failed and why.

# Actor input Schema

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

mobile.de links, pasted as they are in your browser: a search (`https://suchen.mobile.de/fahrzeuge/search.html?...`, every filter set on the site is kept), a listing (`https://suchen.mobile.de/auto-inserat/.../123456789.html` or `details.html?id=123456789`) or a dealer page (`https://home.mobile.de/home/index.html?customerId=...` = all the dealer's vehicles). Pages of up to 500 listings, automatic: a search is read from its first page, page numbers in a pasted link are ignored (the log says so). When this list is not empty, the search fields below (vehicle type, make, keywords, locations) and the **Vehicle filters** (price, fuel, year, sort order, country…) are ignored: set them on mobile.de before copying the link. The Actor's own filters (words to exclude, dates, phone number only), the caps and monitoring still apply. Max 1 000 URLs.

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

The mobile.de section to search. Some filters below exist only for cars (a filter a section does not have is ignored by the site, and the run log says so).

## `make` (type: `string`):

Make as written on mobile.de, e.g. `BMW`, `Volkswagen`, `Mercedes-Benz` (case and accents ignored) or its mobile.de id (`3500`). An unknown make stops the run with the list of close names, instead of silently searching every make. Empty = all makes.

## `model` (type: `string`):

Model of the make above, as on mobile.de: a single model (`Golf`, `320`) or a model series (`3er`, `3 Series`, `A-Klasse` = all its models), or its mobile.de id. Needs **Make**. Empty = all models of the make.

## `modelDescription` (type: `string`):

Words of the version / model description searched by mobile.de with **Make** + **Model** (its « Modellbeschreibung » field), e.g. `xDrive`, `GTI`, `Competition`. Needs **Make**. Empty = any version.

## `models` (type: `array`):

Several make + model searches in one run, one per line: `BMW 3er`, `Audi A4`, `Tesla` (make alone = all its models). Added to **Make** / **Model**; each line is a separate search (times each keyword and location below, max 500 searches); a listing found by several searches is saved once.

## `query` (type: `string`):

Free text searched by mobile.de in the listing (title, description and equipment), e.g. `xenon`, `scheckheft`. Empty = no keyword.

## `searchQueries` (type: `array`):

Several keywords in one run: one search per keyword (times each make / model and location). Added to **Search keyword**; listings found by several searches are saved once.

## `location` (type: `string`):

Centre of a radius search: a German postcode (`10115`), a German town (`Berlin`, `München`) or GPS coordinates `52.52,13.40`. Used with **Radius**. Empty = everywhere.

## `locations` (type: `array`):

Several locations in one run: every search is run around every location (3 models × 4 locations = 12 searches, max 500). Added to **Location**.

## `radiusKm` (type: `integer`):

Distance around each location, in km (any value: mobile.de takes it as is).

## `country` (type: `array`):

Only vehicles offered in these countries (mobile.de also lists vehicles from dealers abroad). Empty = all countries.

## `sellerIds` (type: `array`):

Every vehicle of these sellers: the numeric seller id this Actor returns (`sellerId`, e.g. `462978`) or a dealer page URL (`https://home.mobile.de/home/index.html?customerId=462978`). Each seller is one search; the filters below still apply.

## `listingIds` (type: `array`):

Fetch these listings directly, by id (`457720205`) or listing URL. Always added to the searches above; each id is read on its detail (one request), so it is charged as **Listing details** on top of the listing.

## `maxItems` (type: `integer`):

Maximum number of listings to save for the whole run (after deduplication and filters). 0 = no limit.

## `maxItemsPerQuery` (type: `integer`):

Cap for EACH search (make / model × keyword × location, seller, or start URL), so that the first search cannot use up the whole **Max listings** budget. 0 = no per-search cap.

## `splitLargeSearches` (type: `boolean`):

mobile.de returns at most 2 000 listings per search. On: a bigger search is cut into price bands, each under 2 000, so that every priced listing is reached (free, a few more requests); the bands add up to the exact total, listings without a price included. Off: the first 2 000.

## `extractDetails` (type: `boolean`):

Open each listing (1 extra request per listing) for the full description, all equipment, every technical attribute (CO₂, consumption, HU, trailer load…), mobile.de's AI summary, financing details, the dealer's website, languages and opening hours (and, with **Seller phone numbers**, the private seller's phone). Charged per listing as **Listing details**, on top of the listing (see Pricing). Off = the fields of the results list, which already include price, price rating, mileage, power, dealer name and address. A listing in **Listing IDs** or a listing URL in **Start URLs** is always read on its detail.

## `includePhones` (type: `boolean`):

Fill `sellerPhone`, `sellerPhones`, `sellerWhatsapp` and the dealer's contact person (`sellerContactPerson`). Charged per listing as **Phone number found**, once per listing delivered with at least one number (however many it has), on top of the listing (see Pricing); a listing without a number costs nothing extra. Dealers' numbers are in the results list; for a listing without a number there (private sellers), its detail page is read for the number only, at no extra charge (the other detail fields need **Extract details**). Off = the phone fields are always empty.

## `includeDealerProfiles` (type: `boolean`):

For each dealer, read its mobile.de dealer page once per run: e-mail, own website, imprint (legal name, managing director, register and VAT id), number of listings and, with **Dealer reviews per dealer**, its customer reviews (opening hours come with **Extract details**). Charged per dealer found as **Dealer profile** (see Pricing); private sellers have no dealer page.

## `reviewLimit` (type: `integer`):

With **Dealer profiles**: also return up to this many of the latest customer reviews of each dealer (`sellerReviews`: date, score and sub-scores, liked / disliked text, dealer reply). Read from the dealer's mobile.de review page, included in the **Dealer profile** charge. 0 = no reviews.

## `minPrice` (type: `integer`):

Lowest price in euros (gross price).

## `maxPrice` (type: `integer`):

Highest price in euros.

## `minYear` (type: `integer`):

Registered in this year or later.

## `maxYear` (type: `integer`):

Registered in this year or earlier.

## `minMileage` (type: `integer`):

Lowest mileage in km.

## `maxMileage` (type: `integer`):

Highest mileage in km.

## `minPowerKw` (type: `integer`):

Lowest engine power in kW. Use either kW or hp, not both.

## `maxPowerKw` (type: `integer`):

Highest engine power in kW.

## `minPowerHp` (type: `integer`):

Lowest engine power in hp (PS), converted to kW for mobile.de.

## `maxPowerHp` (type: `integer`):

Highest engine power in hp (PS).

## `fuelTypes` (type: `array`):

Keep any of these fuels. Empty = all.

## `transmission` (type: `array`):

Keep any of these gearboxes. Empty = all.

## `bodyTypes` (type: `array`):

Keep any of these body types. Empty = all.

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

New vehicles, used vehicles, or both.

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

Dealers, private sellers, or both. `Commercial private` = a private seller flagged by mobile.de as selling commercially.

## `exteriorColors` (type: `array`):

Keep any of these colours. Empty = all.

## `priceRatings` (type: `array`):

Keep only listings with one of these mobile.de price ratings (e.g. `Very good price` + `Good price` = the deals). Empty = all.

## `maxPreviousOwners` (type: `integer`):

At most this many previous owners (1 to 4).

## `minSeats` (type: `integer`):

At least this many seats.

## `maxSeats` (type: `integer`):

At most this many seats.

## `doors` (type: `string`):

Number of doors.

## `driveType` (type: `string`):

Driven wheels.

## `emissionClass` (type: `string`):

This Euro emission class or a better one.

## `emissionSticker` (type: `string`):

German low-emission zone sticker (Umweltplakette), this one or better.

## `minEngineSize` (type: `integer`):

Lowest cubic capacity in cm³.

## `maxEngineSize` (type: `integer`):

Highest cubic capacity in cm³.

## `excludeDamaged` (type: `boolean`):

Drop vehicles with unrepaired major damage (mobile.de's `Beschädigt`).

## `damagedOnly` (type: `boolean`):

Only vehicles with unrepaired major damage. Cannot be ticked together with **Exclude damaged vehicles**.

## `roadworthyOnly` (type: `boolean`):

Only vehicles marked ready to drive (`Fahrtauglich`).

## `vatReclaimable` (type: `boolean`):

Only listings where the VAT can be reclaimed (net price shown), for business buyers.

## `onlineSinceDays` (type: `string`):

Only listings put online in the last N days, filtered by mobile.de itself (for any other period use **Posted after**).

## `huValidMonths` (type: `string`):

German general inspection (HU / TÜV) still valid for at least this many months; `New` = fresh HU.

## `minSellerRating` (type: `integer`):

Dealers rated at least this many stars on mobile.de (3, 4 or 5).

## `withPicturesOnly` (type: `boolean`):

Only listings with at least one photo.

## `withVideoOnly` (type: `boolean`):

Only listings with a video.

## `priceReducedOnly` (type: `boolean`):

Only listings whose price was lowered (mobile.de shows the old price crossed out: `previousPrice`).

## `qualitySealOnly` (type: `boolean`):

Only used cars with a manufacturer or dealer quality seal (certified used cars).

## `leasingOnly` (type: `string`):

Only listings that carry a leasing offer, for private or business use (`leasing` and `leasingRateMonthly` in the results). Empty = every listing.

## `maxLeasingRate` (type: `integer`):

With **Leasing offers only**: highest monthly leasing rate, in euros.

## `excludeExportOffers` (type: `boolean`):

Drop the listings offered for export only.

## `usageTypes` (type: `array`):

Only these kinds of vehicles. Empty = all.

## `features` (type: `array`):

Keep only vehicles with ALL of these features, as mobile.de feature codes: `NAVIGATION_SYSTEM`, `CARPLAY`, `ANDROID_AUTO`, `HEAD_UP_DISPLAY`, `PANORAMIC_GLASS_ROOF`, `ELECTRIC_HEATED_SEATS`, `FULL_SERVICE_HISTORY`, `NONSMOKER_VEHICLE`, `WARRANTY`… (every code is listed in the README). An unknown code stops the run with the closest codes.

## `customFilters` (type: `object`):

Any other filter of the mobile.de search form, as `parameter: value` (a list for several values): e.g. `{"clim": "AUTOMATIC_CLIMATISATION", "it": ["LEATHER", "ALCANTARA"], "cy": "6:", "tlb": "2000:"}`. The README lists every parameter and its values; an unknown parameter or value stops the run (mobile.de would silently ignore it and return everything).

## `sortBy` (type: `string`):

Order in which mobile.de returns the listings. Newest first is the default and the one used to stop early with **Only new listings**.

## `postedAfter` (type: `string`):

Only listings first put online on mobile.de on or after this date (`created`, not a later price change or push-up): `2026-09-01`, or a period before now such as `7 days`, `2 weeks`, `1 month` (API: `24 hours` and full ISO date-times work too). A date within the last 13 days is also sent to mobile.de as its own **Online since** window, so older listings are neither read nor charged; with an older date the whole search is read and each listing dropped pays the filter fee: narrow it with a make, a model or a price range.

## `postedBefore` (type: `string`):

Only listings first put online on or before this date (the whole day is included), or older than a period such as `30 days`.

## `excludeKeywords` (type: `array`):

Drop the listings whose title or subtitle contains one of these words (case and German umlauts ignored), e.g. `Motorschaden`, `Export`, `defekt`, or a model to leave out (`M3`). A word also counts inside a longer word: `unfall` also matches `unfallfrei`.

## `requirePhone` (type: `boolean`):

Keep only the listings whose seller shows a phone number. Needs **Seller phone numbers** (private sellers' numbers are read from their detail page).

## `onlyNew` (type: `boolean`):

Skip the listings that a previous run (same **Memory key**) already delivered: they are not saved and not charged, and their detail is not even opened. First run = everything is new.

## `stateKey` (type: `string`):

Name of the memory used by **Only new listings**. Give each schedule / task its own key (e.g. `golf-berlin`) so that they do not share their memory. Letters, digits, `-` and `_`.

## `resetState` (type: `boolean`):

Forget everything remembered under this **Memory key** before the run: this run returns (and charges) every listing again. Untick it afterwards.

## `includePriceChanges` (type: `boolean`):

Needs **Only new listings**. A listing already delivered under this **Memory key** comes back, whole, when its price has changed since the run that delivered it: `changeType` = `PRICE_CHANGED`, with `lastDeliveredPrice`, `priceChange`, `priceChangePct` and `priceChangedAt`. Charged per listing as **Price change**, on top of the listing (see Pricing); a listing whose price did not move is not saved. The first run after you tick it learns the prices and reports no change. The search is read to its end (up to **Max listings** delivered), because an older listing can change its price: each listing already delivered and re-checked for a price change is charged a small **Price check** (see Pricing), and the run stops when its maximum cost cannot pay one.

## `minPriceChangePercent` (type: `integer`):

With **Report price changes**: ignore a price change smaller than this percentage (up or down). 0 = every change.

## `language` (type: `string`):

Language of the texts mobile.de writes (fuel, gearbox, colour, equipment, attribute labels, AI summary). The codes (`fuelType`, `priceRating`…) and numbers are the same in both.

## `imageSize` (type: `string`):

Width of the photo URLs returned.

## `includeRaw` (type: `boolean`):

Add a `raw` field with the untouched JSON of mobile.de (results list and detail). Useful to recover a field this Actor does not map yet; makes the data bigger.

## `proxyConfiguration` (type: `object`):

No proxy by default: mobile.de answers the Apify platform directly. Turn the Apify proxy on only if your runs get blocked; its usage is included in the price. The residential Apify proxy is not available in this Actor.

## `maxConcurrency` (type: `integer`):

Maximum number of requests processed in parallel.

## `maxRequestsPerMinute` (type: `integer`):

Most requests to mobile.de in any 60 seconds, all of them counted: results pages (up to 500 listings each), listing details and dealer pages. A budget, not an even pace (spread them with the minimum delay below). Lower it if the log shows HTTP 429 / 403.

## `minRequestIntervalMs` (type: `integer`):

Smallest gap between two requests, in milliseconds. Unlike the per-minute rate, this spreads the requests evenly instead of letting them go out in a burst. 0 = no gap.

## `maxRequestRetries` (type: `integer`):

Retries per request before it is marked as failed. If you turn the Apify proxy on, a request the site turns away is also retried on a new proxy session up to 10 times without using up these retries.

## `debugLog` (type: `boolean`):

Include debug messages in the run log.

## Actor input object example

```json
{
  "startUrls": [],
  "vehicleType": "Car",
  "make": "Volkswagen",
  "model": "Golf",
  "models": [],
  "searchQueries": [],
  "locations": [],
  "radiusKm": 50,
  "country": [],
  "sellerIds": [],
  "listingIds": [],
  "maxItems": 100,
  "maxItemsPerQuery": 0,
  "splitLargeSearches": true,
  "extractDetails": false,
  "includePhones": false,
  "includeDealerProfiles": false,
  "reviewLimit": 0,
  "fuelTypes": [],
  "transmission": [],
  "bodyTypes": [],
  "condition": "ANY",
  "sellerType": "ANY",
  "exteriorColors": [],
  "priceRatings": [],
  "excludeDamaged": false,
  "damagedOnly": false,
  "roadworthyOnly": false,
  "vatReclaimable": false,
  "withPicturesOnly": false,
  "withVideoOnly": false,
  "priceReducedOnly": false,
  "qualitySealOnly": false,
  "excludeExportOffers": false,
  "usageTypes": [],
  "features": [],
  "customFilters": {},
  "sortBy": "NEWEST",
  "excludeKeywords": [],
  "requirePhone": false,
  "onlyNew": false,
  "stateKey": "default",
  "resetState": false,
  "includePriceChanges": false,
  "minPriceChangePercent": 0,
  "language": "en",
  "imageSize": "large",
  "includeRaw": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 8,
  "maxRequestsPerMinute": 150,
  "minRequestIntervalMs": 0,
  "maxRequestRetries": 5,
  "debugLog": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "make": "Volkswagen",
    "model": "Golf",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nice_dev/mobile-de-listings-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 = {
    "make": "Volkswagen",
    "model": "Golf",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("nice_dev/mobile-de-listings-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 '{
  "make": "Volkswagen",
  "model": "Golf",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call nice_dev/mobile-de-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/mobile-de-listings-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/jNKhJSXRTXgKmoKO2/builds/nkqfo7pEZr5L41LsS/openapi.json
