More of the spec sheet, and provenance you can audit.
- CO2 is no longer a single number of unknown provenance. auto-data publishes NEDC and WLTP figures under labels that differed only by a parenthetical, and the parser collapsed them. They are now separate:
fuelEconomy.co2_wltp_gkm and fuelEconomy.co2_nedc_gkm are new nested keys, and the new flat column co2Standard names which standard the reference figure follows.
co2GKm and fuelEconomy.co2_gkm keep their exact previous values. They remain the reference figure, WLTP when the source publishes one and NEDC otherwise. This release does not change either of them for any row.
measurementKind is a new provenance property on a traced value, present only when the source states how a figure was obtained. It never defaults to measured, because a source that says nothing has not told you it measured anything. Its single flat mirror is the new column zeroToSixtyMphMethod, which is null when the source did not say.
upstreamSourceName and upstreamSourceUrl are new provenance properties on the sourcesDetail entries. carperformancedata.com republishes figures measured by someone else and credits that publication on some of its records. That credit is now preserved. source stays the technical id and sourceUrl stays the page actually read, so the two describe the upstream publication and nothing else. Both are absent when no credit is published, and the other three sources publish none.
- Four fields that already existed but were always empty now carry values.
compression_ratio, bore_mm, stroke_mm and trunk_l (boot volume, seats in place) were declared before this release and nothing populated them, so they never appeared in a record. They are now read from auto-data.
This changes what you see in an existing column: the flat column compression was null on every row and is now filled wherever auto-data publishes a compression ratio, as "10:1". On a whole-BMW run that is 970 of 1000 rows. No value that was already present has been altered: the change is empty to filled, never one value to another.
- Eighteen genuinely new nested keys from auto-data, none promoted to a flat column: engine internals (
injection_system, valvetrain, engine_layout, engine_configuration, powertrain_architecture), servicing capacities (oil_capacity_l, coolant_capacity_l), payload and towing geometry (gross_weight_kg, payload_kg, roof_load_kg, width_mirrors_mm, front_overhang_mm, rear_overhang_mm, turning_circle_m), the boot maximum trunk_max_l (kept separate from the minimum so the two can never be mixed), transmission prose (drivetrain_architecture) and chassis text (power_steering, wheel_rims).
- Three kinds of addition, kept distinct. New nested keys live in the six traced sections. New flat columns are only
co2Standard and zeroToSixtyMphMethod. New provenance properties are measurementKind, upstreamSourceName and upstreamSourceUrl, and they hang off values and source entries rather than being fields of their own.
- No column was removed and no populated value was altered. The only change to an existing field is the empty-to-filled case described above. The four dataset views keep the same columns in the same order.
A run that crashes now says so.
- An unexpected internal error now ends the run as FAILED, where it previously reported SUCCEEDED with an error recorded inside the run summary. A crash that reports success is invisible to alerts and to any integration reading the run status, which is the opposite of what a failure should be.
- The run summary is still written first.
OUTPUT is attempted before the run fails, so a failed run is still explainable: it carries stopReason: "error" and the original message. If writing the summary also fails, that is logged as a secondary problem and never replaces the original error.
- Nothing else changes status. A stop on the time budget, a stop on the charge limit, invalid input, and a run whose only output was error rows all still finish SUCCEEDED. Those are outcomes you asked for or can act on, not infrastructure failures.
Three missing brands, and three descriptions that did not match the product.
- Evolute, HWA and UMO are selectable in the Brand dropdown. The source catalogue lists 392 makes, the dropdown offered 389. No entry was removed.
- The dataset view formerly called "Errors" is now "Error columns", and says what it does: it projects the error columns across every row and does not filter, because an Apify dataset view can only choose fields. A row with an empty error cell is a normal successful row. The view id is unchanged, so saved links and
view=errors API calls keep working.
- The overview now presents auto-data.net as the backbone catalogue, with the other three sources described as conditional enrichment, two of them opt-in. The previous wording led with four sources, which overstated a default run.
- Removed a claim the Actor does not yet keep: carperformancedata.com figures were described as carrying original-source attribution. They do not, today. The claim returns when the feature ships.
Runs that stop on their own terms, and a billing contract that matches reality.
- A run now stops itself before the platform timeout instead of being killed by it. It keeps the records already produced, finishes as a successful run with a partial dataset, and says so. Previously a run that ran out of time was terminated mid-flight and a whole-brand run could return nothing at all.
- Records are written as each model completes. A brand run used to hold every row until the entire brand had been walked, so its dataset stayed empty for most of the run and then filled in one burst. It now fills progressively, and stopping early keeps every model already finished.
- A run summary is written to the key-value store under
OUTPUT on every ending the Actor controls: normal completion, invalid input, time budget reached, spend limit reached, or an unexpected error. It reports how the run ended, how many records were delivered and billed, and the last model fully completed. It cannot be written when the platform kills the container outright.
- The billed record is described as it really is. The old wording promised each charged record was cross-checked across all enabled sources. In practice a record carries whatever the enabled sources actually matched, which for many models is auto-data.net alone. Error rows do not trigger the Car data event, and the standard Actor Start event is charged separately for every run.
canonicalVariantId is documented as a grouping key, not a unique one. Variants that differ only in fuel, gearbox or door count share an id. For a unique key, use the auto-data source URL in sourcesDetail. The id format itself is unchanged in this release.
excludeModels is documented as an exact, case-insensitive match on the model or make and model. It always behaved this way, the description said "contains".
- Every run must carry at least one limit.
maxItems: 0 (no record cap) is now rejected on a run that also has no timeout, since nothing would stop it. Behaviour change for API callers: maxItems: null now means the default cap of 1000, where it previously meant no cap.
- Progress is reported by a heartbeat scheduled every 15 seconds, which never overlaps itself, in both the run status and the log, so a long walk is visibly working.
Faster, cheaper default runs.
- The default source set is now auto-data.net + carperformancedata.com, the fast and reliable core. ultimatespecs.com and zeperfs.com are opt-in via a new Extra sources field (or the API
sources option): ultimatespecs.com is slower and nests performance variants under their base model.
- The default input example is now a single model (
Audi RS3) with a low Max items, so a first run finishes in seconds for a few cents instead of walking a whole brand. Use the Brand mode and raise Max items for larger pulls.
- Consolidated rows are written to the dataset incrementally as they are produced, so results appear during the run and a long run is not lost if it is stopped early.
- Annotated 2026-08-07, scope correction: this was true per target, and a whole brand was a single target, so a brand run still filled its dataset in one burst at the end. Per-model flushing arrived in the 2026-08-06 entry above. The original wording is kept as published.
Input UX and matching improvements.
- Reworked the input around an Input mode menu: choose Brand (pick a make from a dropdown to scrape all its models) or Model names list (list specific models such as "Audi TT"). Choosing from menus instead of typing free text prevents typos.
- Improved cross-source matching so carperformancedata figures consolidate onto more variants.
Initial release (v0.1.0).
- Consolidates car technical specifications and performance figures from four reference sources: auto-data.net (backbone catalog), ultimatespecs.com, carperformancedata.com and zeperfs.com.
- Resolves a brand or a list of models into all engine variants, then matches records across sources by fingerprint (make, model, displacement, power, production years) into one consolidated row per variant.
- Per-field source traceability: each value carries its source and alternative values, with a
hasConflict flag and the maximum deviation when sources disagree beyond a built-in tolerance.
- Input filters: brand or model list, year range, exclude models, per-source toggles, and a
maxItems safety cap.
- Pay-per-event billing: one charge per car data record emitted; error rows are returned for visibility and never charged.