# mobile.de Scraper - Car Listings, Prices, Specs & Dealers (`scrapewise/mobile-de-scraper`) Actor

Scrape mobile.de car, motorbike and motorhome listings by make, model, price, year, mileage, fuel or search link: price, price rating, mileage, power, specs, equipment, description, photos and dealer details. onlyNew for daily alerts. Error rows are free.

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

## Pricing

from $1.19 / 1,000 listing delivereds

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

## mobile.de Scraper: car listings with price, price rating, specs, equipment and dealer details

mobile.de Scraper collects **vehicle listings from mobile.de**, Germany's largest car marketplace, without an account,
cookies or a browser. Search by make, model, price, first registration, mileage, fuel, gearbox, body type, country or
seller type, or paste any search link from the site. Each listing comes back as one clean row: price (gross and net
with VAT), the mobile.de price rating and its thresholds, mileage, power in kW and hp, fuel, gearbox, colour, owners,
next inspection, consumption and CO2, the full equipment list, the description, every photo and, for dealers, the
company name, address, phone, rating and opening hours.

It is used for used-car price monitoring, dealer stock tracking, import and export sourcing, residual value models,
lead lists of car dealers and daily alerts for new listings that match a search.

### At a glance

| What | Price |
|---|---|
| Listing delivered | **US$ 1.40 per 1,000 listings** (US$ 0.0014 each) |
| Run start | US$ 0.005 per run |

- 500 listings with full details = **US$ 0.705**. A daily `onlyNew` alert that finds 30 new cars = US$ 0.047 a day.
- Error rows, duplicates and listings skipped by `onlyNew` are never charged. `maxItems` is a hard cap, and a spending
  limit set on the run stops it cleanly with everything delivered so far.
- Cars, motorbikes and motorhomes, every country listed on mobile.de (Germany, Austria, Netherlands, Italy, Belgium...).

### Quick start

```json
{
  "make": "BMW",
  "model": "3 Series",
  "minPrice": 15000,
  "maxPrice": 40000,
  "minYear": 2019,
  "maxItems": 100
}
```

Electric cars from dealers, newest listings first, every day only what is new:

```json
{
  "fuelTypes": ["ELECTRICITY"],
  "sellerType": "dealer",
  "sortBy": "newest",
  "onlyNew": true,
  "maxItems": 200
}
```

Any search you set up on the site, plus single listings:

```json
{
  "startUrls": [
    "https://suchen.mobile.de/fahrzeuge/search.html?isSearchRequest=true&s=Car&vc=Car&ms=17200%3B%3B%3B&p=%3A30000&fr=2020%3A",
    "https://suchen.mobile.de/fahrzeuge/details.html?id=51103295001248"
  ]
}
```

With an empty input the Actor runs the example search (BMW 3 Series) so you can see the output right away.

### Input

| Field | What it does |
|---|---|
| `make` | Brand as mobile.de shows it: `BMW`, `Volkswagen`, `Mercedes-Benz`, `Tesla`... (`VW` and `Mercedes` work too). |
| `model` | Model or model series: `3 Series` (the whole series), `320` (one model), `Golf`, `Model 3`. Needs a make. |
| `query` | Free text matched against the listing title, for example `M Sport` or `Touring`. |
| `vehicleType` | `Car` (default), `Motorbike` or `Motorhome`. |
| `minPrice` / `maxPrice` | Gross price range in euros. |
| `minYear` / `maxYear` | First registration year range. |
| `maxMileage` | Highest mileage in km. |
| `fuelTypes` | `PETROL`, `DIESEL`, `ELECTRICITY`, `HYBRID`, `HYBRID_DIESEL`, `LPG`, `CNG`, `HYDROGENIUM`, `ETHANOL`, `OTHER`. |
| `transmission` | `AUTOMATIC_GEAR`, `MANUAL_GEAR`, `SEMIAUTOMATIC_GEAR`. |
| `bodyTypes` | `Cabrio`, `EstateCar`, `Limousine` (saloon), `SmallCar`, `SportsCar`, `OffRoad` (SUV), `Van`, `OtherCar`. |
| `countryCode` | Vehicle location: `DE`, `AT`, `NL`, `IT`... Empty = every country. |
| `sellerType` | `dealer` or `private`. Empty = both. |
| `excludeDamaged` | On by default, like the site: hides accident-damaged and not roadworthy vehicles. |
| `sortBy` | `relevance` (site default), `newest`, `price_asc`, `price_desc`, `mileage_asc`, `registration_desc`. |
| `startUrls` | mobile.de search links (every filter in the link is used) or listing links. |
| `includeDetails` | On by default: description, full equipment, technical data, dealer hours and scores. Off: about 10x faster. |
| `maxItems` | Cap for the whole run (default 50; 0 = no cap). |
| `onlyNew` | Remembers what earlier runs of the same search delivered and returns only new listings. |
| `proxyConfiguration` | Datacenter by default; the run moves to a stronger proxy group by itself if refused. |

