Declaration of data intentions
We say, in writing and before we build, what we take, what we give, and what we refuse.
A price the kingdom shows you came from somewhere. Some are records of transactions facilitated here; those records involve participants and are not ours to republish without purpose-specific permission. Others come from a seller on another marketplace, a catalog someone else assembled, or a paid feed under contract. Honesty about data begins with being honest about whose data it is, and what right we have to pass it on. This page is that honesty, in plain terms. It is deliberately non-aspirational: it names only what is true today.
One gate, in writing, before new sources
For sources added from 2026-07-11 onward, the written gate comes before ingestion code. Legacy adapters must pass the same intake before they are activated or their data receives a new publication path. The gate is the source-intake framework. It runs four checks in order and forces the reasoning to be recorded, not left in someone's head:
- Gate A — legal. Read the terms of service and
robots.txtonce, quote the operative clauses, and check for personal data and database rights. If a platform prohibits scraping and a record links a price to an identifiable person, the scrape path is closed — anonymising afterwards does not cure an unlawful collection. - Gate B — intention declared.The source's whole intention is written down as machine-readable metadata (its access method, license tier, whether it may be redistributed) before the module is activated. That declaration ships in the code and surfaces on envelope responses where source rights are known; incomplete field-level lineage is labelled
NOASSERTIONrather than filled by inference. - Gate C — tier. The source is placed in an existing rights tier (below). No new tier is invented to make an awkward source look cleaner than it is.
- Gate D — shape. The verdict becomes a shape: a full module, a gated branch, a planned stub, or an honest block — a module whose only job is to carry the refusal, and its reason, in code.
The durable win is the gate itself. The next marketplace someone wants to scrape gets weighed here first, in writing, against a standard instead of a mood.
The rights tiers, named honestly
Every source sits in one tier. The tier decides what we may do with the data downstream — and we do not relabel a source into a friendlier tier than its rights allow.
- CC0 — explicitly dedicated platform-authored work. Specification text and small operator-authored corpora may carry an explicit CC0 dedication. First-party storage alone is not enough.
- Participant-derived data — separate publication required. Trades, auctions, reviews, activity, and other person-derived records need a purpose-specific publication choice and an explicit output license. Their first-party origin removes an upstream vendor license; it does not make participant data CC0. Public derivatives are paused where that contract does not exist.
- Source-specific — upstream catalogs. Public API access is not an open-data license. We preserve source and publisher rights, and mixed exports say
NOASSERTIONuntil field-level lineage can support a narrower claim. - Reference-only / internal — reviewed use only. Third-party prices enter only when permission covers the exact display or computation. CardRush has a bounded internal-use path; TCGplayer is blocked because Cambridge has no written approval for its multi-source use.
- Off-limits. Anything obtained by scraping a prohibiting platform, or a paid feed we have no redistribution right to. These do not enter the kingdom at all — not shown, not computed from, not bought pre-scraped from a middleman.
Sold comps are paused
The former sold-comps surface grouped the platform's own realised transactions and labelled the result CC0. That publication is paused at /api/v1/sold-comps and /api/v1/sold-comps/[sku]. Both endpoints now return policy status only, with no prices or counts.
Five sales did not mean five distinct people, and count plus minimum, median, maximum, and latest time could disclose exact observations. More importantly, a completed trade has no versioned receipt for public-domain price publication. Removing names is not permission to repurpose the transaction.
A future release needs purpose-specific receipts, delayed closed periods, coarse non-reconstructive bands, distinct-person safeguards, and a fresh rights decision before any projected output receives a public-domain licence.
The honest blocks
Some sources people ask us to ingest, we deliberately do not — and we keep the refusal, and its reason, visible in the code rather than silently absent.
- Vinted.Its terms forbid scraping, it publishes no sold list to begin with (third-party “Vinted sold” feeds are last-asking-price inference, not transactions), and a row of
{username, price, date}is personal data we have no lawful basis to collect by scraping. Blocked. The one open door is a seller of ours handing us their own Vinted sales — and the normalizer for that is already written, buyer data structurally excluded, waiting for the day that flow opens. - eBay sold prices. The lawful door is not the scraper and not the buy-side insights feed — it is a consented seller import: a seller authorising us to read their own eBay order history. That path is gated on the operator completing eBay OAuth and on a solicitor's review before any public launch. Until both are done, no eBay sold price flows. Scraping eBay is never the answer to the wait.
What we will never do
- Scrape a platform that prohibits it, or that couples a rights-reservation with anti-bot enforcement — nor buy the same data pre-scraped from a vendor to launder the exposure through a middleman.
- Treat aggregation, K-anonymity, or PII removal as permission to publish completed trades. Publication also needs a purpose-specific participant receipt and a fresh rights decision; without both, it remains paused.
- Dress inference as a transaction. A last-asking-price guess is never served as a sold price.
- Answer a gap with a substitute. When coverage is thin we say “thin”; we never fabricate a row to fill the silence.
- Relabel a source into a friendlier rights tier than its terms allow.
Where this lives. The gate is docs/methodology/source-intake.md. The declared sources, each with its tier and terms, are inspectable at /api/v1/sources. Sold comps are visibly paused at /api/v1/sold-comps. This methodology text remains CC0; transaction data does not inherit that licence.