# mobile.de Scraper - Cars, Prices, Dealers & Vehicle Data (`abotapi/mobile-de-scraper`) Actor

Scrape mobile.de vehicle listings with 30+ fields including price, mileage, registration, power, fuel, transmission, location and dealer details. Optional enrichment adds descriptions, equipment, images and dealer profiles.

- **URL**: https://apify.com/abotapi/mobile-de-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Features:** Limited permissions
- **Stats:** 20 total users, 3 monthly users, 17.2% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 vehicle listings

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## mobile.de Scraper: Car Listings, Prices & Seller Data

mobile.de Scraper turns mobile.de, Germany's largest vehicle marketplace, into a clean, structured data feed. Search by make and model, location and radius, price, year, mileage, power, colour, seller type, price rating and more, or paste your own mobile.de search and listing links. Every record carries price, vehicle facts, mobile.de's price rating and seller contact details, and you can switch on full detail enrichment for the complete specification table, equipment list, description and image gallery, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

### Why This Scraper?

- **Two ways to find listings.** Build a search from filters, or paste your own mobile.de search or vehicle links and let the actor walk the pages forward.
- **The widest filter set.** Make and model (a single model like `320` or a whole series like `3er`), postal code or town with radius, vehicle class, condition, fuel, transmission, body type, colour, seller type (dealer or private), price rating, listing age, VAT-reclaimable, seats, doors, previous owners, drive type, emission class, minimum seller rating, a description keyword, and price, year, mileage and power ranges. An unrecognised make, model or location stops the run with a clear message instead of silently searching everything.
- **Rich records without extra cost.** Every search result already includes colour, doors, seats, previous owners, HU/TÜV date, accident-free flag, highlights, VAT status, mobile.de's price rating, seller type, seller id and seller phone numbers.
- **Optional full detail enrichment.** Switch on Fetch full vehicle detail for engine size, cylinders, emission class, CO₂ and consumption, equipment list, description, full gallery, listing dates, make/model ids, and the seller's address, coordinates, WhatsApp, languages, opening hours and rating breakdown. You pay only for the listings it enriches.
- **Incremental monitoring for scheduled runs.** Turn on incremental mode and each run returns only what is NEW, UPDATED (with the changed fields named) or REAPPEARED since the last run, and optionally what EXPIRED. Unchanged listings are skipped and not billed.
- **Sponsored placements under your control.** Include mobile.de's paid top placements or filter them out, and see each listing's placement type.
- **Only real results, and failures are loud.** The "similar" cars mobile.de pads onto sparse searches are dropped, so an empty search returns an empty dataset. If the site cannot be read at all, the run stops with a clear status message instead of finishing silently empty.

### Use Cases

- **Dealer and inventory monitoring:** track a make, model range or price band across mobile.de for pricing and stock research.
- **Marketplace aggregation:** pull structured German vehicle listings into your own search or comparison site.
- **Lead generation for auto dealers:** collect seller names, cities and ratings for outreach or competitive analysis.
- **Pricing and valuation models:** build a dataset of price against mileage, year and power for data science and appraisal work.
- **Personal car shopping:** run a saved mobile.de search URL and get every matching listing back as structured data.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

**On every record (search results, no extra charge)**

