# Mobile.de Cars Scraper (`automation-lab/mobile-de-vehicle-listings-scraper`) Actor

Search Mobile.de cars and commercial vehicles. Export normalized prices, mileage, specifications, seller or dealer details, locations, images, and retrieval timestamps.

- **URL**: https://apify.com/automation-lab/mobile-de-vehicle-listings-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Mobile.de Cars Scraper

Export current **mobile.de cars** and commercial-vehicle search results as normalized JSON, CSV, Excel, or XML records.

Mobile.de Cars Scraper turns keyword filters or existing Mobile.de search URLs into structured vehicle listings with prices, mileage, specifications, seller or dealer details, location, images, and retrieval timestamps. It is designed for repeatable inventory research and data pipelines, not for downloading pages or media files.

### What does Mobile.de Cars Scraper do?

The Actor searches Mobile.de's public vehicle inventory and saves one dataset row per unique listing.

It supports:

- cars, motorbikes, motorhomes, and trucks;
- free-text make, model, and variant searches;
- gross price, registration year, mileage, fuel, and seller filters;
- existing Mobile.de search-result URLs;
- pagination up to the requested `maxItems` limit;
- normalized EUR prices and numeric vehicle specifications;
- public dealer names, phone numbers, locations, and ratings when available;
- listing and image URLs without downloading the images;
- UTC retrieval timestamps for scheduled inventory comparisons.

The default dataset works directly with Apify exports, API clients, webhooks, schedules, Google Sheets, Make, Zapier, and other downstream tools.

### Who is it for?

#### Automotive market analysts

Compare advertised prices, mileage, registration year, fuel type, and location across a consistent result set.

#### Dealers and inventory teams

Schedule the same search regularly, store records by `listingId`, and identify additions, removals, or changed asking prices in your own database.

#### Vehicle buyers and sourcing teams

Build shortlists for specific makes, models, price ranges, and seller types, then group results by the reported seller location.

#### Data engineers

Feed normalized vehicle records into a warehouse, spreadsheet, dashboard, or lead-routing workflow without maintaining Mobile.de parsing code.

#### Researchers

Capture timestamped snapshots of public marketplace inventory for bounded, responsible analysis.

### Why use this Actor?

- **Structured route:** reads Mobile.de's public consumer search JSON instead of rendering and parsing every visible result page.
- **Lower overhead:** no browser or automatic paid proxy mode is used for normal runs.
- **Normalized values:** prices, mileage, power, displacement, emissions, location, and seller fields have stable names.
- **Search URL support:** reuse a search you prepared on Mobile.de.
- **Filter parity:** structured Actor filters are also applied to supplied search URLs.
- **Deduplication:** duplicate listing IDs across searches are saved once per run.
- **Clear failures:** an access challenge or invalid upstream response fails the run rather than returning a misleading empty success.
- **Monitoring-ready timestamps:** every row includes `retrievedAt` and the normalized `searchUrl`.

### What data can you extract?

| Field | Meaning |
| --- | --- |
| `listingId` | Stable Mobile.de listing ID |
| `url` | Public vehicle-detail URL |
| `title` | Advertised vehicle title |
| `make`, `model` | Manufacturer and model |
| `category`, `vehicleType`, `bodyType` | Inventory and body classifications |
| `price`, `currency`, `netPrice`, `vat` | Advertised price information |
| `firstRegistration`, `modelYear` | Vehicle age information |
| `mileageKm` | Numeric mileage in kilometers |
| `powerKw`, `powerHp` | Advertised power |
| `fuelType`, `transmission` | Drivetrain attributes |
| `engineDisplacementCc` | Engine displacement |
| `exteriorColor` | Advertised color |
| `emissionClass`, `co2EmissionsGKm`, `consumption` | Available emissions and consumption data |
| `country`, `postalCode`, `city` | Seller location |
| `sellerType`, `sellerName`, `sellerPhone` | Public seller details |
| `sellerRating`, `sellerRatingCount` | Available seller rating information |
| `imageUrl`, `imageUrls` | Public thumbnail URLs |
| `priceRating` | Mobile.de price assessment when available |
| `listingType` | Search-result placement type |
| `searchUrl` | Search that produced the record |
| `retrievedAt` | UTC retrieval timestamp |

Fields can be `null` when a seller does not provide the corresponding value. `imageUrls` is an empty array when images are disabled or unavailable.