`brand`, `priceFrom`, `priceTo`, `maxResults`, `urls`, `keyword` and `country` are accepted too, so inputs written for other
mobile.de tools keep working.

### Output

One row per listing. Fields that the seller did not fill come back as `null`.

| Field | Content |
|---|---|
| `listingId`, `url` | mobile.de listing id and link |
| `title`, `subTitle`, `make`, `model`, `makeId`, `modelId` | What is being sold |
| `vehicleType`, `category`, `condition` | Car / motorbike / motorhome, body type, used or new and accident-free status |
| `price`, `priceNet`, `currency`, `priceType`, `vatRate` | Gross and net price, fixed or negotiable, VAT rate when the dealer shows VAT |
| `priceRating`, `priceRatingLabel`, `priceRatingThresholds` | mobile.de market price rating (very good, good, fair, increased, high) and the price bands used |
| `firstRegistration`, `mileageKm`, `powerKw`, `powerHp` | Registration month, mileage and power as numbers |
| `fuel`, `transmission`, `engineCcm`, `batteryCapacityKwh` | Drive train |
| `exteriorColor`, `doors`, `seats`, `previousOwners`, `nextInspection` | Body and history (HU date) |
| `emissionClass`, `fuelConsumption`, `co2Emissions`, `co2Class`, `weightKg`, `countryVersion` | Environment and type data |
| `hasDamage`, `isAccidentDamaged`, `readyToDrive`, `isElectric`, `isPluginHybrid` | Flags |
| `hsnTsn` | German type approval codes (useful for insurance and parts lookups) |
| `usedCarSeal`, `highlights`, `financing` | Manufacturer used-car programme, dealer highlights, the financing example shown on the listing |
| `sellerType`, `country`, `postalCode`, `city` | Seller type and where the vehicle is |
| `dealer` | Dealers only: company name, street, postal code and city, phones, coordinates, rating, number of reviews, recommendation rate, homepage, languages, on mobile.de since, opening hours |
| `imageCount`, `images` | Photo links in 1024 px |
| `syndicatedFrom` | Partner site the listing came from, when mobile.de shows one |
| `createdAt`, `modifiedAt`, `renewedAt` | Listing dates (UTC) |
| `description`, `features`, `technicalData` | With `includeDetails`: the text, the equipment list and every technical attribute the site shows |
| `sourceQuery`, `scrapedAt`, `errorCode`, `error` | Where the row came from |

Private sellers: the row keeps the vehicle data, the city and postal code, but never the seller's name, phone,
street or coordinates, and phone numbers or e-mails written in the description are replaced by `[contact removed]`.

#### Example (real row, shortened)

