# Changelog of Chileautos.cl Scraper - Cars, Prices & Specs from Chile (`rastriq/chileautos-scraper`) Actor

- **URL**: https://apify.com/rastriq/chileautos-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/rastriq/chileautos-scraper.md

## Changelog

### 0.2 — 2026-10-02 (build 0.2.3) · UUID listing ids, year 0 → null

Found in the full-marketplace run of the same day (61,793 listings):

- **3 listings use a UUID as id** (`7b78dc34-…`) instead of `XX-AD-<n>` — dealer-feed stock. Search
  emitted them fine, but `urls` / `listingIds` input rejected them as unsupported. The id pattern now
  lives in one place (`urls.LISTING_ID_PATTERN`) and accepts both forms; the detail and gallery APIs
  were checked to work with UUIDs. AD ids are upper-cased, UUIDs lower-cased, as the site writes
  them. The id is taken from the last match in the path, since the slug before it is free text.
- **`year` 0 becomes `null`.** Incomplete listings (title literally "0 0") publish year 0. Values
  outside 1900–2100 are now null; 1929 Ford As stay.

### 0.2 — 2026-10-02 · Portfolio conventions: input names, delta engine, privacy

The input schema now follows the conventions of `wallapop-cars-scraper` and `cochesnet-spain`, so a
consumer driving several of our actors uses the same field names everywhere:

| v0.1 | v0.2 |
|---|---|
| `brands` (array) | `make` (string; commas = OR) |
| `fuelType` / `transmission` | `fuel` / `gearbox` |
| `yearFrom` / `yearTo` | `minYear` / `maxYear` |
| `priceFrom` / `priceTo` | `minPrice` / `maxPrice` |
| `mileageFrom` / `mileageTo` | `minKm` / `maxKm` |
| `startUrls` + `listingIds` | `urls` (URLs and bare IDs in one list) |

The v0.1 names are still accepted (`normalize_input`), so tasks saved against 0.1 keep working.
Search filters no longer carry `default`s — `nullable` selects instead of `""` enums — because a
schema default is injected into every run (rule 4 in the repo README). `maxItems` default 100 → 50,
matching the other actors.

#### Delta engine (`enableCursor`, `cursorId`, `emitSeenIds`)

Same contract as the other actors (`docs/DELTA-ENGINE.md`): sharded ledger in the named store
`chileautos-delta-state`, `_delta_status` / `_changed_fields` / `_previous_price` / `_price_delta`,
90-day TTL, `SEEN_IDS` with `reconcilable`, `SUMMARY` with `scanned == emitted_new +
emitted_updated + unchanged_skipped (+ removed_listings)`.

One deliberate difference: a listing is recorded in the ledger only **after** it is pushed. Here a
batch can be truncated by the user's spending limit; recording at classification time would mark
the dropped listings as delivered and the next run would never emit them.

Unchanged listings are classified from the search card, before enrichment, so an incremental run
with `includeDetails` skips the detail request for them too. Measured: a repeat run on a 22-listing
slice made **2 requests instead of 24**.

`SEEN_IDS.reconcilable` is false when the sweep was cut by `maxItems` or the spending limit, when a
result page failed, when a search URL could not be resolved, or when a raw expression with its own
price term exceeds the 1,800 results two sort orders can reach.

#### `stripSellerPII`

Chileautos hides phones behind login and the actor never collects them, but private sellers type
phones and e-mails into descriptions. The Chilean phone pattern requires the 4-4 grouping, so CLP
prices written as `9.990.000` (1-3-3) are not redacted — covered by a test.

#### Robustness

Batch push falls back to row-by-row on failure (rule 3): a row rejected by the dataset schema is
dropped with a warning instead of aborting the sweep. A run that scanned nothing because every
request was blocked now fails instead of finishing green with 0 items.

### 0.1 — 2026-10-02 · First release

HTTP-only scraper on the Merlin endpoints (`/_api/search-core`, `/_api/details-core`,
`/_api/gallery-core`). Price bisection past the 900-result cap per query. PPE pricing:
`listing` $0.0015, `listing-details` $0.0015. Analysis behind the design:
[`docs/ANALISIS-TECNICO.md`](docs/ANALISIS-TECNICO.md).