### How to scrape Mobile.de cars in 4 steps

1. Open the Actor and click **Try for free**.
2. Enter a keyword such as `BMW`, or paste one or more Mobile.de search URLs.
3. Add filters and set **Maximum listings** to the volume you need.
4. Start the run, then open **Vehicle listings** to download or integrate the dataset.

A small starting input:

```json
{
  "query": "BMW",
  "vehicleType": "Car",
  "priceTo": 30000,
  "maxItems": 10
}
```

### Input parameters

| Input | Type | Default | Description |
| --- | --- | --- | --- |
| `startUrls` | array | empty | Mobile.de search-result URLs to process |
| `query` | string | empty | Make, model, variant, or other free-text search |
| `vehicleType` | string | `Car` | `Car`, `Motorbike`, `Motorhome`, or `Truck` |
| `priceFrom` | integer | empty | Minimum gross price in EUR |
| `priceTo` | integer | empty | Maximum gross price in EUR |
| `yearFrom` | integer | empty | Oldest first-registration year |
| `yearTo` | integer | empty | Newest first-registration year |
| `mileageTo` | integer | empty | Maximum mileage in kilometers |
| `fuelType` | string | empty | Mobile.de code such as `PETROL`, `DIESEL`, or `ELECTRICITY` |
| `sellerType` | string | empty | `DEALER` or `PRIVATE` |
| `includeImages` | boolean | `true` | Include image URLs without downloading files |
| `maxItems` | integer | `100` | Stop after 1–1,300 unique listings |

If `startUrls` is empty, the Actor builds one search from the structured fields. If URLs are supplied, each URL is processed and any structured fields you set override or add to that URL's query.

### Use an existing Mobile.de search URL

You can configure a search on Mobile.de and pass its result URL:

```json
{
  "startUrls": [
    {
      "url": "https://suchen.mobile.de/fahrzeuge/search.html?vc=Car&q=Volkswagen+Golf&p=:20000"
    }
  ],
  "maxItems": 50
}
```

Only public `mobile.de` hostnames are accepted. Vehicle detail URLs are not search inputs; use a search-result URL or structured filters.

### Output example

The following abbreviated record reflects the current output shape. Values vary by seller and listing.

```json
{
  "listingId": "453354856",
  "url": "https://suchen.mobile.de/fahrzeuge/details.html?id=453354856",
  "title": "BMW i3 ALUFELGEN KLIMA NAVIGATION MFL AUTO",
  "make": "BMW",
  "model": "i3",
  "category": "Kleinwagen",
  "vehicleType": "Car",
  "price": 12900,
  "currency": "EUR",
  "firstRegistration": "08/2016",
  "mileageKm": 101900,
  "powerKw": 125,
  "powerHp": 170,
  "fuelType": "Elektro",
  "transmission": "Automatik",
  "country": "DE",
  "postalCode": "44579",
  "city": "Castrop-Rauxel",
  "sellerType": "DEALER",
  "sellerName": "Example Autohaus GmbH",
  "sellerRating": 5,
  "imageUrl": "https://img.classistatic.de/api/v1/mo-prod/images/example?rule=mo-160w",
  "searchUrl": "https://suchen.mobile.de/fahrzeuge/search.html?vc=Car&q=BMW&p=:30000",
  "retrievedAt": "2026-08-08T12:00:00.000Z"
}
```

### How much does it cost to extract Mobile.de vehicle listings?

The Actor uses pay-per-event pricing:

- one `start` event when a run begins;
- one `item` event for each unique listing saved.

Under the current BRONZE tier, the start fee is **$0.0005** and each listing is **$0.00088**.

| Saved listings | Example BRONZE charge |
| ---: | ---: |
| 10 | 0.0005 + (10 × 0.00088) = 0.0093 USD |
| 100 | 0.0005 + (100 × 0.00088) = 0.0885 USD |
| 1,000 | 0.0005 + (1,000 × 0.00088) = 0.8805 USD |

The Apify Console shows the active tier and maximum run charge before execution. Failed or duplicate records are not charged as items. Apify platform usage is handled according to the pricing displayed for your account.

### Monitor vehicle inventory and prices

The Actor outputs snapshots; it does not maintain hidden cross-run state or claim that a listing changed.

A reliable monitoring workflow is:

1. Save a stable search input as an Apify Task.
2. Schedule it hourly, daily, or weekly.
3. Send each completed dataset to your database or webhook.
4. Match records by `listingId`.
5. Compare `price`, `mileageKm`, seller fields, and presence between retrieval timestamps.
6. Trigger your own alert only after applying your business rules.

This keeps change history transparent and under your control.

### Export to spreadsheets and data pipelines

From the dataset page, export results as JSON, CSV, Excel, XML, RSS, or JSONL.

Common workflows include:

- scheduled CSV exports to a shared reporting folder;
- Google Sheets updates for sourcing teams;
- webhooks that load completed datasets into BigQuery or Snowflake;
- Make or Zapier scenarios that route listings by price and location;
- Python or JavaScript jobs that compare daily snapshots;
- BI dashboards grouped by make, fuel type, seller, or city.

For large recurring workflows, consume the dataset API instead of copying data manually.

### Run with the Apify API using cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~mobile-de-vehicle-listings-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "Mercedes",
    "sellerType": "DEALER",
    "priceTo": 50000,
    "maxItems": 20
  }'
```

To wait for completion and receive dataset items directly, use the synchronous dataset-items endpoint documented by Apify.

### Run with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/mobile-de-vehicle-listings-scraper').call({
    query: 'BMW',
    vehicleType: 'Car',
    priceTo: 30000,
    maxItems: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation-lab/mobile-de-vehicle-listings-scraper").call(
    run_input={
        "query": "BMW",
        "vehicleType": "Car",
        "priceTo": 30000,
        "maxItems": 100,
    }
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use Mobile.de Cars Scraper with MCP

#### Claude Code MCP setup

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/mobile-de-vehicle-listings-scraper"
```

#### Claude Desktop, Cursor, and VS Code MCP setup