```json
{
  "type": "listing",
  "listingId": 51136100020704,
  "url": "https://suchen.mobile.de/auto-inserat/volkswagen-id-3-gtx-performance-greven/51136100020704.html",
  "title": "Volkswagen ID.3 GTX Performance",
  "make": "Volkswagen",
  "model": "ID.3",
  "category": "Saloon",
  "condition": "Used vehicle, Accident-free",
  "price": 39970.01,
  "priceNet": 33588.24,
  "currency": "EUR",
  "priceType": "FIXED",
  "vatRate": 19.0,
  "priceRating": "GOOD_PRICE",
  "priceRatingLabel": "Good price",
  "priceRatingThresholds": ["€30,400", "€39,500", "€42,500", "€47,300", "€50,800", "€56,400"],
  "firstRegistration": "10/2025",
  "mileageKm": 4974,
  "powerKw": 240,
  "powerHp": 326,
  "fuel": "Electric",
  "transmission": "Automatic",
  "batteryCapacityKwh": 79,
  "exteriorColor": "White",
  "seats": 5,
  "previousOwners": 1,
  "fuelConsumption": "16.2 kWh/100km",
  "weightKg": 1976,
  "hsnTsn": "0603/CUN",
  "financing": {"monthlyInstallment": 423.76, "termMonths": 60, "downPayment": 7994, "loanType": "BALLOON"},
  "sellerType": "Dealer",
  "country": "DE",
  "postalCode": "48268",
  "city": "Greven",
  "dealer": {
    "dealerId": 455856,
    "name": "Knubel GmbH & Co. KG, Zweigniederlassung Greven",
    "street": "Saerbecker Str. 151",
    "postalCity": "DE-48268 Greven",
    "phones": ["+49 (0)2571 8022100"],
    "rating": 5.0,
    "ratingCount": 14,
    "recommendationRate": 100,
    "onMobileDeSince": "Nov 12, 2001"
  },
  "imageCount": 9,
  "images": ["https://img.classistatic.de/api/v1/mo-prod/images/9d/9d7828b6-e1f4-4f8b-bc1a-d4c1840ff348?rule=mo-1024.jpg"],
  "createdAt": "2026-10-16T23:46:39Z",
  "features": ["ABS", "Adaptive Cruise Control", "Android Auto", "Apple CarPlay"],
  "technicalData": {"trimLine": "Performance", "batteryCapacity": "79 kWh", "envkv.electricalRange": "546 km"}
}
```

### Errors you may see

Error rows are free and carry an `errorCode`:

| errorCode | Meaning |
|---|---|
| `INVALID_INPUT` | A field has a value the Actor does not know (for example a fuel name). The message lists the valid ones. |
| `NOT_FOUND` | The make or model does not exist on mobile.de, or a listing link was sold or removed. |
| `INVALID_URL` | A link that is not a mobile.de search or listing link. |
| `INVALID_SEARCH` | mobile.de rejected a parameter of a pasted search link. |
| `NO_RESULTS` | The search has no listing. Loosen a filter. |
| `BLOCKED` | mobile.de refused every attempt for that search. Run it again in a few minutes. |

### Integrations, scheduling and AI agents

- **Schedules:** create a schedule in Apify Console (for example every morning at 7:00) with `onlyNew` on. Each run
  returns only the listings that appeared since the previous run, so you pay only for new cars.
- **Export:** download the dataset as JSON, CSV, Excel, XML or HTML, or read it from the Apify API
  (`/datasets/{id}/items?format=csv`). The table view shows make, model, price, rating, mileage and seller.
- **Make, n8n and Zapier:** use the Apify app or the "Run Actor" node, then send each new listing to Google Sheets,
  Slack, Airtable, a CRM or an e-mail alert.
- **AI agents:** the Actor works through the Apify MCP server, so Claude, ChatGPT and other MCP clients can call it
  with plain inputs like `{"make": "Porsche", "model": "911", "maxPrice": 80000}` and reason over the rows.
- **Webhooks:** fire a webhook when a run succeeds to push the new rows into your own system.

### FAQ

**Do I need a mobile.de account or cookies?** No. The Actor reads the same public listing data the site shows to any
visitor.

**How many listings can one search return?** mobile.de shows at most 2,000 listings per search. To collect more,
split the search by price band or registration year (for example one search per 5,000 euros) in `startUrls` or in
several runs.

