mobile.de Scraper: Car Prices, Price Rating & New Listings avatar

mobile.de Scraper: Car Prices, Price Rating & New Listings

Pricing

from $1.20 / 1,000 listings

Go to Apify Store
mobile.de Scraper: Car Prices, Price Rating & New Listings

mobile.de Scraper: Car Prices, Price Rating & New Listings

Get mobile.de car listings for BMW, VW or Audi with price rating, mileage, registration, specs, dealer and location. Track new listings, price drops and observed price history. $0.0015 per listing, $0.0015 extra for details, $0.002 start. No login. Car listings Germany data.

Pricing

from $1.20 / 1,000 listings

Rating

0.0

(0)

Developer

mogged

mogged

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

7 days ago

Last modified

Security

Limited permissions

Share

Independent of mobile.de. For car dealers, exporters and vehicle price analysts who monitor public mobile.de inventory every day. Get asking prices, mobile.de's own price rating, mileage, registration, technical specifications, dealer reputation and location in a consistent dataset.

A basic listing costs about $0.0015, or $0.003 with full details, including the basic listing fee. Each run also has a $0.002 start charge at the default memory. Twenty basic listings cost about $0.032; twenty with full specifications and equipment cost about $0.062. Tier discounts reduce listing fees. No login, account cookies or separate data subscription is required.

What you get

Each car is a separate row, with a readable verdict and typed fields for spreadsheets, dashboards and AI workflows. One listing found through overlapping searches appears once and has one listing fee. A separate SUMMARY record reports counts, the median asking price, skipped watch records and any unavailable inputs.

Field groupIncluded data
IdentitylistingId, title, make, model, variant, url
Current priceprice, currency, priceRating, priceRatingCode, marketPriceRange
MonitoringpreviousPrice, previousCurrency, priceChange, priceChangePercent, isNewSinceLastRun, firstSeenAt, scrapedAt
Observed historypriceHistory, observationCount, firstObservedPrice, lowestObservedPrice, highestObservedPrice, totalPriceChange, priceDropCount, lastPriceChangeAt, daysObserved, daysSincePriceChange
Advertised reductionsadvertisedPreviousPrice, advertisedPriceReduction, when mobile.de shows a crossed-out price
Vehicle basicsfirstRegistration, mileageKm, fuel, powerKw, powerHp, powerHpUnit, transmission, bodyType
Vehicle conditioncolour, doors, seats, owners, accidentFree, vatDeductible
Seller and placesellerType, dealerName, dealerId, dealerRating, dealerReviewCount, city, postcode, country
Full detailsfeatures, specifications, netPrice, vatRate, plus the complete photo list where available
Business contactPublished business phone, street address, homepage and coordinates when the source supplies them
ProvenancesourceUrl, detailsIncluded and observation timestamps

Missing values are null. Accident history stays unknown without an explicit statement. Doors retain values such as 4/5; registration retains the source month/year. Prices on request remain null, rather than zero. Private seller names, phones, addresses and personal contact profiles are excluded.

Example from a real cloud run

Observed on 28 October 2026:

{
"verdict": "BMW 320 e M SPORT 18ZOLL FACELIFT SPURHALTE,LED,NAVI: €25,480, Sehr guter Preis, first seen by this watch.",
"listingId": "49248474879040",
"price": 25480,
"currency": "EUR",
"priceRating": "Sehr guter Preis",
"firstRegistration": "11/2022",
"mileageKm": 73334,
"powerKw": 150,
"dealerName": "Autohaus Royal GmbH",
"city": "Ludwigsfelde",
"postcode": "14974"
}

Start in three steps

  1. Enter a make and model, for example BMW and 320, or Volkswagen and Golf. You can instead paste search, category, dealer inventory or individual listing URLs into startUrls.
  2. Set your limits and optional location. Use a German postcode and a radius in kilometres. Leave includeDetails off for quick price monitoring; turn it on for equipment and the full specification sheet.
  3. Start the run, inspect the overview, and export JSON, CSV or Excel. Read SUMMARY when a query returns no cars or a source page is temporarily unavailable.

The prefill requests twenty BMW 320 listings near 10115 Berlin. A real cloud test on 28 October 2026 returned twenty rows in nine seconds. Normal runs use public JSON without a browser.

