# Changelog of Wallapop Scraper (`devilscrapes/wallapop-scraper`) Actor

- **URL**: https://apify.com/devilscrapes/wallapop-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/devilscrapes/wallapop-scraper.md

## Changelog

All notable changes to this Actor are documented here.

### \[0.1.0] - 2026-09-20

Initial implementation. Exports Wallapop (Spain classifieds) search
results — title, description, price, location, images, and listing
metadata — for one or more keyword queries, no login.

- REQ-1/2/3/7: `WallapopClient` (`src/client.py`) fetches
  `GET /api/v3/search` via `curl_cffi.requests.AsyncSession` with
  rotating browser impersonation (`chrome131`/`chrome124`/`firefox147`/
  `safari180`), follows `meta.next_page` verbatim, and stops at
  `max_pages_per_query` or when the cursor is absent.
- REQ-4: `WallapopRoutingError` classifies the dead-endpoint 403
  signature (text/html CloudFront body) with zero retries, distinct
  from `WallapopRequestError` (retry exhaustion on 408/429/503/network
  errors, backoff 2s→30s, 5 attempts).
- REQ-5: a genuinely empty search result SUCCEEDS with zero rows and a
  status message naming the queries searched; a routing/request
  failure fails loud (ERROR log + non-zero exit) with zero PPE charges.
- REQ-6: per-item and per-page fault isolation — a malformed item is
  logged and skipped, never crashes the run (`src/scraper.py`).
- REQ-8: run-wide `listing_id` dedup across every query and page.
- REQ-9: proxy defaults to Apify Proxy datacenter tier
  (`apifyProxyGroups: ["BUYPROXIES94952"]`) — never Residential, never
  a bare `useApifyProxy: true`.
- REQ-10: `ActorInput`/`ResultRow` are Pydantic v2 models
  (`src/models.py`), keyword-form `Field(default=..., ...)` throughout.
- REQ-11: `actor-start` ($0.20) charges at most once per run, gated
  behind the first batch of results that actually reaches the dataset
  (`_StartFee.charge_once()`, ported verbatim from
  `upwork-job-leads-scraper`) — never at boot, never on a zero-row run.
- REQ-12: `listing-scraped` ($0.004) charges once per unique row
  pushed.
- REQ-13/14/15/16/17: real HTTP calls and parsing against the live
  endpoint (fixtures captured from a real `bicicleta` search, T03), the
  full `.actor/` file set, an `input_schema.json` prefill exercising
  page-2 pagination, a Devil Scrapes brand-voice `README.md`, and
  `promo.json`.

Pricing: $0.20 `actor-start` + $0.004/listing (≈$4.00–4.20 / 1,000
results depending on batch size).