| Field | Example |
| --- | --- |
| `id`, `url`, `title` | `"398217655"`, mobile.de link, `"Audi A4"` |
| `make`, `model`, `category` | `"Audi"`, `"A4"`, `"Kombi"` |
| `price`, `priceFormatted`, `currency` | `28900`, `"28.900 €"`, `"EUR"` |
| `priceRating`, `priceRatingLabel`, `vatDeductible` | `"GOOD_PRICE"`, `"Good price"` (mobile.de's market comparison), `true` when VAT can be shown on the invoice |
| `firstRegistration`, `mileageKm` | `"03/2020"`, `45000` |
| `powerKw`, `powerHp`, `fuel`, `transmission` | `140`, `190`, `"DIESEL"`, `"AUTOMATIC_GEAR"` |
| `color`, `doors`, `seats` | `"Schwarz"`, `"4/5"`, `5` |
| `previousOwners`, `huDate`, `netWeightKg` | `1`, `"06/2027"`, `1540` |
| `accidentFree`, `highlights` | `true`, `["Sitzheizung", "Navigation"]` |
| `city`, `zip`, `country`, `previewImage`, `numImages` | `"Muenchen"`, `"80331"`, `"DE"`, first image, `24` |
| `sellerName`, `sellerType`, `sellerId`, `sellerPhones` | `"Autohaus Beispiel GmbH"`, `"DEALER"` or `"FSBO"` (private), `1234567`, `["+490000000000"]` |
| `rating`, `reviewCount`, `listingType`, `sponsored` | `4.7`, `312`, `"regular"`, `"eyecatcher"`, `"topInCategory"` or `"topOfPage"`, `false` |

**Added by Fetch full vehicle detail**

| Field | Example |
| --- | --- |
| `subTitle`, `trimLine`, `modelRange`, `makeId`, `modelId`, `vehicleNumber` | `"Avant 40 TDI S line"`, `"S line"`, `"B9"`, `1900`, `9`, the dealer's stock number |
| `createdAt`, `modifiedAt`, `renewedAt` | `"2026-09-01T08:00:00Z"` |
| `isNew`, `readyToDrive`, `damageCondition` | `false`, `true`, `"Gebrauchtfahrzeug, Unfallfrei"` |
| `cubicCapacityCcm`, `cylinders`, `fuelTankLiters`, `engineType` | `1968`, `4`, `40`, `"Verbrennungsmotor"` |
| `emissionClass`, `emissionsSticker`, `co2Emissions`, `fuelConsumption`, `energyConsumption` | `"Euro6d"`, `"4 (Grün)"`, `"132 g/km"`, `"5,0 l/100km (kombiniert)"`, ... |
| `manufacturerColor`, `interior`, `climatisation`, `airbags`, `parkAssists`, `trailerLoadBrakedKg`, `trailerLoadUnbrakedKg` | `"Mythosschwarz"`, `"Leder, Schwarz"`, ..., `1800`, `750` |
| `lastServiceDate`, `lastServiceMileageKm`, `countryVersion`, `deliveryOption`, `deliveryRadius`, `deliveryPeriod` | `"06/2026"`, `42000`, `"Deutsche Ausführung"`, `"Lieferung möglich"`, `"700 km"`, `"1 Tag"` |
| `sellerAddress`, `sellerZip`, `sellerLatitude`, `sellerLongitude`, `sellerWhatsApp`, `sellerLanguages`, `sellerSince`, `sellerHomepage` | `"Beispielstraße 1, DE-80331 Muenchen"`, `"80331"`, `48.1`, `11.5`, `"+490000000000"`, `["Deutsch", "English"]`, `"2015-04-01"`, link |
| `sellerOpeningHours`, `sellerRecommendationRate`, `sellerAdRealityRate` | `[{"day": "Mo - Fr", "time": "08:00 Uhr - 18:00 Uhr"}]`, `92`, `95` (percent) |
| `segment`, `priceRanges` | `Car`; price bands by rating, e.g. `Very good price`: `11.400 € - 14.800 €` |
| `sellerScore`, `sellerActiveRatingCount`, `sellerRecommendPercentage`, `sellerVehicleAsDescribedPercentage`, `sellerReviewPageUrl`, `sellerIconUrl` | dealer sub-scores (total, responseTime, friendliness, advice), rating count, percentages, review page and logo |
| `description`, `features`, `images`, `attributes` | seller text, equipment list, full gallery, full spec table |
| `dealerReviews` | newest dealer reviews (reviewer, rating, date, text, sub-scores); see **Dealer reviews per listing** |

Every record has the same set of keys; anything a listing does not show is `null` (or an empty list).

### How to Use

1. Pick a **mode**: `search` (build a query from filters) or `url` (paste your own mobile.de search or listing links).
2. For search mode, fill in vehicle class, make and the range filters you need. For url mode, paste one or more mobile.de search or vehicle detail links.
3. Turn on **Fetch full vehicle detail** if you need the specification table, equipment list, description and full image gallery. Leave it off for fast, list-only runs.
4. Set **Maximum listings** and **Maximum pages per search** to control run size and cost, then click **Start**.

**Filtered search:**

```json
{
  "mode": "search",
  "vehicleClass": "Car",
  "make": "Audi",
  "priceFrom": 10000,
  "priceTo": 40000,
  "yearFrom": 2018,
  "fuels": ["DIESEL"],
  "maxListings": 50
}
```

**Search with full detail enrichment:**

```json
{
  "mode": "search",
  "vehicleClass": "Car",
  "make": "BMW",
  "fetchDetails": true,
  "maxListings": 20
}
```

**Postal code and radius, used vehicles only:**

```json
{
  "mode": "search",
  "vehicleClass": "Car",
  "zipcode": "10115",
  "radiusKm": 50,
  "condition": "USED",
  "transmission": "AUTOMATIC_GEAR",
  "maxListings": 30
}
```

**Your own URLs:**

```json
{
  "mode": "url",
  "urls": [
    "https://suchen.mobile.de/fahrzeuge/search.html?ms=3500%3B%3B%3B&vc=Car",
    "https://suchen.mobile.de/fahrzeuge/details.html?id=398217655"
  ],
  "maxPages": 5,
  "maxListings": 100
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/mobile-de-scraper").call(run_input={"mode": "search", "make": "Audi", "maxListings": 20})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(listing["title"], listing["priceFormatted"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/mobile-de-scraper').call({ mode: 'search', make: 'Audi', maxListings: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### Incremental monitoring (scheduled runs)

Schedule the same search daily or weekly with **Incremental changes for scheduled runs** on:

1. The first run returns every matching listing, marked `changeType: "NEW"`.
2. Later runs return only listings that are `NEW`, `UPDATED` (with `changedFields`, e.g. `["price"]`) or `REAPPEARED`. Listings that did not change are skipped and **not billed**. Each row also carries `firstSeenAt` and `lastSeenAt`.
3. Turn on **Emit expired listings** to also get listings that disappeared, marked `EXPIRED`. This is only decided when a run has read every result the site reports for each search (no page failed and no page or listing limit cut it short), so a temporary problem never marks live listings as gone. mobile.de shows at most 50 pages per search, so for very large searches narrow the filters to get expiry tracking.
4. Turn on **Emit unchanged listings** if you want the full snapshot every run (billed).

State is kept automatically per search setup (filters, URLs and options), so different searches never mix. Use **State key** to name a campaign or share state on purpose. Some fields never count as a change because they move without the car changing: the seller-level aggregates and reviews (`rating`, `reviewCount`, `sellerRecommendationRate`, `sellerAdRealityRate`, `sellerScore`, `sellerActiveRatingCount`, `sellerRecommendPercentage`, `sellerVehicleAsDescribedPercentage`, `priceRanges`, `dealerReviews`), `modifiedAt` and `renewedAt` (dealer feed syncs, renewals) and `listingType` (the paid placement). Add your own with **Ignore fields when detecting changes**. Every other returned field (price, mileage, description, images, features, seller details) counts as a change; ignored fields are still returned in the output.

#### How search mode paginates

Search mode reads one page at a time, deduplicates listings by id, and keeps going until **Maximum listings** is reached, **Maximum pages per search** is reached, or two pages in a row come back with nothing new, whichever happens first. URL mode auto-paginates a pasted search link forward under the same rules; a pasted vehicle detail link is read once, on its own.

#### URL mode: supported links

If you leave the **URLs** field untouched in URL mode, the actor scrapes the twelve example links below (one per link type, each resolving to a different target); use **Maximum listings** to cap the run. Replace them with your own links to scrape something specific.

| Link type | Example | What happens |
| --- | --- | --- |
| Search | `suchen.mobile.de/fahrzeuge/search.html?...&ms=3500&s=Car&vc=Car` | Read from page 1 and paged forward. |
| Search, later start page | same link with `&pageNumber=2` | Reading starts at that page. |
| Search, filtered and sorted | search link with `ft=`, `sb=`, `od=` (older `fuels`, `sb`, `od` forms also work) | Filters and sort order are kept. |
| Other vehicle class | search link with `vc=Motorbike&s=Motorbike` | Read like any search. |
| Vehicle detail | `.../fahrzeuge/details.html?id=460410691` | One record, read from the detail page. |
| Detail with search parameters | detail link followed by `&searchId=...` and search parameters (not in the examples) | Same as a plain detail link. |
| Make or model page | `.../auto/audi-a4.html` | Converted to the matching search; a make or model the site does not list is reported in the log and counted as a failed read. |
| Fuel category page | `.../auto/elektro.html` (also hybrid, diesel, benzin, erdgas, autogas, wasserstoff) | Converted to a search with that fuel filter; any other category page is skipped with a warning. |
| Body-type page | `.../auto/kombi.html` (also cabrio, limousine, kleinwagen, sportwagen, suv, gelaendewagen, van and their longer forms such as `cabrio-roadster`) | Converted to a search with that body-type filter, the same as the **Body types** input; an unlisted body-type slug is skipped with a warning. |
| Vehicle class search | `.../fahrzeuge/search.html?...&s=Van&vc=VanUpTo7500` | Scraped like any other search link (the site may show it under a different class, for example Truck). |
| Legacy vehicle link | `.../auto-inserat/x/459673664.html` | Read as the vehicle detail page with that id. |
| Marketing landing page | `www.mobile.de/lp/bmw-3er-angebote/` | Converted to the make and model search, because the landing page itself lists no vehicles. |
| New-style search link | `www.mobile.de/s/auto?...` | Not supported and skipped with a warning; open the search on `suchen.mobile.de` and paste that `search.html` result link instead. |
| Mobile host | `m.mobile.de/fahrzeuge/details.html?id=...` | Treated as `suchen.mobile.de`. |

A link with a `customerId=` (dealer) filter is still read, but mobile.de ignores that filter, so the log warns that results are not limited to that dealer.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` (build a query from filters) or `url` (use your own links). |
| `urls` | array | twelve example links, one per link type (see "URL mode: supported links") | Your own mobile.de search or vehicle detail links (`url` mode). If you leave the field untouched in URL mode, the actor scrapes those twelve examples. |
| `vehicleClass` | string | `Car` | Vehicle category (search mode only). |
| `make` | string | none | Manufacturer name as it appears on mobile.de. Left blank searches all makes; an unknown name stops the run with a message. |
| `model` | string | none | Model (`320`, `X5`, `Golf`) or whole series (`3er`) for the chosen make. An unknown model stops the run and lists valid series. |
| `condition` | string | ``(any) | New, used, employee car, classic, demo, or pre-registered. |
| `fuels` | array | `[]` (any) | Multi-select fuel types. |
| `bodyTypes` | array | `[]` | Multi-select body types, combined with the single `bodyType` when both are set. |
| `transmissions` | array | `[]` | Multi-select gearbox types, combined with the single `transmission` when both are set. |
| `models` | array | `[]` | `Make|Model` entries (e.g. `BMW|3er`), one search per entry, Max listings split equally between them. Search mode only. |
| `transmission` | string |`` (any) | Gearbox type used as a search filter. |
| `bodyType` | string | ``(any) | Body shape, used together with a Car vehicle class. |
| `country` | string | `DE` | Country the listings are offered in. |
| `zipcode` | string | none | Postal code or town (e.g. `10115` or `München`), used with Radius. An unknown location stops the run with a message. |
| `radiusKm` | integer | none | Radius around the location (up to 1000 km), rounded up to the nearest radius mobile.de offers. |
| `priceFrom` | integer | none | Lower bound for price (EUR). |
| `priceTo` | integer | none | Upper bound for price (EUR). |
| `yearFrom` | integer | none | Oldest first-registration year. |
| `yearTo` | integer | none | Newest first-registration year. |
| `mileageFrom` | integer | none | Lower bound for mileage (km). |
| `mileageTo` | integer | none | Upper bound for mileage (km). |
| `powerFromKw` | integer | none | Lower bound for engine power (kW). |
| `powerToKw` | integer | none | Upper bound for engine power (kW). |
| `excludeDamaged` | boolean | `true` | Hide vehicles flagged as damaged. |
| `onlyDamaged` | boolean | `false` | Show only vehicles flagged as damaged (overrides the option above). |
| `exteriorColors` | array | `[]` (any) | Multi-select exterior colours. |
| `sellerType` | string |`` (any) | Dealer, private seller, or company vehicle. |
| `priceRatings` | array | `[]` (any) | Only listings mobile.de rates as very good, good, or fair price. |
| `onlineSinceDays` | string | ``(any) | Only listings published in the last 1, 3, 7 or 14 days. |
| `vatReclaimable` | boolean | `false` | Only listings with VAT shown on the invoice. |
| `minSeats` | integer | none | Minimum number of seats. |
| `doors` | string |`` (any) | 2/3, 4/5 or 6/7 doors. |
| `maxPreviousOwners` | integer | none | Up to this many previous owners (1-4). |
| `driveType` | string | ``(any) | All-wheel, front-wheel or rear-wheel drive. |
| `emissionClass` | string |`` (any) | Minimum emission standard (Euro 1 to Euro 7). |
| `minSellerRating` | integer | none | Only sellers rated at least this many stars (3-5). |
| `keyword` | string | none | Only listings whose description contains this text. |
| `sortBy` | string | `RELEVANCE` | Result order: relevance, price, first registration, mileage, or listing date (newest or oldest). |
| `resumeFromRunId` | string | none | Run ID or dataset ID of an interrupted collection; listings already in that dataset are skipped and not charged again. |
| `incrementalMode` | boolean | `false` | Return only NEW / UPDATED / REAPPEARED listings since the last run of the same search. |
| `stateKey` | string | none | Optional name for an incremental monitoring campaign. |
| `emitUnchanged` | boolean | `false` | Also return unchanged listings (billed). |
| `emitExpired` | boolean | `false` | Also return listings no longer found, after a complete scan (billed). |
| `ignoreFieldsForChanges` | array | `[]` | Extra field names that should not count as a change. |
| `fetchDetails` | boolean | `false` | Pull the specification table, equipment list, description and full image gallery from each listing's detail page. |
| `reviewLimit` | integer | `0` (the Console form pre-fills `20`) | With Fetch full vehicle detail on, also return the newest dealer reviews per listing (0 to 100) in `dealerReviews`; 0 turns reviews off. Each started block of 10 reviews returned adds one detail-enrichment unit. |
| `includeSponsored` | boolean | `false` | Include mobile.de's paid top placements. |
| `maxListings` | integer | `20` | Stop after this many listings across the whole run. `0` means no limit. |
| `maxPages` | integer | `0` | Optional per-search page cap; `0` leaves it to Maximum listings. The actor never walks more than 1000 pages per search, and stops early once the site's own result list is exhausted. |
| `proxyConfiguration` | object | none in the schema (prefill: residential group, country `DE`); the actor applies this same setting at runtime if the field is left out | Connection settings. Only the country is used; connections always route through the residential proxy group. |
| `mcpConnectors` | array | none | Optional connectors (Notion, Linear, Airtable, Apify) that receive a short summary of each returned listing after the run. |
| `notionParentPageUrl` | string | none | Notion page under which listing pages are created; needed only for the Notion connector. |
| `maxNotifyListings` | integer | `50` | Cap on listings sent to each connector per run (1 to 1000). The dataset is not affected. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record. Detail-only fields are shown filled, as with Fetch full vehicle detail on.

```json
{
  "id": "398217655",
  "url": "https://suchen.mobile.de/fahrzeuge/details.html?id=398217655",
  "title": "Audi A4",
  "make": "Audi",
  "model": "A4",
  "subTitle": "Avant 40 TDI S line",
  "category": "Kombi",
  "price": 28900,
  "priceFormatted": "28.900 €",
  "currency": "EUR",
  "priceRating": "GOOD_PRICE",
  "priceRatingLabel": "Good price",
  "vatDeductible": true,
  "firstRegistration": "03/2020",
  "mileageKm": 45000,
  "powerKw": 140,
  "powerHp": 190,
  "fuel": "DIESEL",
  "transmission": "AUTOMATIC_GEAR",
  "color": "Schwarz Metallic",
  "doors": "4/5",
  "seats": 5,
  "previousOwners": 1,
  "huDate": "06/2027",
  "accidentFree": true,
  "highlights": ["Sitzheizung", "Navigation"],
  "cubicCapacityCcm": 1968,
  "emissionClass": "Euro6d",
  "co2Emissions": "132 g/km",
  "fuelConsumption": "5,0 l/100km (kombiniert)",
  "createdAt": "2026-09-01T08:00:00Z",
  "city": "Muenchen",
  "zip": "80331",
  "country": "DE",
  "listingType": "regular",
  "sponsored": false,
  "numImages": 24,
  "previewImage": "https://img.classistatic.de/api/v1/mo-prod/images/sample.jpg?rule=mo-1600",
  "sellerName": "Autohaus Beispiel GmbH",
  "sellerType": "DEALER",
  "sellerId": 1234567,
  "sellerPhones": ["+490000000000"],
  "sellerAddress": "Beispielstraße 1, DE-80331 Muenchen",
  "sellerLatitude": 48.1,
  "sellerLongitude": 11.5,
  "sellerSince": "2015-04-01",
  "rating": 4.7,
  "reviewCount": 312,
  "sellerRecommendationRate": 92,
  "description": "Sample seller description text describing the vehicle's condition and history.",
  "features": ["Navigation", "Sitzheizung", "Xenon-Scheinwerfer"],
  "dealerReviews": [{"reviewId": "4601425406", "reviewer": "Ralph", "rating": 3.3, "date": "2026-08-03", "text": "Sample review text.", "purchased": true, "friendliness": 4, "advice": 3, "responseTime": 3}]
}
```

### Send results into your apps (MCP connectors)

Optionally pick a connector in `mcpConnectors` (authorize it once under Apify Settings, Integrations). After the run, a short summary of each returned listing is sent to it, up to `maxNotifyListings` per connector. For Notion, set `notionParentPageUrl` to the parent page. The dataset is never changed by this export, and a failed export only logs a warning.

### Plan Requirement

Residential proxies are required. mobile.de sits behind an edge filter that refuses datacenter addresses outright (an "Access Denied" page), so connections always route through Apify's residential proxy group; the exit country comes from Connection settings and defaults to Germany. A paid Apify plan with residential proxy access is therefore needed. On a plan without it the run logs "The selected connection is unavailable to this run. Apify free plans do not include residential proxies." and continues on a backup connection where some pages may still be unavailable; if that backup also cannot load the pages the run ends with "No results: residential proxies are unavailable on this run (Apify free plans do not include them)...". If the proxy refuses the account the run stops with "The proxy connection was refused for this account, so no page could be read.", and if every page request fails it stops with "Could not load any results page (the requests failed)... This is a connection problem, not an empty search." You can also supply your own proxy URLs.

Billing: you pay per record returned. Detail enrichment is an extra event per listing it successfully enriches, on top of the per-record price. This applies to every listing enriched with `fetchDetails` on, and to every vehicle detail link pasted directly in URL mode, which is always read from its detail page. Dealer reviews (the **Dealer reviews per listing** input, default 0 so existing API, task and schedule callers see no change, the Console form pre-fills 20, at most 100, only with detail enrichment) add one more detail-enrichment unit per started block of 10 reviews actually returned on a row, charged after the row is saved; a row with no reviews, a skipped unchanged listing or a failed read adds nothing. Set it to 0 to turn reviews off. Check the **Pricing** tab for the current rates before a large run.

### FAQ

#### How much does it cost?

You pay per record returned, plus one detail-enrichment charge per enriched listing: each listing `fetchDetails` succeeds on, and each vehicle detail link pasted directly in URL mode, plus one detail-enrichment unit per started 10 dealer reviews delivered on a row (set **Dealer reviews per listing** to 0 to avoid it). The **Pricing** tab shows the current rates. Use **Maximum listings** to cap the cost of any run.

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

This actor collects only publicly available vehicle listing data. You are responsible for how you use it: follow mobile.de's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing facts (price, mileage, specifications) are generally data, but photos and dealer information may carry third-party rights.

#### How do Model and Location work?

Model accepts a single model (`320`, `X5`, `Golf`) or a whole series (`3er`); the actor looks up mobile.de's own model list for your make. Location accepts a postal code or a town and is looked up the same way mobile.de's search box does it, then combined with Radius. If either cannot be matched, the run stops and tells you, rather than quietly searching without it.

#### Which fields need Fetch full vehicle detail?

Price rating, colour, doors, seats, owners, HU date, transmission, category, seller type and phone numbers come with every search result. Engine and emission data, the equipment list, description, full gallery, listing dates and the seller's address, coordinates, opening hours and rating breakdown come from the detail page, so they need **Fetch full vehicle detail** (vehicle links pasted directly in URL mode are always read in full).

#### Why did my run fail instead of returning an empty dataset?

If the site refuses every request the actor tries, or if the run has no proxy access, or if `url` mode was chosen with no links, the run stops and reports why instead of finishing with zero items. A search that is simply empty (the reads worked, there were no matching cars) still finishes successfully with an empty dataset, without the "similar" cars mobile.de shows instead; only "nothing could be read" is treated as a failure. Try again, or pick a different proxy country.

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, or pull results from the dataset through the API.

### 🔗 Want more car data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🚗 <a href="https://apify.com/abotapi/cars-com-scraper"><b>Cars.com Scraper</b></a><br>Scrape cars.com listings by make, ZIP and radius. 90+ fields per car: price, MSRP...</td><td>🚗 <a href="https://apify.com/abotapi/autoscout24-scraper"><b>AutoScout24 Scraper</b></a><br>A lean, production-grade scraper for autoscout24.com. Point it at a search, get back...</td></tr>
<tr><td>🚗 <a href="https://apify.com/abotapi/autotrader"><b>AutoTrader UK Scraper</b></a><br>Pull structured vehicle listings from autotrader.co.uk at scale. Search by filters or use...</td><td>🚗 <a href="https://apify.com/abotapi/carsales-au-scraper"><b>Carsales.com.au Scraper</b></a><br>Scrape structured vehicle listings from Carsales.com.au from $1 per 1K results. Built to...</td></tr>
<tr><td>🚗 <a href="https://apify.com/abotapi/autotrader-com-scraper"><b>Autotrader US</b></a><br>Scrape US car listings from Autotrader by make, model, ZIP, price, year, body style...</td><td>🏷️ <a href="https://apify.com/abotapi/kleinanzeigen-de-scraper"><b>Kleinanzeigen.de Scraper</b></a><br>Scrape Kleinanzeigen.de ads by keyword, category, location, price, seller type, or search...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/mobile-de-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

## `mode` (type: `string`):

Choose how to find listings. Only fields belonging to the chosen mode are used.

## `vehicleClass` (type: `string`):

Vehicle category.

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

Manufacturer name as it appears on mobile.de (e.g. BMW, Audi, Mercedes-Benz, Volkswagen, Porsche). Leave empty for all makes.

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

Model or series name for the chosen Make, e.g. 320, X5, Golf, or a whole series like 3er. Requires a Make. An unknown model stops the run and lists valid names.

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

One search per entry, format Make|Model (for example BMW|3er or Audi|A4); Make alone searches the whole make. Each entry is capped at an equal share of Max listings. Search mode only.

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

Vehicle condition.

## `fuels` (type: `array`):

Multi-select. Leave empty for any fuel.

## `transmission` (type: `string`):

Gearbox type.

## `transmissions` (type: `array`):

Several gearbox types at once. Combined with the single transmission above when both are set.

## `bodyType` (type: `string`):

Body shape. Cars only.

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

Several body types at once. Combined with the single body type above when both are set.

## `country` (type: `string`):

Country where the vehicle is offered. DE covers the bulk of mobile.de inventory.

## `zipcode` (type: `string`):

Postal code or town in the chosen country (e.g. 10115 or München). Combine with Radius. A location that cannot be found stops the run with a message instead of searching the whole country.

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

Search radius around the location. Rounded up to the nearest radius the site offers (10, 20, 30, 40, 50, 60, 70, 100, 150, 200, 250, 300, 500, 1000 km). Ignored unless a location is set.

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

Lower bound for price.

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

Upper bound for price.

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

Oldest first-registration year.

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

Newest first-registration year.

## `mileageFrom` (type: `integer`):

Lower bound for mileage.

## `mileageTo` (type: `integer`):

Upper bound for mileage.

## `powerFromKw` (type: `integer`):

Lower bound for engine power in kW. 1 hp ~= 0.735 kW.

## `powerToKw` (type: `integer`):

Upper bound for engine power in kW.

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

Hide vehicles flagged as damaged.

## `onlyDamaged` (type: `boolean`):

Show ONLY vehicles flagged as damaged (overrides Exclude damaged).

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

Multi-select. Leave empty for any colour.

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

Dealers, private sellers, or company vehicles.

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

Only listings the site rates at these price levels versus the market. Leave empty for any.

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

Only listings published within this many days.

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

Only listings where VAT can be shown on the invoice (useful for businesses).

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

Minimum number of seats (2-10).

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

Number of doors.

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

Up to this many previous owners (1-4).

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

Which wheels are driven.

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

Minimum emission standard.

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

Only sellers rated at least this many stars (3-5).

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

Only listings whose description contains this text, e.g. panorama or Anhängerkupplung.

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

How results are ordered. In URL mode the order comes from the pasted link.

## `urls` (type: `array`):

Paste one or more mobile.de search or vehicle URLs. Each search URL is auto-paginated forward until Maximum Pages or Maximum Listings. Vehicle detail URLs are scraped directly. Filter fields are ignored in URL mode. Search links (search.html, with filters, sort order, a start page or another vehicle class), vehicle detail links, make/model pages such as /auto/audi-a4.html, fuel category pages such as /auto/elektro.html, body-type pages such as /auto/kombi.html and marketing landing pages such as /lp/audi-a4-angebote/, legacy /auto-inserat/ vehicle links and m.mobile.de links all work. Left untouched, URL mode scrapes the twelve example links.

## `fetchDetails` (type: `boolean`):

Pull extra fields per listing from the detail page: full description, equipment list, full image gallery, registration codes (HSN/TSN), highlights, finance plan, and full dealer profile with address, opening hours, languages, phones list. Adds ~1 fetch per listing.

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

With Fetch full vehicle detail on, also return the newest customer reviews of the listing's dealer (reviewer, rating, date, text, and friendliness, advice and response-time scores) in dealerReviews. 0 (the default when the field is omitted) turns reviews off; the Console form pre-fills 20. Private sellers have none. Each started block of 10 delivered reviews is billed as one detail-enrichment unit, on top of the detail charge for the listing.

## `includeSponsored` (type: `boolean`):

Mobile.de injects 1-3 paid sponsored placements at the top of every result page; these always appear regardless of your filter. Off by default so filtered runs only return matching listings. Turn on if you want every entry the user sees, sponsored placements included.

## `maxListings` (type: `integer`):

Stop after this many listings across the whole run. 0 means no limit. In incremental mode only listings that are returned count towards it.

## `maxPages` (type: `integer`):

Optional page cap per search. Leave at 0 to let Maximum listings decide how much to collect; the actor never walks more than 1000 pages per search, and mobile.de itself shows at most 50 pages (about 1,000 listings) per search, so for very large searches split by model, price or location.

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

Mobile.de uses a behavioural edge filter that rejects most datacenter ranges. RESIDENTIAL with the country pinned to any EU country mobile.de covers (DE, AT, NL, FR, IT, ES, BE, CH, ...) works. DE is the default since most listings are in Germany, but feel free to change.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue an interrupted collection. Listings already in that run's dataset are skipped, so they are neither returned nor charged again. Leave empty for a new collection; do not combine with recurring updates.

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

Turn this on for daily or recurring monitoring. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED listings, each marked with changeType (and changedFields for updates). Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). A listing counts as UPDATED when any returned field changes (price, mileage, description, images, features, seller details and so on) except these, which never count: rating, reviewCount, sellerRecommendationRate, sellerAdRealityRate, sellerScore, sellerActiveRatingCount, sellerRecommendPercentage, sellerVehicleAsDescribedPercentage, priceRanges, dealerReviews, modifiedAt, renewedAt and listingType; add your own in "Ignore fields when detecting changes". Excluded fields are still returned. State is kept separately for each search setup; use State key when you want to name or deliberately share a monitoring campaign.

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

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode, URLs and filter settings, so different searches never mix state with each other.

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

Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns (and bills) extra rows you already have, so leave it off unless you want the full snapshot every run.

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

Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced when a run has scanned every result of every tracked search (all pages read, nothing cut short by Maximum listings or Maximum pages, no page that failed to load). This returns (and bills) extra rows, so leave it off unless you need expiry tracking.

