# Mobile.de Vehicle Listings Scraper (`zapticx/mobile-de-vehicle-listings-scraper`) Actor

Scrape Mobile.de car listings by URL or filters. Get prices, mileage, specs, equipment, photos and dealer contacts as structured used car data — export to JSON, CSV, Excel or API.

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

## Pricing

from $0.50 / 1,000 vehicle listings

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 Vehicle Listings Scraper

**Extract structured used-car listings from Mobile.de** — prices, mileage, specifications, equipment, photos, seller details and listing URLs — as clean, typed data you can actually use.

Search by **pasting a Mobile.de URL** or by **filling in filters** (make, model, price, mileage, year, fuel, location). Turn on **full detail enrichment** when you need equipment lists, descriptions, photos, VAT and dealer contacts. Export to **JSON, CSV or Excel**, or pull results through the **Apify API**.

Built for car dealers, exporters, automation developers, vehicle databases and market researchers.

***

### Why use this Actor?

- 🚗 **Structured vehicle data** — `price` and `mileage` come back as numbers, not `"22.990 €"` and `"68.626 km"`
- 🎯 **Search by make and model** — resolved against Mobile.de's own live reference data, never a stale lookup table
- 🧾 **Full specifications** — power, engine, transmission, drivetrain, emissions, colours, doors, seats
- 🖼️ **Photos and equipment** — every image URL and the complete equipment list
- 🏢 **Dealer and seller details** — name, phone, address, city, rating and review count where published
- ⚡ **Fast search-only mode** — about 1 request per 20 listings when you don't need detail pages
- 🔎 **Optional detail enrichment** — one toggle switches between fast and complete
- 🛡️ **Built for Mobile.de's anti-bot** — ships with the proxy configuration it is tested against
- 🧭 **Honest nulls** — anything a listing does not publish is `null`, never `"N/A"` or `"-"`
- 📤 **JSON, CSV, Excel and API** exports
- 🔗 **Make, Zapier, n8n and Google Sheets** workflows

***

### Quick start

#### Option A — Paste a Mobile.de search URL

1. Set up your search on **mobile.de** exactly how you want it.
2. Copy the address bar and paste it into **Mobile.de URLs**.
3. Set **Maximum listings**.
4. Turn **full details** on or off.
5. Click **Start**.

Any filter Mobile.de offers works this way, and you can paste several URLs at once.

#### Option B — Use the built-in filters

1. Enter a **make** and optionally a **model**.
2. Add any of price, mileage, registration year, fuel, transmission, body type, condition, seller type or location.
3. Set **Maximum listings**.
4. Click **Start**.

Start with full details **off** and a low limit to check the results are what you expect, then switch detail mode on.

***

### Data you can extract

| Group | Fields |
|---|---|
| **Vehicle** | make, model, variant, title, price, currency, mileage, first registration, registration year, fuel type, transmission, power (kW and hp), body type, category, condition |
| **Specifications** | engine displacement, drivetrain, doors, seats, exterior and interior colour, interior material, emission class, emissions sticker, fuel consumption, CO₂, previous owners |
| **Pricing & VAT** | price type, VAT reclaimable flag, VAT rate and net price, financing and leasing availability |
| **Seller** | seller name, seller type, dealer name, phone, address, postal code, city, country, dealer rating, review count |
| **Media & text** | main image, full image gallery, image count, equipment list, seller's description |
| **Metadata** | listing ID, canonical URL, sponsored flag, detail status, scrape timestamp, source, originating search URL |

Full field-by-field documentation lives on the **Output** tab.

***

### Example input

**Paste a search URL**

```json
{
  "startUrls": [{ "url": "https://suchen.mobile.de/fahrzeuge/search.html?isSearchRequest=true&s=Car&vc=Car&ms=3500%3B48" }],
  "maxItems": 50,
  "includeDetails": false
}
```

**BMW X3 under €30,000 near Berlin**

```json
{
  "make": "BMW",
  "model": "X3",
  "maxPrice": 30000,
  "minYear": 2019,
  "fuelType": "diesel",
  "location": "10115",
  "radius": "100",
  "maxItems": 100
}
```

**Volkswagen Golf with full details**

```json
{
  "make": "Volkswagen",
  "model": "Golf",
  "maxItems": 25,
  "includeDetails": true
}
```

***

### Example output

