Search Vinted (vinted.com/.co.uk/.de/.fr) catalog listings by keyword — one row per item with price, condition, brand, size, seller, and photo. Built for resale-arbitrage comps. No login; we handle the retries.
Scaffolded: .actor/ (actor.json with categories: ["ECOMMERCE"],
input_schema.json / dataset_schema.json / output_schema.json
matching design.md field-for-field, Dockerfile), src/main.py
placeholder (reads input, validates against the placeholder
ActorInput, pushes one clearly-marked placeholder record, exits
clean), src/__init__.py / src/__main__.py, test scaffold
(tests/conftest.py, tests/test_main.py), the QA fixture
(tests/fixtures/input.qa.json, spec's own live-verified
keywords=["jacket"]/domain="vinted.com"/maxItems=5 combination),
README skeleton, scaffold.json, promo.json.
.actor/icon.svg deferred to actor-icon-designer (Vinted brand
mark inside the canonical Devil Scrapes container).
.actor/pay_per_event.json deferred to implementer (T07) per
docs/specs/vinted-sold-listings/design.md's file plan.
Added throwaway placeholder src/models.py (bare ActorInput/
ResultRow, no validators) and src/scraper.py (NotImplementedError
stub) so the repo's ADR-0004 Pydantic-wiring gate
(scripts/verify_pydantic.py, enforced by .claude/hooks/stop_check.sh)
passes at scaffold time. Both are fully replaced, not extended, by
T02 (models.py — the real validated ActorInput/ResultRow) and
T04-T06 (parser.py/client.py/scraper.py — the real orchestration)
per docs/specs/vinted-sold-listings/design.md and tasks.md.
Real crawler logic (src/client.py, src/parser.py, plus the real
src/models.py / src/scraper.py / src/main.py) is not implemented
yet — see docs/specs/vinted-sold-listings/tasks.md.