Input reference

InputMeaning and example
startUrlsOptional array of mobile.de search, category, listing or public dealer URLs. Use one URL string per entry. At most 100 URLs.
makeManufacturer, such as BMW, Volkswagen, Audi, Mercedes-Benz or Toyota. Used when no URLs are supplied.
modelModel or family, such as 320, Golf, A4 or C-Klasse. Requires a make.
priceMin / priceMaxOptional minimum and maximum asking price in EUR.
yearFromEarliest first-registration year. This does not mean manufacture year.
mileageMaxMaximum odometer reading in kilometres.
fuelEmpty for any fuel, or petrol, diesel, electric, hybrid, lpg, cng, hydrogen.
postcodeOptional five-digit German postcode. Unknown codes produce a free note, without broadening the search.
radiusKmRadius around the postcode centre, from 5 to 500. Default 100.
sellerTypeany, dealer or private.
maxItemsMaximum distinct listings delivered, from 1 to 10,000. In only-new mode it also caps inspected listings. Default 20.
includeDetailsFetch full specifications and equipment. Default false. The optional detail fee applies only to successful enrichment.
onlyChangesSinceLastRunReturn new IDs and asking-price/currency changes. Skip unchanged IDs without a listing fee.
onlyNewSinceLastRunReturn IDs not observed by this watch before. Default false. Strictly new listings, rather than changed existing cars.
watchIdStable name for one monitoring history. Default default. Use letters, digits, underscores or hyphens.
proxyConfigurationDefault strategy tries datacenter first and retries refusals through German residential proxy. Explicit groups or custom URLs override the default.

Filters apply together. Structured price, mileage, fuel, seller and postcode inputs override corresponding pasted search filters. A pasted search retains other source filters. Direct listing URLs select the supplied listing ID and ignore search filters. Category links are resolved to the site's make/model identifiers before filters are applied, because category pages themselves can discard query-string filters.

Berlin BMW price watch

{
"make": "BMW",
"model": "320",
"postcode": "10115",
"radiusKm": 100,
"priceMax": 30000,
"yearFrom": 2018,
"mileageMax": 120000,
"maxItems": 20,
"watchId": "berlin-bmw-prices"
}

Diesel dealer inventory with equipment

{
"make": "Audi",
"model": "A4",
"fuel": "diesel",
"sellerType": "dealer",
"maxItems": 20,
"includeDetails": true,
"watchId": "audi-diesel-stock"
}
{
"startUrls": [
"https://suchen.mobile.de/fahrzeuge/search.html?vc=Car&ms=3500%3B10%3B%3B&fr=2018%3A&cn=DE"
],
"maxItems": 50,
"watchId": "saved-search"
}

Monitor prices every day

Create a saved task with your normal query and a stable watchId, then add a daily schedule in Apify Console. Keep that watch's runs sequential. History survives new runs and container restarts. Watch names and users have separate histories.

On the first run, each delivered ID has isNewSinceLastRun: true, previousPrice: null and priceChange: null. On later full runs, the prior observed asking price becomes previousPrice. priceChange is current minus previous, so a negative number means a drop. For example, an observed change from EUR 25,000 to EUR 24,000 produces priceChange: -1000.

For economical daily alerts, set onlyChangesSinceLastRun: true: return new listings and changed asking prices, with unchanged inspections free. Keep both switches off for full snapshots. Turn it on for a feed of first-seen listing IDs. Both filtered modes cap inspected IDs at maxItems. Strict new-only takes precedence if both switches are on. A scan of twenty existing cars can therefore return no new listings. Increase the cap deliberately for a broader watch. Skipped existing IDs have no listing or detail fee; the normal start charge still applies.

Retained price history

Every watch keeps up to ten observed price states per listing, each with its currency and observation timestamp. An unchanged price increases observationCount without repeating a timeline point. First, lowest and highest observed prices remain available even after an older timeline point falls outside that ten-state window. Price extrema and drop counts restart if currency changes.

priceDropCount counts observed decreases; totalPriceChange compares the current price with the first priced observation. daysObserved measures time since this watch first saw the ID, not time advertised. daysSincePriceChange remains null until a change is observed. Reboots preserve observation counts.

