# mobile.de \[$0.55/1K💰] Price Drops, AI Summary & Dealers (`corvuslab/mobile-de-scraper`) Actor

Scrape mobile.de, Germany's largest car marketplace (1.5M+ cars), by make, model, price or postcode radius. Get 120 fields: price rating with market price bands, full specs, dealer phone, WhatsApp and GPS, plus mobile.de's AI summary. No 2,000-result cap, price-drop alerts, JSON/CSV/Excel.

- **URL**: https://apify.com/corvuslab/mobile-de-scraper.md
- **Developed by:** [Corvuslab](https://apify.com/corvuslab) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.55 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 does mobile.de Car Scraper do?

**mobile.de Car Scraper** turns mobile.de, Germany's largest vehicle marketplace, into a clean,
scheduled data feed. Give it a make and model (`BMW` + `3er`), a keyword or a pasted mobile.de
search link, and every matching listing comes back as **120 structured fields**: price,
**mobile.de's own price rating and market price bands**, the full spec sheet and equipment list,
**GPS location**, the dealer's phone, WhatsApp and rating, and mobile.de's **AI summary** where one
exists. It covers cars, motorbikes, vans, trucks and **12 vehicle types** in total. It's no-code,
and the output is ready for JSON, CSV, Excel, the API or an AI agent.

> New to Apify? Sign up free and use the included monthly platform credit to try this Actor. No credit card needed.

**Why this scraper**

- 📉 **Price-drop monitoring built in.** Scheduled runs return only new, changed and re-listed cars.
- 🧠 **mobile.de's AI summary and highlights** on detailed listings.
- 💶 **Market price bands**, not just a rating: the exact prices where "good" turns into "reasonable".
- 🚫 **No 2,000-result ceiling.** Big searches are read to the end.

***

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

Every record carries **120 fields**, grouped like this:

| Group | What you get |
|---|---|
| **Price & rating** | Price, currency, net price, VAT rate, VAT-deductible flag, price type, **mobile.de price rating** (`VERY_GOOD_PRICE` … `HIGH_PRICE`) with its label, the **price thresholds of each rating band** and where the car sits inside its band |
| **Vehicle & specs** | Make, model, version, model range, trim line, category, body type, condition, mileage, first registration, power (kW + hp), engine size, fuel, gearbox, doors, seats, colour + manufacturer colour name, interior, emission class and sticker, climate control, parking assists, airbags, previous owners, next inspection, damage flags, HSN/TSN, trailer loads, the full spec sheet as a key-value map and the complete **equipment list** |
| **Consumption & EV** | Fuel or energy consumption, CO₂ emissions and class, consumption by driving cycle, battery capacity and ownership, AC and DC charging time, plug types |
| **AI insight** | `aiSummary` (mobile.de's AI-written assessment of the listing) and `aiHighlights` (short tags such as "First owner with TÜV", "Good price", "Top rated dealer") |
| **Seller contacts & location** | Seller name and type, dealer ID, **phone numbers**, **WhatsApp**, contact person, website, address, city, postcode, country, **GPS latitude/longitude**, rating, review count, recommendation rate, reviews link, logo, opening hours, languages, member-since date |
| **Monitoring & media** | Change type, previous price, price change and amount, first/last seen, re-post detection, created/modified/renewed timestamps, photo URLs, photo count, video flag, and the description as plain text, HTML and/or Markdown |

***

### Key features

- 📉 **Price-drop and new-listing monitoring.** Incremental mode emits only NEW, UPDATED and REAPPEARED cars. A price move is labelled `DECREASED` or `INCREASED`, with the old price and the difference on the record. Sold and removed cars can be reported too.
- 💶 **mobile.de's own price verdict, with the numbers behind it.** Every rated listing carries its rating and the six price points that bound mobile.de's bands for that exact car, so you see the fair-market range, not just a label.
- 🧠 **The listing's AI summary and highlights.** `aiSummary` + `aiHighlights` capture mobile.de's AI-written take on each car, ready for ranking or an LLM pipeline.
- 🚫 **Full inventory past the ~2,000-result limit.** Larger searches are split automatically and read completely (6,542 of 6,542 Volvo XC60s in testing).
- 🚘 **12 vehicle types.** Cars, motorbikes, motorhomes, vans, trucks, semi-trailer trucks, trailers, semi-trailers, buses, agricultural vehicles, construction machines and forklifts.
- 🏷️ **Make and model by name, in any spelling.** `3er`, `3 Series`, `C-Klasse` and `Classe C` all resolve. Paste a mobile.de search link and every filter in it is kept.
- 🎚️ **20+ filters applied on mobile.de**, including **emission class, drive type, minimum seats, vehicle country** and a **German postcode or town name** + radius. You never pay for listings you filtered out.
- 📇 **Dealer lead data.** Phone numbers, WhatsApp, contact person, website, address, GPS, rating, recommendation rate, opening hours and languages, plus a whole dealer's stock by dealer ID.
- ⚡ **Fast, low-cost and AI-ready.** Close to 2,000 listings a minute with details off, Telegram/Slack/Discord/webhook alerts, and compact or drop-empty output for LLM and MCP payloads.

***

### 🚀 How to scrape mobile.de

1. Open the Actor and enter a **make** (e.g. `BMW`) and optionally a **model** (`3er`), or paste a mobile.de search link.
2. Pick your **filters**: price, year, mileage, fuel, gearbox, location and radius.
3. Set **Max results** (`0` = everything) and choose whether to **fetch full details** (on by default).
4. Click **Start**. Results stream into the Output tab. Download them as **JSON, CSV or Excel**, or pull them from the **API**.

No login, no cookies, no setup. Even an empty input works: `{}` returns the 100 newest car
listings with full details.

#### Quick-start example input

```json
{
  "make": "BMW",
  "model": "3er",
  "fuelType": ["DIESEL"],
  "yearMin": 2018,
  "priceMax": 30000,
  "maxResults": 100
}
```

This returns the 100 most recently listed diesel BMW 3 Series from 2018 onwards under 30,000 €,
each with its price rating, equipment list, dealer phone number and, where available, the AI
summary.

***

### Input

Configure it in the visual editor with no code, or pass JSON through the API. **52 inputs**,
grouped as they appear in the editor.

#### 🔎 Search

| Field | Type | What it does |
|---|---|---|
| `vehicleType` | enum | `Car` (default), `Motorbike`, `Motorhome`, `VanUpTo7500`, `TruckOver7500`, `SemiTrailerTruck`, `Trailer`, `SemiTrailer`, `Bus`, `AgriculturalVehicle`, `ConstructionMachine`, `ForkliftTruck`. |
| `make` | string | Brand, e.g. `BMW`, `Volkswagen`, `Mercedes-Benz`. Comma-separate several. |
| `model` | string | Model or family, e.g. `3er`, `Golf`, `C-Klasse`. Comma-separate several. |
| `keyword` | string | Free-text search inside listings, e.g. `M Sport` or `Standheizung`. |
| `startUrls` | array | mobile.de search links (all filters kept) or single listing links. |
| `maxResults` | integer | Listings to return (default 100, `0` = no limit). |
| `sort` | enum | `newest` (default), `price_asc`, `price_desc`, `mileage_asc`, `year_desc`, `power_desc`, `relevance`. |
| `listedWithinDays` | integer | Only listings put online in the last N days, e.g. `1` for today's new cars. |

#### 🎚️ Filters

All filters are applied by mobile.de itself. Several values inside one filter widen the search
(OR); different filters narrow it (AND).

| Field | Type | What it does |
|---|---|---|
| `condition` | array | `NEW` and/or `USED`. |
| `priceMin` / `priceMax` | integer | Price range in EUR. |
| `yearMin` / `yearMax` | integer | First-registration year range. |
| `mileageMin` / `mileageMax` | integer | Mileage range in km. |
| `powerMinPs` / `powerMaxPs` | integer | Power range in PS (metric hp). |
| `fuelType` | array | `PETROL`, `DIESEL`, `ELECTRICITY`, `HYBRID`, `HYBRID_DIESEL`, `LPG`, `CNG`, `ETHANOL`, `HYDROGENIUM`, `OTHER`. |
| `transmission` | array | `AUTOMATIC_GEAR`, `MANUAL_GEAR`, `SEMIAUTOMATIC_GEAR`. |
| `bodyType` | array | Cars only: `SmallCar`, `Limousine`, `EstateCar`, `OffRoad`, `Van`, `SportsCar`, `Cabrio`, `OtherCar`. |
| `exteriorColor` | array | 13 colours, from `BLACK` and `WHITE` to `GOLD` and `PURPLE`. |
| `emissionClass` | array | `EURO7` down to `EURO1`, including `EURO6D` and `EURO6D_TEMP`. |
| `driveType` | array | `ALL_WHEEL`, `FRONT`, `REAR`. |
| `minSeats` | integer | At least this many seats. |
| `sellerType` | enum | `ANY`, `DEALER` or `PRIVATE`. |
| `damageStatus` | enum | `ANY`, `NO_DAMAGE` or `ONLY_DAMAGED`. |
| `vatDeductibleOnly` | boolean | Only listings with VAT shown separately (deductible for businesses). |
| `country` | array | Where the vehicle is: 20 countries including `DE`, `AT`, `CH`, `NL`, `BE`, `FR`, `IT`, `PL`, `ES`. |
| `location` + `radiusKm` | string + integer | A German postcode (`10115`), town (`München`) or `latitude,longitude`, with a radius (default 50 km, up to 1,000). |
| `sellerId` | string | One dealer's whole stock. Use the `sellerId` from any of their listings. |

#### 📄 Output

| Field | Type | What it does |
|---|---|---|
| `includeDetails` | boolean | Adds description, equipment, full spec sheet, consumption, AI summary and dealer profile (default on). |
| `descriptionFormat` | enum | `all`, `text`, `html` or `markdown`. |
| `descriptionMaxLength` | integer | Truncate descriptions to N characters (`0` = full text). |
| `compact` | boolean | 21 core fields only, for AI agents and MCP clients. |
| `excludeEmptyFields` | boolean | Drop null and empty fields. |

#### ♻️ Monitoring

| Field | Type | What it does |
|---|---|---|
| `incrementalMode` | boolean | Emit only new, changed and re-listed cars since the last run. |
| `stateKey` | string | Name for the tracked search. Blank = derived from your settings. |
| `emitUnchanged` | boolean | Also emit listings that haven't changed. |
| `emitExpired` | boolean | Emit a record for each listing that has gone (sold or removed). |
| `skipReposts` | boolean | Suppress the same car re-posted by the same seller under a new ID. |

#### 🔔 Notifications and ⚙️ Advanced

The alert channels (`telegramToken` + `telegramChatId`, `slackWebhookUrl`, `discordWebhookUrl`,
`webhookUrl` + `webhookHeaders`, `notificationLimit`) are covered in the
**alerts** section below. Advanced settings
(`proxyConfiguration`, `detailConcurrency`, `maxRequestRetries`, `ignoreUrlFailures`) work out of
the box and can be left alone.

#### More example inputs

Every electric SUV listed by dealers within 50 km of Munich:

```json
{
  "fuelType": ["ELECTRICITY"],
  "bodyType": ["OffRoad"],
  "sellerType": "DEALER",
  "location": "München",
  "radiusKm": 50,
  "maxResults": 0
}
```

A search you built on mobile.de, with full details:

```json
{
  "startUrls": [{ "url": "https://suchen.mobile.de/fahrzeuge/search.html?ms=3500%3B10%3B%3B&vc=Car" }]
}
```

***

### Output

Each dataset item is one vehicle listing. A real record (trimmed: the Actor returns the full
description, every photo, the whole equipment list and the full spec sheet):

```json
{
  "id": "434925035",
  "url": "https://suchen.mobile.de/auto-inserat/audi-q7-50-tdi-quattro-virtual-navi-bad-waldsee/434925035.html",
  "title": "Audi Q7 50 TDI quattro Virtual Navi",
  "make": "Audi",
  "model": "Q7",
  "version": "50 TDI quattro Virtual Navi",
  "vehicleType": "Car",
  "category": "SUV/Off-road Vehicle/Pickup Truck",
  "condition": "USED",
  "price": 39900.0,
  "currency": "EUR",
  "priceNet": 33529.41,
  "vatRate": 19.0,
  "vatDeductible": true,
  "priceRating": "GOOD_PRICE",
  "priceRatingLabel": "Good price",
  "priceRatingThresholds": [30300.0, 39400.0, 42400.0, 47200.0, 50700.0, 56300.0],
  "priceRatingPosition": 16,
  "mileageKm": 85600,
  "firstRegistration": "09/2020",
  "powerKw": 210,
  "powerHp": 286,
  "fuelType": "Diesel",
  "transmission": "Automatic",
  "emissionClass": "Euro6d",
  "previousOwners": 1,
  "hasDamage": false,
  "city": "Bad Waldsee",
  "postalCode": "88339",
  "country": "DE",
  "imageUrls": [
    "https://img.classistatic.de/api/v1/mo-prod/images/50/50443159-ecc9-4204-b409-95b78c391a59?rule=mo-1024.jpg"
  ],
  "imageCount": 19,
  "createdAt": "2025-08-28T08:32:11+00:00",
  "sellerType": "DEALER",
  "sellerName": "AD-Automobile GmbH",
  "sellerId": "453536",
  "sellerPhones": ["+49 (0)7524 9147157", "+49 (0)178 6359466"],
  "sellerWhatsapp": "+49 178 6359466",
  "sellerAddress": "Rudolf-Diesel-Straße 12, DE-88339 Bad Waldsee",
  "latitude": 47.9405433,
  "longitude": 9.765612899999999,
  "sellerOpeningHours": ["Mon - Fri: 09:00 h - 19:00 h"],
  "sellerLanguages": ["Deutsch", "Pусский", "English"],
  "sellerSince": "2007-05-23",
  "modelRange": "Q7 (4MG)(07.2019->)",
  "trimLine": "50 TDI quattro basis",
  "fuelConsumption": "6.9 l/100km",
  "co2Emissions": "175 g/km",
  "emissionsSticker": "4 (Green)",
  "climatisation": "Automatic air conditioning",
  "interior": "Cloth, Black",
  "features": ["ABS", "Alloy wheels", "Apple CarPlay", "Bluetooth", "Central locking"],
  "specs": {
    "cubicCapacity": "2,967 ccm",
    "parkAssists": "Front, Rear",
    "trailerLoadBraked": "2,700 kg",
    "fuelTankVolume": "75 l"
  },
  "aiSummary": "This vehicle stands out with a good price and features a fresh TÜV for immediate roadworthiness. Buying from an established dealer who has been active since 2007 adds strong trust. Prospective buyers should carefully verify the vehicle history and overall condition during a visit.",
  "aiHighlights": ["Good price", "Fresh TÜV", "Experienced dealer"],
  "description": "Besichtigung und Probefahrt nach Terminvereinbarung möglich. …",
  "source": "mobile.de",
  "scrapedAt": "2026-10-14T07:12:48.150185+00:00"
}
```

#### Data fields

- **Always:** price, rating and price bands, VAT split, vehicle identity and key specs, location, photos, timestamps, and the seller's name, phones, WhatsApp, rating, address and GPS.
- **With `includeDetails`** (on by default): description (also as `descriptionHtml` / `descriptionMarkdown`), equipment list, full spec sheet, consumption detail, EV charging data, AI summary and highlights, contact person, website, opening hours, languages, recommendation rate and member-since date.
- **With `incrementalMode`:** `changeType`, `firstSeenAt` / `lastSeenAt`, `previousPrice`, `priceChange` and `priceChangeAmount` on a price move, `expiredAt`, and `isRepost` / `repostOfId`.

Every field is present in standard mode (missing values are `null`). **Compact mode** returns 21
core fields, and **`excludeEmptyFields`** drops empties entirely. The Output tab ships three
views: **Overview**, **Sellers & contacts** and **Changes**.

***

### ♻️ How to monitor mobile.de with incremental mode

Schedule the Actor with **incremental mode** on. Each run compares against the previous one and
emits only **NEW**, **UPDATED** (including every price drop) and **REAPPEARED** listings.
Unchanged cars are recognised from the search results *before* their details are loaded, so you
skip both the work and the cost. Each tracked search remembers up to about 22,000 listings.

| | First run (baseline) | Next run (nothing changed) | Next run (one car cut its price) |
|---|---|---|---|
| Listings found | all | all | all |
| Full details loaded | all | **none** | **1** |
| Records emitted & billed | all | **none** | **1**, with `previousPrice`, `priceChange: DECREASED` and `priceChangeAmount` |

After the baseline, your cost scales with how much mobile.de changes, not with how much you watch:

| Daily churn | of 1,000 tracked | billable records | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | **95 %** |
| 15 % | 1,000 | 150 | **85 %** |
| 30 % | 1,000 | 300 | **70 %** |

#### Setting up scheduled monitoring

1. Configure your search, keep **Sort by** on *Newest first* and set **Max results** to `0`. Sold/removed listings are only reported by runs that read the whole search.
2. Turn on **Incremental mode**, plus **Include sold/removed listings** and **Skip re-listed cars** if you want them.
3. Run it once to seed the baseline, then add a schedule (hourly or daily) in the **Schedules** tab and a notification channel.

A daily price-drop watch on used Porsche 911s with a Telegram alert:

```json
{
  "make": "Porsche",
  "model": "911",
  "condition": ["USED"],
  "maxResults": 0,
  "incrementalMode": true,
  "emitExpired": true,
  "telegramToken": "<bot token>",
  "telegramChatId": "@your_channel"
}
```

***

### 🔔 How to set up mobile.de alerts

Get pinged the moment a matching car is listed or drops its price. Fill in only the channels you
want:

| Channel | What to configure |
|---|---|
| ✈️ **Telegram** | `telegramToken` (from @BotFather) + `telegramChatId` |
| 💬 **Slack** | `slackWebhookUrl` (Incoming Webhook URL) |
| 🎮 **Discord** | `discordWebhookUrl` (channel webhook URL) |
| 🪝 **Webhook** | `webhookUrl` (+ optional `webhookHeaders`) receives structured JSON, ideal for n8n / Make / Zapier |

Each alert lists up to `notificationLimit` cars (default 5, up to 20) with price, mileage, first
registration and, on a price drop, the old price. Channels fire independently, and a broken one
can't stop the scrape. Credentials are secret inputs: encrypted at rest, masked in the UI and never
written to the run log.

***

### 💡 What can you do with mobile.de data?

#### Catch underpriced cars before anyone else

Schedule a newest-first search with incremental mode and a Telegram alert, and filter on
`priceRating: VERY_GOOD_PRICE`. You hear about bargains soon after they go online, with the
dealer's phone number attached.

#### Used-car valuation and residual-value models

Read an entire make or model past the 2,000-result limit, with mileage, year, power, equipment and
condition on every row, and mobile.de's own price bands as a market benchmark for each car.

#### Track price drops and days-on-market

`previousPrice`, `priceChangeAmount`, `firstSeenAt` and the sold/removed records show which models
are being discounted and how long they sit, which is the raw material for pricing your stock or
timing a purchase.

#### Dealer lead generation for automotive services

Build regional dealer lists with phone, WhatsApp, contact person, website, address, GPS, rating
and `sellerId`, a natural fit for financing, insurance, logistics and software vendors.

#### Competitor stock monitoring for dealers

Point the `sellerId` filter at a rival dealership and schedule it. You see every car they add,
every price change and every vehicle that sells.

#### Export and fleet sourcing across Europe

Filter by `country`, `vatDeductibleOnly` and emission class to source VAT-deductible vehicles in
20 European countries, then export the list straight to Excel.

***

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

This Actor uses Apify's **pay-per-event** model: a small fee when a run starts, plus a fee for each
listing delivered. The **Pricing** tab shows the current numbers live.

There's no extra charge for full details, and none for the unchanged listings a monitoring run
checks. Two things cut your bill further: **site-side filters** (listings you filtered out are
never fetched or billed) and **incremental mode** (after the baseline you pay only for what
changed, see the savings table above).

***

### 🔌 Integrations & export

Export to **JSON, CSV, Excel** or an HTML table, or pull from the **REST API** and the
**JavaScript / Python** clients. Run it on a **schedule**, connect it to **Google Sheets, Slack,
Make, Zapier and n8n**, or call it as an **MCP tool** from an AI agent.

Also covering European car marketplaces: [AutoScout24 Scraper](https://apify.com/corvuslab/autoscout24-scraper).

***

### 🔗 Using the API

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("corvuslab/mobile-de-scraper").call(run_input={
    "make": "Volkswagen",
    "model": "Golf",
    "yearMin": 2020,
    "maxResults": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price"], item["priceRating"])
```

***

### ❓ FAQ

**Do I need a mobile.de account or login?** No. It reads public listings only and runs out of the
box.

**mobile.de only shows about 2,000 results per search. Can I get more?** Yes. Set `maxResults` to
`0` and larger searches are split and read to the end, up to 50,000 listings per run. Two
exceptions: with **Listed within (days)** set, results are read newest-first without splitting, so
narrow the filters if more than ~2,000 cars match; and "price on request" listings can't be placed
in a price range, so a split read may miss some of them.

**What do `priceRating`, `priceRatingThresholds` and `priceRatingPosition` mean?** `priceRating`
is mobile.de's market verdict: `VERY_GOOD_PRICE`, `GOOD_PRICE`, `REASONABLE_PRICE`,
`INCREASED_PRICE` or `HIGH_PRICE` (`NO_RATING` when mobile.de didn't rate the car).
`priceRatingThresholds` are the six prices in EUR that bound those five bands, cheapest first, so
the third and fourth values are mobile.de's fair-market range for that car. `priceRatingPosition`
is how far into its band the price sits (0–100).

**Why are `aiSummary`, `features` or `description` empty?** They come with full details, so keep
**Fetch full details** on. `aiSummary` is filled only where mobile.de has written one, and not
every listing has one.

**Why are `model`, `version` and `priceRating` empty on motorbikes and trucks?** mobile.de only
records the make for most non-car vehicle types and only rates car prices. The model is still in
the `title`, and `make`, `category` and every spec are filled as usual.

**Why is `sellerWhatsapp`, `sellerRating` or `imageUrls` empty on some listings?** Those exist only
when the seller provides them. Many dealers don't list WhatsApp, private sellers have no rating,
opening hours or website, and some imported partner listings come without photos.

**Which model names work?** The names you'd use on mobile.de and their common variants: `3er`,
`3 Series`, `C-Klasse`, `Classe C`, `Golf`. If a name isn't a mobile.de model (e.g. `320d`), that
make's listings mentioning it are searched instead. An unknown make stops the run before anything
is charged, and the status message suggests the closest names.

**Can I search outside Germany?** Yes. mobile.de lists vehicles across Europe; use `country` to
pick from 20 countries. The radius search works on German postcodes and towns, or on any
`latitude,longitude`.

***

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

This Actor collects only **publicly available** listing data. You're responsible for how you use
it, in particular any personal information such as private sellers' names and phone numbers, and
for complying with mobile.de's terms and applicable law (including the GDPR where it applies). Not
affiliated with, endorsed by or sponsored by mobile.de GmbH.

***

**Keywords:** mobile.de scraper · mobile.de api · scrape mobile.de · mobile.de car listings · mobile de scraper · car price scraper · used car prices Germany · car price drop alerts · car dealer leads · Germany car marketplace data · vehicle listings scraper · car market research · price rating · motorbike listings · export to CSV · export to Excel · no-code scraper · MCP tool for AI agents

# Changelog

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

# Actor input Schema

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

What kind of vehicle to search. Body type and some other filters apply to cars only.

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

Brand name as written on mobile.de, e.g. BMW, Volkswagen, Mercedes-Benz. Separate several makes with commas — they are searched together.

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

Optional. Model or model family, e.g. 3er, 3 Series, 320, Golf, C-Klasse. Separate several with commas. Requires a make. A name mobile.de has no model for (e.g. 320d) searches that make's listings mentioning it.

## `keyword` (type: `string`):

Optional free-text search inside the listings, e.g. 'M Sport' or 'Standheizung'.

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

Optional. Paste mobile.de search result links (every filter in the link is kept) or single listing links. Search links replace the form search above unless a make is also filled in.

## `maxResults` (type: `integer`):

Maximum number of listings to return. Set 0 for no limit — searches larger than mobile.de can show in one list are read in price bands automatically.

## `sort` (type: `string`):

Order in which listings are read. Newest first is best for monitoring.

## `listedWithinDays` (type: `integer`):

Optional. Only listings put online in the last N days (e.g. 1 for today's new cars). Forces newest-first order.

## `condition` (type: `array`):

New and/or used vehicles. Leave empty for both.

## `priceMin` (type: `integer`):

Minimum price in EUR.

## `priceMax` (type: `integer`):

Maximum price in EUR.

## `yearMin` (type: `integer`):

Earliest first-registration year, e.g. 2018.

## `yearMax` (type: `integer`):

Latest first-registration year.

## `mileageMin` (type: `integer`):

Minimum mileage in km.

## `mileageMax` (type: `integer`):

Maximum mileage in km.

## `powerMinPs` (type: `integer`):

Minimum engine power in PS (metric hp).

## `powerMaxPs` (type: `integer`):

Maximum engine power in PS (metric hp).

## `fuelType` (type: `array`):

One or more fuel types.

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

One or more gearbox types.

## `bodyType` (type: `array`):

One or more body types. Cars only.

## `exteriorColor` (type: `array`):

One or more colours.

## `emissionClass` (type: `array`):

One or more emission classes.

## `driveType` (type: `array`):

One or more drive types.

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

Only vehicles with at least this many seats.

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

Dealers, private sellers, or both.

## `damageStatus` (type: `string`):

Whether to include vehicles with unrepaired damage.

## `vatDeductibleOnly` (type: `boolean`):

Only listings where VAT is shown separately (deductible for businesses).

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

Only vehicles located in these countries. Leave empty for all countries on mobile.de.

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

Optional. Search around a German postcode (e.g. 10115), a German town (e.g. München) or 'latitude,longitude'.

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

Search radius around the location above. Default 50 km.

## `sellerId` (type: `string`):

Optional. Restrict the search to one seller's stock — the sellerId value from any of their listings in this actor's output.

## `includeDetails` (type: `boolean`):

Adds the description, equipment list, full spec sheet, consumption, the listing's AI summary and the dealer profile (opening hours, languages, rating details). Turn off for the fastest, leanest runs — price, specs, seller, phone and GPS are included either way.

## `descriptionFormat` (type: `string`):

Which representation(s) of the description to include.

## `descriptionMaxLength` (type: `integer`):

Truncate descriptions to this many characters. 0 = no limit.

## `compact` (type: `boolean`):

Emit only the core fields. Ideal for AI agents and MCP clients.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty-string and empty-array fields from each record.

## `incrementalMode` (type: `boolean`):

Remember listings between runs and emit only new, changed (including price drops) and re-listed ones. Each record gets a changeType and its previous price.

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

Name for the tracked search. Leave empty to derive one from your search settings. Use different keys to track different searches.

## `emitUnchanged` (type: `boolean`):

Also emit listings that have not changed since the previous run.

## `emitExpired` (type: `boolean`):

Emit a record for each listing that was in the previous run but is gone now. Only reported by runs that read the whole search.

## `skipReposts` (type: `boolean`):

Suppress listings that are the same car from the same seller re-posted under a new ID.

## `telegramToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL.

## `discordWebhookUrl` (type: `string`):

Discord incoming-webhook URL.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST with the matched listings — works with n8n, Make and Zapier.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook request, e.g. {"Authorization": "Bearer xyz"}.

## `notificationLimit` (type: `integer`):

How many listings to include in each notification message.

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

Optional. Not needed — the actor connects on its own. Only set this if you must route requests through your own proxies.

## `detailConcurrency` (type: `integer`):

How many listing details to load in parallel.

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

How many times to retry a failed request before giving up on it.

## `ignoreUrlFailures` (type: `boolean`):

Skip links that cannot be interpreted instead of failing the whole run.

## Actor input object example

```json
{
  "vehicleType": "Car",
  "make": "BMW",
  "maxResults": 100,
  "sort": "newest",
  "sellerType": "ANY",
  "damageStatus": "ANY",
  "vatDeductibleOnly": false,
  "includeDetails": true,
  "descriptionFormat": "all",
  "descriptionMaxLength": 0,
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "skipReposts": false,
  "notificationLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "detailConcurrency": 8,
  "maxRequestRetries": 3,
  "ignoreUrlFailures": true
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `sellers` (type: `string`):

No description

## `allItems` (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": "BMW"
};

// Run the Actor and wait for it to finish
const run = await client.actor("corvuslab/mobile-de-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": "BMW" }

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/mobile-de-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": "BMW"
}' |
apify call corvuslab/mobile-de-scraper --silent --output-dataset

```

## MCP server setup

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