Scrape car listings from chileautos.cl, Chile's largest car marketplace: prices, year, mileage, specs, dealers, regions and images. Fast HTTP-only scraper with no 900-result limit.
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.
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 defaults — 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.
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
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.