# Mobile.de Scraper \[$0.21/1k] (`cocoa_kit/mobile-de-scraper`) Actor

Fastest, cheapest way to scrape Mobile.de. 600 car listings per minute, full specs, prices and images, no 2,000-result limit. From $0.21 per 1,000.

- **URL**: https://apify.com/cocoa_kit/mobile-de-scraper.md
- **Developed by:** [Cocoa Kit](https://apify.com/cocoa_kit) (community)
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.21 / 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.
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

**Mobile.de Scraper** turns any search on [Mobile.de](https://www.mobile.de), Germany's largest vehicle marketplace, into clean, structured data. Paste a search URL, or simply choose a make, a model, and a price range, and get every listing with its **price, specifications, equipment, description, and images**. Download the results as JSON, CSV, or Excel, or use them through the Apify API.

### What can Mobile.de Scraper do?

- 🔎 **Use any Mobile.de search.** Set your filters on Mobile.de, copy the URL, and paste it. All filters stay the same.
- 🎯 **Or search without a URL.** Choose make, model, price, year, mileage, power, fuel, colour, seller, and a distance from a postcode directly in the input.
- 🏍️ **Scrape every vehicle category.** Cars, motorbikes, motorhomes, vans, trucks, trailers, buses, machines, and e-bikes.
- 🚗 **Get the full listing.** Price, VAT, mileage, first registration, power, fuel, transmission, equipment, description, and all images.
- 🏪 **Know the seller.** Dealer name, address, phone, website, opening hours, and rating, plus the newest dealer reviews if you want them.
- 🏷️ **See the price rating.** Mobile.de's own rating, from "Very good price" to "High price".
- ♾️ **Go past 2,000 results.** Mobile.de shows only 2,000 results for a search. Set a higher limit and the scraper gets them all automatically.
- ⚡ **Work fast.** About 600 listings per minute. It does not need a browser.
- 📈 **Track prices.** Each listing has a stable ID and URL, so you can follow it from run to run.
- ✅ **Know what you got.** A run either collects your listings or fails with a clear reason.

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

| Data            | Examples                                                                                    |
| --------------- | ------------------------------------------------------------------------------------------- |
| 🚘 Vehicle      | Title, make, model, vehicle category, body type                                             |
| 💶 Price        | Gross price, net price and VAT rate (if shown), fixed/negotiable                            |
| 📋 Key facts    | First registration, mileage, power, fuel, transmission, HU                                  |
| 🧾 Attributes   | Every attribute on the listing: colour, doors, seats, emissions…                            |
| 🛠️ Equipment    | The full equipment list                                                                     |
| 📝 Description  | The seller's description as plain text                                                      |
| 🖼️ Images       | All image URLs in high resolution                                                           |
| 🏪 Seller       | Dealer or private seller; for dealers: name, address, phone, website, opening hours, rating |
| ⭐ Reviews      | Optional: the newest reviews of each dealer, with scores, text, and the dealer's reply      |
| 🏷️ Price rating | Mobile.de's price rating, for example "Good price"                                        |
| 🕒 Dates        | Created, modified, and renewed dates, plus the time of scraping                             |

### How to scrape Mobile.de

1. Choose how you want to search:
   - **With a search URL:** open [Mobile.de](https://suchen.mobile.de/fahrzeuge/search.html), set your filters, and copy the URL of the results page. Paste it into **Search URLs and listing URLs**. You can add several URLs, and also URLs of single listings.
   - **With filters:** leave the URL field empty and fill in **Search with filters**, for example make "BMW", model "X5", and a maximum price.
2. Set **Maximum listings for each search**.
3. Click **Start**. When the run finishes, download your data from the **Output** tab.

### How much does it cost to scrape Mobile.de?

You pay only for the listings you get. There is no monthly fee, and platform usage is included.

| Apify plan discount | Price per 1,000 listings |
| ------------------- | ------------------------ |
| No discount         | $0.55                    |
| Bronze              | $0.27                    |
| Silver              | $0.24                    |
| Gold                | $0.21                    |

So 10,000 listings cost $5.50 without a discount, or $2.70 with the Bronze discount. Each run also has a start fee of $0.00005.

See the **Pricing** tab for the current prices.

### Input

Give a search URL, or set filters. Both examples get up to 5,000 Volkswagen Golf cars from 2018 or newer, priced from €10,000 to €25,000.

**With a search URL:**

```json
{
    "searchPageURLs": [
        "https://suchen.mobile.de/fahrzeuge/search.html?isSearchRequest=true&s=Car&vc=Car&ms=25200%3B14%3B%3B&fr=2018%3A&p=10000%3A25000"
    ],
    "searchPageURLMaxItems": 5000
}
```

**With filters:**

```json
{
    "make": "Volkswagen",
    "models": ["Golf"],
    "yearMin": 2018,
    "priceMin": 10000,
    "priceMax": 25000,
    "searchPageURLMaxItems": 5000
}
```

**Diesel estate cars from dealers, 100 km around Munich, cheapest first:**

```json
{
    "fuelTypes": ["DIESEL"],
    "bodyTypes": ["EstateCar"],
    "sellerType": "DEALER",
    "postcode": "80331",
    "radiusKm": 100,
    "sortBy": "PRICE_ASC"
}
```

| Field                   | Default | What it does                                                     |
| ----------------------- | ------- | ---------------------------------------------------------------- |
| `searchPageURLs`        | –       | Mobile.de search URLs or listing URLs                            |
| `searchPageURLMaxItems` | `100`   | Maximum number of listings for each search (up to 200,000)       |
| `includeDetails`        | `true`  | Set to `false` for a faster run without description or equipment |
| `language`              | `"en"`  | Language of attribute names and equipment: `en` or `de`          |
| `includeSellerDetails`  | `true`  | Set to `false` to remove the contact data of dealers             |
| `includeReviews`        | `false` | Set to `true` to add the newest reviews of each dealer           |
| `reviewLimit`           | `5`     | Number of reviews for each dealer (up to 10)                     |

**Search with filters.** All filters are optional. Use them instead of a search URL, or in addition to search URLs.

| Field                          | What it does                                                        |
| ------------------------------ | ------------------------------------------------------------------- |
| `vehicleType`                  | `Car` (default), `Motorbike`, `Motorhome`, `VanUpTo7500`, and more  |
| `make`, `models`               | Make and models by name, for example `"BMW"` and `["X5", "3er"]`    |
| `priceMin`, `priceMax`         | Gross price in euros                                                |
| `yearMin`, `yearMax`           | Year of first registration                                          |
| `mileageMin`, `mileageMax`     | Mileage in km                                                       |
| `powerHpMin`, `powerHpMax`     | Power in hp                                                         |
| `fuelTypes`, `transmissions`   | For example `["DIESEL", "HYBRID"]` and `["AUTOMATIC_GEAR"]`         |
| `bodyTypes`, `colors`          | For example `["EstateCar", "OffRoad"]` and `["BLACK", "GREY"]`      |
| `condition`, `damagedVehicles` | New or used vehicles; include, remove, or only get damaged vehicles |
| `sellerType`                   | `ANY`, `DEALER`, or `PRIVATE`                                       |
| `postcode`, `radiusKm`         | German postcode and distance around it (default 50 km)              |
| `sortBy`                       | For example `PRICE_ASC`, `MILEAGE_ASC`, or `NEWEST`                 |

See the **Input** tab for all values.

### Output

You get one record for each listing. Here is a shortened example:

```json
{
    "id": "412345678",
    "title": "Volkswagen Golf VII 1.5 TSI Highline DSG",
    "brand": "Volkswagen",
    "model": "Golf",
    "vehicleClass": "Car",
    "category": "Saloon",
    "url": "https://suchen.mobile.de/fahrzeuge/details.html?id=412345678",
    "price": {
        "total": { "amount": 18990, "currency": "EUR", "localized": "€18,990" },
        "net": { "amount": 15957.98, "currency": "EUR", "localized": "€15,958" },
        "vatRate": 19,
        "type": "FIXED"
    },
    "createdDate": "2026-08-31T09:02:19.000Z",
    "modifiedDate": "2026-09-29T17:16:35.000Z",
    "description": "One owner, full service history.\n\nNavigation, adaptive cruise control, LED headlights, parking sensors front and rear.",
    "attributes": {
        "Vehicle condition": "Used vehicle, Accident-free",
        "Mileage": "68,500 km",
        "Power": "110 kW (150 hp)",
        "Fuel": "Petrol",
        "Transmission": "Automatic",
        "First Registration": "05/2019",
        "HU": "05/2027",
        "Colour": "Grey Metallic"
    },
    "features": ["ABS", "Adaptive cruise control", "Heated seats", "Navigation system"],
    "previewImage": "https://img.classistatic.de/api/v1/mo-prod/images/3f/3f2a9c1e-7b4d-4e8a-9c6f-1d2e3f4a5b6c?rule=mo-1600.jpg",
    "images": [
        "https://img.classistatic.de/api/v1/mo-prod/images/3f/3f2a9c1e-7b4d-4e8a-9c6f-1d2e3f4a5b6c?rule=mo-1600.jpg"
    ],
    "priceRating": { "rating": "GOOD_PRICE", "label": "Good price" },
    "seller": {
        "type": "DEALER",
        "id": "123456",
        "name": "Beispiel Autohaus GmbH",
        "address": { "street": "Musterstraße 1", "postcodeCity": "DE-40591 Düsseldorf" },
        "phones": ["+49 (0)211 1234567"],
        "website": "https://home.mobile.de/home/redirect.html?customerId=123456",
        "openingHours": [{ "day": "Mon - Fri", "time": "09:00 h - 18:00 h" }],
        "rating": { "score": 4.5, "reviewCount": 305, "recommendationRate": 85 },
        "reviews": [
            {
                "date": "2026-09-17",
                "score": 5,
                "scores": { "consulting": 5, "friendliness": 5, "responseTime": 5 },
                "recommendsDealer": true,
                "boughtVehicle": true,
                "positive": "Friendly and fast, everything as described.",
                "negative": null,
                "dealerReply": "Thank you for your feedback!"
            }
        ]
    },
    "scrapedAt": "2026-10-02T12:46:31.346Z"
}
```

A field is empty only when the seller did not give that information. For private sellers, `seller` contains only the type and the country, to protect their personal data. `reviews` is filled only when **Include dealer reviews** is on.

### FAQ

#### Do I need a Mobile.de search URL?

No. You can set make, model, price, and other filters directly in the input. If you already have a search on Mobile.de, you can also paste its URL.

#### Can I get more than 2,000 results from one search?

Yes. Mobile.de shows only 2,000 results for a search, but Mobile.de Scraper has no such limit. Set **Maximum listings** to the number you need, and the scraper gets them all.

#### How fast is Mobile.de Scraper?

Very fast. It collects about 600 listings per minute, so most searches are done in a few minutes. For large jobs, start many runs at the same time.

#### Can I track price changes?

Yes. Schedule the same search to run every day or every week. Each listing keeps the same ID, so you can see when a price goes up or down, and when a listing is removed.

#### Which vehicles are supported?

All vehicle categories on Mobile.de: cars, motorbikes, motorhomes and caravans, vans, trucks, trailers, buses, construction and agricultural machines, forklift trucks, and e-bikes.

#### Can I get dealer contact data and reviews?

Yes. Each record has the seller type, and for dealers also the name, address, phone, website, opening hours, and rating. Switch on **Include dealer reviews** to also get the newest reviews of each dealer (up to 10), with scores, text, and the dealer's reply. Reviews do not cost extra, but a run with many dealers takes longer. For private sellers, the records contain only the seller type and the country.

#### Is the data reliable?

Yes. You get the data exactly as the seller shows it on Mobile.de. If a run cannot complete, it tells you why, so you never get incomplete data without a warning.

#### Can I connect Mobile.de Scraper to my own tools?

Yes. Use the Apify API to get your data in your app, spreadsheet, or database. You can also connect it to Make, Zapier, Google Sheets, and many other services. See the **API** and **Integrations** tabs.

#### Do you give support?

Yes. If something does not work, or if you need a new feature, open an issue on the **Issues** tab. We reply to all issues in 48 hours or less.

***

Postcode locations: [GeoNames](https://www.geonames.org), [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).

# Changelog

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

# Actor input Schema

## `searchPageURLs` (type: `array`):

Make a search on Mobile.de for cars or for a different vehicle category, and paste the URL of the results page (`https://suchen.mobile.de/fahrzeuge/search.html?...`). The Actor keeps all filters of the URL. You can also paste URLs of single listings. If you leave this empty, the Actor uses the fields in "Search with filters".

## `searchPageURLMaxItems` (type: `integer`):

The Actor stops a search when it selected this number of listings. This limit applies to each search URL and to the search with filters. Mobile.de serves a maximum of 2,000 results for one search. If the limit is more than 2,000 and the search has more than 2,000 results, the Actor divides the search into price ranges automatically.

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

If you set this to false, the Actor does not request each listing. The run is faster, but the records have no description, no features, and fewer attributes.

## `includeSellerDetails` (type: `boolean`):

Name, address, telephone, website, and opening hours of dealers. For private sellers, the records contain only the seller type and the country.

## `includeReviews` (type: `boolean`):

Get the newest reviews of each dealer: date, scores, text, and the reply of the dealer. The price stays the same, but a run with many dealers takes approximately 50% longer. Only with "Include listing details".

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

Maximum number of the newest reviews for each dealer.

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

Language of the attribute names, attribute values, and features.

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

Vehicle category of the search.

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

Name of the make as Mobile.de shows it, for example "Volkswagen", "BMW", or "Mercedes-Benz". Upper case and lower case are the same. If the name is not correct, the run stops and shows similar names.

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

Names of models of the make, for example "Golf" and "Polo". You can also use the name of a model group, for example "3er". If you leave this empty, the Actor gets all models of the make. Set "Make" before you use this field.

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

Minimum gross price in euros.

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

Maximum gross price in euros.

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

Earliest year of first registration, for example 2018.

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

Latest year of first registration.

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

Minimum mileage in kilometres.

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

Maximum mileage in kilometres.

## `powerHpMin` (type: `integer`):

Minimum power in hp (PS).

## `powerHpMax` (type: `integer`):

Maximum power in hp (PS).

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

Get only vehicles with one of these fuels. If you select none, all fuels are included.

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

Get only vehicles with one of these transmissions. If you select none, all transmissions are included.

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

Get only cars with one of these body types. Use this field only when the vehicle type is "Car".

## `colors` (type: `array`):

Get only vehicles with one of these colours. If you select none, all colours are included.

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

New vehicles, used vehicles, or both.

## `damagedVehicles` (type: `string`):

Include damaged vehicles, remove them, or get only damaged vehicles.

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

Dealers, private sellers, or both.

## `postcode` (type: `string`):

German postcode with 5 digits, for example "10115". The Actor gets the vehicles in the radius around this postcode.

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

Distance from the postcode. The Actor uses this field only when you set a postcode.

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

Order of the results. When the Actor divides a search of more than 2,000 results into price ranges, the order applies in each price range.

## `automaticPaging` (type: `boolean`):

If you set this to false, the Actor reads only the first page (100 results) of each search and does not divide a search.

## `searchCategory` (type: `string`):

Vehicle class for a search URL that has no `vc` parameter and no `s` parameter.

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

Rate limit for the requests to Mobile.de.

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

Maximum number of requests that the Actor sends at the same time.

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

Number of times that the Actor tries a failed request again. The Actor waits longer before each retry.

## `maxDetailFailurePercent` (type: `integer`):

The run fails if more than this percentage of the selected listings failed after all retries. A listing that Mobile.de removed is not a failure.

## `proxyUse` (type: `string`):

Direct requests are faster and use less CPU. Mobile.de blocks an IP address for some time if it gets too many requests from it. WHEN_BLOCKED: send direct requests and use the proxy for some time (10 minutes or more) after a block. ALWAYS: send all requests through the proxy. NEVER: send direct requests only.

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

Proxy that the Actor uses in agreement with "Use of the proxy". The default is Apify Proxy with automatic selection of datacenter addresses.

## Actor input object example

```json
{
  "searchPageURLs": [
    "https://suchen.mobile.de/fahrzeuge/search.html?isSearchRequest=true&s=Car&vc=Car&ms=25200%3B14%3B%3B&fr=2018%3A&p=10000%3A25000"
  ],
  "searchPageURLMaxItems": 100,
  "includeDetails": true,
  "includeSellerDetails": true,
  "includeReviews": false,
  "reviewLimit": 5,
  "language": "en",
  "vehicleType": "Car",
  "make": "",
  "models": [],
  "fuelTypes": [],
  "transmissions": [],
  "bodyTypes": [],
  "colors": [],
  "condition": "ANY",
  "damagedVehicles": "ANY",
  "sellerType": "ANY",
  "postcode": "",
  "radiusKm": 50,
  "sortBy": "STANDARD",
  "automaticPaging": true,
  "searchCategory": "Car",
  "maxRequestsPerMinute": 600,
  "maxConcurrency": 20,
  "maxRequestRetries": 8,
  "maxDetailFailurePercent": 10,
  "proxyUse": "WHEN_BLOCKED",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One record for each listing.

## `runSummary` (type: `string`):

Result of the run and counts for each search.

# 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 = {
    "searchPageURLs": [
        "https://suchen.mobile.de/fahrzeuge/search.html?isSearchRequest=true&s=Car&vc=Car&ms=25200%3B14%3B%3B&fr=2018%3A&p=10000%3A25000"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cocoa_kit/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 = {
    "searchPageURLs": ["https://suchen.mobile.de/fahrzeuge/search.html?isSearchRequest=true&s=Car&vc=Car&ms=25200%3B14%3B%3B&fr=2018%3A&p=10000%3A25000"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cocoa_kit/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 '{
  "searchPageURLs": [
    "https://suchen.mobile.de/fahrzeuge/search.html?isSearchRequest=true&s=Car&vc=Car&ms=25200%3B14%3B%3B&fr=2018%3A&p=10000%3A25000"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cocoa_kit/mobile-de-scraper --silent --output-dataset

```

## MCP server setup

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