## `ignoreFieldsForChanges` (type: `array`):

Output field names that should NOT make a listing count as UPDATED. Always ignored: seller-level ratings (rating, reviewCount, sellerRecommendationRate, sellerAdRealityRate), which change for every listing of a dealer when one review arrives; modifiedAt and renewedAt, which move on dealer feed syncs and renewals; and listingType (the paid placement). Add fields such as description or images here if changes to them are not relevant to you. Ignored fields are still returned in the output.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "vehicleClass": "Car",
  "models": [],
  "condition": "",
  "fuels": [],
  "transmission": "",
  "bodyType": "",
  "country": "DE",
  "excludeDamaged": true,
  "onlyDamaged": false,
  "exteriorColors": [],
  "sellerType": "",
  "priceRatings": [],
  "onlineSinceDays": "",
  "vatReclaimable": false,
  "doors": "",
  "driveType": "",
  "emissionClass": "",
  "sortBy": "RELEVANCE",
  "urls": [
    "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&ms=3500&s=Car&vc=Car",
    "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&ms=3500&s=Car&vc=Car&pageNumber=2",
    "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&ft=ELECTRICITY&isSearchRequest=true&ms=3500&od=down&s=Car&sb=p&vc=Car",
    "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&s=Motorbike&vc=Motorbike",
    "https://suchen.mobile.de/fahrzeuge/details.html?id=460410691",
    "https://suchen.mobile.de/auto/audi-a4.html",
    "https://suchen.mobile.de/auto/elektro.html",
    "https://suchen.mobile.de/auto/kombi.html",
    "https://m.mobile.de/fahrzeuge/details.html?id=449181583",
    "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&s=Van&vc=VanUpTo7500",
    "https://suchen.mobile.de/auto-inserat/x/459673664.html",
    "https://www.mobile.de/lp/bmw-3er-angebote/"
  ],
  "fetchDetails": false,
  "reviewLimit": 20,
  "includeSponsored": false,
  "maxListings": 20,
  "maxPages": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

