# mobile.de Listings Scraper (`xtracto/mobilede-listings`) Actor

Scrape used-car and vehicle listings from mobile.de — Germany's largest automotive marketplace (~1.9 M active listings). Returns structured JSON with price, specs, features, contact, and images via the internal BFF JSON endpoint. No auth required.

- **URL**: https://apify.com/xtracto/mobilede-listings.md
- **Developed by:** [Farhan Febrian Nauval](https://apify.com/xtracto) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 8 total users, 3 monthly users, 98.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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

Extract car and vehicle listings from [mobile.de](https://www.mobile.de) — Germany's largest automotive marketplace with around 1.9 million active listings.

### Why use this actor

- **No account or login required** — search and collect listings without signing up.
- **Search by any keyword** — find by make, model, trim, or any free-text term (e.g. "volkswagen golf", "bmw 3 series").
- **Filter by price, mileage, and registration year** — narrow results before they hit your dataset.
- **Optional deep detail per listing** — toggle one field to also collect full equipment lists, descriptions, and finance information.
- **Stable structured JSON output** — every record has the same fields, ready to load into a spreadsheet, database, or pipeline.
- **Multiple queries in one run** — supply a list of search terms and get all results in a single dataset.

### How it works

1. You provide one or more search queries (e.g. `["volkswagen golf", "bmw 320d"]`) and optional filters such as max price or mileage.
2. The actor pages through search results and collects up to your chosen limit per query.
3. If **Fetch per-listing detail** is enabled, each listing is enriched with its full equipment list, HTML description, and finance plans.
4. Results stream into your Apify dataset as structured JSON records — no browser, no account, and no API key needed on your end.

### How it works under the hood (WAF & endpoint)

- **WAF:** mobile.de's HTML pages (`www.mobile.de`, `m.mobile.de`) are behind **Akamai Bot Manager** (server `AkamaiGHost`; `_abck`/`bm_sz` cookies; 403 "Zugriff verweigert"). The actor does **not** touch those HTML pages.
- **Data source:** the site's own **consumer BFF JSON API** at `https://www.mobile.de/consumer/api/search/srp` (search) and `.../search/vip` (detail). This BFF is **not** Akamai-walled and needs **no cookie warmup**.
- **The one gate** is an API-contract header — `x-mobile-client: de.mobile.consumer-webapp`. Without it every call returns `400 {"errors":[{"key":"400","args":["Missing or invalid client header"]}]}`.
- **TLS profile:** `curl_cffi` `chrome124`. The BFF is not JA3-sensitive (chrome124/chrome131/safari17\_0/edge101 all pass) — the header, not the fingerprint, is what unlocks it.
- **Pagination:** the SRP endpoint consumes a classic `suchen.mobile.de/fahrzeuge/search.html?...` URL (built from your filters) and returns `searchResults.{numResultsTotal, page, numPages, hasNextPage, items}`. mobile.de caps deep pagination at ~50 pages (~1300 listings) per search.
- **Proxy:** works from any residential IP (DE **not** required). Datacenter may work for small runs; residential recommended at scale.
- **Last verified:** 2026-07-10.

> **Note on API drift (fixed 2026-07-10):** the previous `www.mobile.de/api/s/` endpoint broke — it now hard-requires the `x-mobile-client` header *and* is only a capped 20-item quick-search preview with no working pagination. The actor was migrated to the paginated SRP/VIP BFF endpoints above.

### Input

```json
{
  "searchQueries": ["volkswagen golf"],
  "categoryId": "Car",
  "maxPrice": 15000,
  "minPrice": 2000,
  "maxMileage": 150000,
  "minFirstRegistrationDate": "2019-01",
  "maxFirstRegistrationDate": "2023-12",
  "sortBy": "price_asc",
  "maxListingsPerQuery": 200,
  "fetchDetail": false,
  "concurrency": 3,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

| Field | Type | Description |
|---|---|---|
| `searchQueries` | string\[] | One or more search terms. Each runs as a separate search. Example: `["volkswagen golf", "bmw 3 series"]`. |
| `categoryId` | string | Vehicle category: `Car`, `Truck`, `Motorcycle`, `Van`, `Camper`, `Trailer`, or empty for all. Default: `Car`. |
| `maxPrice` | integer | Maximum price in EUR. `0` means no limit. |
| `minPrice` | integer | Minimum price in EUR. `0` means no limit. |
| `maxMileage` | integer | Maximum odometer reading in km. `0` means no limit. |
| `minFirstRegistrationDate` | string | Earliest first registration date, `YYYY-MM` format (e.g. `2019-01`). Leave empty for no lower limit. |
| `maxFirstRegistrationDate` | string | Latest first registration date, `YYYY-MM` format (e.g. `2023-12`). Leave empty for no upper limit. |
| `sortBy` | string | Sort order: `relevance` (default), `price_asc`, `price_desc`, `mileage_asc`, `age_asc`. |
| `maxListingsPerQuery` | integer | Maximum listings to collect per search query. `0` fetches all pages. Default: `200`. |
| `fetchDetail` | boolean | Fetch full detail for each listing (equipment list, description, finance). Doubles request count. Default: `true`. |
| `concurrency` | integer | Number of parallel requests (1–10). Default: `3`. |
| `proxyConfiguration` | object | Apify proxy settings. |

### Output

Each record includes envelope fields `_input` (the search query), `_source` (`S1-search` or `S1-detail`), and `_scrapedAt` (UTC timestamp), plus the raw listing data from mobile.de.

#### Search record (fetchDetail: false)

```json
{
  "_input": "volkswagen golf",
  "_source": "S1-search",
  "_scrapedAt": "2026-07-10T12:13:20Z",
  "id": 455043408,
  "url": "https://suchen.mobile.de/fahrzeuge/details.html?id=455043408&...",
  "type": "listing",
  "make": "Volkswagen",
  "model": "Golf",
  "title": "Volkswagen Golf VII Variant 1.2 TSI Trendline",
  "shortTitle": "Volkswagen Golf",
  "subTitle": "VII Variant 1.2 TSI Trendline",
  "price": { "gross": "7.950 €", "grossAmount": 7950, "grossCurrency": "EUR" },
  "attr": {
    "cn": "DE",
    "z": "51107",
    "loc": "Köln",
    "fr": "03/2016",
    "pw": "63 kW (86 PS)",
    "ft": "Benzin",
    "ml": "136.110 km",
    "cc": "1.197 cm³",
    "tr": "Schaltgetriebe",
    "ecol": "Grau",
    "door": "4/5",
    "c": "EstateCar"
  },
  "relativeUrl": "/fahrzeuge/details.html?id=455043408&...",
  "contactInfo": { "typeLocalized": "Händler", "name": "…", "location": "51107 Köln", "rating": { "score": 4.5, "count": 9 } },
  "kba": { "hsn": "0603", "tsn": "ADJ" },
  "numImages": 6
}
```

#### Detail record (fetchDetail: true)

All search fields above, merged with the VIP (`ad`) object, which adds:

```json
{
  "_source": "S1-detail",
  "attributes": [
    { "label": "Kilometerstand", "value": "136.110 km" },
    { "label": "Erstzulassung", "value": "03/2016" },
    "... 30+ more"
  ],
  "features": ["ABS", "Apple CarPlay", "Sitzheizung", "Klimaautomatik", "... 50 more"],
  "htmlDescription": "Fahrzeug aus erster Hand ...",
  "financePlan": null,
  "mediaGallery": { "…": "…" },
  "vehicleCondition": "…"
}
```

| Field | Type | Description |
|---|---|---|
| `_input` | string | The search query that produced this record. |
| `_source` | string | `S1-search` (search result only) or `S1-detail` (enriched with full detail). |
| `_scrapedAt` | string | UTC timestamp when this record was collected. |
| `id` | integer | Unique listing ID on mobile.de. |
| `url` | string | Absolute link to the listing page (built from `relativeUrl`). |
| `make` | string | Vehicle make, e.g. `"Volkswagen"`. |
| `model` | string | Vehicle model, e.g. `"Golf"`. |
| `title` / `shortTitle` / `subTitle` | string | Listing title variants. |
| `price` | object | Price with `gross` (display), `grossAmount` (integer), `grossCurrency`. |
| `attr` | object | Core attributes: location (`loc`, `z`, `cn`), first registration (`fr`, `MM/YYYY`), power (`pw`), fuel (`ft`), mileage (`ml`), engine size (`cc`), transmission (`tr`), color (`ecol`), body type (`c`). |
| `relativeUrl` | string | Listing path on `suchen.mobile.de` (raw upstream field). |
| `contactInfo` | object | Seller info: type, name, location, rating. |
| `kba` | object | German type-approval numbers (`hsn`, `tsn`). |
| `numImages` | integer | Number of photos attached to the listing. |
| `attributes` | array | Full labelled specification list (detail only). Each item has `label` / `value`. |
| `features` | array | Equipment and feature list, e.g. `["ABS", "Apple CarPlay", "Sitzheizung"]` (detail only). |
| `htmlDescription` | string | Seller's full listing description as HTML (detail only). |
| `financePlan` | object/null | Finance offer details if available (detail only). |
| `_error` | string | Present only on error records. Describes what went wrong (e.g. `search_http_400`). |

### Other actors in this collection

| Actor | What it collects |
|---|---|
| [Immobiliare Listings](https://apify.com/xtracto/immobiliare-listings) | Italian real estate listings |
| [Idealista Listings](https://apify.com/xtracto/idealista-listings) | Spanish real estate listings |
| [Leboncoin Listings](https://apify.com/xtracto/leboncoin-listings) | French classifieds |
| [Avito Listings](https://apify.com/xtracto/avito-listings) | Russian classifieds |
| [MercadoLibre Listings](https://apify.com/xtracto/mercadolibre-listings) | Latin American marketplace |
| [Eventbrite Events](https://apify.com/xtracto/eventbrite-events) | Event listings |
| [Kickstarter Projects](https://apify.com/xtracto/kickstarter-projects) | Crowdfunding projects |

# Actor input Schema

## `searchQueries` (type: `array`):

One or more free-text search queries (e.g. 'volkswagen golf', 'bmw 3 series', 'mercedes c class'). Each query is run as a separate search on mobile.de.

## `categoryId` (type: `string`):

Filter by vehicle category. 'Car' covers ~95% of listings. Leave empty for all categories.

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

Maximum listing price in EUR. Leave 0 for no limit.

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

Minimum listing price in EUR. Leave 0 for no limit.

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

Maximum odometer reading in km. Leave 0 for no limit.

## `minFirstRegistrationDate` (type: `string`):

Only include cars first registered on or after this date, e.g. '2019-01'. Leave empty for no lower limit.

## `maxFirstRegistrationDate` (type: `string`):

Only include cars first registered on or before this date, e.g. '2023-12'. Leave empty for no upper limit.

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

Sort search results.

## `maxListingsPerQuery` (type: `integer`):

Maximum number of listings to extract per search query. 0 = no limit (fetches all pages). Default 200.

## `fetchDetail` (type: `boolean`):

If true, fetch full detail for each listing to get attributes\[], features\[], images\[], and htmlDescription. Doubles the number of requests. Default true.

## `concurrency` (type: `integer`):

Max concurrent HTTP requests. Recommended: 3-5. Higher values risk rate-limiting.

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

Apify proxy settings. Datacenter proxies work well. For large-scale runs, DE residential proxies are recommended.

## Actor input object example

```json
{
  "searchQueries": [
    "volkswagen golf"
  ],
  "categoryId": "Car",
  "maxPrice": 0,
  "minPrice": 0,
  "maxMileage": 0,
  "minFirstRegistrationDate": "2019-01",
  "maxFirstRegistrationDate": "2023-12",
  "sortBy": "relevance",
  "maxListingsPerQuery": 200,
  "fetchDetail": true,
  "concurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searchQueries": [
        "volkswagen golf"
    ],
    "minFirstRegistrationDate": "2019-01",
    "maxFirstRegistrationDate": "2023-12"
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtracto/mobilede-listings").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 = {
    "searchQueries": ["volkswagen golf"],
    "minFirstRegistrationDate": "2019-01",
    "maxFirstRegistrationDate": "2023-12",
}

# Run the Actor and wait for it to finish
run = client.actor("xtracto/mobilede-listings").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 '{
  "searchQueries": [
    "volkswagen golf"
  ],
  "minFirstRegistrationDate": "2019-01",
  "maxFirstRegistrationDate": "2023-12"
}' |
apify call xtracto/mobilede-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,xtracto/mobilede-listings"
        }
    }
}

```

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/hrXCnbnfaHkmeNVaT/builds/f26ciKXOyWwVu1eKG/openapi.json
