Mobile.de Scraper — German Car Listings, Prices & Dealer Data
Pricing
from $5.00 / 1,000 result scrapeds
Mobile.de Scraper — German Car Listings, Prices & Dealer Data
Scrape car listings from Mobile.de, Germany's #1 car marketplace with 46M+ monthly visits. Search by keyword, make, model, price range, and more. Extract prices, mileage, specs, dealer info, and photos. No login or cookies required.
Pricing
from $5.00 / 1,000 result scrapeds
Rating
0.0
(0)
Developer
Studio Amba
Maintained by CommunityActor stats
0
Bookmarked
16
Total users
0
Monthly active users
21 hours ago
Last modified
Categories
Share
Mobile.de Scraper
Scrape car listings from Mobile.de, Germany's largest online car marketplace with over 46 million monthly visits. Extract prices, specifications, mileage, dealer information, and photos from millions of car listings. No login or cookies required.
What does Mobile.de Scraper do?
This Actor extracts structured car listing data from Mobile.de search results. Search by keyword, filter by price, year, and mileage, and get clean, structured JSON output with all the details you need for market research, price comparison, or inventory monitoring.
Mobile.de is part of the Adevinta group and hosts listings from both private sellers and professional dealers across Germany and Europe. With this scraper, you can programmatically access this data via the Apify platform with built-in proxy rotation, scheduling, and API access.
Why use Mobile.de Scraper?
- Market research — Track car prices across makes, models, and regions in Germany's largest car market
- Dealer intelligence — Monitor competitor inventory and pricing strategies
- Price comparison — Find the best deals by comparing thousands of listings automatically
- Inventory monitoring — Set up scheduled runs to track new listings matching your criteria
- Data analysis — Export to CSV, JSON, or Excel for analysis in your tools of choice
How to scrape Mobile.de data
- Go to the Input tab
- Enter a search query (e.g., "bmw 3er") or provide direct Mobile.de URLs
- Optionally set price, year, and mileage filters
- Set the maximum number of results you want
- Click Start and wait for the run to finish
- Download your data from the Output tab in JSON, CSV, or Excel format
Input
| Field | Type | Required | Description |
|---|---|---|---|
query | String | No | Make and model (e.g., "bmw", "audi a4", "vw golf", "mercedes c-klasse"). A make or model mobile.de lists is searched with its own make/model filter; other words search the listing description |
make | String | No | Make as mobile.de writes it (e.g. "BMW", "Mercedes-Benz"). Uses mobile.de's make filter |
model | String | No | Model or model group, used with make (e.g. "X5", "C-Klasse") |
startUrls | Array | No | Direct Mobile.de search or detail URLs |
minPrice | Integer | No | Minimum price filter in EUR |
maxPrice | Integer | No | Maximum price filter in EUR |
minYear | Integer | No | Minimum first registration year |
maxYear | Integer | No | Maximum first registration year |
mileageMin | Integer | No | Minimum mileage in km |
maxMileage | Integer | No | Maximum mileage in km |
sellerType | String | No | any (default), dealer, private or company. Uses mobile.de's own seller filter |
maxResults | Integer | No | Maximum listings to scrape (default: 100) |
fetchDetails | Boolean | No | Off by default. Opens every ad page and adds the ad-page fields below |
trackListings | Boolean | No | Off by default. Remembers listings between runs and adds removals and market days supply (see below) |
trackingKey | String | No | Name of the tracked segment. Empty = derived from the filters |
salesWindowDays | Integer | No | Days counted as potential sales for market days supply (default: 45) |
priceBands | Array | No | Band edges in EUR for the price breakdown in the segment summary |
proxyConfiguration | Object | No | Not used. Kept so older inputs keep working |
Output
Each car listing contains:
| Field | Type | Example |
|---|---|---|
make | String | "BMW" |
model | String | "3er" |
variant | String | "320d Touring M Sport" |
title | String | "BMW 320d Touring M Sport" |
price | Number | 32900 |
currency | String | "EUR" |
year | Number | 2021 |
mileage | Number | 45000 |
fuelType | String | "Diesel" |
transmission | String | "Automatik" |
power | String | "190 PS" |
sellerType | String | "Dealer" |
sellerName | String | "Autohaus Schmidt GmbH" |
location | String | "Munich, Bavaria" |
imageUrl | String | Main listing image URL |
imageUrls | Array | All listing image URLs |
url | String | Direct link to the listing |
listingId | String | "447812345" (the id in the ad URL) |
scrapedAt | String | "2026-04-06T12:00:00.000Z" |
Ad page fields (fetchDetails)
With fetchDetails on, every row also has: firstRegistration, sellerId, dealerName, dealerRating, dealerRatingCount, sellerAddress, vin, hsn, tsn, fuelTypeDetail, previousOwners, exteriorColor, damageCondition, category, priceNet, vatRate, equipment, description, imageCount, adCreatedAt, adModifiedAt, adRenewedAt and detailsError. transmission, sellerType (Dealer, Private or Company) and the full photo list come from the ad page too. Without the flag these fields are not in the output.
vinis only filled when the seller wrote the VIN in the description. Mobile.de has no VIN field.detailsErrorsays why an ad page could not be read (for example the ad was removed during the run). The row still has the search card data.- It opens one extra page per listing, so a run takes longer.
Example output
{"make": "BMW","model": "3er","variant": "320d Touring M Sport","title": "BMW 320d Touring M Sport","price": 32900,"currency": "EUR","year": 2021,"mileage": 45000,"fuelType": "Diesel","transmission": "Automatik","power": "190 PS","sellerType": "Dealer","sellerName": "Autohaus Schmidt GmbH","location": "Munich, Bavaria","imageUrl": "https://img.classistatic.de/api/v1/mo-prod/images/...","imageUrls": ["https://img.classistatic.de/api/v1/mo-prod/images/..."],"url": "https://suchen.mobile.de/fahrzeuge/details.html?id=123456789","listingId": "123456789","scrapedAt": "2026-04-06T12:00:00.000Z"}
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
Track listings and market days supply
Turn on trackListings and run the same search every day. The actor reads every result page of the search and remembers each listing in a key-value store called mobile-de-tracking in your own Apify account, under one key per search (trackingKey).
Every run then outputs:
- One row per active listing with
status(neworactive),firstSeenAt,lastSeenAt,previousPrice,priceChanged,listedAtanddaysListed. - One row with
status: "removed"for each listing that disappeared since the last run.removalClassisrepostedwhen a new ad for the same car showed up in the same run (same VIN, or same seller, make, model, year, fuel, gearbox and seller type with mileage within 2% or 1500 km), otherwisepotential_sold. - One row with
status: "active_outside_filter"for a listing that is still online but no longer matches your filters, for example after a price change. It is not counted as a removal. - One row with
recordType: "__SEGMENT_SUMMARY__"with the segment numbers: active listings, new listings, price changes, potential sales and reposts in the sales window, average daily sales,mdsDays, median, 25th and 75th percentile (p25Price,p75Price), average, min and max price, median days listed, and a count per price band.
Market days supply is calculated as:
mdsDays = activeListings / (potentialSalesInWindow / effectiveWindowDays)
effectiveWindowDays is salesWindowDays (45 by default), or the number of days tracked so far when that is shorter. The summary says so in notes until the window is full. mdsDays is null when there were no potential sales in the window.
listedAt is the ad's creation time. With fetchDetails on it comes from the ad page. Without it, it is read from the ad id for the 14-digit ids mobile.de gives new ads; older 9-digit ids carry no date, so listedAt is null for those.
Limitations
- Mobile.de does not say why an ad disappeared. A removed ad and an id that never existed return the same "page not found". So a removal is a potential sale, never a confirmed one. Every removal row carries
removalConfidence: "site does not say why an ad disappeared". - A listing is only marked removed when the run read every result page. The actor compares what it read with the count mobile.de shows. If
maxResultsstopped the run early, or a page could not be read, nothing is marked removed and the summary explains why inincompleteReason. SetmaxResultsabove the size of your search. - Mobile.de shows at most 2,000 listings per search (100 pages). With
trackListingson, a bigger search is split into price ranges automatically and every range is read in full. Listings without a price are not in any price range. SetmaxResultsabove the number of listings in the search. - Missing listings are checked one by one. Before a listing counts as removed, the actor opens its ad page twice. Listings move between result pages while a run reads them, so this stops a listing that was only skipped from counting as a sale.
- The first run is the baseline. Removals and sales are counted from the second run on.
- Reposts are matched within one run. A car that comes back days later under a new id counts as a new listing.
- Run one schedule per search. Two runs on the same
trackingKeyat the same time overwrite each other's state.
How to schedule it daily on Apify
- Fill in your search and turn on
trackListings. SetmaxResultsabove the number of listings mobile.de shows for that search. - Save it as a task in Apify Console.
- Open Schedules, create a schedule with a daily time (for example 06:00), and add the task.
- Read the
__SEGMENT_SUMMARY__row of each run, or the full dataset for listing-level history.
To track several segments (for example price bands or model years), make one task per segment. Each gets its own trackingKey.
How much does it cost to scrape Mobile.de?
This actor loads Mobile.de through Bright Data (Web Unlocker, with the Scraping Browser as a second route) to handle Mobile.de's Akamai bot protection. Each search page gives 20 listings. It charges $0.02 per run (start fee, based on its 4 GB memory allocation) plus $0.002 per result scraped. 100 results costs about $0.22; 1,000 results about $2.02. With trackListings on, every active, removed and summary row is a result, so a daily run on a search of 500 listings costs about $1.02. A run's usage cost only settles after it reports SUCCEEDED.
Tips for best results
- Start small — Test with
maxResults: 10before running large scrapes - Use filters — Price, year, and mileage filters reduce the number of pages to scrape
- Schedule runs — Set up daily or weekly runs to track price changes over time
- Direct URLs — If you know the exact search URL from Mobile.de, paste it in
startUrlsfor precise control
Limitations
- Mobile.de uses Akamai bot protection. The actor handles it through Bright Data, so no proxy setup is needed, but a page can take 10-60 seconds to load
- A normal search reads at most 50 result pages (1,000 listings)
- The full description, equipment and dealer details are on the ad pages and need
fetchDetails - Data is scraped from the public website and may change without notice
FAQ and support
Is it legal to scrape Mobile.de? This Actor extracts publicly available data from Mobile.de. Always respect the website's terms of service and applicable laws in your jurisdiction.
The scraper returns no results. When Mobile.de has no cars for your search, the run ends SUCCEEDED with 0 results and a status message saying so. When Mobile.de could not be loaded before the run timeout, the run fails with a message saying that; retry the run.
Can I scrape specific car makes or models? Yes. Type the make and model in query ("audi a4" returns only Audi A4 listings; "mercedes c-klasse" every C-Klasse model). The run log names the make/model filter it used. Words that are not a make or model mobile.de lists are searched in the listing description. You can also paste a filtered Mobile.de search URL in startUrls.
For bug reports or feature requests, please use the Issues tab. For custom scraping solutions, feel free to reach out.