**What does the price rating mean?** It is mobile.de's own market comparison for that vehicle: `VERY_GOOD_PRICE`,
`GOOD_PRICE`, `REASONABLE_PRICE`, `INCREASED_PRICE`, `HIGH_PRICE` or `NO_RATING` when there are not enough similar cars.
`priceRatingThresholds` holds the price bands used for the rating.

**Why is `priceNet` empty on some listings?** Only dealers that show VAT separately (company sales, export) have a net
price. Private sellers never do.

**Is it fast?** About 100 listings per second of search without details, and 4 listings per second with
`includeDetails` (one extra request per listing).

**Does it get phone numbers?** Only the business phone numbers that dealers publish on their listings. Private
sellers' contact data is never collected.

**Which languages?** Labels come in English. The description is in the language the seller wrote it.

### Limitations

- 2,000 listings per search (a mobile.de limit, see FAQ).
- The sort `relevance` follows mobile.de's own default order, which may change.
- Commercial vehicles (trucks, vans over 3.5 t, trailers) live on a separate part of the site and are not covered.
- Listings that the seller deletes between the search page and the detail page come back without description.

### Changelog

- **16 Oct 2026** (0.1): first release. Search by make, model, price, year, mileage, fuel, gearbox, body type,
  country and seller type, or by pasted search links; listing links; full details; dealer block without personal
  data; `onlyNew` for schedules; free error rows.

# Actor input Schema

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

Brand as mobile.de shows it, for example BMW, Volkswagen, Mercedes-Benz or Tesla. Leave empty to search every make.

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

Model or model series as the site shows it, for example 3 Series, 320, Golf or Model 3. Needs a make.

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

Optional free text matched against the listing title, for example M Sport or Touring.

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

Which part of mobile.de to search.

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

Lowest gross price in euros.

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

Highest gross price in euros.

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

Oldest first registration year, for example 2019.

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

Newest first registration year.

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

Highest mileage in kilometres, for example 100000.

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

Keep only these fuel types. Empty = all.

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

Keep only these gearbox types. Empty = all.

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

Keep only these body types. Empty = all.

## `countryCode` (type: `string`):

Two-letter country code of the vehicle location, for example DE, AT, NL or IT. Empty = every country listed on mobile.de.

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

Empty = both.

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

On (like the site default): leaves out accident-damaged and not roadworthy vehicles.

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

Order of the results. onlyNew switches the site default to newest first.

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

Optional: search links copied from the address bar of mobile.de after setting filters on the site (every filter in the link is used), or listing links. They run in addition to the fields above.

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

On: opens each listing for the description, full equipment list, technical data and dealer opening hours and scores. Off: faster, the row keeps price, specs, photos and dealer name and address.

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

Hard cap for the whole run, across all searches. 0 = no cap. mobile.de shows at most 2,000 listings per search.

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

On: remembers the listings delivered in earlier runs of the same search (in your account) and delivers only listings not seen before. Skipped listings are free.

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

Apify datacenter proxy by default; if mobile.de refuses it, the run moves to a stronger proxy group on its own. Change it only if you know you need to.

## Actor input object example

```json
{
  "make": "BMW",
  "model": "3 Series",
  "vehicleType": "Car",
  "minPrice": 15000,
  "maxPrice": 40000,
  "minYear": 2019,
  "excludeDamaged": true,
  "sortBy": "relevance",
  "includeDetails": true,
  "maxItems": 50,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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",
    "model": "3 Series",
    "minPrice": 15000,
    "maxPrice": 40000,
    "minYear": 2019,
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/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",
    "model": "3 Series",
    "minPrice": 15000,
    "maxPrice": 40000,
    "minYear": 2019,
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/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",
  "model": "3 Series",
  "minPrice": 15000,
  "maxPrice": 40000,
  "minYear": 2019,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/mobile-de-scraper --silent --output-dataset

```

## MCP server setup

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