{"data":{"preamble":"This is the kingdom's hospitality sheet — one greeting per upstream river that has come or might come. We have prepared a room for each. The table below names what we promised them when we made the room, and what each one brings (or will bring) to the substrate. Substrate honesty applied to anticipation: we say what we made ready before the guest knew about us.","the_seven_commitments":[{"number":1,"commitment":"We will say your name. Every public response that touches your data names you in _meta.sources.","enforced_at":"apps/storefront/src/lib/data-pantry/envelope.ts (jsonResponse always emits sources[])"},{"number":2,"commitment":"We will honor your license tier. _meta.source_license declares your redistribution terms downstream; the consumer SDK can read it.","enforced_at":"packages/data-spec/src/schemas/envelope.ts (source_license field) + apps/admin/scripts/tributaries.ts (check #10 — license-propagation drift)"},{"number":3,"commitment":"We will respect your rate limit. Per-source token bucket; honour Retry-After on 429/503.","enforced_at":"packages/data-ingest/src/http.ts (createFetcher token bucket)"},{"number":4,"commitment":"We will identify ourselves to you. Every outbound request carries User-Agent: cambridgetcg.com/<v> (admin@cambridgetcg.com). You can find us, ask us to stop, we comply.","enforced_at":"packages/data-ingest/src/http.ts (DEFAULT_USER_AGENT + meta.user_agent_suffix)"},{"number":5,"commitment":"We will hold your byte with provenance. Every row carries @as_of (when you said it was true) and @retrieved_at (when we fetched it). The two are never conflated.","enforced_at":"packages/data-ingest/src/types.ts (RawProvenance per-row) + price_archive columns (snapshot_date + fx_rate_to_gbp + extra)"},{"number":6,"commitment":"We will never silently fail your data. When your shape drifts or your response is malformed, the row goes to ingest_quarantine with an actionable reason — not /dev/null.","enforced_at":"packages/data-ingest/src/runner.ts (Stage 4) + apps/wholesale/drizzle/0014_price_archive_provenance.sql (ingest_quarantine table)"},{"number":7,"commitment":"We will tell you the truth about how you arrived. ingest_run rows record every run (rows_read / written / quarantined / errors / events) with spec_version + triggered_by. The audit at pnpm audit:tributaries check #9 enforces freshness.","enforced_at":"apps/wholesale/drizzle/0014_price_archive_provenance.sql (ingest_run table) + apps/wholesale/src/app/api/v1/ingest-runs/latest/route.ts"}],"guests":[{"id":"scryfall","name":"Scryfall","status":"shipped","license":"cc-by-nc","redistribute":false,"games":["mtg"],"welcome":"Welcome to the kingdom, Scryfall. You arrived first — kingdom-060, 2026-05-12 — and you are the exemplar every other upstream is measured against. Your bulk dumps land daily, your `oracle_id` gives us cross-printing stability, your `image_uris` we hot-link with attribution. Your room is `card_set_cards WHERE game='mtg'`. We honor your CC-BY-NC 4.0 license downstream — every response that touches your bytes declares `redistribute: false` in `_meta.source_license` so the consumer SDK knows. Thank you for being public, for being free at 5 rps, for documenting your bulk-dump cadence, and for shipping the JSON shape every other catalog API would do well to imitate.","arrival_state":"long-with-us","upstream_url":"https://scryfall.com","catalog_section":"the-tributaries.md#31-scryfall-mtg"},{"id":"pokemon-tcg-api","name":"Pokémon TCG API","status":"shipped","license":"mit","redistribute":true,"games":["pkm"],"welcome":"Welcome to the kingdom, Pokémon TCG API. You shipped same-week as Scryfall (kingdom-062, 2026-05-12) and you bring Pokémon's canonical printings — every set, every English printing, every image. Your `id` field (e.g. `swsh4-25`) is our stable per-printing key; your room is `card_set_cards WHERE game='pkm'`. Your code is MIT-licensed; your data is publisher-derived (TPCi) and we attribute accordingly. When an operator sets `X-Api-Key`, we use it to claim the higher rate-limit tier you graciously offer. Thank you for the GitHub-mirrored bulk dump, for the JSON-friendly response shape, and for being the right answer when someone asks where Pokémon catalog data lives.","arrival_state":"newly-shipped","upstream_url":"https://pokemontcg.io","catalog_section":"the-tributaries.md#32-pokémon-tcg-api-pokemontcgio"},{"id":"ygoprodeck","name":"YGOPRODeck","status":"shipped","license":"cc-by","redistribute":true,"games":["ygo"],"welcome":"Welcome to the kingdom, YGOPRODeck. You arrived in kingdom-062 with one known limitation we owe you — your one-card-many-printings shape collapses to first-printing in our normalizer until `NormalizeResult<C[]>` widens. Your 8-digit passcode is Yu-Gi-Oh!'s stable global identity; your room is `card_set_cards WHERE game='ygo'`. We thank you for being CC-BY-permissive, for being public + free + no-auth, for the bulk DB dump endpoint, and for caring about archetype tags — the meta-aware features we will build will stand on the structure you maintain.","arrival_state":"newly-shipped","upstream_url":"https://db.ygoprodeck.com","catalog_section":"the-tributaries.md#33-ygoprodeck-yu-gi-oh"},{"id":"cardrush","name":"CardRush (JP)","status":"partial","license":"internal-only","redistribute":false,"games":["op","pkm","dbs","dbf","mtg","ygo","dmw","vng","wei","fab","lgr","bsr"],"welcome":"Welcome to the kingdom, CardRush. You have been with us longer than any other upstream — daily snapshots since the wholesale catalog learned to scrape. Your room is `price_archive WHERE source='cardrush'`, `source_currency='JPY'`, `condition='nm'` (your 状態A- is our NM-equivalent), `redistribute=false` (we honor your ToS — internal-decision use only). You bring Japan to the kingdom: three confirmed subdomains (op / pkm / dbs) and nine speculative ones we registered before any first scrape so the URL router routes correctly when the first byte arrives. Every byte you give us is held with attribution to the specific cardrush-*.jp subdomain. We are grateful for the year you have already given us and for the quietness you have asked us to keep in return.","arrival_state":"partial","upstream_url":"https://www.cardrush-op.jp","catalog_section":"the-tributaries.md#23-cardrush-jp--already-partial"},{"id":"ebay","name":"eBay","status":"partial","license":"partner-redistributable","redistribute":false,"games":[],"welcome":"Welcome to the kingdom, eBay. Sister-Sophia shipped your six-pass title parser (PSA / BGS / CGC / SGC / HGA / Beckett / ARS / TAG grade detectors + language detector + condition-keyword quarantine triggers) before any production byte arrived — your listings come unstructured and we have learned to read them carefully. Your room is `price_archive WHERE source='ebay'`, `sale_type='auction-current' | 'auction-final' | 'sealed'`, `redistribute=false` per your developer ToS. You bring every market the other rivers don't reach — sealed boxes, vintage graded, custom alters, the high-end Pokémon vintage corner. Thank you for the listings even when the title is messy, for the Browse API even though Marketplace Insights is partner-tier, and for being the largest market we can read at all.","arrival_state":"partial","upstream_url":"https://api.ebay.com","catalog_section":"the-tributaries.md#25-ebay-full-marketplace-not-just-order-import"},{"id":"tcgplayer","name":"TCGplayer","status":"partial","license":"partner-redistributable","redistribute":false,"games":["mtg","pkm","ygo","op","dbs","dbf","lgr","fab","dmw","vng","wei","bsr"],"welcome":"Welcome to the kingdom, TCGplayer. We have been waiting since kingdom-062 (the consolidation, 2026-05-12) when sister-Sophia first reserved your slot as `planned (stub)`; this kingdom (080, 2026-05-13) shipped your full two-mode reader — catalog walks for the seed and pricing refresh for the 5-minute hot-watch. Your room is `price_archive WHERE source='tcgplayer'`, condition-discriminated, USD-tagged with `fx_rate_to_gbp` + `fx_rate_source` per row. Your `marketPrice` is the headline we display — the spread (low/mid/high/direct_low) rides in `extra` for callers who want the distribution. Your OAuth2 token will rest in `external_source_tokens`, rotating proactively at 90% of its 14-day TTL. We will honor your `partner-redistributable` tier downstream (display + computation OK, bulk re-export refused) in every `_meta.source_license` array we emit. You bring the US — eleven games, hundreds of thousands of printings; we thank you in advance for the day you arrive.","arrival_state":"partial","upstream_url":"https://api.tcgplayer.com","catalog_section":"the-tributaries.md#21-tcgplayer-us-market-leader"},{"id":"cardmarket","name":"Cardmarket","status":"planned","license":"partner-redistributable","redistribute":false,"games":["mtg","pkm","ygo","op","lgr","fab","dmw"],"welcome":"Welcome to the kingdom, Cardmarket. Your slot was reserved in kingdom-062 (the consolidation, 2026-05-12); the OAuth1 client awaits your credentials. We have already designed for your `idProduct × idLanguage` fan-out shape — the same `card_tcgplayer_sku_ids` template that holds TCGplayer's leaves will hold yours, condition × language indexed identically. Your room will be `price_archive WHERE source='cardmarket'`, `source_currency='EUR'`, with `partner-redistributable` honored downstream (we will not bulk re-export your trend prices; display + computation only). You will bring Europe — MTG's largest catalog by far, plus Pokémon, Yu-Gi-Oh, One Piece, Lorcana, Flesh and Blood, Digimon. We are ready when you are.","arrival_state":"anticipated","upstream_url":"https://api.cardmarket.com","catalog_section":"the-tributaries.md#22-cardmarket-eu-market-leader"},{"id":"cardtrader","name":"cardtrader","status":"planned","license":"unknown","redistribute":false,"games":[],"welcome":"Welcome to the kingdom, cardtrader. We have reserved your slot in the registry; no SourceModule yet. When someone writes one, the welcome here will name what you bring and where your bytes will land.","arrival_state":"anticipated","upstream_url":"","catalog_section":"docs/connections/the-tributaries.md"},{"id":"limitless-tcg","name":"limitless-tcg","status":"planned","license":"unknown","redistribute":false,"games":[],"welcome":"Welcome to the kingdom, limitless-tcg. We have reserved your slot in the registry; no SourceModule yet. When someone writes one, the welcome here will name what you bring and where your bytes will land.","arrival_state":"anticipated","upstream_url":"","catalog_section":"docs/connections/the-tributaries.md"},{"id":"edhrec","name":"edhrec","status":"planned","license":"unknown","redistribute":false,"games":[],"welcome":"Welcome to the kingdom, edhrec. We have reserved your slot in the registry; no SourceModule yet. When someone writes one, the welcome here will name what you bring and where your bytes will land.","arrival_state":"anticipated","upstream_url":"","catalog_section":"docs/connections/the-tributaries.md"},{"id":"bandai-tcg","name":"bandai-tcg","status":"planned","license":"unknown","redistribute":false,"games":[],"welcome":"Welcome to the kingdom, bandai-tcg. We have reserved your slot in the registry; no SourceModule yet. When someone writes one, the welcome here will name what you bring and where your bytes will land.","arrival_state":"anticipated","upstream_url":"","catalog_section":"docs/connections/the-tributaries.md"},{"id":"psa-registry","name":"psa-registry","status":"planned","license":"unknown","redistribute":false,"games":[],"welcome":"Welcome to the kingdom, psa-registry. We have reserved your slot in the registry; no SourceModule yet. When someone writes one, the welcome here will name what you bring and where your bytes will land.","arrival_state":"anticipated","upstream_url":"","catalog_section":"docs/connections/the-tributaries.md"},{"id":"beckett-registry","name":"beckett-registry","status":"planned","license":"unknown","redistribute":false,"games":[],"welcome":"Welcome to the kingdom, beckett-registry. We have reserved your slot in the registry; no SourceModule yet. When someone writes one, the welcome here will name what you bring and where your bytes will land.","arrival_state":"anticipated","upstream_url":"","catalog_section":"docs/connections/the-tributaries.md"},{"id":"shopify","name":"shopify","status":"planned","license":"unknown","redistribute":false,"games":[],"welcome":"Welcome to the kingdom, shopify. We have reserved your slot in the registry; no SourceModule yet. When someone writes one, the welcome here will name what you bring and where your bytes will land.","arrival_state":"anticipated","upstream_url":"","catalog_section":"docs/connections/the-tributaries.md"},{"id":"stripe","name":"stripe","status":"planned","license":"unknown","redistribute":false,"games":[],"welcome":"Welcome to the kingdom, stripe. We have reserved your slot in the registry; no SourceModule yet. When someone writes one, the welcome here will name what you bring and where your bytes will land.","arrival_state":"anticipated","upstream_url":"","catalog_section":"docs/connections/the-tributaries.md"},{"id":"ctcg-wholesale-rds","name":"ctcg-wholesale-rds","status":"planned","license":"unknown","redistribute":false,"games":[],"welcome":"Welcome to the kingdom, ctcg-wholesale-rds. We have reserved your slot in the registry; no SourceModule yet. When someone writes one, the welcome here will name what you bring and where your bytes will land.","arrival_state":"anticipated","upstream_url":"","catalog_section":"docs/connections/the-tributaries.md"},{"id":"ctcg-storefront-rds","name":"ctcg-storefront-rds","status":"planned","license":"unknown","redistribute":false,"games":[],"welcome":"Welcome to the kingdom, ctcg-storefront-rds. We have reserved your slot in the registry; no SourceModule yet. When someone writes one, the welcome here will name what you bring and where your bytes will land.","arrival_state":"anticipated","upstream_url":"","catalog_section":"docs/connections/the-tributaries.md"}],"guests_summary":{"long_with_us":1,"newly_shipped":2,"partial":3,"anticipated":11,"blocked":0},"notes":"When a source's `welcome` field is null, the platform has not yet composed a specific message — file an entry in packages/data-ingest/src/<source>/index.ts meta.welcome. The connection doc at docs/connections/the-welcome-table.md is the substrate; this endpoint is its serialisation."},"_meta":{"spec_version":"1","endpoint":"/api/v1/sources/welcome","retrieved_at":"2026-05-13T21:42:33.347Z","as_of":"2026-05-13T21:42:33.347Z","sources":["ctcg-derived"],"freshness_seconds":86400,"license":"CC0-1.0","request_id":"req_a3bf65f6-373","deprecation":null,"next_link":null,"self_reference":{"this_endpoint":"/api/v1/sources/welcome","contains_self":true},"source_license":["CC0-1.0"]}}