Use this equivalent HTTP MCP configuration in Claude Desktop, Cursor, or VS Code:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/mobile-de-vehicle-listings-scraper"
    }
  }
}
```

#### Example prompts for MCP

After connecting the MCP server, try:

- “Use the Mobile.de Cars Scraper MCP tool to find up to 30 BMW cars below €25,000 and summarize median price and mileage.”
- “Export dealer-listed Mercedes vehicles under €50,000 and group them by seller city.”
- “Run my saved Volkswagen Golf search and group the results by registration year.”

Always inspect the proposed Actor input before approving a large MCP run.

### Tips for reliable results

- Start with 10–50 items while checking whether the source filters match your intent.
- Use a specific make or model instead of a broad keyword when precision matters.
- Keep the exact input stable across scheduled monitoring runs.
- Compare by `listingId`, not title, because titles can change.
- Treat price as an advertised asking price, not a completed sale price.
- Keep `includeImages` disabled if your pipeline does not need image URLs.
- Use the output `city` and `postalCode` fields for downstream location grouping.
- Inspect nullable fields before calculations.

### Limits and failure behavior

- A run supports at most 1,300 unique listings and 50 source pages.
- Mobile.de may reorder promoted or sponsored results between requests.
- Search-result records do not include every field from the full detail page, such as complete descriptions or all equipment options.
- Some sellers omit net price, VAT, phone, emissions, rating, or other fields.
- Image URLs point to Mobile.de's image CDN and can expire or change.
- The Actor does not download images, contact sellers, solve CAPTCHAs, log in, or access private data.
- The Actor has no automatic residential proxy mode, so there is no hidden proxy-transfer charge path.
- If Mobile.de returns an access challenge or malformed response, the run fails with a diagnostic error instead of silently producing zero records.
- Naturally empty searches succeed with an empty dataset.

### Troubleshooting

#### Why did I get no listings?

Open the normalized `searchUrl` from a regular browser and confirm the filters produce public inventory. Then remove one restrictive filter at a time. An empty valid search is different from an upstream failure; failures appear in the run log and run status.

#### Why was my URL rejected?

`startUrls` accepts only public Mobile.de URLs. Use a search-result URL rather than a listing detail URL or a third-party redirect.

#### Why is a field null?

Mobile.de and its sellers do not provide every attribute on every search card. Build integrations to accept nullable fields, as declared in the dataset schema.

#### Why did the run fail after retries?

Check the log for an HTTP status, access challenge, timeout, or response-shape message. Retry later only for a temporary source incident. Repeating an invalid input will not help.

### Responsible use and legality

This Actor extracts public marketplace information. You are responsible for ensuring that your use complies with Mobile.de's terms, applicable laws, database rights, privacy requirements, and contractual obligations.

Use reasonable run frequencies and volumes. Do not use public seller contact data for spam, harassment, unlawful profiling, or unsolicited high-volume outreach. Avoid republishing copyrighted descriptions or images without permission. Honor deletion and correction obligations in systems where you retain personal or business contact data.

This documentation is practical guidance, not legal advice.

### Related Automation Lab Actors

- [CarGurus Vehicle Listings Scraper](https://apify.com/automation-lab/cargurus-vehicle-listings-scraper) for CarGurus inventory.
- [Cars.com Vehicle Listings Scraper](https://apify.com/automation-lab/cars-com-vehicle-listings-scraper) for United States vehicle listings.
- [Coches.net Vehicle Listings Scraper](https://apify.com/automation-lab/coches-net-vehicle-listings-scraper) for Spanish vehicle inventory.

Use separate Actors for each marketplace instead of treating listings from different sources as interchangeable.

### FAQ

#### Does this Actor monitor changes automatically?

It produces timestamped snapshots. Create a Task and schedule it, then compare listing IDs and values in your database or automation platform.

#### Can it scrape one listing detail URL?

No. This product is optimized for vehicle search and inventory export. It returns detail URLs, but does not promise full detail-page descriptions or equipment lists.

#### Does it use a browser or residential proxy?

No. Normal runs use Mobile.de's public consumer search JSON over direct HTTP, which keeps runtime and transfer low.

#### Are prices sale prices?

No. They are advertised asking prices at retrieval time.

#### Can I search outside Germany?

The source may contain cross-border sellers. This Actor reports seller country, city, and postal code when Mobile.de provides them, but it does not expose a country filter.

#### How fresh are the records?

Each row reflects the source response at `retrievedAt`. The Actor does not guarantee that a seller has not changed or removed a listing immediately afterward.

#### Can I export more than 1,300 listings?

Not in one run. Split the market into meaningful searches, such as make, model, price, year, fuel, or location ranges, while keeping request volume responsible.

#### Is a proxy setting required?

No. There is no proxy input and no automatic paid fallback. If the public consumer endpoint is unavailable, the run reports an error.

# Actor input Schema

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

Optional Mobile.de search-result URLs. Structured filters below are applied to every URL. Leave empty to build one search from the filters.

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

Free-text vehicle search, such as a make, model, or variant.

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

Mobile.de inventory segment to search.

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

Minimum advertised gross price in euros.

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

Maximum advertised gross price in euros.

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

Oldest first-registration year to include.

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

Newest first-registration year to include.

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

Maximum advertised mileage in kilometers.

## `fuelType` (type: `string`):

Optional Mobile.de fuel filter code, for example PETROL, DIESEL, or ELECTRICITY.

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

Limit results to dealer or private listings.

## `includeImages` (type: `boolean`):

Include available listing thumbnail URLs without downloading image files.

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

Stop after saving this many unique vehicle listings.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://suchen.mobile.de/fahrzeuge/search.html?vc=Car&q=Volkswagen+Golf&p=:20000"
    }
  ],
  "query": "BMW",
  "vehicleType": "Car",
  "includeImages": true,
  "maxItems": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing normalized vehicle, price, seller, location, and retrieval data.

# 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 = {
    "startUrls": [
        {
            "url": "https://suchen.mobile.de/fahrzeuge/search.html?vc=Car&q=Volkswagen+Golf&p=:20000"
        }
    ],
    "query": "BMW",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/mobile-de-vehicle-listings-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 = {
    "startUrls": [{ "url": "https://suchen.mobile.de/fahrzeuge/search.html?vc=Car&q=Volkswagen+Golf&p=:20000" }],
    "query": "BMW",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/mobile-de-vehicle-listings-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 '{
  "startUrls": [
    {
      "url": "https://suchen.mobile.de/fahrzeuge/search.html?vc=Car&q=Volkswagen+Golf&p=:20000"
    }
  ],
  "query": "BMW",
  "maxItems": 10
}' |
apify call automation-lab/mobile-de-vehicle-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/mobile-de-vehicle-listings-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/21lGdiqJm361aKoKV/builds/i6hcBB17ejBNW03gi/openapi.json