## `details` (type: `string`):

No description

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

No description

## `specs` (type: `string`):

No description

## `changes` (type: `string`):

No description

## `reviews` (type: `string`):

No description

## `summary` (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 = {
    "mode": "search",
    "models": [],
    "urls": [
        "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&ms=3500&s=Car&vc=Car",
        "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&ms=3500&s=Car&vc=Car&pageNumber=2",
        "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&ft=ELECTRICITY&isSearchRequest=true&ms=3500&od=down&s=Car&sb=p&vc=Car",
        "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&s=Motorbike&vc=Motorbike",
        "https://suchen.mobile.de/fahrzeuge/details.html?id=460410691",
        "https://suchen.mobile.de/auto/audi-a4.html",
        "https://suchen.mobile.de/auto/elektro.html",
        "https://suchen.mobile.de/auto/kombi.html",
        "https://m.mobile.de/fahrzeuge/details.html?id=449181583",
        "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&s=Van&vc=VanUpTo7500",
        "https://suchen.mobile.de/auto-inserat/x/459673664.html",
        "https://www.mobile.de/lp/bmw-3er-angebote/"
    ],
    "reviewLimit": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/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 = {
    "mode": "search",
    "models": [],
    "urls": [
        "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&ms=3500&s=Car&vc=Car",
        "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&ms=3500&s=Car&vc=Car&pageNumber=2",
        "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&ft=ELECTRICITY&isSearchRequest=true&ms=3500&od=down&s=Car&sb=p&vc=Car",
        "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&s=Motorbike&vc=Motorbike",
        "https://suchen.mobile.de/fahrzeuge/details.html?id=460410691",
        "https://suchen.mobile.de/auto/audi-a4.html",
        "https://suchen.mobile.de/auto/elektro.html",
        "https://suchen.mobile.de/auto/kombi.html",
        "https://m.mobile.de/fahrzeuge/details.html?id=449181583",
        "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&s=Van&vc=VanUpTo7500",
        "https://suchen.mobile.de/auto-inserat/x/459673664.html",
        "https://www.mobile.de/lp/bmw-3er-angebote/",
    ],
    "reviewLimit": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/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 '{
  "mode": "search",
  "models": [],
  "urls": [
    "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&ms=3500&s=Car&vc=Car",
    "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&ms=3500&s=Car&vc=Car&pageNumber=2",
    "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&ft=ELECTRICITY&isSearchRequest=true&ms=3500&od=down&s=Car&sb=p&vc=Car",
    "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&s=Motorbike&vc=Motorbike",
    "https://suchen.mobile.de/fahrzeuge/details.html?id=460410691",
    "https://suchen.mobile.de/auto/audi-a4.html",
    "https://suchen.mobile.de/auto/elektro.html",
    "https://suchen.mobile.de/auto/kombi.html",
    "https://m.mobile.de/fahrzeuge/details.html?id=449181583",
    "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&s=Van&vc=VanUpTo7500",
    "https://suchen.mobile.de/auto-inserat/x/459673664.html",
    "https://www.mobile.de/lp/bmw-3er-angebote/"
  ],
  "reviewLimit": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call abotapi/mobile-de-scraper --silent --output-dataset

```

## MCP server setup

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