```json
{
  "listingId": "459015449",
  "url": "https://suchen.mobile.de/auto-inserat/volkswagen-golf-viii-variant-life-2-0-tdi-.../459015449.html",
  "title": "Volkswagen Golf VIII Variant Life 2.0 TDI, DSG, Klimaautomatik",
  "make": "Volkswagen",
  "model": "Golf",
  "price": 27990,
  "currency": "EUR",
  "vatReclaimable": true,
  "vatDetails": { "vatRate": 19, "netPrice": 23521.01, "currency": "EUR" },
  "firstRegistration": "03/2024",
  "mileage": 14750,
  "fuelType": "Diesel",
  "transmission": "Automatik",
  "powerKw": 110,
  "powerHp": 150,
  "driveType": "Frontantrieb",
  "exteriorColor": "Schwarz Metallic",
  "features": ["Abstandstempomat", "Android Auto", "Apple CarPlay", "..."],
  "mainImage": "https://img.classistatic.de/api/v1/mo-prod/images/...?rule=mo-1024",
  "sellerName": "Autohaus Scholl GmbH",
  "city": "Bad Harzburg",
  "detailStatus": "complete",
  "source": "mobile.de"
}
```

Values such as `fuelType` and `transmission` stay in German, exactly as Mobile.de publishes them.

***

### What it costs

You pay for what you receive:

| Event | Price | When |
|---|---|---|
| Actor start | $0.005 per run | once per run |
| Vehicle listing | $0.0005 each | a listing collected from search results |
| Vehicle listing with full details | $0.0012 each | a listing enriched from its own page |

**Worked examples** *(figures update with the Pricing tab)*

| Job | Cost |
|---|---|
| 10 listings, search only | $0.005 + (10 × $0.0005) = **$0.010** |
| 100 listings, search only | $0.005 + (100 × $0.0005) = **$0.055** |
| 1,000 listings, search only | $0.005 + (1,000 × $0.0005) = **$0.505** |

**If a vehicle page cannot be loaded**, the listing is still delivered with its search-result data, marked `detailStatus: "partial"`, and billed at the **`Vehicle listing` price** — never the higher rate for data you did not receive.

Failed requests, retries, blocked pages, duplicates and anything past your limit all cost nothing: a charge only ever accompanies a record written to the dataset. Apify platform usage is included.

***

### Use cases

- **Dealer inventory collection** — pull a competitor's or your own stock into a spreadsheet
- **Vehicle export sourcing** — find cars by make, model, price, mileage and location
- **Used-car databases** — populate or refresh a vehicle database
- **CRM enrichment** — attach live listing data to records you already hold
- **Dealer lead collection** — gather dealer names, phones and addresses where published
- **Scheduled pipelines** — re-run a saved search daily or weekly and diff the results yourself
- **Price and catalogue research** — collect raw listing data and analyse it however you like
- **Automotive dashboards** — feed a BI tool from the dataset or API
- **AI agents and automation** — a dependable automotive data feed behind an API

The Actor delivers **raw structured listings**. It does not score, rate or interpret them — any analysis is yours to do.

***

### Integrations

Results are available through the **Apify API** in JSON, CSV, Excel, XML or RSS, and through the official JavaScript and Python clients. Runs can be scheduled, triggered by **webhooks**, or wired into **Make**, **Zapier**, **n8n**, **Google Sheets**, **Slack** and the rest of Apify's integrations catalogue — so listings flow straight into a CRM, a database or a spreadsheet.

***

### FAQ

**Can I scrape a Mobile.de search URL?**
Yes. Paste one or more into **Mobile.de URLs**. Any filter the site offers works, and results from every URL are combined and de-duplicated.

**Can I filter by make and model?**
Yes. Both are resolved against Mobile.de's own live reference data at run time. If Mobile.de does not list the model under that make, the run continues with the make only and says so in the log — it never quietly returns unfiltered results.

**Can I collect seller details?**
Yes, where they are published. Seller type, phone, postal code and city come through in both modes; the seller's name, full address and rating need full details switched on.

**Can I scrape images?**
Yes, in full-detail mode — every image URL plus a `mainImage`. Search-only mode reports `imageCount` but no URLs, because Mobile.de only sends thumbnails for the first few cards on a results page.

**What is the difference between search-only and full details?**
Search-only collects what the results page shows (about 26 fields) using roughly one request per 20 listings. Full details opens each vehicle page and adds the equipment list, description, photos, VAT, colours, emissions and seller contact.

**How many listings can I scrape?**
Mobile.de caps a single search at roughly the first 100 pages (about 2,000 listings), however many matches it reports. To go beyond that, split the job into narrower searches — by price band, year, model or location — and run them separately.

