Scrape finn.no/torget — Norway's largest classifieds marketplace — filter by category · condition and price across 11 categories and all counties · each listing ships price · location and seller details. Incremental mode tracks new and changed listings across scheduled runs.
Billing correctness across restarts and overlapping runs
A run that the platform restarts mid-way no longer re-delivers what it had already delivered, and a run that resumes after another run has moved the shared incremental state on now keeps what that run delivered instead of billing the change again.
A listing that was merely seen again, without being delivered, is no longer mistaken for a newer version of itself.
An expiry that has already been reported is now recorded as reported rather than dropped, so it is not reported a second time — and a listing that comes back after one is reported as NEW, as documented.
Where one search had been stored under two spellings (with and without an explicit sort), both records are read, merged once and retired, so paid history is not lost and settled expiries are not revived.
Known limitation during the upgrade
State written by earlier versions cannot say whether a listing is missing from it because a scan was incomplete or because its expiry had already been reported. Listings carried over from such state are therefore treated conservatively for one run: they are never billed as new again, and if they are gone their expiry is recorded without an EXPIRED row. An EXPIRED row can be missed once per listing in that window; no listing is billed twice. It resolves on the first run that sees the listing or completes a scan.
0.2.0 — 2026-05-12
Behavior change
omitNulls default is true. Output rows now drop fields with null, empty string, empty array, or empty object values by default. Set omitNulls: false if you need a stable schema where every row has every documented key.
New typed output fields
Generic-suffix matching (validated on the DBA-equivalent Schibsted Aurora platform across 1320 listings × 320 sub-cats) promotes category-prefixed extras to typed columns:
material matches *_material (bags_purses_material, jewellery_main_material)
gender matches gender or *_gender
theme matches *_theme (e.g. lego_theme)
designer for art/furniture listings
age matches *_age (pet age)
season for seasonal items (Påske, Jul, …)
platform for gaming (games_group, *_platform)
depth, height, width, length (cm — furniture)
Shared / location fields
coordinateAccuracy is now populated for supported listings.
mapImageUrl extracted from recommerce detail JSON (itemData.location.position.mapImage).
Fiks ferdig filter
Added the fiksFerdig input flag to return only listings with Fiks ferdig (transactable shipping). About 86% of recommerce listings qualify (verified live).
Internal
15 new unit tests in tests/transform.test.ts covering extras matching, length parsing, and omitNulls semantics.
0.1.1 — 2026-05-11
Fixed: priceMin / priceMax filters now actually narrow results to the requested price range. Previously they were accepted but ignored, and runs returned the full unfiltered list.
Added: Live canary test suite — verifies each filter actually narrows results against an unfiltered baseline on every release.
0.1.x — 2026-04-14
Added: descriptionHtml, descriptionMarkdown output fields (triple-format descriptions for RAG/LLM pipelines)
Added: contentHash output field (stable hash over content-identifying fields, used for change detection)