Scrape mobile.de - Germany’s largest car marketplace. Prices, full specifications, seller details, image galleries, and search filters. Incremental mode detects new and changed listings. Compact output for AI agents and MCP workflows.
All notable changes to mobile.de Car Scraper are documented here.
0.2.5 — 2026-04-25 (later)
Added: WhatsApp Cloud API notifications (whatsappAccessToken + whatsappPhoneNumberId + whatsappTo).
Added: Generic JSON webhook (webhookUrl + optional webhookHeaders) — universal hook for n8n / Make / Zapier / custom backends. Receives { metadata, items } per run.
Added: USD + GBP price conversion (priceConvertedUsd, priceConvertedGbp) via Frankfurter ECB rates — fetched once per run, fail-soft to null on error.
Refactor: incremental price + repost tracking moved to a mobile.de-local module (src/priceTracker.ts) with separate KV side-states (prices__<key>, repostState__<key>) so the shared incrementalState.ts stays canonical across the workspace.
Tests: 332 passing across 14 suites.
0.2.0 — 2026-04-25
Major release: doubles output coverage, fixes silent filter failures, adds full feature parity with our adzuna/wellfound baseline.
Filter correctness (P0):
Fixed: fuelType: ELECTRIC previously produced an unmatched URL parameter — now correctly maps to mobile.de's ELECTRICITY. Same fix for PLUG_IN_HYBRID → HYBRID_PLUGIN, HYDROGEN → HYDROGENIUM, SEMI_AUTOMATIC_GEAR → SEMIAUTOMATIC_GEAR, and 6 of 9 body-type values (KOMBI → EstateCar, KLEINWAGEN → SmallCar, COUPE → SportsCar, GELAENDEWAGEN → OffRoad, LIMOUSINE → Limousine, VAN → Van). Listings now actually match the requested filter.
Changed: sort order now uses mobile.de's canonical sb/od URL params (was sr numeric values that mobile.de ignored).
Added: descriptionMaxLength input — truncate descriptions for AI-pipeline use.
Fixed: make/model parsing now uses JSON-LD BreadcrumbList from detail pages (was naive title-split that broke on "Land Rover", "Alfa Romeo", "Mercedes-Benz"). SERP fallback handles these multi-word makes locally.
Added: contentHash output field (SHA-256 fingerprint of content-identifying fields).
Output normalization (P2):
Added: fuelType, transmission, bodyType, condition, color, priceRating now emit canonical English enums (e.g. ELECTRIC, AUTOMATIC, SEDAN, NEW, WHITE, GOOD).
Added: *Raw siblings preserve the original German values (fuelTypeRaw: "Elektro").
Added: firstRegistrationDate field (ISO YYYY-MM-01) alongside the legacy firstRegistration (MM/YYYY).
Added: yearOfManufacture derived from registration.
Added: accidentFree boolean derived from condition raw text.
Multi-select filters (P2):
Changed: fuelType, transmission, bodyType, condition now accept arrays for multi-select. Single-string values still work.
Added: emitUnchanged and emitExpired inputs (the README example finally works).
Added: priceChange (UP / DOWN) and priceChangeAmount fields on incremental runs — the same price-direction signal azzouzana charges $0.25/run for, included in our base $0.001/result.
Post-fetch filters (P2):
Added: includeKeywords / excludeKeywords keyword DSL with field scoping (title / subtitle / description / features).
Note: prior CHANGELOG claimed descriptionHtml, descriptionMarkdown, contentHash were added — they were declared in the type but never populated. Properly delivered in 0.2.0 (above).
[0.1.0] - 2026-03-21
Initial release.
29 SERP-only output fields
Keyword + make/model + start-URL inputs
Price, mileage, year, power, location-radius range filters
Condition, fuel type, transmission, body type, seller type single-select enums