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

Scrape mobile.de car listings: price, price rating, mileage, year, power, fuel, dealer name & phone, images, equipment. Filters, PLZ radius, URLs. No browser, fast.

- **URL**: https://apify.com/ninhothedev/mobile-de-scraper.md
- **Developed by:** [ninhothedev](https://apify.com/ninhothedev) (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 $0.70 / 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

## mobile.de Scraper – Car Listings, Prices, Dealers & Specs

Scrape **mobile.de**, a German vehicle marketplace, into clean JSON, CSV or Excel. Get **price, mobile.de price rating (good / fair price), mileage, first registration, power (kW/PS), fuel, transmission, body type, dealer name, address, phone, WhatsApp and dealer rating, all photos**, and optionally the **full equipment list, description, previous owners, HU/TÜV date, CO2 & consumption and HSN/TSN** for every ad. Filter by make/model, price, year, mileage, power, fuel, gearbox, body type, condition, seller type and **postal code (PLZ) + radius** — or just paste any mobile.de search URL.

The Actor uses HTTP requests without a browser and can split large searches into price ranges to work around the source's 2,000-result pagination window. Coverage and runtime depend on the filters, available listings and source restrictions; a complete market census is not guaranteed.

### What data can you extract?

| Field | Example |
|---|---|
| `title`, `make`, `model`, `variant` | Mercedes-Benz C 300, 2.0 CDI (206.206) Metallic |
| `price`, `currency`, `price_type`, `price_net`, `vat_info` | 11990, EUR, FIXED |
| `price_rating`, `price_rating_label`, `price_rating_thresholds` | GOOD_PRICE, Good price, \[16200, 21100, …] |
| `first_registration`, `first_registration_year` | 12/2021, 2021 |
| `mileage_km`, `power_kw`, `power_ps`, `engine_cc` | 192262, 195, 265, 1993 |
| `fuel`, `transmission`, `body_type`, `condition` | Diesel, Automatic, Estate car, used |
| `color`, `doors`, `seats`, `emission_class`, `previous_owners`, `hu_until` | Grey, 4/5, 5, Euro6d, 1, 04/2028 |
| `has_damage`, `accident_vehicle`, `co2_g_km`, `consumption`, `hsn`, `tsn` | false, false, 105, 4.0 l/100km, 0603, CNN |
| `seller_type`, `dealer_name`, `dealer_address`, `dealer_phone`, `whatsapp` | dealer, P\&P Automobile GmbH, Gewerbering 14c, DE-14656 Brieselang |
| `dealer_rating`, `dealer_rating_count` | 4.8, 267 |
| `location_zip`, `location_city`, `country`, `latitude`, `longitude` | 14656, Brieselang, DE |
| `images`, `thumbnail`, `image_count` | full-size photo URLs (1024 px) |
| `created_at`, `modified_at`, `scraped_at` | ISO timestamps |
| **With "Include full details":** `features`, `description`, `model_range`, `trim_line`, `interior`, `climatisation`, `park_assists`, `airbags`, `manufacturer_color`, `cylinders`, `energy_consumption`, `ai_summary`, `dealer_since`, `dealer_homepage`, `attributes` | 32 equipment items, seller description … |

### How to use

1. Enter a **make** and **model** (e.g. `BMW` + `3er`, `VW` + `Golf`, `Tesla` + `Model 3`) and any filters — or paste mobile.de **search URLs / ad URLs** into *Start URLs*.
2. Set **Max results** and, if needed, enable **Include full details**.
3. Click **Start** and download the data as JSON, CSV, Excel or via API.

```json
{
  "make": "Mercedes-Benz",
  "model": "C-Klasse",
  "yearMin": 2020,
  "priceMax": 40000,
  "fuel": ["DIESEL", "HYBRID"],
  "sellerType": "dealer",
  "zip": "10115",
  "radiusKm": 100,
  "sortBy": "newest",
  "includeDetails": true,
  "maxItems": 500
}
```

Tips:

- Model series work in German or English: `3er` / `3 Series`, `A-Klasse` / `A-Class`, `Golf`, `X-Reihe`.
- *Start URLs* accept any `suchen.mobile.de` search URL (all filters kept, incl. page number) and ad URLs (`…/auto-inserat/…/123456789.html` or `details.html?id=…`). When Start URLs are given, the filter fields are ignored.
- Sort by **Newest first** and schedule the actor to monitor fresh listings.
- Also works for motorbikes, motorhomes, vans and trucks (*Vehicle type*).

### Output example

Real output from a test run (lists shortened):

```json
{
  "id": "50913054417504",
  "url": "https://suchen.mobile.de/auto-inserat/mercedes-benz-c-300-2-0-cdi-206-206-metallic-brieselang/50913054417504.html",
  "title": "Mercedes-Benz C 300 2.0 CDI (206.206) Metallic",
  "make": "Mercedes-Benz",
  "model": "C 300",
  "variant": "2.0 CDI (206.206) Metallic",
  "price": 11990,
  "currency": "EUR",
  "price_rating": "NO_RATING",
  "price_rating_label": "No rating",
  "first_registration": "12/2021",
  "first_registration_year": 2021,
  "mileage_km": 192262,
  "fuel": "Diesel",
  "transmission": "Automatic",
  "power_kw": 195,
  "power_ps": 265,
  "body_type": "Estate car",
  "condition": "used",
  "color": "Grey",
  "seller_type": "dealer",
  "dealer_name": "P&P Automobile GmbH",
  "dealer_address": "Gewerbering 14c, DE-14656 Brieselang",
  "dealer_phone": "+49 (0)33208 235010",
  "dealer_rating": 4.8,
  "dealer_rating_count": 267,
  "location_zip": "14656",
  "location_city": "Brieselang",
  "country": "DE",
  "image_count": 11,
  "images": [
    "https://img.classistatic.de/api/v1/mo-prod/images/e4/e4d97cda-097f-43de-9c88-b65c3deeed2f?rule=mo-1024.jpg",
    "https://img.classistatic.de/api/v1/mo-prod/images/e6/e65cc7a0-06c2-4163-afc8-b664af57d142?rule=mo-1024.jpg"
  ],
  "created_at": "2026-10-15T17:31:30Z",
  "details_scraped": true,
  "features_count": 32,
  "features": [
    "ABS",
    "Alloy wheels",
    "Ambient lighting",
    "Android Auto",
    "Apple CarPlay",
    "Autom. dimming interior mirror",
    "Bluetooth",
    "Cruise control"
  ],
  "description": "Sonderausstattung\n Komfort-Paket Advanced Sitz-Komfort-Paket Sitzheizung vorn Lendenwirbelstützen vorn, elektr. verstellbar Spiegel-Paket Außenspiegel elektr. a...",
  "scraped_at": "2026-10-15T21:15:05.887020Z"
}
```

### Pricing

Pay per result – no subscription, no proxy costs:

- **$0.70 per 1,000 vehicles** (search results incl. dealer contact, price rating and all photos)
- **+ $0.50 per 1,000** for *Include full details* (equipment, description, owners, CO2…)

Example: 1,000 BMW listings cost **$0.70** in result charges; with full details, **$1.20**. A small Actor-start event also applies ($0.00005 per GB, minimum one event); the live Pricing tab is authoritative. Ad URLs always include details and are charged as one result. Set a result limit and a maximum charge in Apify Console.

### Use cases

- **Car dealers:** price your stock against the market and track competitors' inventory.
- **Exporters & traders:** find under-priced cars ("very good price") across Germany and Europe.
- **Price analytics & valuation:** build depreciation curves by model, year and mileage; use mobile.de's price-rating thresholds as market bands.
- **Lead generation:** collect dealer names, addresses, phone numbers and ratings by region (PLZ + radius).
- **Market research:** supply, fuel-type mix (EV/hybrid share), regional availability.
- **Alerts:** schedule "newest first" searches and push new matches to Slack, e-mail or your CRM.

### Integrations

Use the data anywhere via the Apify API, webhooks, **Make, Zapier, n8n, Google Sheets**, Airbyte or Keboola.

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("ninhothedev/mobile-de-scraper").call(run_input={"make": "BMW", "model": "3er", "maxItems": 100})
for car in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(car["title"], car["price"], car["mileage_km"])
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('ninhothedev/mobile-de-scraper').call({ make: 'VW', model: 'Golf', maxItems: 100 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

### FAQ

**Is it legal to scrape mobile.de?** The actor only collects publicly visible listing data. You are responsible for using it in line with GDPR, mobile.de's terms and your local law – especially for personal data of private sellers.

**How many results can I get?** mobile.de shows max. 2,000 results per search; the actor automatically splits bigger searches into price ranges, to improve coverage. Very dense price ranges, changing listings or source restrictions can still prevent complete coverage. Review `RUN_SUMMARY` and use narrower filters when needed.

**Do I need proxies?** No. The actor connects directly and automatically falls back to Apify datacenter and German residential proxies if mobile.de ever blocks.

**Why is `price_rating` "NO_RATING"?** mobile.de only rates prices when enough comparable vehicles exist.

**Can I run it on a schedule?** Yes – use Apify Schedules (e.g. hourly "newest first") and dedupe by `id`.

**Something missing or broken?** Open an issue on the actor page – we usually respond within a day.

### Related actors

- [AutoScout24 Scraper](https://apify.com/ninhothedev/autoscout24-scraper) – Europe-wide car listings
- [Kleinanzeigen Scraper](https://apify.com/ninhothedev/kleinanzeigen-scraper) – German classifieds incl. cars
- [eBay Scraper](https://apify.com/ninhothedev/ebay-scraper) – listings, prices & auctions

# Actor input Schema

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

Vehicle make, e.g. BMW, Volkswagen (VW), Mercedes-Benz, Audi, Tesla. Leave empty to search all makes (or when using Start URLs).

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

Model name as on mobile.de: a series like '3er' / '3 Series', 'Golf', 'A-Klasse', or an exact model like '320', 'Model 3'. Unknown names are used as a free-text model filter.

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

Optional free-text filter on the model description, e.g. 'M Sport', 'Touring', 'GTI'.

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

Vehicle category to search.

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

Minimum price in EUR.

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

Maximum price in EUR.

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

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

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

Latest year of first registration.

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

Minimum mileage in km.

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

Maximum mileage in km.

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

Minimum engine power in PS (hp).

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

Maximum engine power in PS (hp).

## `fuel` (type: `array`):

One or more fuel types (empty = all).

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

Gearbox type(s) (empty = all).

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

Body type(s) for cars (empty = all).

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

New or used vehicles.

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

Only dealers or only private sellers.

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

Hide vehicles listed as damaged.

## `zip` (type: `string`):

Search around this postal code, e.g. 80331 (Munich). Combine with radius.

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

Search radius around the postal code in km.

## `zipCountry` (type: `string`):

ISO country of the postal code (DE, AT, NL, BE, FR, IT, ...).

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

Only vehicles located in this country (ISO code, e.g. DE). Empty = all countries listed on mobile.de.

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

Paste mobile.de search result URLs (all filters are kept) and/or ad URLs (…/auto-inserat/…/123456789.html or details.html?id=…). Ad URLs always return full details. When Start URLs are given, the filter fields above are ignored.

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

Result order. 'Newest' is ideal for monitoring new listings.

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

Maximum number of vehicles to return (0 = unlimited). Searches with more than 2,000 hits are split automatically by price to go beyond mobile.de's 2,000-result limit.

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

Fetch each ad's detail page: full equipment list, description, previous owners, consumption/CO2, interior, dealer rating details, AI summary. Charged as an extra event.

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

Language of text values (fuel, transmission, body type, features).

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

Parallel detail requests.

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

Optional. By default the actor connects directly and automatically falls back to Apify datacenter, then German residential proxies if mobile.de blocks.

## Actor input object example

```json
{
  "make": "BMW",
  "model": "3er",
  "vehicleType": "Car",
  "condition": "any",
  "sellerType": "any",
  "excludeDamaged": false,
  "radiusKm": 50,
  "zipCountry": "DE",
  "sortBy": "newest",
  "maxItems": 20,
  "includeDetails": false,
  "language": "en",
  "maxConcurrency": 6
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

## `dealers` (type: `string`):

No description

## `details` (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 = {
    "make": "BMW",
    "model": "3er",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("ninhothedev/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": "3er",
    "maxItems": 20,
}

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

```

## MCP server setup

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