The site's crossed-out asking price is separate: advertisedPreviousPrice and advertisedPriceReduction describe a displayed offer, without inventing its date. They do not become observations in your timeline. History and statistics are included in the basic fee and require no extra site requests.

Understanding ratings, prices and conditions

priceRating retains mobile.de's displayed label, such as Sehr guter Preis or Fairer Preis. priceRatingCode contains the corresponding source code when available. marketPriceRange preserves the displayed rating scale's bounds and thresholds. Those bounds are a comparison scale shown by the source, not a confidence interval, an appraisal or a history of this particular car.

powerHp retains the source horsepower value; powerHpUnit identifies PS (metric horsepower) or hp. No conversion is guessed. price is the total asking price shown by the listing. Monthly finance or leasing instalments are not substituted for it. When full details expose VAT, netPrice and vatRate retain the published values. A missing VAT statement stays unknown. Seller declarations about accidents are preserved as statements from the listing, without vehicle-history verification.

Visible and all-time review counts are separate: dealerReviewCount and dealerTotalReviewCount. They are not interchangeable. Equipment and full specifications depend on the listing detail response. A failed enrichment keeps a useful search row, marks detailsIncluded: false and adds no detail fee.

Pricing examples

Base prices below include one $0.002 start. More than one GB of memory increases start units.

JobApproximate total
1 basic listing$0.0035
20 basic listings$0.032
100 basic listings$0.152
20 listings with full details$0.062
100 listings with full details$0.302
Only-new scan with no new listings$0.002 start charge; no listing fee

Bronze receives 5% off listing and detail fees, Silver 10%, and Gold and higher tiers 20%. Proxy and platform usage are included. There is no separate fee for inspecting previously seen watch records. Failed source requests, duplicates within a run and note rows have no listing charge. The Actor checks whether the remaining spending limit can cover the whole row, including requested details, before saving a paid result. Set Apify's maximum charge for an additional spending ceiling.

Use with the API

Use the Apify client or HTTP API. Keep your token in an environment variable and fetch the dataset after completion.

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('moggedhq/mobile-de-scraper').call({
make: 'BMW', model: '320', maxItems: 20,
postcode: '10115', watchId: 'daily-berlin'
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('moggedhq/mobile-de-scraper').call(run_input={
'make': 'Volkswagen', 'model': 'Golf', 'maxItems': 20,
'watchId': 'daily-golf'
})
items = client.dataset(run['defaultDatasetId']).list_items().items

Use with AI agents (MCP)

Connect Apify's MCP server at https://mcp.apify.com and request mobile.de listings with a make, model, postcode, price ceiling, result cap and stable watch name. Ask the agent to inspect both the dataset and SUMMARY. History begins with your own observations; the Actor does not call an AI provider.

Coverage and limits

The scope is public car listings. Other vehicle types are not certified. Capped scans cannot establish sold or removed status. Unfinished watches must be resumed before reusing their name. The source limits deep pagination; the Actor stops after fifty pages per search and explains this in the summary. Narrow larger searches by model, year, region or price. Listings can change between requests; results are not a simultaneous market snapshot.

German postcode centres come from GeoNames postal data, under Creative Commons Attribution 4.0. The 28 October 2026 directory contains 10,815 codes. Centres are approximate. Without a postcode, generated searches default to Germany.

Requests run serially with pacing. Refusals retry with fresh sessions and honour Retry-After. Residential proxy is used only after the default datacenter route fails, unless you explicitly choose it. Repeated source refusals produce free failure notes. Future source changes can require maintenance; no scraper can promise permanent access to a third-party site.

Frequently asked questions

Does this require a mobile.de account?

No. Public signed-out data only; no login cookies or CAPTCHA solving.

Are private seller identities included?

Private contacts are omitted. Business contacts are included for dealers. Seller descriptions and personal reviews are excluded.

What happens if a request fails or the run restarts?

Unavailable inputs have no listing fee. Restarts recover delivered rows without duplicate fees. Resume unfinished watches before reusing their names.

For mobile.de scraper and mobile de car listings Germany workflows, start with the overview.