**Can I export to CSV or Excel?**
Yes, from the Apify Console, or via the API in JSON, CSV, Excel, XML and RSS.

**Can I use the API?**
Yes. Every run and dataset is reachable through the Apify API and the official clients, so the Actor works as a vehicle listings API.

**Why can some records be partial?**
If a vehicle page cannot be loaded after its retries, the listing is still delivered with its search-result data and marked `detailStatus: "partial"`, rather than being dropped. Partials are billed at the lower search-data rate.

**Does this Actor use proxies?**
Yes. Mobile.de is protected by Akamai and refuses ordinary datacentre and residential IPs, so the Actor ships with the proxy configuration it is tested against, already filled in. Changing it usually causes blocked runs.

***

### Responsible use

Listings can include business and occasionally personal contact details. You are responsible for using what you collect lawfully: respect the GDPR and other applicable data protection law, Mobile.de's terms of use, and the rules on unsolicited marketing before contacting anyone whose details appear in a dataset. Collect only the data you need, keep it no longer than you need it, and do not re-publish personal data.

# Actor input Schema

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

Paste one or more Mobile.de URLs — search result pages or individual vehicle pages. Set the search up on mobile.de exactly how you want it, then copy the address bar. This is the most precise option: every filter Mobile.de offers works here.

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

Free text to look for in the listing description — a trim name such as "GTI" or "Avant", for example.

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

Vehicle make as Mobile.de spells it, for example "BMW", "Volkswagen" or "Mercedes-Benz".

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

Model name as Mobile.de spells it, for example "X3" or "Golf". Needs a make as well. If Mobile.de lists no such model under that make, the run continues with the make only and says so in the log.

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

Limit results to one vehicle condition.

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

Limit results to one vehicle shape.

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

Limit results to one fuel type.

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

Limit results to one gearbox type.

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

Lowest asking price to include.

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

Highest asking price to include.

## `minMileage` (type: `integer`):

Lowest odometer reading to include.

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

Highest odometer reading to include.

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

Oldest year of first registration to include.

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

Newest year of first registration to include.

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

Limit results to dealers, private sellers or company vehicles.

## `location` (type: `string`):

A German postal code or town to search around — "10115" or "München". Mobile.de's own location lookup resolves it, and the run log records which location was used. Pair it with a radius.

## `radius` (type: `string`):

How far from the location to search. Only the distances Mobile.de itself offers are available.

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

Stop once this many unique listings have been collected. Keep it low for a first test run. The form starts you at 10; omit this field in an API call and the Actor uses 100.

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

On: also opens every vehicle page to add the full equipment list, description, all photos, VAT details, colours, emissions and the seller's name, phone and address. Off: faster and cheaper, using only what the search results show. Partial records — where a vehicle page could not be loaded — are billed at the lower search-data rate. The form starts with this on; omit it in an API call and it stays off.

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

How many vehicle pages to open at once. Higher is faster but drops more detail pages to partial records; 3 returned complete data in every test run.

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

Mobile.de is protected by Akamai and refuses ordinary datacentre and residential IPs. The default below is the configuration this Actor is tested against — changing it usually causes blocked runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://suchen.mobile.de/fahrzeuge/search.html?dam=false&isSearchRequest=true&ms=3500%3B48&ref=quickSearch&s=Car&sb=rel&vc=Car"
    }
  ],
  "make": "BMW",
  "model": "X3",
  "condition": "any",
  "bodyType": "any",
  "fuelType": "any",
  "transmission": "any",
  "sellerType": "any",
  "location": "10115",
  "maxItems": 10,
  "includeDetails": true,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

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

Every scraped Mobile.de listing: identification, pricing and VAT, registration and mileage, engine and performance, specifications, equipment, description, images and seller details.

# 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?dam=false&isSearchRequest=true&ms=3500%3B48&ref=quickSearch&s=Car&sb=rel&vc=Car"
        }
    ],
    "maxItems": 10,
    "includeDetails": true,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("zapticx/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?dam=false&isSearchRequest=true&ms=3500%3B48&ref=quickSearch&s=Car&sb=rel&vc=Car" }],
    "maxItems": 10,
    "includeDetails": True,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("zapticx/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?dam=false&isSearchRequest=true&ms=3500%3B48&ref=quickSearch&s=Car&sb=rel&vc=Car"
    }
  ],
  "maxItems": 10,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call zapticx/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,zapticx/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/HGBuXkAcERNMhbIYH/builds/FIyGXqOw5cDH5kgfp/openapi.json
