# Changelog of 🚗 mobile.de \[$0.59/1K💰] Fast Scraper · Finance · Dealer GPS (`blackfalcondata/mobile-de-scraper`) Actor

- **URL**: https://apify.com/blackfalcondata/mobile-de-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/blackfalcondata/mobile-de-scraper.md

## Changelog

All notable changes to mobile.de Car Scraper are documented here.

### 0.2.78 — 2026-09-24

- Changed: `accidentFree` is now `null` when the seller does not state the accident history. It is `true` for "Accident-free" and `false` for "Accident-damaged vehicle" or "Repaired accident damage". Before this build, an unstated history came out as `false`.
- Added: `isCurrentlyDamaged` — `true` when the listing is marked "Damaged", otherwise `null` (mobile.de has no explicit "not damaged" value, so it is never `false`).
- Added: `isRoadworthy` — `true` or `false` when mobile.de provides it (`false` for "Not roadworthy"), otherwise `null`.
- Note: accident history and current damage are separate. A car can be accident-free and damaged at the same time (for example hail or engine damage), so `accidentFree: true` and `isCurrentlyDamaged: true` can appear together.

### 0.2.77 — 2026-09-24

- Fixed: `accidentFree`, `conditionRaw`, `previousOwners` and `huStatus` are now filled on detailed results ("Include Full Details", on by default).

### 0.2.21 — 2026-07-07

- Improved: **Start URLs** — a pasted mobile.de search URL is now applied as a full structured search, so its make/model, price, mileage, power, fuel, transmission, body, colour, seller, damage, postal-code radius and sort filters are all honoured. Single-listing links and non-search URLs are skipped.
- Improved: search reliability and lower per-run overhead.

### 0.2.20 — 2026-07-07

- Pricing: pay-per-result reduced to **$0.6 / 1,000 results** (from $0.75), effective 2026-07-22 (14-day notice). Run start fee unchanged at $0.005.
- Added: **Dealer ID** input (`sellerId`) — restrict the whole search to a single dealer's inventory. Also auto-detected from a pasted dealer URL's `customerId=` / `sid=` value.
- Added: **Get More Results** toggle (`moreResults`, opt-in) — sweep past the ~2,000-listings-per-query limit for full-inventory runs; the search is split by price range automatically. Off by default.
- Added: dealer **opening hours** (`sellerOpeningHours`) on detailed results, plus WhatsApp, website, languages and years-on-platform now filled on the fast default transport as well as the fallback.
- Improved: large uncapped runs now stream results to the dataset as they are found instead of buffering the whole set in memory — lower memory use and earlier first output.
- Docs: clarified `reviewLimit` — each listing already carries the dealer's average rating, review count and tenure; individual review text is only populated where reachable.

### 0.2.19 — 2026-05-24

- Changed: runs with no search source (no `query`, `make`, or `startUrls`) now exit gracefully with a clear status message instead of failing. The run completes as SUCCEEDED with 0 items and the status message guides the user to provide one of the required inputs.
- Updated: input schema description now explicitly lists the three search sources and notes that at least one is required.

### 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).
- Changed: `powerMin`/`powerMax` now auto-convert PS → kW (mobile.de URL expects kW).

**Detail enrichment (P1) — 30+ new output fields:**

- Added: `includeDetails` input (default `false`). When enabled, fetches each listing's detail page and unlocks: `vin`, `description`, `descriptionHtml`, `descriptionMarkdown`, `features` (40+ equipment items), `accidentFree`, `previousOwners`, `huStatus`, `cubicCapacityCc`, `cylinders`, `driveType`, `batteryCapacityKwh`, `colorManufacturer`, `interiorMaterial`, `interiorColor`, `series`, `trimLevel`, `availability`, `origin`, `weight`, `trailerLoadBraked`, `trailerLoadUnbraked`, `climatisation`, `parkAssists`, `airbags`, `sellerStreet`, `sellerZipCity`, `sellerLatitude`, `sellerLongitude`, `sellerPhones`, `sellerLanguages`, `sellerYearsOnPlatform`.
- 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 hash 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: `category` input — search Cars, Motorbikes, Motorhomes, Vans, Trucks, Buses, Trailers, Construction & Agricultural Vehicles.
- Added: `exteriorColor` multi-select filter.
- Added: `damageStatus` filter (`ANY` / `EXCLUDE` / `ONLY`).
- Added: `model` accepts multiple comma-separated or JSON-array values.
- Added: `radiusMiles` alternative to `radiusKm`.

**Performance (P2):**

- Changed: pages 2..N now fetched in parallel via `maxConcurrency` (default 5). Cuts runtime ~3× for multi-page queries.
- Added: detail enrichment fetches in parallel as well.

**Notifications (P2):**

- Added: Slack / Telegram / Discord webhook integration. Sends new + price-changed listings as formatted messages with thumbnail, price, mileage, registration, and seller.
- Added: `notificationLimit`, `notifyOnlyChanges`, `includeRunMetadata` controls.

**Incremental & monitoring (P2):**

- 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).
- Added: `customFilters` rule engine (e.g. drop listings containing "Bastler", require `powerPs >= 300`).
- Added: `fromDate` / `toDate` / `maxAgeMinutes` filters.

**Competitive moats (P3):**

- Added: dealer phone numbers (`sellerPhones`).
- Added: dealer GPS coordinates (`sellerLatitude` / `sellerLongitude`) — extracted from contactInfo.latLong or mapLink fallback.
- Added: dealer language list (`sellerLanguages`).
- Added: dealer street + city + opening hours.
- Added: `reviewLimit` input — extract dealer review text bodies (capped, default 0).
- Added: `sellerWebsite`, `sellerWhatsapp` fields.

**Schema fixes (P0):**

- Fixed: repost fields no longer appear twice in the output table view.
- Added: every new output field is wired into the dataset preview ("Overview" + "All Fields" views).

**Performance:**

- Bumped: `defaultRunOptions.memoryMbytes` to 256 (was 128 — too tight for parallel detail enrichment).
- Bumped: `maxResults` cap to 10,000 (was 1,000).

**Tests:**

- 240+ tests across 11 suites (was 111). New: `enums.test.ts`, `urlBuilder.test.ts`, `filters.test.ts`, `notifications.test.ts`, `routes.fixture.test.ts`, `detailEnricher.fixture.test.ts`.

### 0.1.x — 2026-04-14

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
- Sort (relevance, price, mileage, registration date)
- PAY\_PER\_EVENT pricing: $0.005/start + $0.001/result
- Reliable high-success data retrieval
- Incremental mode with NEW/UPDATED/UNCHANGED/EXPIRED + repost detection
- Compact output mode
