Connectors (9 sources), pipeline workers, valuation, indices, CLI, docs (agents A–D, G)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
75 changed files +19,993 −2
modified
.env.example
+1 −1
@@ -32,4 +32,4 @@ LOG_LEVEL=info | ||
| 32 | 32 | |
| 33 | 33 | # Transactional email (verification codes, MFA codes, alerts, digests) |
| 34 | 34 | RESEND_API_KEY= |
| 35 | −EMAIL_FROM=RareIndex <no-reply@rareindex.io> | |
| 35 | +EMAIL_FROM="RareIndex <no-reply@rareindex.io>" | |
added
README.md
+88 −0
@@ -0,0 +1,88 @@ | ||
| 1 | +# RareIndex | |
| 2 | + | |
| 3 | +**The global market for collectibles.** RareIndex.io is a market-intelligence, search, pricing and | |
| 4 | +index platform for collectible assets: trading cards, sports cards, watches, sneakers, LEGO, comics, | |
| 5 | +video games, toys, coins, art, wine and, over time, every category the collectibles economy contains. | |
| 6 | +It continuously collects public market data from marketplaces, auction houses, dealers, grading | |
| 7 | +companies, manufacturer catalogs and archives, resolves it into one canonical asset graph, and turns | |
| 8 | +it into research-grade data: valuations with confidence levels, comparable sales, live listings, | |
| 9 | +rarity and liquidity scores, price histories, and the RareIndex family of indices (`RARE` and its | |
| 10 | +category subindices). | |
| 11 | + | |
| 12 | +RareIndex is an intelligence platform, not a marketplace aggregator. Every number shown is traceable | |
| 13 | +to its source, every estimate carries a sample size and a confidence level, and when the evidence is | |
| 14 | +insufficient the platform says "Data unavailable" rather than inventing a figure. The full product | |
| 15 | +mandate is in [`docs/SPEC-original.md`](docs/SPEC-original.md); the condensed working version that | |
| 16 | +guides implementation is [`CLAUDE.md`](CLAUDE.md). | |
| 17 | + | |
| 18 | +## Architecture | |
| 19 | + | |
| 20 | +TypeScript end-to-end in a pnpm monorepo: Next.js 16 web app, Fastify public API, PostgreSQL 17 | |
| 21 | +(pg_trgm, unaccent, pgvector) as system of record, pg-boss workers for the ingestion pipeline, and a | |
| 22 | +connector framework routing Direct API → Firecrawl → Scrapfly with quality scoring and health | |
| 23 | +metrics. See [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) for the layout and data flow, and | |
| 24 | +[`docs/adr/`](docs/adr/) for the decisions behind it. | |
| 25 | + | |
| 26 | +``` | |
| 27 | +apps/web · apps/api · packages/{shared,database,taxonomy,connectors,valuation,indices,search,ai} | |
| 28 | +workers/ · connectors/ (+ registry.json) · data/{taxonomy,fixtures} · docs/ · scripts/ | |
| 29 | +``` | |
| 30 | + | |
| 31 | +Data flow: `raw_records` (immutable) → `normalize()` → `normalized_records` → entity resolution → | |
| 32 | +`assets` / `asset_variants` → dedupe and price validation (flags + audit log, nothing deleted) → | |
| 33 | +`sales` / `listings` / `auction_lots` / `price_observations` → valuations and stats → indices. | |
| 34 | + | |
| 35 | +## Quick start | |
| 36 | + | |
| 37 | +Requirements: Node ≥ 22, pnpm 11, PostgreSQL 17 with the `pgvector` extension available. | |
| 38 | + | |
| 39 | +```bash | |
| 40 | +pnpm install | |
| 41 | +createdb rareindex | |
| 42 | +cp .env.example .env # fill DATABASE_URL, FIRECRAWL_API_KEY, SCRAPFLY_API_KEY, AI and Resend keys | |
| 43 | +pnpm db:migrate && pnpm db:seed # creates extensions + tables, seeds taxonomy, graders, indices, registry | |
| 44 | + | |
| 45 | +pnpm dev:web # Next.js on http://localhost:3000 | |
| 46 | +pnpm dev:api # public REST API (/v1) | |
| 47 | +pnpm worker # pipeline workers (crawl, normalize, resolve, value, index) | |
| 48 | +pnpm ri --help # operational CLI (run a connector, recompute valuations, health…) | |
| 49 | +``` | |
| 50 | + | |
| 51 | +Useful scripts: `pnpm typecheck`, `pnpm test`, `pnpm build`, `pnpm db:generate` (after editing | |
| 52 | +`packages/database/src/schema/*`), `pnpm tsx scripts/build-registry.ts` (rebuilds | |
| 53 | +`connectors/registry.json` from per-connector `meta.json` files). | |
| 54 | + | |
| 55 | +## Adding a connector | |
| 56 | + | |
| 57 | +A new source needs only four things: connector metadata (`meta.json`), an extraction schema, a pure | |
| 58 | +`normalize()` adapter and real captured fixtures with tests. The rest of the pipeline works | |
| 59 | +unchanged. Conventions and the module contract are in [`connectors/README.md`](connectors/README.md). | |
| 60 | + | |
| 61 | +## Data honesty rules | |
| 62 | + | |
| 63 | +- No fabricated data, ever: no invented sales, prices, populations, market caps, auctions or listings. | |
| 64 | +- Price-guide values are stored as observations, never as transactions. | |
| 65 | +- Valuations are published only with sample size, confidence, low/high range and timestamp. | |
| 66 | +- Outliers are flagged and audited, never silently deleted. | |
| 67 | +- Sale dates come from the source; crawl time is never substituted. | |
| 68 | +- Historical prices are converted with the exchange rate of the sale date. | |
| 69 | + | |
| 70 | +Details: [`docs/adr/0002-data-honesty.md`](docs/adr/0002-data-honesty.md). | |
| 71 | + | |
| 72 | +## Deployment | |
| 73 | + | |
| 74 | +Production runs on a MacLustr node (PostgreSQL 17 + pgvector) deployed through the `mld` gateway: | |
| 75 | +PM2 processes `rareindex-web`, `rareindex-api`, `rareindex-worker` and an ngrok tunnel serving | |
| 76 | +**https://www.rareindex.io**. Secrets live only in the node's `.env` / the `mld` manifest. | |
| 77 | + | |
| 78 | +## Disclaimers | |
| 79 | + | |
| 80 | +RareIndex is an information platform. Valuations are estimates derived from observed public data. | |
| 81 | +Listing prices are not confirmed transactions. Past performance does not guarantee future results. | |
| 82 | +RareIndex does not authenticate items. Third-party names, marks and content belong to their owners | |
| 83 | +and are attributed to their sources; RareIndex respects source terms, robots policies, rate limits, | |
| 84 | +copyright, privacy and database rights, and never bypasses authentication, paywalls or CAPTCHAs. | |
| 85 | + | |
| 86 | +## License | |
| 87 | + | |
| 88 | +Proprietary — © 2026 RareIndex. All rights reserved. | |
added
connectors/api/README.md
+23 −0
@@ -0,0 +1,23 @@ | ||
| 1 | +# Official-API connectors | |
| 2 | + | |
| 3 | +Sources with a public, documented API (engine priority `api`, optional `feed` fallback). They provide | |
| 4 | +the **catalog backbone** (canonical printings with deterministic identifiers) plus **price-guide | |
| 5 | +observations** — never transactions. | |
| 6 | + | |
| 7 | +| id | source | catalog | prices | full run | notes | | |
| 8 | +|---|---|---|---|---|---| | |
| 9 | +| `scryfall` | Scryfall bulk `default_cards` (JSONL gz, daily) | ~110k printings × finishes | USD/EUR market (TCGplayer/Cardmarket aggregates), dated with the bulk `updated_at` | 1 listing call + 1 streamed 78 MB download | cursor `{updatedAt}` skips unchanged bulks; `lookup()` for scryfall.com card URLs | | |
| 10 | +| `pokemontcg` | api.pokemontcg.io v2 | ~19k cards / 174 sets (× TCGplayer variants) | TCGplayer USD low/mid/high/market per variant + Cardmarket EUR aggregates, each with its own `updatedAt` | 1 sets call + ~190 card pages at ≤28 req/min ≈ 8 min | API is intermittently 5xx → 5 retries w/ backoff, then GitHub mirror (catalog only) | | |
| 11 | +| `ygoprodeck` | db.ygoprodeck.com v7 `cardinfo.php?misc=yes` | ~14.5k cards / ~44k printings | per-printing `set_price` (USD, `guide_value`) + card-level tcgplayer/cardmarket/ebay/amazon/coolstuffinc | ONE ~21 MB request | no price timestamp → dated at fetch, confidence 0.7 | | |
| 12 | + | |
| 13 | +## Identifiers for entity resolution | |
| 14 | + | |
| 15 | +- Scryfall: `scryfall_id` (printing, unique) · `oracle_id` (card concept) · `tcgplayer_id` · `cardmarket_id` · `mtgo_id` · `multiverse_id` · `finish` (nonfoil/foil/etched). Canonical printing key ≈ `magic_the_gathering|<setCode>|<number>|<lang>|<variant>`. | |
| 16 | +- Pokémon: `pokemontcg_id` (e.g. `base1-4`) · `pokemontcg_set_id` · `tcgplayer_url`. Variants: null / Holo / Reverse Holo / 1st Edition / 1st Edition Holo (from TCGplayer price keys). Canonical key ≈ `pokemon|<setCode>|<number>|<variant>`. | |
| 17 | +- Yu-Gi-Oh!: `ygo_id` (passcode) · `konami_id` · `set_code` (e.g. `LOB-EN001`; same code may exist in several rarities → distinct printings). Canonical key ≈ `yugioh|<set_code>|<rarity>`. | |
| 18 | + | |
| 19 | +## Tooling | |
| 20 | + | |
| 21 | +- `pnpm tsx connectors/api/_lib/capture.ts` — refresh fixtures from live responses (small, trimmed). | |
| 22 | +- `pnpm tsx connectors/api/_lib/smoke.ts [id…]` — live probe crawl (limit 5) through the real router/context. | |
| 23 | +- Tests: `pnpm --filter @rareindex/source-connectors run test` (fixture suite + targeted assertions). | |
added
connectors/api/_lib/capture.ts
+74 −0
@@ -0,0 +1,74 @@ | ||
| 1 | +/** | |
| 2 | + * Build fixtures for the official-API connectors from live captures. | |
| 3 | + * Usage: pnpm tsx connectors/api/_lib/capture.ts (fetches live; keeps fixtures small) | |
| 4 | + */ | |
| 5 | +import { saveFixture } from '@rareindex/connectors/testing'; | |
| 6 | +import { trimCard as trimScryfall } from '../scryfall/index.js'; | |
| 7 | +import { trimCard as trimPokemon } from '../pokemontcg/index.js'; | |
| 8 | +import { trimCard as trimYgo } from '../ygoprodeck/index.js'; | |
| 9 | + | |
| 10 | +const UA = { 'user-agent': 'RareIndexBot/0.1 (+https://www.rareindex.io/about/data)', accept: 'application/json' }; | |
| 11 | + | |
| 12 | +async function getJson<T>(url: string, attempts = 5): Promise<T> { | |
| 13 | + let last = ''; | |
| 14 | + for (let i = 0; i < attempts; i++) { | |
| 15 | + const res = await fetch(url, { headers: UA }); | |
| 16 | + if (res.ok) return (await res.json()) as T; | |
| 17 | + last = `HTTP ${res.status}`; | |
| 18 | + await new Promise((r) => setTimeout(r, 1500 * 2 ** i)); | |
| 19 | + } | |
| 20 | + throw new Error(`${url}: ${last}`); | |
| 21 | +} | |
| 22 | + | |
| 23 | +const fetchedAt = new Date().toISOString(); | |
| 24 | + | |
| 25 | +// ---- Scryfall: single cards via API (same shape as bulk lines) ---- | |
| 26 | +const scry: Array<[string, string, Record<string, unknown>]> = [ | |
| 27 | + ['lea/232', 'black-lotus-alpha', { count: 2, kinds: ['catalog_item', 'price_observation'], 'first.attributes.setCode': 'LEA' }], | |
| 28 | + ['sld/1145', 'secret-lair-foil-nonfoil', { minCount: 4 }], | |
| 29 | + ['neo/430', 'neo-showcase-foil-only', { minCount: 2 }], | |
| 30 | + ['clb/682', 'clb-double-faced', { minCount: 2 }], | |
| 31 | +]; | |
| 32 | +for (const [path, name, expect] of scry) { | |
| 33 | + const card = await getJson<Record<string, unknown>>(`https://api.scryfall.com/cards/${path}`); | |
| 34 | + await new Promise((r) => setTimeout(r, 120)); | |
| 35 | + saveFixture('scryfall', name, { | |
| 36 | + raw: { url: String(card.scryfall_uri), externalId: String(card.id), kind: 'catalog_item', engine: 'api', fetchedAt: new Date(fetchedAt), payload: { card: trimScryfall(card), bulkUpdatedAt: '2026-09-06T21:05:43.673+00:00' } }, | |
| 37 | + expect: { count: (expect.count as number | undefined), minCount: (expect.minCount as number | undefined), kinds: expect.kinds as string[] | undefined, requiredFields: ['attributes.identifiers.scryfall_id', 'attributes.setCode', 'attributes.number'] }, | |
| 38 | + note: `Live capture of https://api.scryfall.com/cards/${path}; bulkUpdatedAt copied from the bulk-data listing of the same day.`, | |
| 39 | + }); | |
| 40 | +} | |
| 41 | + | |
| 42 | +// ---- Pokémon TCG: base1 (API is flaky → retries) ---- | |
| 43 | +const pk = await getJson<{ data: Record<string, unknown>[] }>('https://api.pokemontcg.io/v2/cards?q=set.id:base1'); | |
| 44 | +const wanted = new Set(['base1-1', 'base1-4', 'base1-58', 'base1-102']); | |
| 45 | +for (const c of pk.data.filter((x) => wanted.has(String(x.id)))) { | |
| 46 | + const card = trimPokemon(c); | |
| 47 | + saveFixture('pokemontcg', String(card.id), { | |
| 48 | + raw: { url: `https://api.pokemontcg.io/v2/cards/${card.id}`, externalId: card.id, kind: 'catalog_item', engine: 'api', fetchedAt: new Date(fetchedAt), payload: { card, source: 'api' } }, | |
| 49 | + expect: { minCount: 1, kinds: ['catalog_item', 'price_observation'], requiredFields: ['attributes.identifiers.pokemontcg_id', 'attributes.set', 'attributes.number', 'attributes.year'] }, | |
| 50 | + note: 'Live capture of https://api.pokemontcg.io/v2/cards?q=set.id:base1 (trimmed).', | |
| 51 | + }); | |
| 52 | +} | |
| 53 | +// GitHub mirror shape (no prices) | |
| 54 | +const mirror = await getJson<Record<string, unknown>[]>('https://raw.githubusercontent.com/PokemonTCG/pokemon-tcg-data/master/cards/en/base1.json'); | |
| 55 | +const sets = await getJson<Record<string, unknown>[]>('https://raw.githubusercontent.com/PokemonTCG/pokemon-tcg-data/master/sets/en.json'); | |
| 56 | +const base1 = sets.find((s) => s.id === 'base1') as Record<string, unknown>; | |
| 57 | +const m4 = mirror.find((c) => c.id === 'base1-4')!; | |
| 58 | +saveFixture('pokemontcg', 'base1-4-mirror', { | |
| 59 | + raw: { url: 'https://api.pokemontcg.io/v2/cards/base1-4', externalId: 'base1-4', kind: 'catalog_item', engine: 'feed', fetchedAt: new Date(fetchedAt), payload: { card: trimPokemon(m4, base1 as never), source: 'github-mirror' } }, | |
| 60 | + expect: { count: 1, kinds: ['catalog_item'], first: { 'attributes.variant': null } }, | |
| 61 | + note: 'GitHub mirror fallback (PokemonTCG/pokemon-tcg-data): catalog only, no prices.', | |
| 62 | +}); | |
| 63 | + | |
| 64 | +// ---- YGOPRODeck ---- | |
| 65 | +const ygo = await getJson<{ data: Record<string, unknown>[] }>('https://db.ygoprodeck.com/api/v7/cardinfo.php?name=Dark%20Magician%7CBlue-Eyes%20White%20Dragon%7CPot%20of%20Greed&misc=yes'); | |
| 66 | +for (const c of ygo.data) { | |
| 67 | + const card = trimYgo(c); | |
| 68 | + saveFixture('ygoprodeck', String(card.id), { | |
| 69 | + raw: { url: String(card.ygoprodeck_url), externalId: String(card.id), kind: 'catalog_item', engine: 'api', fetchedAt: new Date(fetchedAt), payload: { card } }, | |
| 70 | + expect: { minCount: (card.card_sets?.length ?? 1), kinds: ['catalog_item', 'price_observation'], requiredFields: ['attributes.identifiers.ygo_id', 'attributes.set', 'attributes.number'] }, | |
| 71 | + note: 'Live capture of cardinfo.php?name=…&misc=yes (trimmed).', | |
| 72 | + }); | |
| 73 | +} | |
| 74 | +console.log('fixtures written'); | |
added
connectors/api/_lib/shared.ts
+62 −0
@@ -0,0 +1,62 @@ | ||
| 1 | +import { z } from 'zod'; | |
| 2 | +import { AssetAttributesSchema, NormalizedCatalogItemSchema, NormalizedPriceObservationSchema, type NormalizedCatalogItem, type NormalizedPriceObservation } from '@rareindex/shared'; | |
| 3 | + | |
| 4 | +/** Helpers shared by the official-API connectors (kept inside connectors/api, not the framework). */ | |
| 5 | + | |
| 6 | +export type AttrInput = z.input<typeof AssetAttributesSchema>; | |
| 7 | + | |
| 8 | +export function attrs(input: AttrInput) { | |
| 9 | + return AssetAttributesSchema.parse(input); | |
| 10 | +} | |
| 11 | + | |
| 12 | +export function catalogItem(input: z.input<typeof NormalizedCatalogItemSchema>): NormalizedCatalogItem { | |
| 13 | + return NormalizedCatalogItemSchema.parse(input); | |
| 14 | +} | |
| 15 | + | |
| 16 | +export function priceObservation(input: z.input<typeof NormalizedPriceObservationSchema>): NormalizedPriceObservation { | |
| 17 | + return NormalizedPriceObservationSchema.parse(input); | |
| 18 | +} | |
| 19 | + | |
| 20 | +/** "2026/09/06" | "2026-09-06" | "2022/10/10 15:12:00" → UTC Date, else null. */ | |
| 21 | +export function parseSlashDate(s: string | null | undefined): Date | null { | |
| 22 | + if (!s) return null; | |
| 23 | + const m = s.match(/^(\d{4})[/-](\d{2})[/-](\d{2})/); | |
| 24 | + if (!m) return null; | |
| 25 | + const d = new Date(Date.UTC(Number(m[1]), Number(m[2]) - 1, Number(m[3]))); | |
| 26 | + return Number.isNaN(d.getTime()) ? null : d; | |
| 27 | +} | |
| 28 | + | |
| 29 | +export function yearOf(s: string | null | undefined): number | null { | |
| 30 | + const d = parseSlashDate(s); | |
| 31 | + return d ? d.getUTCFullYear() : null; | |
| 32 | +} | |
| 33 | + | |
| 34 | +/** Parse a numeric price from string/number; null when missing, non-finite or ≤ 0. */ | |
| 35 | +export function num(v: unknown): number | null { | |
| 36 | + if (v === null || v === undefined || v === '') return null; | |
| 37 | + const n = typeof v === 'number' ? v : Number.parseFloat(String(v)); | |
| 38 | + return Number.isFinite(n) && n > 0 ? n : null; | |
| 39 | +} | |
| 40 | + | |
| 41 | +/** "Charizard · Base Set #4/102 (1999)" style title. */ | |
| 42 | +export function makeTitle(parts: { name: string; set?: string | null; number?: string | null; total?: number | string | null; year?: number | null; variant?: string | null }): string { | |
| 43 | + let t = parts.name; | |
| 44 | + const loc: string[] = []; | |
| 45 | + if (parts.set) loc.push(parts.set); | |
| 46 | + if (parts.number) loc.push(`#${parts.number}${parts.total ? `/${parts.total}` : ''}`); | |
| 47 | + if (loc.length) t += ` · ${loc.join(' ')}`; | |
| 48 | + if (parts.variant) t += ` ${parts.variant}`; | |
| 49 | + if (parts.year) t += ` (${parts.year})`; | |
| 50 | + return t; | |
| 51 | +} | |
| 52 | + | |
| 53 | +/** Generic retry wrapper for flaky public APIs (in addition to the HTTP engine's own retries). */ | |
| 54 | +export async function withRetries<T>(fn: () => Promise<T>, isOk: (v: T) => boolean, attempts = 4, baseDelayMs = 1500): Promise<T> { | |
| 55 | + let last!: T; | |
| 56 | + for (let i = 0; i < attempts; i++) { | |
| 57 | + last = await fn(); | |
| 58 | + if (isOk(last)) return last; | |
| 59 | + await new Promise((r) => setTimeout(r, baseDelayMs * 2 ** i)); | |
| 60 | + } | |
| 61 | + return last; | |
| 62 | +} | |
added
connectors/api/_lib/smoke.ts
+34 −0
@@ -0,0 +1,34 @@ | ||
| 1 | +/** | |
| 2 | + * Live smoke test for the official-API connectors: real router + crawl context, probe mode, limit 5. | |
| 3 | + * Usage: pnpm tsx connectors/api/_lib/smoke.ts [scryfall|pokemontcg|ygoprodeck] | |
| 4 | + */ | |
| 5 | +import { createCrawlContext, createRouter, loadConnector } from '@rareindex/connectors'; | |
| 6 | +import { childLogger } from '@rareindex/shared'; | |
| 7 | + | |
| 8 | +const ids = process.argv.slice(2).length ? process.argv.slice(2) : ['scryfall', 'pokemontcg', 'ygoprodeck']; | |
| 9 | +const router = createRouter({}); | |
| 10 | +for (const id of ids) { | |
| 11 | + const started = Date.now(); | |
| 12 | + const connector = await loadConnector(id); | |
| 13 | + const ctx = createCrawlContext({ router, meta: connector.meta, options: { mode: 'probe', limit: 5, ...(id === 'pokemontcg' ? { seeds: ['base1'] } : {}) }, log: childLogger({ connector: id, level: 'warn' }) }); | |
| 14 | + let raws = 0; | |
| 15 | + let normalized = 0; | |
| 16 | + let firstPrinted = false; | |
| 17 | + for await (const raw of connector.crawl(ctx)) { | |
| 18 | + raws++; | |
| 19 | + const out = await connector.normalize({ ...raw, externalId: raw.externalId ?? null, fetchedAt: raw.fetchedAt ?? new Date() }); | |
| 20 | + normalized += out.length; | |
| 21 | + if (!firstPrinted) { | |
| 22 | + firstPrinted = true; | |
| 23 | + for (const r of out.slice(0, 3)) { | |
| 24 | + const summary = r.kind === 'price_observation' ? `${r.priceKind} ${r.price} ${r.currency} @ ${r.observationDate.toISOString().slice(0, 10)}` : r.kind === 'catalog_item' ? `variant=${r.attributes.variant ?? '-'} ids=${JSON.stringify(r.attributes.identifiers)}` : ''; | |
| 25 | + console.log(` [${id}] ${r.kind}: ${'rawTitle' in r ? r.rawTitle : ''} → ${summary}`); | |
| 26 | + } | |
| 27 | + } | |
| 28 | + } | |
| 29 | + if (id === 'scryfall') { | |
| 30 | + const looked = await connector.lookup?.('https://scryfall.com/card/lea/232/black-lotus', ctx); | |
| 31 | + console.log(` [${id}] lookup(black lotus) → ${looked?.length ?? 0} raw record(s)`); | |
| 32 | + } | |
| 33 | + console.log(`[${id}] raw=${raws} normalized=${normalized} engineStats=${JSON.stringify(ctx.engineStats)} anomalies=${ctx.anomalies.length} ms=${Date.now() - started}`); | |
| 34 | +} | |
added
connectors/api/comicconnect/_smoke.ts
+20 −0
@@ -0,0 +1,20 @@ | ||
| 1 | +/** Live smoke: pnpm tsx connectors/api/comicconnect/_smoke.ts (CAPTURE=1 to save fixtures) */ | |
| 2 | +import { createRouter, createCrawlContext, getConnectorMeta } from '@rareindex/connectors'; | |
| 3 | +import { saveFixture } from '@rareindex/connectors/testing'; | |
| 4 | +import { env } from '@rareindex/shared'; | |
| 5 | +import createConnector from './index.js'; | |
| 6 | + | |
| 7 | +const e = env(); | |
| 8 | +const meta = getConnectorMeta('comicconnect'); | |
| 9 | +const connector = createConnector(meta); | |
| 10 | +const router = createRouter({ firecrawlApiKey: e.FIRECRAWL_API_KEY, scrapflyApiKey: e.SCRAPFLY_API_KEY }); | |
| 11 | +const ctx = createCrawlContext({ router, meta, options: { mode: 'probe', limit: Number(process.env.LIMIT ?? 2) } }); | |
| 12 | + | |
| 13 | +for await (const raw of connector.crawl(ctx)) { | |
| 14 | + const recs = await connector.normalize({ ...raw, externalId: raw.externalId ?? null, fetchedAt: raw.fetchedAt ?? new Date() }); | |
| 15 | + const p = raw.payload as { page: number; totalResults: number | null; cards: unknown[] }; | |
| 16 | + console.log(`\n# page ${p.page} (${p.totalResults} total) — ${p.cards.length} cards → ${recs.length} sales`); | |
| 17 | + for (const r of recs.slice(0, 3)) console.log(JSON.stringify(r).slice(0, 800)); | |
| 18 | + if (process.env.CAPTURE) saveFixture('comicconnect', `sold-comics-page-${p.page}`, { raw: { url: raw.url, externalId: raw.externalId ?? null, kind: raw.kind, engine: raw.engine, fetchedAt: raw.fetchedAt ?? new Date(), payload: raw.payload }, expect: { minCount: 10, kinds: ['sale'] }, note: `captured live from ${raw.url}` }); | |
| 19 | +} | |
| 20 | +console.log('\nengine stats', ctx.engineStats, 'anomalies', ctx.anomalies); | |
added
connectors/api/comicconnect/index.test.ts
+51 −0
@@ -0,0 +1,51 @@ | ||
| 1 | +import { describe, expect, it } from 'vitest'; | |
| 2 | +import { getConnectorMeta } from '@rareindex/connectors'; | |
| 3 | +import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; | |
| 4 | +import createConnector, { parseComicTitle, parseGradeLine, parseSoldPage } from './index.js'; | |
| 5 | + | |
| 6 | +const connector = createConnector(getConnectorMeta('comicconnect')); | |
| 7 | + | |
| 8 | +describe('comicconnect', () => { | |
| 9 | + runFixtureSuite(connector, it, expect); | |
| 10 | + | |
| 11 | + it('parses titles and grade lines', () => { | |
| 12 | + expect(parseComicTitle('X-MEN (1963-2011) #282')).toEqual({ series: 'X-Men', seriesYears: '1963-2011', issue: '282', year: null, groupLot: false }); | |
| 13 | + expect(parseComicTitle('AMAZING SPIDER-MAN (1963) #300')).toMatchObject({ series: 'Amazing Spider-Man', issue: '300', year: 1963 }); | |
| 14 | + expect(parseComicTitle('X-MEN GROUP LOT #1 Comic Book Group Lot').groupLot).toBe(true); | |
| 15 | + expect(parseGradeLine('Marvel CGC NM/M: 9.8')).toEqual({ publisher: 'Marvel', grader: 'cgc', grade: '9.8', label: 'NM/M' }); | |
| 16 | + expect(parseGradeLine('Marvel NM: 9.4')).toEqual({ publisher: 'Marvel', grader: 'raw', grade: '9.4', label: 'NM' }); | |
| 17 | + expect(parseGradeLine('DC CGC NM: 9.4')).toEqual({ publisher: 'DC', grader: 'cgc', grade: '9.4', label: 'NM' }); | |
| 18 | + expect(parseGradeLine('DC VF-: 7.5')).toEqual({ publisher: 'DC', grader: 'raw', grade: '7.5', label: 'VF-' }); | |
| 19 | + expect(parseGradeLine('Robin Snyder/Steve Ditko VF: 8.0')).toMatchObject({ publisher: 'Robin Snyder/Steve Ditko', grader: 'raw', grade: '8.0' }); | |
| 20 | + }); | |
| 21 | + | |
| 22 | + it('maps sold cards to sales with grader, publisher and hammer price', async () => { | |
| 23 | + const fx = loadFixture('comicconnect', 'sold-comics-page-1'); | |
| 24 | + const out = await connector.normalize(fx.raw); | |
| 25 | + expect(out.length).toBe(20); | |
| 26 | + const graded = out.find((r) => r.kind === 'sale' && r.grade.grader === 'cgc'); | |
| 27 | + if (graded?.kind !== 'sale') throw new Error('expected a CGC sale'); | |
| 28 | + expect(graded.attributes.categorySlug).toMatch(/_comics$/); | |
| 29 | + expect(graded.attributes.brand).toBeTruthy(); | |
| 30 | + expect(graded.attributes.number).toMatch(/^\d/); | |
| 31 | + expect(graded.currency).toBe('USD'); | |
| 32 | + expect(graded.buyerPremiumIncluded).toBe(false); | |
| 33 | + expect(graded.auctionHouse).toBe('ComicConnect'); | |
| 34 | + expect(graded.saleDate.getUTCFullYear()).toBeGreaterThanOrEqual(2020); | |
| 35 | + const marvel = out.filter((r) => r.kind === 'sale' && r.attributes.categorySlug === 'marvel_comics'); | |
| 36 | + expect(marvel.length).toBeGreaterThan(0); | |
| 37 | + }); | |
| 38 | + | |
| 39 | + it('parses the browse page HTML', () => { | |
| 40 | + const html = `<div class="table_info">479,121 Results</div> | |
| 41 | + <div class="itempreview details listingbox" data-type="auction" bp="true"><div class="mainimg"><a href="/item/1"><img src="/coverimages/gallery425/a.jpg"></a></div> | |
| 42 | + <a href="/item/1"><div class="titleline ">BATMAN (1940-2011) #1</div></a><div class="grade">DC CGC VG: 4.0</div> | |
| 43 | + <div class="comments wrap"><b>A 15% BUYER'S PREMIUM</b><br>off-white pages<div class="ctip">dup</div></div> | |
| 44 | + <div class="endednotice">Sold on Monday, 06/24/2024 11:46 PM</div><div class="pricing"><span class="lbl">Sold For</span><span class="val prc">$402,500.00</span><span class="reserve">(No Reserve)</span></div></div>`; | |
| 45 | + const p = parseSoldPage(html, 'https://www.comicconnect.com/browse/comics/?filtertype=Sold&page=1', 1); | |
| 46 | + expect(p.totalResults).toBe(479121); | |
| 47 | + expect(p.cards).toEqual([ | |
| 48 | + { itemId: '1', url: 'https://www.comicconnect.com/item/1', title: 'BATMAN (1940-2011) #1', gradeLine: 'DC CGC VG: 4.0', soldOn: 'Monday, 06/24/2024 11:46 PM', soldFor: 402500, saleType: 'auction', buyersPremium: true, noReserve: true, comments: 'off-white pages', image: 'https://www.comicconnect.com/coverimages/gallery425/a.jpg' }, | |
| 49 | + ]); | |
| 50 | + }); | |
| 51 | +}); | |
added
connectors/api/comicconnect/index.ts
+214 −0
@@ -0,0 +1,214 @@ | ||
| 1 | +import { z } from 'zod'; | |
| 2 | +import { BaseConnector, html as H, type ConnectorMeta, type CrawlContext, type RawRecordInput, type RawRecordLike } from '@rareindex/connectors'; | |
| 3 | +import { getGrader, normalizeCondition } from '@rareindex/taxonomy'; | |
| 4 | +import { parsePrice, type AssetAttributes, type NormalizedRecord, type NormalizedSale } from '@rareindex/shared'; | |
| 5 | + | |
| 6 | +/** | |
| 7 | + * ComicConnect sold archive — realised prices for comic books (auctions + fixed-price sales). | |
| 8 | + * One raw record per browse page (compact parsed cards); normalise → one sale per card. | |
| 9 | + */ | |
| 10 | + | |
| 11 | +const BASE = 'https://www.comicconnect.com'; | |
| 12 | +const PARSER_VERSION = '1.0.0'; | |
| 13 | + | |
| 14 | +export const CardSchema = z.object({ | |
| 15 | + itemId: z.string(), | |
| 16 | + url: z.string(), | |
| 17 | + title: z.string(), | |
| 18 | + gradeLine: z.string(), | |
| 19 | + soldOn: z.string(), | |
| 20 | + soldFor: z.number(), | |
| 21 | + saleType: z.enum(['auction', 'sale', 'unknown']), | |
| 22 | + buyersPremium: z.boolean(), | |
| 23 | + noReserve: z.boolean(), | |
| 24 | + comments: z.string().nullable(), | |
| 25 | + image: z.string().nullable(), | |
| 26 | +}); | |
| 27 | +export const PagePayloadSchema = z.object({ kind: z.literal('sold_page'), url: z.string(), page: z.number(), totalResults: z.number().nullable(), cards: z.array(CardSchema) }); | |
| 28 | +export type PagePayload = z.infer<typeof PagePayloadSchema>; | |
| 29 | + | |
| 30 | +export function parseSoldPage(htmlText: string, url: string, page: number): PagePayload { | |
| 31 | + const $ = H.load(htmlText); | |
| 32 | + const total = $('.table_info').first().text().match(/([\d,]+)\s+Results/)?.[1] ?? null; | |
| 33 | + const cards: z.infer<typeof CardSchema>[] = []; | |
| 34 | + $('.itempreview').each((_, el) => { | |
| 35 | + const $el = $(el); | |
| 36 | + const href = $el.find('.titleline').closest('a').attr('href') ?? $el.find('.mainimg a').attr('href') ?? ''; | |
| 37 | + const itemId = href.match(/\/item\/(\d+)/)?.[1]; | |
| 38 | + const title = H.text($el.find('.titleline')); | |
| 39 | + const gradeLine = H.text($el.find('.grade')) ?? ''; | |
| 40 | + const soldOn = (H.text($el.find('.endednotice')) ?? '').replace(/^Sold on\s*/i, ''); | |
| 41 | + const priceTxt = H.text($el.find('.pricing .val.prc')); | |
| 42 | + const price = parsePrice(priceTxt, 'USD'); | |
| 43 | + if (!itemId || !title || !soldOn || !price || price.amount <= 0) return; | |
| 44 | + const dataType = $el.attr('data-type') ?? ''; | |
| 45 | + const comments = $el.find('.comments').clone().find('.ctip').remove().end(); | |
| 46 | + comments.find('b').remove(); | |
| 47 | + const commentText = H.text(comments); | |
| 48 | + const img = $el.find('.mainimg img').attr('src') ?? null; | |
| 49 | + cards.push({ | |
| 50 | + itemId, | |
| 51 | + url: `${BASE}/item/${itemId}`, | |
| 52 | + title, | |
| 53 | + gradeLine, | |
| 54 | + soldOn, | |
| 55 | + soldFor: price.amount, | |
| 56 | + saleType: dataType === 'auction' ? 'auction' : dataType === 'sale' || dataType === 'buynow' ? 'sale' : 'unknown', | |
| 57 | + buyersPremium: $el.attr('bp') === 'true', | |
| 58 | + noReserve: /no reserve/i.test($el.find('.reserve').text()), | |
| 59 | + comments: commentText, | |
| 60 | + image: img ? (img.startsWith('http') ? img : BASE + img) : null, | |
| 61 | + }); | |
| 62 | + }); | |
| 63 | + return { kind: 'sold_page', url, page, totalResults: total ? Number(total.replace(/,/g, '')) : null, cards }; | |
| 64 | +} | |
| 65 | + | |
| 66 | +/** "X-MEN (1963-2011) #282" → { series: 'X-Men', seriesYears: '1963-2011', issue: '282', year: 1963 when single year } */ | |
| 67 | +export function parseComicTitle(title: string): { series: string; seriesYears: string | null; issue: string | null; year: number | null; groupLot: boolean } { | |
| 68 | + const groupLot = /group lot/i.test(title); | |
| 69 | + let t = title.replace(/\s+Comic Book Group Lot$/i, '').trim(); | |
| 70 | + const issue = t.match(/#\s*([0-9]+[A-Za-z]?(?:\.[0-9]+)?(?:\/[0-9]+)?)/)?.[1] ?? null; | |
| 71 | + const yearsM = t.match(/\((\d{4})(?:-(\d{2,4}))?\)/); | |
| 72 | + const seriesYears = yearsM ? yearsM[0].slice(1, -1) : null; | |
| 73 | + const year = yearsM && !yearsM[2] ? Number(yearsM[1]) : null; | |
| 74 | + if (yearsM) t = t.replace(yearsM[0], ' '); | |
| 75 | + if (issue) t = t.replace(/#\s*[0-9]+[A-Za-z]?(?:\.[0-9]+)?(?:\/[0-9]+)?/, ' '); | |
| 76 | + const series = t | |
| 77 | + .replace(/\s+/g, ' ') | |
| 78 | + .trim() | |
| 79 | + .toLowerCase() | |
| 80 | + .replace(/(^|[\s(/-])([a-z])/g, (m, pre: string, c: string) => pre + c.toUpperCase()); | |
| 81 | + return { series, seriesYears, issue, year, groupLot }; | |
| 82 | +} | |
| 83 | + | |
| 84 | +/** "Marvel CGC NM/M: 9.8" → { publisher: 'Marvel', grader: 'cgc', grade: '9.8', label: 'NM/M' } ; "Marvel VF/NM: 9.0" → raw grade */ | |
| 85 | +const GRADE_LABEL = '(?:GEM MT|GEM|MT|NM/M|NM\\+|NM-|NM|VF/NM|VF\\+|VF-|VF|FN/VF|FN\\+|FN-|FN|VG/FN|VG\\+|VG-|VG|GD/VG|GD\\+|GD-|GD|FR/GD|FR|PR|M)'; | |
| 86 | +const GRADE_LINE_RE = new RegExp(`^(.*?)\\s*(?:\\b(CGC|CBCS|PGX|EGS)\\b\\s*)?(${GRADE_LABEL})?\\s*:\\s*([\\d.]+)\\s*$`); | |
| 87 | + | |
| 88 | +export function parseGradeLine(line: string): { publisher: string | null; grader: string | null; grade: string | null; label: string | null } { | |
| 89 | + const m = line.trim().match(GRADE_LINE_RE); | |
| 90 | + if (!m) return { publisher: line || null, grader: null, grade: null, label: null }; | |
| 91 | + const publisher = m[1]?.trim() || null; | |
| 92 | + const grader = m[2] ? (getGrader(m[2])?.slug ?? m[2].toLowerCase()) : 'raw'; | |
| 93 | + return { publisher, grader, grade: m[4] ?? null, label: m[3]?.trim() ?? null }; | |
| 94 | +} | |
| 95 | + | |
| 96 | +function publisherCategory(publisher: string | null): string { | |
| 97 | + const p = (publisher ?? '').toLowerCase(); | |
| 98 | + if (/marvel|timely|atlas/.test(p)) return 'marvel_comics'; | |
| 99 | + if (/^dc\b|dc comics|vertigo|wildstorm|national/.test(p)) return 'dc_comics'; | |
| 100 | + return 'independent_comics'; | |
| 101 | +} | |
| 102 | + | |
| 103 | +export class ComicConnectConnector extends BaseConnector { | |
| 104 | + readonly version = '1.0.0'; | |
| 105 | + readonly parserVersion = PARSER_VERSION; | |
| 106 | + protected override minIntervalMs = 1500; | |
| 107 | + | |
| 108 | + async *crawl(ctx: CrawlContext): AsyncIterable<RawRecordInput> { | |
| 109 | + const browsePath = String(this.meta.config.browsePath ?? '/browse/comics/'); | |
| 110 | + const pages = Number(this.meta.config.pagesPerRun ?? 25); | |
| 111 | + const sort = String(this.meta.config.sortType ?? 'ended_desc'); | |
| 112 | + const start = ctx.options.mode === 'backfill' ? Number(ctx.options.cursor?.nextPage ?? 1) : 1; | |
| 113 | + let count = 0; | |
| 114 | + for (let page = start; page < start + pages; page++) { | |
| 115 | + if (ctx.signal?.aborted || this.reached(ctx, count)) break; | |
| 116 | + const url = `${BASE}${browsePath}?filtertype=Sold&sort_type=${encodeURIComponent(sort)}&page=${page}`; | |
| 117 | + await this.throttle(); | |
| 118 | + const res = await ctx.fetch(url, { | |
| 119 | + responseType: 'text', | |
| 120 | + expect: ['title', 'price', 'date', 'status'], | |
| 121 | + parse: (r) => { | |
| 122 | + if (!r.html) return null; | |
| 123 | + const p = parseSoldPage(r.html, url, page); | |
| 124 | + const c = p.cards[0]; | |
| 125 | + return { title: c?.title ?? null, price: c?.soldFor ?? null, date: c?.soldOn ?? null, status: c ? 'sold' : null }; | |
| 126 | + }, | |
| 127 | + }); | |
| 128 | + if (!res.success || !res.html) { | |
| 129 | + ctx.anomaly('page_fetch_failed', `${url}: ${res.error ?? res.httpStatus}`); | |
| 130 | + break; | |
| 131 | + } | |
| 132 | + const payload = parseSoldPage(res.html, url, page); | |
| 133 | + if (payload.cards.length === 0) { | |
| 134 | + ctx.anomaly('empty_page', url); | |
| 135 | + break; | |
| 136 | + } | |
| 137 | + count++; | |
| 138 | + if (ctx.options.mode === 'backfill') await ctx.setCursor({ nextPage: page + 1, updatedAt: new Date().toISOString() }); | |
| 139 | + yield { url, externalId: `sold:${browsePath}:${page}`, kind: 'sale', engine: res.engine, httpStatus: res.httpStatus, payload, fetchedAt: res.fetchedAt }; | |
| 140 | + } | |
| 141 | + } | |
| 142 | + | |
| 143 | + async normalize(raw: RawRecordLike): Promise<NormalizedRecord[]> { | |
| 144 | + const p = PagePayloadSchema.parse(raw.payload); | |
| 145 | + const out: NormalizedSale[] = []; | |
| 146 | + for (const c of p.cards) { | |
| 147 | + const t = parseComicTitle(c.title); | |
| 148 | + const g = parseGradeLine(c.gradeLine); | |
| 149 | + // "Friday, 08/14/2026 12:15 AM" → US local (Eastern) — we keep the date portion as UTC midnight to avoid faking precision. | |
| 150 | + const dm = c.soldOn.match(/(\d{1,2})\/(\d{1,2})\/(\d{4})/); | |
| 151 | + if (!dm) continue; | |
| 152 | + const saleDate = new Date(Date.UTC(Number(dm[3]), Number(dm[1]) - 1, Number(dm[2]))); | |
| 153 | + const categorySlug = publisherCategory(g.publisher); | |
| 154 | + const rawCondition = g.grader === 'raw' && g.label ? g.label : null; | |
| 155 | + const attributes: AssetAttributes = { | |
| 156 | + categorySlug, | |
| 157 | + subcategorySlug: null, | |
| 158 | + franchise: null, | |
| 159 | + brand: g.publisher, | |
| 160 | + series: t.seriesYears ? `${t.series} (${t.seriesYears})` : t.series, | |
| 161 | + set: t.series, | |
| 162 | + setCode: null, | |
| 163 | + name: t.series, | |
| 164 | + model: null, | |
| 165 | + reference: null, | |
| 166 | + number: t.issue, | |
| 167 | + year: t.year, | |
| 168 | + edition: null, | |
| 169 | + variant: null, | |
| 170 | + language: 'English', | |
| 171 | + region: null, | |
| 172 | + country: 'US', | |
| 173 | + material: null, | |
| 174 | + size: null, | |
| 175 | + color: null, | |
| 176 | + rarity: null, | |
| 177 | + productionQuantity: null, | |
| 178 | + originalMsrp: null, | |
| 179 | + originalMsrpCurrency: null, | |
| 180 | + identifiers: { comicconnect_item: c.itemId }, | |
| 181 | + metadata: { series_years: t.seriesYears, buyers_premium_applies: c.buyersPremium, no_reserve: c.noReserve, sold_on_raw: c.soldOn, grade_label: g.label }, | |
| 182 | + }; | |
| 183 | + out.push({ | |
| 184 | + kind: 'sale', | |
| 185 | + connectorId: this.meta.id, | |
| 186 | + sourceId: this.meta.sourceId, | |
| 187 | + sourceUrl: c.url, | |
| 188 | + externalId: c.itemId, | |
| 189 | + rawTitle: `${c.title} ${c.gradeLine}`.trim(), | |
| 190 | + description: c.comments, | |
| 191 | + imageUrls: c.image ? [c.image] : [], | |
| 192 | + attributes, | |
| 193 | + grade: { grader: g.grader === 'raw' ? 'raw' : g.grader, grade: g.grader === 'raw' ? null : g.grade, qualifier: null, certificationNumber: null }, | |
| 194 | + condition: { condition: normalizeCondition(categorySlug, rawCondition ?? (g.grader === 'raw' ? g.label : null)), conditionRaw: g.grader === 'raw' ? `${g.label ?? ''} ${g.grade ?? ''}`.trim() || null : null, completeness: null }, | |
| 195 | + observedAt: raw.fetchedAt, | |
| 196 | + confidence: 0.9, | |
| 197 | + parserVersion: PARSER_VERSION, | |
| 198 | + saleType: c.saleType === 'auction' ? 'auction' : c.saleType === 'sale' ? 'fixed_price' : 'unknown', | |
| 199 | + saleDate, | |
| 200 | + price: c.soldFor, | |
| 201 | + currency: 'USD', | |
| 202 | + buyerPremiumIncluded: false, | |
| 203 | + quantity: 1, | |
| 204 | + isBundle: t.groupLot, | |
| 205 | + location: 'US', | |
| 206 | + auctionHouse: 'ComicConnect', | |
| 207 | + lotNumber: null, | |
| 208 | + }); | |
| 209 | + } | |
| 210 | + return out; | |
| 211 | + } | |
| 212 | +} | |
| 213 | + | |
| 214 | +export default (meta: ConnectorMeta) => new ComicConnectConnector(meta); | |
added
connectors/api/comicconnect/meta.json
+34 −0
@@ -0,0 +1,34 @@ | ||
| 1 | +{ | |
| 2 | + "id": "comicconnect", | |
| 3 | + "displayName": "ComicConnect (sold archive)", | |
| 4 | + "sourceId": "comicconnect", | |
| 5 | + "sourceName": "ComicConnect", | |
| 6 | + "sourceType": "auction_house", | |
| 7 | + "sourceUrl": "https://www.comicconnect.com", | |
| 8 | + "module": "api/comicconnect", | |
| 9 | + "enginePriority": ["api", "firecrawl", "scrapfly"], | |
| 10 | + "categories": ["comics", "marvel_comics", "dc_comics", "independent_comics"], | |
| 11 | + "regions": ["US"], | |
| 12 | + "languages": ["en"], | |
| 13 | + "currency": ["USD"], | |
| 14 | + "supportsListings": false, | |
| 15 | + "supportsSold": true, | |
| 16 | + "supportsAuctions": true, | |
| 17 | + "supportsImages": true, | |
| 18 | + "supportsCatalog": false, | |
| 19 | + "supportsPopulation": false, | |
| 20 | + "supportsLookup": false, | |
| 21 | + "refreshFrequencyMinutes": 720, | |
| 22 | + "priority": "high", | |
| 23 | + "trustScore": 0.9, | |
| 24 | + "attributionRequired": true, | |
| 25 | + "termsUrl": "https://www.comicconnect.com/terms", | |
| 26 | + "accessNotes": "Public sold archive (/browse/comics/?filtertype=Sold, ~479k results, 20 per page) fetched over plain HTTPS with the RareIndex user agent. robots.txt: Allow / with Content-Signal search=yes, ai-train=no (we only index sale facts and link back). Each card exposes title, publisher + grade, sold date/time, 'Sold For' price and whether a 15% buyer's premium applies (bp attribute) — we store hammer price with buyer_premium_included=false and keep the premium note in metadata. No login, no bidder data. 1.5 s politeness delay.", | |
| 27 | + "enabled": true, | |
| 28 | + "schemaVersion": "1.0", | |
| 29 | + "config": { | |
| 30 | + "browsePath": "/browse/comics/", | |
| 31 | + "pagesPerRun": 25, | |
| 32 | + "sortType": "ended_desc" | |
| 33 | + } | |
| 34 | +} | |
added
connectors/api/pokemontcg/index.test.ts
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +import { describe, expect, it } from 'vitest'; | |
| 2 | +import { getConnectorMeta } from '@rareindex/connectors'; | |
| 3 | +import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; | |
| 4 | +import createConnector, { TCGPLAYER_VARIANTS } from './index.js'; | |
| 5 | + | |
| 6 | +const connector = createConnector(getConnectorMeta('pokemontcg')); | |
| 7 | + | |
| 8 | +describe('pokemontcg', () => { | |
| 9 | + runFixtureSuite(connector, it, expect); | |
| 10 | + | |
| 11 | + it('maps Base Set Charizard to a Holo variant with TCGplayer + Cardmarket observations', async () => { | |
| 12 | + const out = await connector.normalize(loadFixture('pokemontcg', 'base1-4').raw); | |
| 13 | + const cats = out.filter((r) => r.kind === 'catalog_item'); | |
| 14 | + expect(cats).toHaveLength(1); | |
| 15 | + const cat = cats[0]!; | |
| 16 | + if (cat.kind !== 'catalog_item') throw new Error('kind'); | |
| 17 | + expect(cat.attributes).toMatchObject({ categorySlug: 'pokemon', set: 'Base', setCode: 'BS', number: '4', year: 1999, rarity: 'Rare Holo', variant: 'Holo', language: 'English' }); | |
| 18 | + expect(cat.attributes.identifiers.pokemontcg_id).toBe('base1-4'); | |
| 19 | + expect(cat.rawTitle).toBe('Charizard · Base #4/102 Holo (1999)'); | |
| 20 | + expect(cat.releaseDate?.toISOString()).toBe('1999-01-09T00:00:00.000Z'); | |
| 21 | + const obs = out.filter((r) => r.kind === 'price_observation'); | |
| 22 | + const usd = obs.filter((o) => o.kind === 'price_observation' && o.currency === 'USD'); | |
| 23 | + const eur = obs.filter((o) => o.kind === 'price_observation' && o.currency === 'EUR'); | |
| 24 | + expect(usd.map((o) => (o.kind === 'price_observation' ? o.priceKind : '')).sort()).toEqual(['high', 'low', 'market', 'mid']); | |
| 25 | + expect(eur.length).toBeGreaterThanOrEqual(3); | |
| 26 | + for (const o of usd) if (o.kind === 'price_observation') expect(o.observationDate.toISOString().slice(0, 10)).toMatch(/^\d{4}-\d{2}-\d{2}$/); | |
| 27 | + // observation dates come from the source's updatedAt, not the crawl time | |
| 28 | + const tcgMarket = usd.find((o) => o.kind === 'price_observation' && o.priceKind === 'market'); | |
| 29 | + expect(tcgMarket && tcgMarket.kind === 'price_observation' ? tcgMarket.observationDate.getTime() : 0).not.toBe(loadFixture('pokemontcg', 'base1-4').raw.fetchedAt.getTime()); | |
| 30 | + expect(obs.every((o) => o.kind === 'price_observation' && o.attributes.variant === 'Holo')).toBe(true); | |
| 31 | + }); | |
| 32 | + | |
| 33 | + it('keeps base (normal) printings with variant null', async () => { | |
| 34 | + const out = await connector.normalize(loadFixture('pokemontcg', 'base1-58').raw); | |
| 35 | + const cat = out.find((r) => r.kind === 'catalog_item'); | |
| 36 | + expect(cat && cat.kind === 'catalog_item' ? cat.attributes.variant : 'x').toBeNull(); | |
| 37 | + }); | |
| 38 | + | |
| 39 | + it('handles the GitHub mirror payload (catalog only, no prices)', async () => { | |
| 40 | + const out = await connector.normalize(loadFixture('pokemontcg', 'base1-4-mirror').raw); | |
| 41 | + expect(out).toHaveLength(1); | |
| 42 | + expect(out[0]?.kind).toBe('catalog_item'); | |
| 43 | + expect(out[0] && 'attributes' in out[0] ? out[0].attributes.metadata.dataSource : '').toBe('github-mirror'); | |
| 44 | + }); | |
| 45 | + | |
| 46 | + it('covers the known TCGplayer variant keys', () => { | |
| 47 | + expect(TCGPLAYER_VARIANTS['1stEditionHolofoil']).toBe('1st Edition Holo'); | |
| 48 | + expect(TCGPLAYER_VARIANTS.reverseHolofoil).toBe('Reverse Holo'); | |
| 49 | + }); | |
| 50 | +}); | |
added
connectors/api/pokemontcg/index.ts
+325 −0
@@ -0,0 +1,325 @@ | ||
| 1 | +import { z } from 'zod'; | |
| 2 | +import { BaseConnector, type ConnectorMeta, type CrawlContext, type RawRecordInput, type RawRecordLike } from '@rareindex/connectors'; | |
| 3 | +import { type NormalizedRecord } from '@rareindex/shared'; | |
| 4 | +import { attrs, catalogItem, makeTitle, num, parseSlashDate, priceObservation, withRetries, yearOf } from '../_lib/shared.js'; | |
| 5 | + | |
| 6 | +const API = 'https://api.pokemontcg.io/v2'; | |
| 7 | + | |
| 8 | +const SetSchema = z.object({ | |
| 9 | + id: z.string(), | |
| 10 | + name: z.string(), | |
| 11 | + series: z.string().optional(), | |
| 12 | + printedTotal: z.number().optional(), | |
| 13 | + total: z.number().optional(), | |
| 14 | + ptcgoCode: z.string().optional(), | |
| 15 | + releaseDate: z.string().optional(), | |
| 16 | + updatedAt: z.string().optional(), | |
| 17 | + images: z.object({ symbol: z.string().optional(), logo: z.string().optional() }).optional(), | |
| 18 | +}); | |
| 19 | +type PkSet = z.infer<typeof SetSchema>; | |
| 20 | + | |
| 21 | +const PriceBlock = z.object({ low: z.number().nullable().optional(), mid: z.number().nullable().optional(), high: z.number().nullable().optional(), market: z.number().nullable().optional(), directLow: z.number().nullable().optional() }); | |
| 22 | + | |
| 23 | +const CardSchema = z.object({ | |
| 24 | + id: z.string(), | |
| 25 | + name: z.string(), | |
| 26 | + supertype: z.string().optional(), | |
| 27 | + subtypes: z.array(z.string()).optional(), | |
| 28 | + hp: z.string().optional(), | |
| 29 | + types: z.array(z.string()).optional(), | |
| 30 | + number: z.string(), | |
| 31 | + artist: z.string().optional(), | |
| 32 | + rarity: z.string().optional(), | |
| 33 | + flavorText: z.string().optional(), | |
| 34 | + nationalPokedexNumbers: z.array(z.number()).optional(), | |
| 35 | + regulationMark: z.string().nullable().optional(), | |
| 36 | + images: z.object({ small: z.string().optional(), large: z.string().optional() }).optional(), | |
| 37 | + set: SetSchema, | |
| 38 | + tcgplayer: z.object({ url: z.string().optional(), updatedAt: z.string().optional(), prices: z.record(z.string(), PriceBlock).optional() }).optional(), | |
| 39 | + cardmarket: z.object({ url: z.string().optional(), updatedAt: z.string().optional(), prices: z.record(z.string(), z.number().nullable()).optional() }).optional(), | |
| 40 | +}); | |
| 41 | +type PkCard = z.infer<typeof CardSchema>; | |
| 42 | + | |
| 43 | +const RawPayloadSchema = z.object({ card: CardSchema, source: z.enum(['api', 'github-mirror']).default('api') }); | |
| 44 | + | |
| 45 | +const KEEP = ['id', 'name', 'supertype', 'subtypes', 'hp', 'types', 'number', 'artist', 'rarity', 'flavorText', 'nationalPokedexNumbers', 'regulationMark', 'images', 'set', 'tcgplayer', 'cardmarket'] as const; | |
| 46 | + | |
| 47 | +export function trimCard(card: Record<string, unknown>, set?: PkSet): PkCard { | |
| 48 | + const out: Record<string, unknown> = {}; | |
| 49 | + for (const k of KEEP) if (card[k] !== undefined) out[k] = card[k]; | |
| 50 | + if (!out.set && set) out.set = set; | |
| 51 | + if (out.set && typeof out.set === 'object') { | |
| 52 | + const s = out.set as Record<string, unknown>; | |
| 53 | + delete s.legalities; | |
| 54 | + } | |
| 55 | + return CardSchema.parse(out); | |
| 56 | +} | |
| 57 | + | |
| 58 | +/** TCGplayer price-variant key → RareIndex variant label (null = base printing). */ | |
| 59 | +export const TCGPLAYER_VARIANTS: Record<string, string | null> = { | |
| 60 | + normal: null, | |
| 61 | + holofoil: 'Holo', | |
| 62 | + reverseHolofoil: 'Reverse Holo', | |
| 63 | + unlimited: null, | |
| 64 | + unlimitedHolofoil: 'Holo', | |
| 65 | + '1stEdition': '1st Edition', | |
| 66 | + '1stEditionNormal': '1st Edition', | |
| 67 | + '1stEditionHolofoil': '1st Edition Holo', | |
| 68 | +}; | |
| 69 | + | |
| 70 | +export class PokemonTcgConnector extends BaseConnector { | |
| 71 | + readonly version = '1.0.0'; | |
| 72 | + readonly parserVersion = '1.0.0'; | |
| 73 | + protected override minIntervalMs = 2100; // ≈ 28 req/min, under the keyless 30/min ceiling | |
| 74 | + | |
| 75 | + private headers(): Record<string, string> { | |
| 76 | + const key = process.env.POKEMONTCG_API_KEY; | |
| 77 | + return key ? { 'x-api-key': key } : {}; | |
| 78 | + } | |
| 79 | + | |
| 80 | + private async apiGet(ctx: CrawlContext, url: string) { | |
| 81 | + await this.throttle(); | |
| 82 | + return withRetries( | |
| 83 | + () => ctx.fetch(url, { engines: ['api'], headers: this.headers(), timeoutMs: 120_000 }), | |
| 84 | + (r) => r.success && r.json !== null, | |
| 85 | + 5, | |
| 86 | + 2000, | |
| 87 | + ); | |
| 88 | + } | |
| 89 | + | |
| 90 | + async *crawl(ctx: CrawlContext): AsyncIterable<RawRecordInput> { | |
| 91 | + const pageSize = Number(ctx.meta.config.pageSize ?? 250); | |
| 92 | + const mirror = String(ctx.meta.config.mirrorBase ?? 'https://raw.githubusercontent.com/PokemonTCG/pokemon-tcg-data/master'); | |
| 93 | + let sets: PkSet[] = []; | |
| 94 | + const setsRes = await this.apiGet(ctx, `${API}/sets?pageSize=250&orderBy=releaseDate`); | |
| 95 | + if (setsRes.success && setsRes.json) { | |
| 96 | + sets = z.array(SetSchema).parse((setsRes.json as { data: unknown[] }).data); | |
| 97 | + } else { | |
| 98 | + ctx.anomaly('blocked_or_down', `sets endpoint failed (${setsRes.error}); using GitHub mirror for the set list`); | |
| 99 | + const m = await ctx.fetch(`${mirror}/sets/en.json`, { engines: ['api'] }); | |
| 100 | + if (!m.success || !m.json) throw new Error(`pokemontcg: sets unavailable from API and mirror: ${m.error}`); | |
| 101 | + sets = z.array(SetSchema).parse(m.json); | |
| 102 | + } | |
| 103 | + sets.sort((a, b) => (a.releaseDate ?? '').localeCompare(b.releaseDate ?? '')); | |
| 104 | + const filterIds = ctx.options.seeds?.length ? new Set(ctx.options.seeds) : null; | |
| 105 | + let setIndex = Number(ctx.options.cursor?.setIndex ?? 0); | |
| 106 | + let page = Number(ctx.options.cursor?.page ?? 1); | |
| 107 | + let count = 0; | |
| 108 | + for (; setIndex < sets.length; setIndex++, page = 1) { | |
| 109 | + const set = sets[setIndex]!; | |
| 110 | + if (filterIds && !filterIds.has(set.id)) continue; | |
| 111 | + let usedMirror = false; | |
| 112 | + for (;;) { | |
| 113 | + const url = `${API}/cards?q=set.id:${encodeURIComponent(set.id)}&pageSize=${pageSize}&page=${page}`; | |
| 114 | + const res = await this.apiGet(ctx, url); | |
| 115 | + let cards: Record<string, unknown>[] = []; | |
| 116 | + let totalCount = 0; | |
| 117 | + if (res.success && res.json) { | |
| 118 | + const body = res.json as { data: Record<string, unknown>[]; totalCount?: number; count?: number }; | |
| 119 | + cards = body.data ?? []; | |
| 120 | + totalCount = body.totalCount ?? cards.length; | |
| 121 | + } else if (page === 1) { | |
| 122 | + // API down for this set → public GitHub mirror (same schema, no prices). | |
| 123 | + const m = await ctx.fetch(`${mirror}/cards/en/${encodeURIComponent(set.id)}.json`, { engines: ['api'] }); | |
| 124 | + if (!m.success || !Array.isArray(m.json)) { | |
| 125 | + ctx.anomaly('empty_page', `set ${set.id}: API ${res.error}; mirror ${m.error ?? 'not an array'}`); | |
| 126 | + break; | |
| 127 | + } | |
| 128 | + cards = m.json as Record<string, unknown>[]; | |
| 129 | + totalCount = cards.length; | |
| 130 | + usedMirror = true; | |
| 131 | + ctx.anomaly('fallback_feed', `set ${set.id} served from GitHub mirror (no prices)`); | |
| 132 | + } else { | |
| 133 | + ctx.anomaly('empty_page', `set ${set.id} page ${page}: ${res.error}`); | |
| 134 | + break; | |
| 135 | + } | |
| 136 | + const fetchedAt = new Date(); | |
| 137 | + for (const c of cards) { | |
| 138 | + let card: PkCard; | |
| 139 | + try { | |
| 140 | + card = trimCard(c, set); | |
| 141 | + } catch (err) { | |
| 142 | + ctx.anomaly('parse_failure', `card ${String(c.id)}: ${err instanceof Error ? err.message : String(err)}`); | |
| 143 | + continue; | |
| 144 | + } | |
| 145 | + yield { | |
| 146 | + url: `${API}/cards/${card.id}`, | |
| 147 | + externalId: card.id, | |
| 148 | + kind: 'catalog_item', | |
| 149 | + engine: usedMirror ? 'feed' : 'api', | |
| 150 | + httpStatus: 200, | |
| 151 | + payload: { card, source: usedMirror ? 'github-mirror' : 'api' }, | |
| 152 | + fetchedAt, | |
| 153 | + }; | |
| 154 | + count++; | |
| 155 | + if (this.reached(ctx, count)) return; | |
| 156 | + } | |
| 157 | + if (usedMirror || page * pageSize >= totalCount || cards.length === 0) break; | |
| 158 | + page++; | |
| 159 | + await ctx.setCursor({ setIndex, page }); | |
| 160 | + } | |
| 161 | + await ctx.setCursor({ setIndex: setIndex + 1, page: 1 }); | |
| 162 | + } | |
| 163 | + await ctx.setCursor({ setIndex: 0, page: 1, completedAt: new Date().toISOString() }); | |
| 164 | + ctx.log.info({ count }, 'pokemontcg crawl done'); | |
| 165 | + } | |
| 166 | + | |
| 167 | + async normalize(raw: RawRecordLike): Promise<NormalizedRecord[]> { | |
| 168 | + const { card, source } = RawPayloadSchema.parse(raw.payload); | |
| 169 | + const set = card.set; | |
| 170 | + const year = yearOf(set.releaseDate); | |
| 171 | + const images = [card.images?.large ?? card.images?.small].filter((x): x is string => Boolean(x)); | |
| 172 | + const sourceUrl = card.tcgplayer?.url ?? `https://pokemontcg.io/card/${card.id}`; | |
| 173 | + const setCode = set.ptcgoCode ?? set.id.toUpperCase(); | |
| 174 | + const out: NormalizedRecord[] = []; | |
| 175 | + | |
| 176 | + const buildAttrs = (variant: string | null) => | |
| 177 | + attrs({ | |
| 178 | + categorySlug: 'pokemon', | |
| 179 | + franchise: 'Pokémon', | |
| 180 | + brand: 'The Pokémon Company', | |
| 181 | + series: set.series ?? null, | |
| 182 | + set: set.name, | |
| 183 | + setCode, | |
| 184 | + name: card.name, | |
| 185 | + number: card.number, | |
| 186 | + year, | |
| 187 | + variant, | |
| 188 | + language: 'English', | |
| 189 | + rarity: card.rarity ?? null, | |
| 190 | + identifiers: { pokemontcg_id: card.id, pokemontcg_set_id: set.id, ...(card.tcgplayer?.url ? { tcgplayer_url: card.tcgplayer.url } : {}), ...(card.cardmarket?.url ? { cardmarket_url: card.cardmarket.url } : {}) }, | |
| 191 | + metadata: { | |
| 192 | + supertype: card.supertype ?? null, | |
| 193 | + subtypes: card.subtypes ?? [], | |
| 194 | + hp: card.hp ?? null, | |
| 195 | + types: card.types ?? [], | |
| 196 | + artist: card.artist ?? null, | |
| 197 | + nationalPokedexNumbers: card.nationalPokedexNumbers ?? [], | |
| 198 | + regulationMark: card.regulationMark ?? null, | |
| 199 | + printedTotal: set.printedTotal ?? null, | |
| 200 | + setTotal: set.total ?? null, | |
| 201 | + setSymbol: set.images?.symbol ?? null, | |
| 202 | + dataSource: source, | |
| 203 | + }, | |
| 204 | + }); | |
| 205 | + | |
| 206 | + const tcg = card.tcgplayer; | |
| 207 | + const tcgDate = parseSlashDate(tcg?.updatedAt) ?? raw.fetchedAt; | |
| 208 | + const variantKeys = Object.keys(tcg?.prices ?? {}).filter((k) => k in TCGPLAYER_VARIANTS); | |
| 209 | + const variants: Array<string | null> = variantKeys.length ? [...new Set(variantKeys.map((k) => TCGPLAYER_VARIANTS[k] ?? null))] : [null]; | |
| 210 | + // Base printing: if the card only exists as holo, the canonical variant is 'Holo'. | |
| 211 | + for (const variant of variants) { | |
| 212 | + const a = buildAttrs(variant); | |
| 213 | + out.push( | |
| 214 | + catalogItem({ | |
| 215 | + kind: 'catalog_item', | |
| 216 | + connectorId: this.meta.id, | |
| 217 | + sourceId: this.meta.sourceId, | |
| 218 | + sourceUrl, | |
| 219 | + externalId: `${card.id}:${variant ?? 'base'}`, | |
| 220 | + rawTitle: makeTitle({ name: card.name, set: set.name, number: card.number, total: set.printedTotal ?? null, year, variant }), | |
| 221 | + description: card.flavorText ?? null, | |
| 222 | + imageUrls: images, | |
| 223 | + attributes: a, | |
| 224 | + observedAt: raw.fetchedAt, | |
| 225 | + confidence: 0.97, | |
| 226 | + parserVersion: this.parserVersion, | |
| 227 | + releaseDate: parseSlashDate(set.releaseDate), | |
| 228 | + }), | |
| 229 | + ); | |
| 230 | + } | |
| 231 | + | |
| 232 | + const kinds: Array<['low' | 'mid' | 'high' | 'market', 'low' | 'mid' | 'high' | 'market']> = [ | |
| 233 | + ['market', 'market'], | |
| 234 | + ['low', 'low'], | |
| 235 | + ['mid', 'mid'], | |
| 236 | + ['high', 'high'], | |
| 237 | + ]; | |
| 238 | + for (const key of variantKeys) { | |
| 239 | + const block = tcg!.prices![key]!; | |
| 240 | + const variant = TCGPLAYER_VARIANTS[key] ?? null; | |
| 241 | + const a = buildAttrs(variant); | |
| 242 | + for (const [field, priceKind] of kinds) { | |
| 243 | + const price = num(block[field]); | |
| 244 | + if (price === null) continue; | |
| 245 | + out.push( | |
| 246 | + priceObservation({ | |
| 247 | + kind: 'price_observation', | |
| 248 | + connectorId: this.meta.id, | |
| 249 | + sourceId: this.meta.sourceId, | |
| 250 | + sourceUrl, | |
| 251 | + externalId: `${card.id}:tcgplayer:${key}:${field}`, | |
| 252 | + rawTitle: makeTitle({ name: card.name, set: set.name, number: card.number, total: set.printedTotal ?? null, year, variant }), | |
| 253 | + imageUrls: images, | |
| 254 | + attributes: { ...a, metadata: { ...a.metadata, priceSource: 'tcgplayer', priceVariantKey: key } }, | |
| 255 | + condition: { condition: 'near_mint', conditionRaw: 'TCGplayer near mint market', completeness: null }, | |
| 256 | + observedAt: tcgDate, | |
| 257 | + confidence: 0.9, | |
| 258 | + parserVersion: this.parserVersion, | |
| 259 | + priceKind, | |
| 260 | + price, | |
| 261 | + currency: 'USD', | |
| 262 | + observationDate: tcgDate, | |
| 263 | + sampleSize: null, | |
| 264 | + }), | |
| 265 | + ); | |
| 266 | + } | |
| 267 | + } | |
| 268 | + | |
| 269 | + const cm = card.cardmarket; | |
| 270 | + if (cm?.prices) { | |
| 271 | + const cmDate = parseSlashDate(cm.updatedAt) ?? raw.fetchedAt; | |
| 272 | + // Cardmarket main prices refer to the card's primary printing; reverseHolo* fields to the reverse holo. | |
| 273 | + const primary = variants.includes('Holo') && !variants.includes(null) ? 'Holo' : variants.includes(null) ? null : (variants[0] ?? null); | |
| 274 | + const main: Array<[string, 'market' | 'low' | 'trend' | 'average_7d' | 'average_30d']> = [ | |
| 275 | + ['averageSellPrice', 'market'], | |
| 276 | + ['lowPrice', 'low'], | |
| 277 | + ['trendPrice', 'trend'], | |
| 278 | + ['avg7', 'average_7d'], | |
| 279 | + ['avg30', 'average_30d'], | |
| 280 | + ]; | |
| 281 | + const reverse: Array<[string, 'market' | 'low' | 'trend' | 'average_7d' | 'average_30d']> = [ | |
| 282 | + ['reverseHoloSell', 'market'], | |
| 283 | + ['reverseHoloLow', 'low'], | |
| 284 | + ['reverseHoloTrend', 'trend'], | |
| 285 | + ['reverseHoloAvg7', 'average_7d'], | |
| 286 | + ['reverseHoloAvg30', 'average_30d'], | |
| 287 | + ]; | |
| 288 | + const emit = (pairs: typeof main, variant: string | null, tag: string) => { | |
| 289 | + const a = buildAttrs(variant); | |
| 290 | + for (const [field, priceKind] of pairs) { | |
| 291 | + const price = num(cm.prices![field]); | |
| 292 | + if (price === null) continue; | |
| 293 | + out.push( | |
| 294 | + priceObservation({ | |
| 295 | + kind: 'price_observation', | |
| 296 | + connectorId: this.meta.id, | |
| 297 | + sourceId: this.meta.sourceId, | |
| 298 | + sourceUrl: cm.url ?? sourceUrl, | |
| 299 | + externalId: `${card.id}:cardmarket:${tag}:${field}`, | |
| 300 | + rawTitle: makeTitle({ name: card.name, set: set.name, number: card.number, total: set.printedTotal ?? null, year, variant }), | |
| 301 | + imageUrls: images, | |
| 302 | + attributes: { ...a, metadata: { ...a.metadata, priceSource: 'cardmarket', priceVariantKey: tag } }, | |
| 303 | + condition: { condition: null, conditionRaw: 'Cardmarket aggregate', completeness: null }, | |
| 304 | + observedAt: cmDate, | |
| 305 | + confidence: 0.75, | |
| 306 | + parserVersion: this.parserVersion, | |
| 307 | + priceKind, | |
| 308 | + price, | |
| 309 | + currency: 'EUR', | |
| 310 | + observationDate: cmDate, | |
| 311 | + sampleSize: null, | |
| 312 | + }), | |
| 313 | + ); | |
| 314 | + } | |
| 315 | + }; | |
| 316 | + emit(main, primary, 'main'); | |
| 317 | + if (variants.includes('Reverse Holo')) emit(reverse, 'Reverse Holo', 'reverse'); | |
| 318 | + } | |
| 319 | + return out; | |
| 320 | + } | |
| 321 | +} | |
| 322 | + | |
| 323 | +export default function createConnector(meta: ConnectorMeta) { | |
| 324 | + return new PokemonTcgConnector(meta); | |
| 325 | +} | |
added
connectors/api/pokemontcg/meta.json
+34 −0
@@ -0,0 +1,34 @@ | ||
| 1 | +{ | |
| 2 | + "id": "pokemontcg", | |
| 3 | + "displayName": "Pokémon TCG API (pokemontcg.io)", | |
| 4 | + "sourceId": "pokemontcg", | |
| 5 | + "sourceName": "Pokémon TCG API", | |
| 6 | + "sourceType": "catalog", | |
| 7 | + "sourceUrl": "https://pokemontcg.io", | |
| 8 | + "module": "api/pokemontcg", | |
| 9 | + "enginePriority": ["api", "feed"], | |
| 10 | + "categories": ["pokemon"], | |
| 11 | + "regions": ["US", "EU"], | |
| 12 | + "languages": ["en"], | |
| 13 | + "currency": ["USD", "EUR"], | |
| 14 | + "supportsListings": false, | |
| 15 | + "supportsSold": false, | |
| 16 | + "supportsAuctions": false, | |
| 17 | + "supportsImages": true, | |
| 18 | + "supportsCatalog": true, | |
| 19 | + "supportsPopulation": false, | |
| 20 | + "supportsLookup": false, | |
| 21 | + "refreshFrequencyMinutes": 1440, | |
| 22 | + "priority": "high", | |
| 23 | + "trustScore": 0.8, | |
| 24 | + "attributionRequired": true, | |
| 25 | + "termsUrl": "https://docs.pokemontcg.io/", | |
| 26 | + "accessNotes": "Public REST API v2 (https://api.pokemontcg.io/v2). Optional X-Api-Key (POKEMONTCG_API_KEY) raises limits (20k/day) — without a key ~1k/day and 30/min. Crawl = sets, then cards per set (pageSize 250, cursor {setIndex,page}). The API is intermittently unavailable (5xx); the connector retries with backoff and falls back to the maintainers' public GitHub mirror (PokemonTCG/pokemon-tcg-data, same card schema, no prices) for the catalog when the API keeps failing. Prices are TCGplayer (USD, per printing variant: normal/holofoil/reverseHolofoil/1stEdition…) and Cardmarket (EUR) daily aggregates with their own updatedAt → stored as price_observations, never as sales. Pokémon © Nintendo/Creatures/GAME FREAK; data attributed to pokemontcg.io.", | |
| 27 | + "enabled": true, | |
| 28 | + "schemaVersion": "1.0", | |
| 29 | + "config": { | |
| 30 | + "pageSize": 250, | |
| 31 | + "requestIntervalMs": 2100, | |
| 32 | + "mirrorBase": "https://raw.githubusercontent.com/PokemonTCG/pokemon-tcg-data/master" | |
| 33 | + } | |
| 34 | +} | |
added
connectors/api/pricecharting/_smoke.ts
+30 −0
@@ -0,0 +1,30 @@ | ||
| 1 | +/** | |
| 2 | + * Live smoke test: pnpm tsx connectors/api/pricecharting/_smoke.ts [consoleUri…] | |
| 3 | + * Crawls a handful of products, prints normalised records, and captures fixtures when | |
| 4 | + * CAPTURE=1 (data/fixtures/pricecharting/<slug>.json). | |
| 5 | + */ | |
| 6 | +import { createRouter, createCrawlContext, getConnectorMeta } from '@rareindex/connectors'; | |
| 7 | +import { saveFixture } from '@rareindex/connectors/testing'; | |
| 8 | +import { env } from '@rareindex/shared'; | |
| 9 | +import createConnector from './index.js'; | |
| 10 | + | |
| 11 | +const e = env(); | |
| 12 | +const meta = getConnectorMeta('pricecharting'); | |
| 13 | +const connector = createConnector(meta); | |
| 14 | +const router = createRouter({ firecrawlApiKey: e.FIRECRAWL_API_KEY, scrapflyApiKey: e.SCRAPFLY_API_KEY }); | |
| 15 | +const seeds = process.argv.slice(2); | |
| 16 | +const ctx = createCrawlContext({ router, meta: { ...meta, config: { ...meta.config, productsPerConsole: 2 } }, options: { mode: 'probe', limit: Number(process.env.LIMIT ?? 6), seeds: seeds.length ? seeds : undefined } }); | |
| 17 | + | |
| 18 | +let n = 0; | |
| 19 | +for await (const raw of connector.crawl(ctx)) { | |
| 20 | + n++; | |
| 21 | + const recs = await connector.normalize({ ...raw, externalId: raw.externalId ?? null, fetchedAt: raw.fetchedAt ?? new Date() }); | |
| 22 | + const p = raw.payload as { title: string; consoleUri: string; sales: unknown[]; prices: unknown[] }; | |
| 23 | + console.log(`\n# ${p.consoleUri} / ${p.title} — ${recs.length} records (${p.sales.length} sales rows, ${p.prices.length} price cells)`); | |
| 24 | + for (const r of recs.slice(0, 4)) console.log(JSON.stringify(r).slice(0, 600)); | |
| 25 | + if (process.env.CAPTURE) { | |
| 26 | + const slug = raw.url.split('/').slice(-2).join('__'); | |
| 27 | + saveFixture('pricecharting', slug, { raw: { url: raw.url, externalId: raw.externalId ?? null, kind: raw.kind, engine: raw.engine, fetchedAt: raw.fetchedAt ?? new Date(), payload: raw.payload }, expect: { minCount: 1, kinds: ['catalog_item', 'price_observation', 'sale'] }, note: `captured live from ${raw.url}` }); | |
| 28 | + } | |
| 29 | +} | |
| 30 | +console.log(`\n${n} raw records; engine stats`, ctx.engineStats, 'anomalies', ctx.anomalies); | |
added
connectors/api/pricecharting/index.test.ts
+75 −0
@@ -0,0 +1,75 @@ | ||
| 1 | +import { describe, expect, it } from 'vitest'; | |
| 2 | +import { getConnectorMeta } from '@rareindex/connectors'; | |
| 3 | +import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; | |
| 4 | +import createConnector, { parseProductPage } from './index.js'; | |
| 5 | + | |
| 6 | +const connector = createConnector(getConnectorMeta('pricecharting')); | |
| 7 | + | |
| 8 | +describe('pricecharting', () => { | |
| 9 | + runFixtureSuite(connector, it, expect); | |
| 10 | + | |
| 11 | + it('maps a video game page to catalog + guide values + eBay sales', async () => { | |
| 12 | + const fx = loadFixture('pricecharting', 'nintendo-64__zelda-ocarina-of-time'); | |
| 13 | + const out = await connector.normalize(fx.raw); | |
| 14 | + const catalog = out.find((r) => r.kind === 'catalog_item'); | |
| 15 | + expect(catalog).toBeTruthy(); | |
| 16 | + if (catalog?.kind !== 'catalog_item') throw new Error(); | |
| 17 | + expect(catalog.attributes.categorySlug).toBe('nintendo_games'); | |
| 18 | + expect(catalog.attributes.set).toBe('Nintendo 64'); | |
| 19 | + expect(catalog.attributes.name).toBe('Zelda Ocarina of Time'); | |
| 20 | + expect(catalog.attributes.identifiers.pricecharting_id).toBe('3977'); | |
| 21 | + expect(catalog.attributes.identifiers.upc).toMatch(/^\d{12}$/); | |
| 22 | + const guides = out.filter((r) => r.kind === 'price_observation'); | |
| 23 | + expect(guides.map((g) => g.kind === 'price_observation' && g.condition.completeness)).toEqual(expect.arrayContaining(['loose', 'cib', 'sealed'])); | |
| 24 | + const sales = out.filter((r) => r.kind === 'sale'); | |
| 25 | + expect(sales.length).toBeGreaterThan(50); | |
| 26 | + const s = sales[0]; | |
| 27 | + if (s?.kind !== 'sale') throw new Error(); | |
| 28 | + expect(s.currency).toBe('USD'); | |
| 29 | + expect(s.externalId).toMatch(/^ebay:\d+$/); | |
| 30 | + expect(s.saleDate.getUTCFullYear()).toBeGreaterThanOrEqual(2024); | |
| 31 | + expect(['loose', 'cib', 'sealed', 'box_only', 'manual_only', null]).toContain(s.condition.completeness); | |
| 32 | + }); | |
| 33 | + | |
| 34 | + it('maps LEGO, Funko and comics pages to the right categories', async () => { | |
| 35 | + const lego = await connector.normalize(loadFixture('pricecharting', 'lego-star-wars__cloud-city-10123').raw); | |
| 36 | + const legoCat = lego.find((r) => r.kind === 'catalog_item'); | |
| 37 | + if (legoCat?.kind !== 'catalog_item') throw new Error(); | |
| 38 | + expect(legoCat.attributes.categorySlug).toBe('lego_sets'); | |
| 39 | + expect(legoCat.attributes.number).toBe('10123'); | |
| 40 | + expect(legoCat.attributes.identifiers.lego_set_number).toBe('10123'); | |
| 41 | + expect(legoCat.attributes.set).toBe('Star Wars'); | |
| 42 | + | |
| 43 | + const funko = await connector.normalize(loadFixture('pricecharting', 'funko-pop-marvel__spider-man-metallic-3').raw); | |
| 44 | + const funkoCat = funko.find((r) => r.kind === 'catalog_item'); | |
| 45 | + if (funkoCat?.kind !== 'catalog_item') throw new Error(); | |
| 46 | + expect(funkoCat.attributes.categorySlug).toBe('funko'); | |
| 47 | + expect(funkoCat.attributes.name).toBe('Spider-Man'); | |
| 48 | + expect(funkoCat.attributes.variant).toBe('Metallic'); | |
| 49 | + expect(funkoCat.attributes.number).toBe('3'); | |
| 50 | + | |
| 51 | + const comic = await connector.normalize(loadFixture('pricecharting', 'comic-books-amazing-spider-man__amazing-spider-man-300-1988').raw); | |
| 52 | + const comicCat = comic.find((r) => r.kind === 'catalog_item'); | |
| 53 | + if (comicCat?.kind !== 'catalog_item') throw new Error(); | |
| 54 | + expect(comicCat.attributes.categorySlug).toBe('marvel_comics'); | |
| 55 | + expect(comicCat.attributes.number).toBe('300'); | |
| 56 | + expect(comicCat.attributes.year).toBe(1988); | |
| 57 | + const graded98 = comic.find((r) => r.kind === 'price_observation' && r.grade.grade === '9.8'); | |
| 58 | + expect(graded98).toBeTruthy(); | |
| 59 | + }); | |
| 60 | + | |
| 61 | + it('parses the product page HTML deterministically', () => { | |
| 62 | + const html = `<html><body><h1 id="product_name">Super Mario 64 [Player's Choice] <a href="/console/nintendo-64">Nintendo 64</a></h1> | |
| 63 | + <script>VGPC.product = { id: 3924, is_comic: false, is_lego_set: false, is_funko_pop: false, is_card: false };</script> | |
| 64 | + <table id="price_data"><tbody><tr><td id="used_price"><span class="price js-price">$39.99</span></td><td id="complete_price"><span class="price js-price">$134.48</span></td><td id="new_price"><span class="price js-price">$1,628.37</span></td></tr></tbody></table> | |
| 65 | + <div class="completed-auctions-used"><table><tbody><tr id="ebay-1"><td class="date">2026-09-05</td><td class="title"><a href="https://www.ebay.com/itm/1">Mario 64 cart</a></td><td class="numeric"><span class="js-price">$37.95</span></td></tr></tbody></table></div> | |
| 66 | + <table><tr><td class="title">UPC:</td><td class="details">045496870010</td></tr></table></body></html>`; | |
| 67 | + const p = parseProductPage(html, 'https://www.pricecharting.com/game/nintendo-64/super-mario-64'); | |
| 68 | + expect(p.title).toBe("Super Mario 64 [Player's Choice]"); | |
| 69 | + expect(p.consoleUri).toBe('nintendo-64'); | |
| 70 | + expect(p.productId).toBe('3924'); | |
| 71 | + expect(p.prices.map((x) => x.value)).toEqual([39.99, 134.48, 1628.37]); | |
| 72 | + expect(p.sales).toEqual([{ tab: 'used', date: '2026-09-05', title: 'Mario 64 cart', price: 37.95, ebayId: '1', listedPrice: null }]); | |
| 73 | + expect(p.details['UPC']).toBe('045496870010'); | |
| 74 | + }); | |
| 75 | +}); | |
added
connectors/api/pricecharting/index.ts
+461 −0
@@ -0,0 +1,461 @@ | ||
| 1 | +import { z } from 'zod'; | |
| 2 | +import { BaseConnector, html as H, type ConnectorMeta, type CrawlContext, type RawRecordInput, type RawRecordLike } from '@rareindex/connectors'; | |
| 3 | +import { extractYear, parsePrice, parseSourceDate, type NormalizedCatalogItem, type NormalizedPriceObservation, type NormalizedRecord, type NormalizedSale, type AssetAttributes } from '@rareindex/shared'; | |
| 4 | + | |
| 5 | +/** | |
| 6 | + * PriceCharting connector — video games, LEGO sets, Funko Pops and comic books. | |
| 7 | + * | |
| 8 | + * A product page carries (a) PriceCharting's own guide value per condition column and | |
| 9 | + * (b) a table of recently completed eBay sales per condition tab (date · title · price · eBay id). | |
| 10 | + * We store the parsed page compactly as one raw record and normalise it into: | |
| 11 | + * - one catalog_item (canonical identity + identifiers), | |
| 12 | + * - one price_observation per non-empty guide column ('guide_value'), | |
| 13 | + * - one sale per completed-sale row (sale_type unknown: eBay auction/BIN not distinguished). | |
| 14 | + */ | |
| 15 | + | |
| 16 | +const BASE = 'https://www.pricecharting.com'; | |
| 17 | +const PARSER_VERSION = '1.0.0'; | |
| 18 | + | |
| 19 | +export const PriceCellSchema = z.object({ key: z.string(), value: z.number().nullable(), raw: z.string() }); | |
| 20 | +export const SaleRowSchema = z.object({ tab: z.string(), date: z.string(), title: z.string(), price: z.number(), ebayId: z.string().nullable(), listedPrice: z.number().nullable() }); | |
| 21 | +export const ProductPayloadSchema = z.object({ | |
| 22 | + kind: z.literal('product'), | |
| 23 | + url: z.string(), | |
| 24 | + productId: z.string().nullable(), | |
| 25 | + consoleUri: z.string(), | |
| 26 | + consoleName: z.string(), | |
| 27 | + title: z.string(), | |
| 28 | + flags: z.object({ isComic: z.boolean(), isLegoSet: z.boolean(), isFunkoPop: z.boolean(), isCard: z.boolean(), isCoin: z.boolean(), isSystem: z.boolean() }), | |
| 29 | + columnLabels: z.array(z.string()), | |
| 30 | + prices: z.array(PriceCellSchema), | |
| 31 | + sales: z.array(SaleRowSchema), | |
| 32 | + details: z.record(z.string(), z.string()), | |
| 33 | + images: z.array(z.string()), | |
| 34 | +}); | |
| 35 | +export type ProductPayload = z.infer<typeof ProductPayloadSchema>; | |
| 36 | + | |
| 37 | +type Family = 'video_games' | 'lego' | 'funko' | 'comics'; | |
| 38 | + | |
| 39 | +interface ColumnMeaning { | |
| 40 | + condition: string | null; | |
| 41 | + completeness: string | null; | |
| 42 | + conditionRaw: string; | |
| 43 | + grade?: string | null; | |
| 44 | +} | |
| 45 | + | |
| 46 | +const PRICE_KEYS = ['used_price', 'complete_price', 'new_price', 'graded_price', 'box_only_price', 'manual_only_price'] as const; | |
| 47 | +const TAB_TO_KEY: Record<string, (typeof PRICE_KEYS)[number]> = { | |
| 48 | + used: 'used_price', | |
| 49 | + cib: 'complete_price', | |
| 50 | + new: 'new_price', | |
| 51 | + graded: 'graded_price', | |
| 52 | + 'box-only': 'box_only_price', | |
| 53 | + 'manual-only': 'manual_only_price', | |
| 54 | + 'loose-and-manual': 'graded_price', | |
| 55 | +}; | |
| 56 | + | |
| 57 | +/** Column semantics per family (PriceCharting reuses the same six cells with different labels). */ | |
| 58 | +const COLUMN_MEANING: Record<Family, Partial<Record<(typeof PRICE_KEYS)[number], ColumnMeaning>>> = { | |
| 59 | + video_games: { | |
| 60 | + used_price: { condition: 'loose', completeness: 'loose', conditionRaw: 'Loose' }, | |
| 61 | + complete_price: { condition: 'cib', completeness: 'cib', conditionRaw: 'Complete in box' }, | |
| 62 | + new_price: { condition: 'sealed', completeness: 'sealed', conditionRaw: 'New / sealed' }, | |
| 63 | + graded_price: { condition: null, completeness: null, conditionRaw: 'Graded (any grader)' }, | |
| 64 | + box_only_price: { condition: null, completeness: 'box_only', conditionRaw: 'Box only' }, | |
| 65 | + manual_only_price: { condition: null, completeness: 'manual_only', conditionRaw: 'Manual only' }, | |
| 66 | + }, | |
| 67 | + lego: { | |
| 68 | + used_price: { condition: 'used_complete', completeness: 'used_complete', conditionRaw: 'Pieces only (used, complete pieces)' }, | |
| 69 | + complete_price: { condition: 'opened_complete', completeness: 'opened_complete', conditionRaw: 'Complete (pieces, box, manual)' }, | |
| 70 | + new_price: { condition: 'sealed', completeness: 'sealed', conditionRaw: 'New / sealed' }, | |
| 71 | + manual_only_price: { condition: null, completeness: 'instructions_only', conditionRaw: 'Manual only' }, | |
| 72 | + }, | |
| 73 | + funko: { | |
| 74 | + used_price: { condition: 'loose', completeness: 'loose', conditionRaw: 'Out of box' }, | |
| 75 | + complete_price: { condition: 'boxed', completeness: 'boxed', conditionRaw: 'In damaged box' }, | |
| 76 | + new_price: { condition: 'mint_in_box', completeness: 'boxed', conditionRaw: 'New (mint in box)' }, | |
| 77 | + }, | |
| 78 | + comics: { | |
| 79 | + used_price: { condition: null, completeness: null, conditionRaw: 'Ungraded (raw)', grade: null }, | |
| 80 | + complete_price: { condition: 'very_good', completeness: null, conditionRaw: 'Graded 4.0 / VG (any grader)', grade: '4.0' }, | |
| 81 | + new_price: { condition: 'fine', completeness: null, conditionRaw: 'Graded 6.0 / Fine (any grader)', grade: '6.0' }, | |
| 82 | + graded_price: { condition: 'very_fine', completeness: null, conditionRaw: 'Graded 8.0 / VF (any grader)', grade: '8.0' }, | |
| 83 | + box_only_price: { condition: 'near_mint', completeness: null, conditionRaw: 'Graded 9.2 / NM- (any grader)', grade: '9.2' }, | |
| 84 | + manual_only_price: { condition: 'near_mint', completeness: null, conditionRaw: 'Graded 9.8 (any grader)', grade: '9.8' }, | |
| 85 | + }, | |
| 86 | +}; | |
| 87 | + | |
| 88 | +const NINTENDO = /^(nes|famicom|super-nintendo|super-famicom|nintendo-64|gamecube|wii|wii-u|nintendo-switch|gameboy|gameboy-color|gameboy-advance|nintendo-ds|nintendo-3ds|virtual-boy|jp-|pal-)/; | |
| 89 | +const SEGA = /^(sega-|pal-sega|jp-sega)/; | |
| 90 | +const PLAYSTATION = /^(playstation|psp|playstation-vita|jp-playstation|pal-playstation)/; | |
| 91 | +const XBOX = /^xbox/; | |
| 92 | +const RETRO = /^(atari|intellivision|colecovision|neo-geo|turbografx|pc-engine|commodore|amiga|vectrex|3do|jaguar|philips-cd-i|magnavox|odyssey|msx|sharp|wonderswan|n-gage|game-com|tiger|evercade|super-cassette|fairchild|bally|arcadia|action-max|amiga-cd32)/; | |
| 93 | + | |
| 94 | +function familyOf(p: ProductPayload): Family | null { | |
| 95 | + if (p.flags.isComic || p.consoleUri.startsWith('comic-books')) return 'comics'; | |
| 96 | + if (p.flags.isLegoSet || p.consoleUri.startsWith('lego')) return 'lego'; | |
| 97 | + if (p.flags.isFunkoPop || p.consoleUri.startsWith('funko')) return 'funko'; | |
| 98 | + if (p.flags.isCard || p.flags.isCoin) return null; // cards & coins are handled by dedicated connectors | |
| 99 | + return 'video_games'; | |
| 100 | +} | |
| 101 | + | |
| 102 | +function categorySlug(p: ProductPayload, family: Family): string | null { | |
| 103 | + const c = p.consoleUri; | |
| 104 | + switch (family) { | |
| 105 | + case 'lego': | |
| 106 | + return 'lego_sets'; | |
| 107 | + case 'funko': | |
| 108 | + return 'funko'; | |
| 109 | + case 'comics': { | |
| 110 | + const pub = (p.details['Publisher'] ?? '').toLowerCase(); | |
| 111 | + if (/marvel/.test(pub)) return 'marvel_comics'; | |
| 112 | + if (/\bdc\b|dc comics|vertigo|wildstorm/.test(pub)) return 'dc_comics'; | |
| 113 | + return 'independent_comics'; | |
| 114 | + } | |
| 115 | + case 'video_games': | |
| 116 | + if (c === 'pc-games') return 'pc_games'; | |
| 117 | + if (NINTENDO.test(c)) return 'nintendo_games'; | |
| 118 | + if (SEGA.test(c)) return 'sega_games'; | |
| 119 | + if (PLAYSTATION.test(c)) return 'playstation_games'; | |
| 120 | + if (XBOX.test(c)) return 'xbox_games'; | |
| 121 | + if (RETRO.test(c)) return 'atari_retro_games'; | |
| 122 | + return 'video_games'; | |
| 123 | + } | |
| 124 | +} | |
| 125 | + | |
| 126 | +/** "Super Mario 64 [Player's Choice]" → { name, variant } ; "Cloud City #10123" → { name, number } */ | |
| 127 | +function splitTitle(title: string): { name: string; variant: string | null; number: string | null } { | |
| 128 | + let t = title.trim(); | |
| 129 | + const variants: string[] = []; | |
| 130 | + t = t.replace(/\[([^\]]+)\]/g, (_m, v: string) => { | |
| 131 | + variants.push(v.trim()); | |
| 132 | + return ' '; | |
| 133 | + }); | |
| 134 | + let number: string | null = null; | |
| 135 | + const num = t.match(/#\s*([A-Za-z0-9.\-/]+)/); | |
| 136 | + if (num) { | |
| 137 | + number = num[1]!; | |
| 138 | + t = t.replace(num[0], ' '); | |
| 139 | + } | |
| 140 | + return { name: t.replace(/\s+/g, ' ').trim(), variant: variants.length ? variants.join(' · ') : null, number }; | |
| 141 | +} | |
| 142 | + | |
| 143 | +function parseProductPage(htmlText: string, url: string): ProductPayload { | |
| 144 | + const $ = H.load(htmlText); | |
| 145 | + const h1 = $('h1#product_name'); | |
| 146 | + const consoleName = H.text(h1.find('a')) ?? ''; | |
| 147 | + const consoleUri = (h1.find('a').attr('href') ?? '').replace(/^\/console\//, '') || (url.match(/\/game\/([^/]+)\//)?.[1] ?? ''); | |
| 148 | + const title = h1 | |
| 149 | + .clone() | |
| 150 | + .children('a') | |
| 151 | + .remove() | |
| 152 | + .end() | |
| 153 | + .text() | |
| 154 | + .replace(/\s+/g, ' ') | |
| 155 | + .trim(); | |
| 156 | + const flagsBlock = htmlText.match(/VGPC\.product\s*=\s*\{([\s\S]*?)\}/)?.[1] ?? ''; | |
| 157 | + const flag = (k: string) => new RegExp(`${k}\\s*:\\s*true`).test(flagsBlock); | |
| 158 | + const productId = flagsBlock.match(/id\s*:\s*(\d+)/)?.[1] ?? null; | |
| 159 | + | |
| 160 | + const prices: z.infer<typeof PriceCellSchema>[] = []; | |
| 161 | + const seen = new Set<string>(); | |
| 162 | + for (const key of PRICE_KEYS) { | |
| 163 | + if (seen.has(key)) continue; | |
| 164 | + const cell = $(`td#${key}`).first(); | |
| 165 | + if (!cell.length) continue; | |
| 166 | + seen.add(key); | |
| 167 | + const raw = H.text(cell.find('.price').first()) ?? H.text(cell) ?? ''; | |
| 168 | + const parsed = parsePrice(raw, 'USD'); | |
| 169 | + prices.push({ key, value: parsed && parsed.amount > 0 ? parsed.amount : null, raw }); | |
| 170 | + } | |
| 171 | + const columnLabels: string[] = []; | |
| 172 | + $('#price_data thead th, table.price_data thead th').each((_, el) => { | |
| 173 | + const t = H.text($(el)); | |
| 174 | + if (t) columnLabels.push(t); | |
| 175 | + }); | |
| 176 | + | |
| 177 | + const sales: z.infer<typeof SaleRowSchema>[] = []; | |
| 178 | + $('div[class^="completed-auctions-"]').each((_, sec) => { | |
| 179 | + const cls = ($(sec).attr('class') ?? '').split(/\s+/).find((c) => c.startsWith('completed-auctions-')) ?? ''; | |
| 180 | + const tab = cls.replace('completed-auctions-', ''); | |
| 181 | + if (!tab || tab === 'condition' || !$(sec).find('table').length) return; | |
| 182 | + $(sec) | |
| 183 | + .find('tbody tr') | |
| 184 | + .each((__, tr) => { | |
| 185 | + const $tr = $(tr); | |
| 186 | + const date = H.text($tr.find('td.date')) ?? ''; | |
| 187 | + const titleEl = $tr.find('td.title a').first(); | |
| 188 | + const rowTitle = H.text(titleEl) ?? H.text($tr.find('td.title')) ?? ''; | |
| 189 | + const priceTxt = H.text($tr.find('td.numeric .js-price').first()) ?? H.text($tr.find('td.numeric').first()) ?? ''; | |
| 190 | + const price = parsePrice(priceTxt, 'USD'); | |
| 191 | + const listedTxt = H.text($tr.find('td.listed-price')); | |
| 192 | + const listed = listedTxt ? parsePrice(listedTxt, 'USD') : null; | |
| 193 | + const ebayId = ($tr.attr('id') ?? '').match(/ebay-(\d+)/)?.[1] ?? titleEl.attr('href')?.match(/\/itm\/(\d+)/)?.[1] ?? null; | |
| 194 | + if (!date || !rowTitle || !price || price.amount <= 0) return; | |
| 195 | + sales.push({ tab, date, title: rowTitle, price: price.amount, ebayId, listedPrice: listed && listed.amount > 0 ? listed.amount : null }); | |
| 196 | + }); | |
| 197 | + }); | |
| 198 | + | |
| 199 | + const details: Record<string, string> = {}; | |
| 200 | + $('td.title').each((_, el) => { | |
| 201 | + const k = (H.text($(el)) ?? '').replace(/:$/, '').trim(); | |
| 202 | + const v = H.text($(el).next('td.details')); | |
| 203 | + if (k && v && v !== 'none' && v !== 'n/a') details[k] = v; | |
| 204 | + }); | |
| 205 | + const images: string[] = []; | |
| 206 | + $('img[src*="images.pricecharting.com"]').each((_, el) => { | |
| 207 | + const src = $(el).attr('src'); | |
| 208 | + if (src && /\/(240|1600|400)\.jpg$/.test(src) && !images.includes(src)) images.push(src); | |
| 209 | + }); | |
| 210 | + | |
| 211 | + return { | |
| 212 | + kind: 'product', | |
| 213 | + url, | |
| 214 | + productId, | |
| 215 | + consoleUri, | |
| 216 | + consoleName, | |
| 217 | + title, | |
| 218 | + flags: { isComic: flag('is_comic'), isLegoSet: flag('is_lego_set'), isFunkoPop: flag('is_funko_pop'), isCard: flag('is_card'), isCoin: flag('is_coin'), isSystem: flag('is_system') }, | |
| 219 | + columnLabels, | |
| 220 | + prices, | |
| 221 | + sales, | |
| 222 | + details, | |
| 223 | + images: images.slice(0, 4), | |
| 224 | + }; | |
| 225 | +} | |
| 226 | + | |
| 227 | +interface ConsoleProduct { | |
| 228 | + id: string; | |
| 229 | + productUri: string; | |
| 230 | + productName: string; | |
| 231 | + consoleUri: string; | |
| 232 | +} | |
| 233 | + | |
| 234 | +export class PriceChartingConnector extends BaseConnector { | |
| 235 | + readonly version = '1.0.0'; | |
| 236 | + readonly parserVersion = PARSER_VERSION; | |
| 237 | + override readonly urlPatterns = [/^https?:\/\/(www\.)?pricecharting\.com\/game\/[^/]+\/[^/?#]+/i]; | |
| 238 | + protected override minIntervalMs = 1500; | |
| 239 | + | |
| 240 | + private get seeds(): string[] { | |
| 241 | + const s = this.meta.config.seeds; | |
| 242 | + return Array.isArray(s) ? (s as string[]) : []; | |
| 243 | + } | |
| 244 | + | |
| 245 | + async *crawl(ctx: CrawlContext): AsyncIterable<RawRecordInput> { | |
| 246 | + const perConsole = Number(this.meta.config.productsPerConsole ?? 200); | |
| 247 | + const sort = String(this.meta.config.sort ?? 'popularity'); | |
| 248 | + const seeds = ctx.options.seeds?.length ? ctx.options.seeds : this.seeds; | |
| 249 | + const cursor = ctx.options.cursor ?? {}; | |
| 250 | + const doneConsoles = new Set<string>((cursor.doneConsoles as string[] | undefined) ?? []); | |
| 251 | + let count = 0; | |
| 252 | + | |
| 253 | + for (const consoleUri of seeds) { | |
| 254 | + if (doneConsoles.has(consoleUri) && ctx.options.mode !== 'backfill') continue; | |
| 255 | + if (ctx.signal?.aborted) return; | |
| 256 | + const products = await this.listConsole(ctx, consoleUri, perConsole, sort); | |
| 257 | + if (products.length === 0) ctx.anomaly('empty_console', consoleUri); | |
| 258 | + for (const p of products) { | |
| 259 | + if (this.reached(ctx, count)) return; | |
| 260 | + const url = `${BASE}/game/${p.consoleUri}/${p.productUri}`; | |
| 261 | + if (!(await ctx.shouldFetch(url))) continue; | |
| 262 | + await this.throttle(); | |
| 263 | + const rec = await this.fetchProduct(ctx, url); | |
| 264 | + if (rec) { | |
| 265 | + count++; | |
| 266 | + yield rec; | |
| 267 | + } | |
| 268 | + } | |
| 269 | + doneConsoles.add(consoleUri); | |
| 270 | + await ctx.setCursor({ doneConsoles: [...doneConsoles], updatedAt: new Date().toISOString() }); | |
| 271 | + } | |
| 272 | + // Full pass complete: reset so the next incremental run starts again. | |
| 273 | + await ctx.setCursor({ doneConsoles: [], updatedAt: new Date().toISOString() }); | |
| 274 | + } | |
| 275 | + | |
| 276 | + private async listConsole(ctx: CrawlContext, consoleUri: string, max: number, sort: string): Promise<ConsoleProduct[]> { | |
| 277 | + const out: ConsoleProduct[] = []; | |
| 278 | + let cursorPos = 0; | |
| 279 | + while (out.length < max) { | |
| 280 | + await this.throttle(); | |
| 281 | + const url = `${BASE}/console/${consoleUri}?sort=${encodeURIComponent(sort)}&cursor=${cursorPos}&format=json`; | |
| 282 | + const res = await ctx.fetch(url, { engines: ['api'], responseType: 'json', minQuality: 0 }); | |
| 283 | + let json = res.json as { products?: Array<Record<string, unknown>>; cursor?: string } | null; | |
| 284 | + if (!json && res.html) { | |
| 285 | + try { | |
| 286 | + json = JSON.parse(res.html) as typeof json; | |
| 287 | + } catch { | |
| 288 | + json = null; | |
| 289 | + } | |
| 290 | + } | |
| 291 | + if (!res.success || !json?.products) { | |
| 292 | + if (cursorPos === 0) ctx.anomaly('console_list_failed', `${consoleUri}: ${res.error ?? 'no products'}`); | |
| 293 | + break; | |
| 294 | + } | |
| 295 | + for (const p of json.products) { | |
| 296 | + if (typeof p.productUri === 'string' && typeof p.consoleUri === 'string') { | |
| 297 | + out.push({ id: String(p.id ?? ''), productUri: p.productUri, productName: String(p.productName ?? ''), consoleUri: p.consoleUri }); | |
| 298 | + } | |
| 299 | + } | |
| 300 | + const next = Number(json.cursor); | |
| 301 | + if (!Number.isFinite(next) || next <= cursorPos || json.products.length === 0) break; | |
| 302 | + cursorPos = next; | |
| 303 | + } | |
| 304 | + return out.slice(0, max); | |
| 305 | + } | |
| 306 | + | |
| 307 | + private async fetchProduct(ctx: CrawlContext, url: string): Promise<RawRecordInput | null> { | |
| 308 | + const res = await ctx.fetch(url, { | |
| 309 | + responseType: 'text', | |
| 310 | + expect: ['title', 'price', 'identifiers', 'category'], | |
| 311 | + parse: (r) => { | |
| 312 | + if (!r.html) return null; | |
| 313 | + const p = parseProductPage(r.html, url); | |
| 314 | + return { title: p.title, price: p.prices.find((x) => x.value !== null)?.value ?? null, identifiers: p.productId ? { id: p.productId } : null, category: p.consoleUri }; | |
| 315 | + }, | |
| 316 | + }); | |
| 317 | + if (!res.success || !res.html) { | |
| 318 | + ctx.anomaly('product_fetch_failed', `${url}: ${res.error ?? res.httpStatus}`); | |
| 319 | + return null; | |
| 320 | + } | |
| 321 | + const payload = parseProductPage(res.html, url); | |
| 322 | + if (!payload.title) { | |
| 323 | + ctx.anomaly('parse_failure_title', url); | |
| 324 | + return null; | |
| 325 | + } | |
| 326 | + return { url, externalId: payload.productId, kind: 'catalog_item', engine: res.engine, httpStatus: res.httpStatus, payload, fetchedAt: res.fetchedAt }; | |
| 327 | + } | |
| 328 | + | |
| 329 | + async lookup(url: string, ctx: CrawlContext): Promise<RawRecordInput[]> { | |
| 330 | + const clean = url.split('?')[0]!; | |
| 331 | + const rec = await this.fetchProduct(ctx, clean); | |
| 332 | + return rec ? [rec] : []; | |
| 333 | + } | |
| 334 | + | |
| 335 | + async normalize(raw: RawRecordLike): Promise<NormalizedRecord[]> { | |
| 336 | + const p = ProductPayloadSchema.parse(raw.payload); | |
| 337 | + const family = familyOf(p); | |
| 338 | + if (!family) return []; | |
| 339 | + const slug = categorySlug(p, family); | |
| 340 | + if (!slug) return []; | |
| 341 | + const { name, variant, number } = splitTitle(p.title); | |
| 342 | + const year = extractYear(p.details['Release Date'] ?? '') ?? extractYear(p.title) ?? null; | |
| 343 | + const identifiers: Record<string, string> = {}; | |
| 344 | + if (p.productId) identifiers.pricecharting_id = p.productId; | |
| 345 | + if (p.details['UPC']) identifiers.upc = p.details['UPC'].replace(/\s+/g, ''); | |
| 346 | + if (p.details['ASIN (Amazon)']) identifiers.asin = p.details['ASIN (Amazon)']; | |
| 347 | + if (p.details['ePID (eBay)']) identifiers.ebay_epid = p.details['ePID (eBay)']; | |
| 348 | + if (p.details['Comic.org ID']) identifiers.comics_org_id = p.details['Comic.org ID']; | |
| 349 | + if (family === 'lego' && number) identifiers.lego_set_number = number; | |
| 350 | + if (p.details['Model Number']) identifiers.model_number = p.details['Model Number']; | |
| 351 | + if (family === 'funko' && p.details['Box Number']) identifiers.funko_box_number = p.details['Box Number']; | |
| 352 | + | |
| 353 | + const attributes: AssetAttributes = { | |
| 354 | + categorySlug: slug, | |
| 355 | + subcategorySlug: null, | |
| 356 | + franchise: family === 'funko' || family === 'lego' ? p.consoleName.replace(/^(Funko POP|LEGO)\s*/i, '') || null : null, | |
| 357 | + brand: family === 'lego' ? 'LEGO' : family === 'funko' ? 'Funko' : p.details['Publisher'] ?? null, | |
| 358 | + series: family === 'funko' ? p.details['Series'] ?? p.consoleName : null, | |
| 359 | + set: family === 'comics' ? p.consoleName : family === 'lego' ? p.consoleName.replace(/^LEGO\s*/i, '') : p.consoleName, | |
| 360 | + setCode: null, | |
| 361 | + name: family === 'comics' ? p.consoleName : name, | |
| 362 | + model: null, | |
| 363 | + reference: null, | |
| 364 | + number: number ?? (family === 'funko' ? p.details['Box Number'] ?? null : null), | |
| 365 | + year, | |
| 366 | + edition: null, | |
| 367 | + variant, | |
| 368 | + language: 'English', | |
| 369 | + region: /^(jp|pal)-/.test(p.consoleUri) ? p.consoleUri.split('-')[0]!.toUpperCase() : 'NTSC-U', | |
| 370 | + country: null, | |
| 371 | + material: null, | |
| 372 | + size: null, | |
| 373 | + color: null, | |
| 374 | + rarity: null, | |
| 375 | + productionQuantity: null, | |
| 376 | + originalMsrp: null, | |
| 377 | + originalMsrpCurrency: null, | |
| 378 | + identifiers, | |
| 379 | + metadata: { pricecharting_console: p.consoleUri, key_issue: p.details['Is Key Issue'] === 'Yes' ? true : undefined, genre: p.details['Genre'], notes: p.details['Notes'] }, | |
| 380 | + }; | |
| 381 | + if (family === 'comics') { | |
| 382 | + // "Amazing Spider-Man #1 (1963)" → name = series (from console), number = issue, year from title | |
| 383 | + attributes.name = p.consoleName; | |
| 384 | + attributes.year = extractYear(p.title) ?? year; | |
| 385 | + } | |
| 386 | + | |
| 387 | + const observedAt = raw.fetchedAt; | |
| 388 | + const base = { | |
| 389 | + connectorId: this.meta.id, | |
| 390 | + sourceId: this.meta.sourceId, | |
| 391 | + sourceUrl: p.url, | |
| 392 | + externalId: p.productId, | |
| 393 | + rawTitle: family === 'comics' ? p.title : `${p.title} (${p.consoleName})`, | |
| 394 | + description: p.details['Description'] ?? null, | |
| 395 | + imageUrls: p.images, | |
| 396 | + attributes, | |
| 397 | + observedAt, | |
| 398 | + confidence: 0.9, | |
| 399 | + parserVersion: PARSER_VERSION, | |
| 400 | + }; | |
| 401 | + const meanings = COLUMN_MEANING[family]; | |
| 402 | + const out: NormalizedRecord[] = []; | |
| 403 | + const catalog: NormalizedCatalogItem = { kind: 'catalog_item', ...base, grade: { grader: null, grade: null, qualifier: null, certificationNumber: null }, condition: { condition: null, conditionRaw: null, completeness: null }, releaseDate: parseSourceDate(p.details['Release Date']) ?? null }; | |
| 404 | + out.push(catalog); | |
| 405 | + | |
| 406 | + const obsDate = new Date(Date.UTC(observedAt.getUTCFullYear(), observedAt.getUTCMonth(), observedAt.getUTCDate())); | |
| 407 | + for (const cell of p.prices) { | |
| 408 | + const m = meanings[cell.key as (typeof PRICE_KEYS)[number]]; | |
| 409 | + if (!m || cell.value === null) continue; | |
| 410 | + const obs: NormalizedPriceObservation = { | |
| 411 | + kind: 'price_observation', | |
| 412 | + ...base, | |
| 413 | + grade: { grader: null, grade: m.grade ?? null, qualifier: null, certificationNumber: null }, | |
| 414 | + condition: { condition: m.condition, conditionRaw: m.conditionRaw, completeness: m.completeness }, | |
| 415 | + priceKind: 'guide_value', | |
| 416 | + price: cell.value, | |
| 417 | + currency: 'USD', | |
| 418 | + observationDate: obsDate, | |
| 419 | + sampleSize: null, | |
| 420 | + confidence: 0.85, | |
| 421 | + }; | |
| 422 | + out.push(obs); | |
| 423 | + } | |
| 424 | + const seenSale = new Set<string>(); | |
| 425 | + for (const row of p.sales) { | |
| 426 | + const key = TAB_TO_KEY[row.tab]; | |
| 427 | + const m = key ? meanings[key] : undefined; | |
| 428 | + if (!m) continue; | |
| 429 | + const saleDate = parseSourceDate(row.date); | |
| 430 | + if (!saleDate) continue; | |
| 431 | + const dedupe = `${row.ebayId ?? row.title}|${row.date}|${row.price}`; | |
| 432 | + if (seenSale.has(dedupe)) continue; | |
| 433 | + seenSale.add(dedupe); | |
| 434 | + const sale: NormalizedSale = { | |
| 435 | + kind: 'sale', | |
| 436 | + ...base, | |
| 437 | + externalId: row.ebayId ? `ebay:${row.ebayId}` : `${p.productId ?? p.url}:${row.date}:${row.price}`, | |
| 438 | + rawTitle: row.title, | |
| 439 | + description: null, | |
| 440 | + grade: { grader: null, grade: m.grade ?? null, qualifier: null, certificationNumber: null }, | |
| 441 | + condition: { condition: m.condition, conditionRaw: m.conditionRaw, completeness: m.completeness }, | |
| 442 | + saleType: 'unknown', | |
| 443 | + saleDate, | |
| 444 | + price: row.price, | |
| 445 | + currency: 'USD', | |
| 446 | + buyerPremiumIncluded: false, | |
| 447 | + quantity: 1, | |
| 448 | + isBundle: /\b(lot|bundle)\b/i.test(row.title), | |
| 449 | + location: null, | |
| 450 | + auctionHouse: null, | |
| 451 | + lotNumber: null, | |
| 452 | + confidence: 0.75, | |
| 453 | + }; | |
| 454 | + out.push(sale); | |
| 455 | + } | |
| 456 | + return out; | |
| 457 | + } | |
| 458 | +} | |
| 459 | + | |
| 460 | +export default (meta: ConnectorMeta) => new PriceChartingConnector(meta); | |
| 461 | +export { parseProductPage }; | |
added
connectors/api/pricecharting/meta.json
+43 −0
@@ -0,0 +1,43 @@ | ||
| 1 | +{ | |
| 2 | + "id": "pricecharting", | |
| 3 | + "displayName": "PriceCharting", | |
| 4 | + "sourceId": "pricecharting", | |
| 5 | + "sourceName": "PriceCharting", | |
| 6 | + "sourceType": "pricing_guide", | |
| 7 | + "sourceUrl": "https://www.pricecharting.com", | |
| 8 | + "module": "api/pricecharting", | |
| 9 | + "enginePriority": ["api", "firecrawl", "scrapfly"], | |
| 10 | + "categories": ["video_games", "nintendo_games", "sega_games", "playstation_games", "xbox_games", "atari_retro_games", "pc_games", "lego_sets", "funko", "comics", "marvel_comics", "dc_comics", "independent_comics"], | |
| 11 | + "regions": ["US"], | |
| 12 | + "languages": ["en"], | |
| 13 | + "currency": ["USD"], | |
| 14 | + "supportsListings": false, | |
| 15 | + "supportsSold": true, | |
| 16 | + "supportsAuctions": false, | |
| 17 | + "supportsImages": true, | |
| 18 | + "supportsCatalog": true, | |
| 19 | + "supportsPopulation": false, | |
| 20 | + "supportsLookup": true, | |
| 21 | + "refreshFrequencyMinutes": 1440, | |
| 22 | + "priority": "high", | |
| 23 | + "trustScore": 0.7, | |
| 24 | + "attributionRequired": true, | |
| 25 | + "termsUrl": "https://www.pricecharting.com/page/terms-of-service", | |
| 26 | + "accessNotes": "Public product pages fetched over plain HTTPS with the RareIndex user agent (robots.txt only disallows /buy, /publish-offer, /stripe-connect). Each product page exposes PriceCharting guide values per condition and a table of recently completed eBay sales (date, title, price, eBay item id) — we store those as sales with the PriceCharting page as source URL. No account, no API key, no photos (TimeWarp is paid and not used). Console listings paginate through the public ?format=json cursor endpoint. ~1 request per product, 1.5 s politeness delay.", | |
| 27 | + "enabled": true, | |
| 28 | + "schemaVersion": "1.0", | |
| 29 | + "config": { | |
| 30 | + "seeds": [ | |
| 31 | + "nintendo-64", "nes", "super-nintendo", "gamecube", "gameboy", "gameboy-color", "gameboy-advance", "nintendo-ds", "nintendo-switch", "wii", | |
| 32 | + "playstation", "playstation-2", "playstation-3", "playstation-4", "playstation-5", "psp", | |
| 33 | + "xbox", "xbox-360", "xbox-one", "xbox-series-x", | |
| 34 | + "sega-genesis", "sega-dreamcast", "sega-saturn", "sega-master-system", "sega-game-gear", | |
| 35 | + "atari-2600", "neo-geo-aes", "turbografx-16", "pc-games", | |
| 36 | + "lego-star-wars", "lego-creator", "lego-technic", "lego-icons", "lego-harry-potter", "lego-ideas", "lego-marvel-super-heroes", "lego-ninjago", "lego-castle", "lego-space", "lego-modular-buildings", | |
| 37 | + "funko-pop-marvel", "funko-pop-star-wars", "funko-pop-disney", "funko-pop-animation", "funko-pop-television", "funko-pop-movies", "funko-pop-games", "funko-pop-rocks", "funko-pop-comics", | |
| 38 | + "comic-books-amazing-spider-man", "comic-books-batman", "comic-books-action-comics", "comic-books-detective-comics", "comic-books-x-men", "comic-books-incredible-hulk", "comic-books-fantastic-four", "comic-books-avengers", "comic-books-spawn", "comic-books-walking-dead" | |
| 39 | + ], | |
| 40 | + "productsPerConsole": 200, | |
| 41 | + "sort": "popularity" | |
| 42 | + } | |
| 43 | +} | |
added
connectors/api/scryfall/index.test.ts
+55 −0
@@ -0,0 +1,55 @@ | ||
| 1 | +import { describe, expect, it } from 'vitest'; | |
| 2 | +import { getConnectorMeta } from '@rareindex/connectors'; | |
| 3 | +import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; | |
| 4 | +import createConnector from './index.js'; | |
| 5 | + | |
| 6 | +const connector = createConnector(getConnectorMeta('scryfall')); | |
| 7 | + | |
| 8 | +describe('scryfall', () => { | |
| 9 | + runFixtureSuite(connector, it, expect); | |
| 10 | + | |
| 11 | + it('maps Black Lotus (Alpha) to a catalog item + EUR observation', async () => { | |
| 12 | + const out = await connector.normalize(loadFixture('scryfall', 'black-lotus-alpha').raw); | |
| 13 | + const cat = out.find((r) => r.kind === 'catalog_item'); | |
| 14 | + const obs = out.filter((r) => r.kind === 'price_observation'); | |
| 15 | + expect(cat && 'attributes' in cat && cat.attributes).toMatchObject({ categorySlug: 'magic_the_gathering', set: 'Limited Edition Alpha', setCode: 'LEA', number: '232', year: 1993, rarity: 'rare', language: 'en', variant: null }); | |
| 16 | + expect(cat && 'attributes' in cat ? cat.attributes.identifiers : {}).toMatchObject({ scryfall_id: 'b0faa7f2-b547-42c4-a810-839da50dadfe', tcgplayer_id: '1042', cardmarket_id: '5465' }); | |
| 17 | + expect(cat && 'rawTitle' in cat ? cat.rawTitle : '').toBe('Black Lotus · Limited Edition Alpha #232 (1993)'); | |
| 18 | + expect(obs).toHaveLength(1); | |
| 19 | + expect(obs[0]).toMatchObject({ currency: 'EUR', priceKind: 'market' }); | |
| 20 | + if (obs[0]?.kind === 'price_observation') { | |
| 21 | + expect(obs[0].price).toBeGreaterThan(1000); | |
| 22 | + expect(obs[0].observationDate.toISOString()).toBe('2026-09-06T21:05:43.673Z'); | |
| 23 | + } | |
| 24 | + }); | |
| 25 | + | |
| 26 | + it('splits foil / nonfoil finishes into distinct variants with matching prices', async () => { | |
| 27 | + const out = await connector.normalize(loadFixture('scryfall', 'secret-lair-foil-nonfoil').raw); | |
| 28 | + const cats = out.filter((r) => r.kind === 'catalog_item'); | |
| 29 | + expect(cats.map((c) => ('attributes' in c ? c.attributes.variant : undefined)).sort()).toEqual([null, 'Foil'].sort()); | |
| 30 | + const obs = out.filter((r) => r.kind === 'price_observation'); | |
| 31 | + const foilUsd = obs.find((o) => 'attributes' in o && o.attributes.variant === 'Foil' && 'currency' in o && o.currency === 'USD'); | |
| 32 | + const nonfoilUsd = obs.find((o) => 'attributes' in o && o.attributes.variant === null && 'currency' in o && o.currency === 'USD'); | |
| 33 | + expect(foilUsd && nonfoilUsd).toBeTruthy(); | |
| 34 | + for (const o of obs) expect(o.kind === 'price_observation' && o.attributes.identifiers.finish).toMatch(/foil|nonfoil/); | |
| 35 | + }); | |
| 36 | + | |
| 37 | + it('labels showcase treatments and foil-only printings', async () => { | |
| 38 | + const out = await connector.normalize(loadFixture('scryfall', 'neo-showcase-foil-only').raw); | |
| 39 | + const cats = out.filter((r) => r.kind === 'catalog_item'); | |
| 40 | + expect(cats).toHaveLength(1); | |
| 41 | + expect(cats[0] && 'attributes' in cats[0] ? cats[0].attributes.variant : '').toMatch(/Showcase.*Foil/); | |
| 42 | + expect(out.filter((r) => r.kind === 'price_observation').every((o) => 'attributes' in o && /Foil/.test(o.attributes.variant ?? ''))).toBe(true); | |
| 43 | + }); | |
| 44 | + | |
| 45 | + it('uses card face images for double-faced cards', async () => { | |
| 46 | + const out = await connector.normalize(loadFixture('scryfall', 'clb-double-faced').raw); | |
| 47 | + const cat = out.find((r) => r.kind === 'catalog_item'); | |
| 48 | + expect(cat && 'imageUrls' in cat ? cat.imageUrls.length : 0).toBeGreaterThanOrEqual(1); | |
| 49 | + }); | |
| 50 | + | |
| 51 | + it('recognises scryfall card URLs for lookup', () => { | |
| 52 | + expect(connector.urlPatterns?.some((re) => re.test('https://scryfall.com/card/lea/232/black-lotus'))).toBe(true); | |
| 53 | + expect(connector.urlPatterns?.some((re) => re.test('https://scryfall.com/sets/lea'))).toBe(false); | |
| 54 | + }); | |
| 55 | +}); | |
added
connectors/api/scryfall/index.ts
+290 −0
@@ -0,0 +1,290 @@ | ||
| 1 | +import { createGunzip } from 'node:zlib'; | |
| 2 | +import { Readable } from 'node:stream'; | |
| 3 | +import { createInterface } from 'node:readline'; | |
| 4 | +import { z } from 'zod'; | |
| 5 | +import { BaseConnector, type ConnectorMeta, type CrawlContext, type RawRecordInput, type RawRecordLike } from '@rareindex/connectors'; | |
| 6 | +import { type NormalizedRecord } from '@rareindex/shared'; | |
| 7 | +import { attrs, catalogItem, makeTitle, num, priceObservation, yearOf } from '../_lib/shared.js'; | |
| 8 | + | |
| 9 | +const API = 'https://api.scryfall.com'; | |
| 10 | +const HEADERS = { 'user-agent': 'RareIndexBot/0.1 (+https://www.rareindex.io/about/data)', accept: 'application/json;q=0.9,*/*;q=0.8' }; | |
| 11 | + | |
| 12 | +/** Trimmed printing payload we persist as the raw record (everything normalize() needs, nothing more). */ | |
| 13 | +const CardPayloadSchema = z.object({ | |
| 14 | + id: z.string(), | |
| 15 | + oracle_id: z.string().optional(), | |
| 16 | + name: z.string(), | |
| 17 | + lang: z.string().optional(), | |
| 18 | + released_at: z.string().optional(), | |
| 19 | + set: z.string(), | |
| 20 | + set_name: z.string(), | |
| 21 | + set_type: z.string().optional(), | |
| 22 | + collector_number: z.string(), | |
| 23 | + rarity: z.string().optional(), | |
| 24 | + layout: z.string().optional(), | |
| 25 | + finishes: z.array(z.string()).optional(), | |
| 26 | + frame_effects: z.array(z.string()).optional().nullable(), | |
| 27 | + promo_types: z.array(z.string()).optional().nullable(), | |
| 28 | + promo: z.boolean().optional(), | |
| 29 | + reserved: z.boolean().optional(), | |
| 30 | + reprint: z.boolean().optional(), | |
| 31 | + variation: z.boolean().optional(), | |
| 32 | + full_art: z.boolean().optional(), | |
| 33 | + border_color: z.string().optional(), | |
| 34 | + frame: z.string().optional(), | |
| 35 | + digital: z.boolean().optional(), | |
| 36 | + artist: z.string().optional(), | |
| 37 | + mana_cost: z.string().optional(), | |
| 38 | + type_line: z.string().optional(), | |
| 39 | + cmc: z.number().optional(), | |
| 40 | + colors: z.array(z.string()).optional(), | |
| 41 | + tcgplayer_id: z.number().optional(), | |
| 42 | + tcgplayer_etched_id: z.number().optional(), | |
| 43 | + cardmarket_id: z.number().optional(), | |
| 44 | + mtgo_id: z.number().optional(), | |
| 45 | + arena_id: z.number().optional(), | |
| 46 | + multiverse_ids: z.array(z.number()).optional(), | |
| 47 | + scryfall_uri: z.string().optional(), | |
| 48 | + image_uris: z.record(z.string(), z.string()).optional(), | |
| 49 | + card_faces: z.array(z.object({ name: z.string().optional(), image_uris: z.record(z.string(), z.string()).optional() })).optional(), | |
| 50 | + prices: z.record(z.string(), z.string().nullable()).optional(), | |
| 51 | +}); | |
| 52 | +type CardPayload = z.infer<typeof CardPayloadSchema>; | |
| 53 | + | |
| 54 | +const RawPayloadSchema = z.object({ | |
| 55 | + card: CardPayloadSchema, | |
| 56 | + /** ISO timestamp of the bulk file (prices' observation time); null for single-card lookups */ | |
| 57 | + bulkUpdatedAt: z.string().nullable().default(null), | |
| 58 | +}); | |
| 59 | + | |
| 60 | +const KEEP: Array<keyof CardPayload> = ['id', 'oracle_id', 'name', 'lang', 'released_at', 'set', 'set_name', 'set_type', 'collector_number', 'rarity', 'layout', 'finishes', 'frame_effects', 'promo_types', 'promo', 'reserved', 'reprint', 'variation', 'full_art', 'border_color', 'frame', 'digital', 'artist', 'mana_cost', 'type_line', 'cmc', 'colors', 'tcgplayer_id', 'tcgplayer_etched_id', 'cardmarket_id', 'mtgo_id', 'arena_id', 'multiverse_ids', 'scryfall_uri', 'image_uris', 'card_faces', 'prices']; | |
| 61 | + | |
| 62 | +export function trimCard(card: Record<string, unknown>): CardPayload { | |
| 63 | + const out: Record<string, unknown> = {}; | |
| 64 | + for (const k of KEEP) if (card[k] !== undefined) out[k] = card[k]; | |
| 65 | + if (Array.isArray(out.card_faces)) out.card_faces = (out.card_faces as Array<Record<string, unknown>>).map((f) => ({ name: f.name, image_uris: f.image_uris })); | |
| 66 | + return CardPayloadSchema.parse(out); | |
| 67 | +} | |
| 68 | + | |
| 69 | +function finishVariant(finish: string): string | null { | |
| 70 | + if (finish === 'foil') return 'Foil'; | |
| 71 | + if (finish === 'etched') return 'Etched Foil'; | |
| 72 | + return null; | |
| 73 | +} | |
| 74 | + | |
| 75 | +/** Frame effects / promo types that materially identify a distinct printing treatment on the market. */ | |
| 76 | +const VARIANT_FRAME_EFFECTS = new Set(['showcase', 'extendedart', 'inverted', 'shatteredglass', 'etched', 'textured']); | |
| 77 | +const VARIANT_PROMO_TYPES = new Set(['serialized', 'prerelease', 'promopack', 'judgegift', 'buyabox', 'gameday', 'textured', 'galaxyfoil', 'surgefoil', 'stepandcompleat', 'confettifoil', 'oilslick', 'halofoil', 'neonink', 'ripplefoil', 'fracturefoil', 'rainbowfoil', 'raisedfoil', 'invisibleink', 'doublerainbow', 'manafoil', 'firstplacefoil', 'dragonscalefoil', 'silverfoil', 'gilded', 'embossed', 'startercollection', 'schinesealtart', 'datestamped', 'playerrewards', 'arenaleague', 'fnm', 'release', 'launch', 'convention', 'mediainsert', 'wizardsplaynetwork', 'thick', 'poster']); | |
| 78 | +const LABELS: Record<string, string> = { extendedart: 'Extended Art', promopack: 'Promo Pack', judgegift: 'Judge Promo', buyabox: 'Buy-a-Box', gameday: 'Game Day', galaxyfoil: 'Galaxy Foil', surgefoil: 'Surge Foil', stepandcompleat: 'Step-and-Compleat', confettifoil: 'Confetti Foil', oilslick: 'Oil Slick', halofoil: 'Halo Foil', neonink: 'Neon Ink', ripplefoil: 'Ripple Foil', fracturefoil: 'Fracture Foil', rainbowfoil: 'Rainbow Foil', raisedfoil: 'Raised Foil', invisibleink: 'Invisible Ink', doublerainbow: 'Double Rainbow', manafoil: 'Mana Foil', firstplacefoil: 'First Place Foil', dragonscalefoil: 'Dragon Scale Foil', silverfoil: 'Silver Foil', startercollection: 'Starter Collection', schinesealtart: 'Chinese Alt Art', datestamped: 'Date Stamped', playerrewards: 'Player Rewards', arenaleague: 'Arena League', fnm: 'FNM', mediainsert: 'Media Insert', wizardsplaynetwork: 'WPN', shatteredglass: 'Shattered Glass' }; | |
| 79 | + | |
| 80 | +function treatments(card: CardPayload): string[] { | |
| 81 | + const t: string[] = []; | |
| 82 | + for (const fe of card.frame_effects ?? []) if (VARIANT_FRAME_EFFECTS.has(fe)) t.push(fe); | |
| 83 | + for (const pt of card.promo_types ?? []) if (VARIANT_PROMO_TYPES.has(pt)) t.push(pt); | |
| 84 | + if (card.full_art) t.push('fullart'); | |
| 85 | + if (card.border_color === 'borderless') t.push('borderless'); | |
| 86 | + if (card.frame === '1997' && card.set_type !== 'core' && card.set_type !== 'expansion' && (card.released_at ?? '') > '2010') t.push('retro'); | |
| 87 | + return [...new Set(t)].map((k) => LABELS[k] ?? (k === 'fullart' ? 'Full Art' : k.charAt(0).toUpperCase() + k.slice(1))); | |
| 88 | +} | |
| 89 | + | |
| 90 | +export class ScryfallConnector extends BaseConnector { | |
| 91 | + readonly version = '1.0.0'; | |
| 92 | + readonly parserVersion = '1.0.0'; | |
| 93 | + override readonly urlPatterns = [/^https?:\/\/(www\.)?scryfall\.com\/card\/[^/]+\/[^/?#]+/i]; | |
| 94 | + protected override minIntervalMs = 100; | |
| 95 | + | |
| 96 | + async *crawl(ctx: CrawlContext): AsyncIterable<RawRecordInput> { | |
| 97 | + const bulkType = String(ctx.meta.config.bulkType ?? 'default_cards'); | |
| 98 | + const list = await ctx.fetch(`${API}/bulk-data`, { engines: ['api'], headers: HEADERS }); | |
| 99 | + if (!list.success || !list.json) throw new Error(`scryfall bulk-data listing failed: ${list.error}`); | |
| 100 | + const entries = (list.json as { data: Array<{ type: string; updated_at: string; download_uri?: string; jsonl_download_uri?: string }> }).data; | |
| 101 | + const entry = entries.find((e) => e.type === bulkType); | |
| 102 | + if (!entry) throw new Error(`scryfall bulk type ${bulkType} not found`); | |
| 103 | + const prev = ctx.options.cursor?.updatedAt as string | undefined; | |
| 104 | + if (ctx.options.mode === 'incremental' && prev && prev === entry.updated_at) { | |
| 105 | + ctx.log.info({ updatedAt: prev }, 'scryfall bulk unchanged, skipping'); | |
| 106 | + return; | |
| 107 | + } | |
| 108 | + const uri = entry.jsonl_download_uri ?? entry.download_uri; | |
| 109 | + if (!uri) throw new Error('scryfall bulk entry has no download uri'); | |
| 110 | + const jsonl = Boolean(entry.jsonl_download_uri); | |
| 111 | + const started = Date.now(); | |
| 112 | + const res = await fetch(uri, { headers: HEADERS, signal: ctx.signal }); | |
| 113 | + const stats = (ctx.engineStats.api ??= { attempts: 0, success: 0, credits: 0, ms: 0 }); | |
| 114 | + stats.attempts++; | |
| 115 | + if (!res.ok || !res.body) throw new Error(`scryfall bulk download HTTP ${res.status}`); | |
| 116 | + stats.success++; | |
| 117 | + let count = 0; | |
| 118 | + const fetchedAt = new Date(); | |
| 119 | + let body: NodeJS.ReadableStream = Readable.fromWeb(res.body as import('node:stream/web').ReadableStream); | |
| 120 | + if (uri.endsWith('.gz')) body = body.pipe(createGunzip()); | |
| 121 | + const rl = createInterface({ input: body, crlfDelay: Infinity }); | |
| 122 | + for await (const rawLine of rl) { | |
| 123 | + let line = rawLine.trim(); | |
| 124 | + if (!jsonl) { | |
| 125 | + // legacy JSON array format: one object per line, wrapped by [ ] and separated by commas | |
| 126 | + if (line === '[' || line === ']' || !line) continue; | |
| 127 | + if (line.endsWith(',')) line = line.slice(0, -1); | |
| 128 | + } | |
| 129 | + if (!line) continue; | |
| 130 | + let card: Record<string, unknown>; | |
| 131 | + try { | |
| 132 | + card = JSON.parse(line) as Record<string, unknown>; | |
| 133 | + } catch { | |
| 134 | + ctx.anomaly('parse_failure', 'bulk line is not JSON'); | |
| 135 | + continue; | |
| 136 | + } | |
| 137 | + if (card.object !== 'card' || card.digital === true) continue; | |
| 138 | + let payload: CardPayload; | |
| 139 | + try { | |
| 140 | + payload = trimCard(card); | |
| 141 | + } catch (err) { | |
| 142 | + ctx.anomaly('parse_failure', `card ${String(card.id)}: ${err instanceof Error ? err.message : String(err)}`); | |
| 143 | + continue; | |
| 144 | + } | |
| 145 | + yield { | |
| 146 | + url: payload.scryfall_uri ?? `${API}/cards/${payload.id}`, | |
| 147 | + externalId: payload.id, | |
| 148 | + kind: 'catalog_item', | |
| 149 | + engine: 'api', | |
| 150 | + httpStatus: 200, | |
| 151 | + payload: { card: payload, bulkUpdatedAt: entry.updated_at }, | |
| 152 | + fetchedAt, | |
| 153 | + }; | |
| 154 | + count++; | |
| 155 | + if (this.reached(ctx, count)) break; | |
| 156 | + } | |
| 157 | + stats.ms += Date.now() - started; | |
| 158 | + rl.close(); | |
| 159 | + if (!this.reached(ctx, count)) await ctx.setCursor({ updatedAt: entry.updated_at, count }); | |
| 160 | + ctx.log.info({ count, ms: Date.now() - started }, 'scryfall bulk crawl done'); | |
| 161 | + } | |
| 162 | + | |
| 163 | + async lookup(url: string, ctx: CrawlContext): Promise<RawRecordInput[]> { | |
| 164 | + const m = url.match(/scryfall\.com\/card\/([^/]+)\/([^/?#]+)/i); | |
| 165 | + if (!m) return []; | |
| 166 | + await this.throttle(); | |
| 167 | + const res = await ctx.fetch(`${API}/cards/${encodeURIComponent(m[1]!)}/${encodeURIComponent(m[2]!)}`, { engines: ['api'], headers: HEADERS }); | |
| 168 | + if (!res.success || !res.json) return []; | |
| 169 | + const payload = trimCard(res.json as Record<string, unknown>); | |
| 170 | + return [{ url: payload.scryfall_uri ?? url, externalId: payload.id, kind: 'catalog_item', engine: 'api', httpStatus: res.httpStatus, payload: { card: payload, bulkUpdatedAt: null }, fetchedAt: res.fetchedAt }]; | |
| 171 | + } | |
| 172 | + | |
| 173 | + async normalize(raw: RawRecordLike): Promise<NormalizedRecord[]> { | |
| 174 | + const { card, bulkUpdatedAt } = RawPayloadSchema.parse(raw.payload); | |
| 175 | + const year = yearOf(card.released_at); | |
| 176 | + const sourceUrl = card.scryfall_uri ?? raw.url; | |
| 177 | + const images = card.image_uris ? [card.image_uris.large ?? card.image_uris.normal ?? card.image_uris.png].filter((x): x is string => Boolean(x)) : (card.card_faces ?? []).map((f) => f.image_uris?.large ?? f.image_uris?.normal).filter((x): x is string => Boolean(x)); | |
| 178 | + const identifiers: Record<string, string> = { scryfall_id: card.id }; | |
| 179 | + if (card.oracle_id) identifiers.oracle_id = card.oracle_id; | |
| 180 | + if (card.tcgplayer_id) identifiers.tcgplayer_id = String(card.tcgplayer_id); | |
| 181 | + if (card.tcgplayer_etched_id) identifiers.tcgplayer_etched_id = String(card.tcgplayer_etched_id); | |
| 182 | + if (card.cardmarket_id) identifiers.cardmarket_id = String(card.cardmarket_id); | |
| 183 | + if (card.mtgo_id) identifiers.mtgo_id = String(card.mtgo_id); | |
| 184 | + if (card.arena_id) identifiers.arena_id = String(card.arena_id); | |
| 185 | + if (card.multiverse_ids?.length) identifiers.multiverse_id = String(card.multiverse_ids[0]); | |
| 186 | + const treat = treatments(card); | |
| 187 | + const baseVariant = treat.length ? treat.join(' ') : null; | |
| 188 | + const finishes = card.finishes?.length ? card.finishes : ['nonfoil']; | |
| 189 | + const observedAt = bulkUpdatedAt ? new Date(bulkUpdatedAt) : raw.fetchedAt; | |
| 190 | + const out: NormalizedRecord[] = []; | |
| 191 | + | |
| 192 | + const buildAttrs = (finish: string) => { | |
| 193 | + const fv = finishVariant(finish); | |
| 194 | + const variant = [baseVariant, fv].filter(Boolean).join(' ') || null; | |
| 195 | + return attrs({ | |
| 196 | + categorySlug: 'magic_the_gathering', | |
| 197 | + franchise: 'Magic: The Gathering', | |
| 198 | + brand: 'Wizards of the Coast', | |
| 199 | + set: card.set_name, | |
| 200 | + setCode: card.set.toUpperCase(), | |
| 201 | + name: card.name, | |
| 202 | + number: card.collector_number, | |
| 203 | + year, | |
| 204 | + variant, | |
| 205 | + language: card.lang ?? null, | |
| 206 | + rarity: card.rarity ?? null, | |
| 207 | + identifiers: { ...identifiers, finish }, | |
| 208 | + metadata: { | |
| 209 | + mana_cost: card.mana_cost ?? null, | |
| 210 | + type_line: card.type_line ?? null, | |
| 211 | + cmc: card.cmc ?? null, | |
| 212 | + colors: card.colors ?? [], | |
| 213 | + artist: card.artist ?? null, | |
| 214 | + reserved: card.reserved ?? false, | |
| 215 | + promo: card.promo ?? false, | |
| 216 | + reprint: card.reprint ?? false, | |
| 217 | + set_type: card.set_type ?? null, | |
| 218 | + layout: card.layout ?? null, | |
| 219 | + frame: card.frame ?? null, | |
| 220 | + border_color: card.border_color ?? null, | |
| 221 | + finish, | |
| 222 | + treatments: treat, | |
| 223 | + }, | |
| 224 | + }); | |
| 225 | + }; | |
| 226 | + | |
| 227 | + for (const finish of finishes) { | |
| 228 | + const a = buildAttrs(finish); | |
| 229 | + out.push( | |
| 230 | + catalogItem({ | |
| 231 | + kind: 'catalog_item', | |
| 232 | + connectorId: this.meta.id, | |
| 233 | + sourceId: this.meta.sourceId, | |
| 234 | + sourceUrl, | |
| 235 | + externalId: `${card.id}:${finish}`, | |
| 236 | + rawTitle: makeTitle({ name: card.name, set: card.set_name, number: card.collector_number, year, variant: a.variant }), | |
| 237 | + description: card.type_line ?? null, | |
| 238 | + imageUrls: images, | |
| 239 | + attributes: a, | |
| 240 | + observedAt, | |
| 241 | + confidence: 0.98, | |
| 242 | + parserVersion: this.parserVersion, | |
| 243 | + releaseDate: card.released_at ?? null, | |
| 244 | + }), | |
| 245 | + ); | |
| 246 | + } | |
| 247 | + | |
| 248 | + const prices = card.prices ?? {}; | |
| 249 | + const obsDate = observedAt; | |
| 250 | + const priceMap: Array<[key: string, finish: string, currency: 'USD' | 'EUR']> = [ | |
| 251 | + ['usd', 'nonfoil', 'USD'], | |
| 252 | + ['usd_foil', 'foil', 'USD'], | |
| 253 | + ['usd_etched', 'etched', 'USD'], | |
| 254 | + ['eur', 'nonfoil', 'EUR'], | |
| 255 | + ['eur_foil', 'foil', 'EUR'], | |
| 256 | + ]; | |
| 257 | + for (const [key, finish, currency] of priceMap) { | |
| 258 | + const price = num(prices[key]); | |
| 259 | + if (price === null) continue; | |
| 260 | + if (!finishes.includes(finish)) continue; | |
| 261 | + const a = buildAttrs(finish); | |
| 262 | + out.push( | |
| 263 | + priceObservation({ | |
| 264 | + kind: 'price_observation', | |
| 265 | + connectorId: this.meta.id, | |
| 266 | + sourceId: this.meta.sourceId, | |
| 267 | + sourceUrl, | |
| 268 | + externalId: `${card.id}:${key}`, | |
| 269 | + rawTitle: makeTitle({ name: card.name, set: card.set_name, number: card.collector_number, year, variant: a.variant }), | |
| 270 | + imageUrls: images, | |
| 271 | + attributes: a, | |
| 272 | + condition: { condition: 'near_mint', conditionRaw: 'NM (market price)', completeness: null }, | |
| 273 | + observedAt, | |
| 274 | + confidence: 0.9, | |
| 275 | + parserVersion: this.parserVersion, | |
| 276 | + priceKind: 'market', | |
| 277 | + price, | |
| 278 | + currency, | |
| 279 | + observationDate: obsDate, | |
| 280 | + sampleSize: null, | |
| 281 | + }), | |
| 282 | + ); | |
| 283 | + } | |
| 284 | + return out; | |
| 285 | + } | |
| 286 | +} | |
| 287 | + | |
| 288 | +export default function createConnector(meta: ConnectorMeta) { | |
| 289 | + return new ScryfallConnector(meta); | |
| 290 | +} | |
added
connectors/api/scryfall/meta.json
+33 −0
@@ -0,0 +1,33 @@ | ||
| 1 | +{ | |
| 2 | + "id": "scryfall", | |
| 3 | + "displayName": "Scryfall (Magic: The Gathering)", | |
| 4 | + "sourceId": "scryfall", | |
| 5 | + "sourceName": "Scryfall", | |
| 6 | + "sourceType": "catalog", | |
| 7 | + "sourceUrl": "https://scryfall.com", | |
| 8 | + "module": "api/scryfall", | |
| 9 | + "enginePriority": ["api"], | |
| 10 | + "categories": ["magic_the_gathering"], | |
| 11 | + "regions": ["US", "EU"], | |
| 12 | + "languages": ["en"], | |
| 13 | + "currency": ["USD", "EUR"], | |
| 14 | + "supportsListings": false, | |
| 15 | + "supportsSold": false, | |
| 16 | + "supportsAuctions": false, | |
| 17 | + "supportsImages": true, | |
| 18 | + "supportsCatalog": true, | |
| 19 | + "supportsPopulation": false, | |
| 20 | + "supportsLookup": true, | |
| 21 | + "refreshFrequencyMinutes": 1440, | |
| 22 | + "priority": "high", | |
| 23 | + "trustScore": 0.85, | |
| 24 | + "attributionRequired": true, | |
| 25 | + "termsUrl": "https://scryfall.com/docs/api", | |
| 26 | + "accessNotes": "Official public API, no key. Bulk 'default_cards' JSONL (gzip, ~78 MB, refreshed daily) is streamed for the full catalog; single-card lookups use /cards/<set>/<number>. Scryfall asks for ≤10 req/s (we pace 100 ms), an identifying User-Agent and Accept headers. Prices (usd/usd_foil/usd_etched/eur/eur_foil) are Scryfall's daily market aggregates from TCGplayer/Cardmarket → stored as price_observations, never as sales. Card data © Wizards of the Coast; Scryfall requests attribution and no implication of endorsement.", | |
| 27 | + "enabled": true, | |
| 28 | + "schemaVersion": "1.0", | |
| 29 | + "config": { | |
| 30 | + "bulkType": "default_cards", | |
| 31 | + "requestIntervalMs": 100 | |
| 32 | + } | |
| 33 | +} | |
added
connectors/api/ygoprodeck/index.test.ts
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +import { describe, expect, it } from 'vitest'; | |
| 2 | +import { getConnectorMeta } from '@rareindex/connectors'; | |
| 3 | +import { loadFixture, listFixtures, runFixtureSuite } from '@rareindex/connectors/testing'; | |
| 4 | +import createConnector, { languageFromSetCode } from './index.js'; | |
| 5 | + | |
| 6 | +const connector = createConnector(getConnectorMeta('ygoprodeck')); | |
| 7 | + | |
| 8 | +describe('ygoprodeck', () => { | |
| 9 | + runFixtureSuite(connector, it, expect); | |
| 10 | + | |
| 11 | + it('emits one catalog item per printing with set code / rarity / language', async () => { | |
| 12 | + const name = listFixtures('ygoprodeck').find((n) => n === '46986414') ?? listFixtures('ygoprodeck')[0]!; // Dark Magician | |
| 13 | + const fx = loadFixture('ygoprodeck', name); | |
| 14 | + const out = await connector.normalize(fx.raw); | |
| 15 | + const cats = out.filter((r) => r.kind === 'catalog_item'); | |
| 16 | + const payload = fx.raw.payload as { card: { card_sets: Array<{ set_code: string; set_rarity?: string }>; id: number } }; | |
| 17 | + const distinct = new Set(payload.card.card_sets.map((s) => `${s.set_code}|${s.set_rarity ?? ''}`)).size; | |
| 18 | + expect(cats).toHaveLength(distinct); | |
| 19 | + const first = cats[0]!; | |
| 20 | + if (first.kind !== 'catalog_item') throw new Error('kind'); | |
| 21 | + expect(first.attributes.categorySlug).toBe('yugioh'); | |
| 22 | + expect(first.attributes.identifiers.ygo_id).toBe(String(payload.card.id)); | |
| 23 | + expect(first.attributes.identifiers.konami_id).toBeTruthy(); | |
| 24 | + expect(first.attributes.number).toMatch(/^[A-Z0-9]+-[A-Z]*\d+/); | |
| 25 | + expect(first.attributes.setCode).toBe(first.attributes.number!.split('-')[0]); | |
| 26 | + expect(first.attributes.year).toBeNull(); // per-printing year unknown → never guessed | |
| 27 | + // unique external ids per printing | |
| 28 | + expect(new Set(cats.map((c) => c.kind === 'catalog_item' && c.externalId)).size).toBe(cats.length); | |
| 29 | + }); | |
| 30 | + | |
| 31 | + it('records set_price per printing and card-level prices once', async () => { | |
| 32 | + const fx = loadFixture('ygoprodeck', listFixtures('ygoprodeck')[0]!); | |
| 33 | + const out = await connector.normalize(fx.raw); | |
| 34 | + const obs = out.filter((r) => r.kind === 'price_observation'); | |
| 35 | + const printingLevel = obs.filter((o) => o.kind === 'price_observation' && o.attributes.metadata.price_scope === 'printing'); | |
| 36 | + const cardLevel = obs.filter((o) => o.kind === 'price_observation' && o.attributes.metadata.price_scope === 'card'); | |
| 37 | + expect(printingLevel.length).toBeGreaterThan(0); | |
| 38 | + expect(cardLevel.length).toBeGreaterThan(0); | |
| 39 | + expect(cardLevel.length).toBeLessThanOrEqual(5); | |
| 40 | + for (const o of printingLevel) if (o.kind === 'price_observation') expect(o.priceKind).toBe('guide_value'); | |
| 41 | + const eur = cardLevel.find((o) => o.kind === 'price_observation' && o.currency === 'EUR'); | |
| 42 | + expect(eur && eur.kind === 'price_observation' ? eur.attributes.metadata.priceSource : '').toBe('cardmarket'); | |
| 43 | + }); | |
| 44 | + | |
| 45 | + it('derives language from set codes', () => { | |
| 46 | + expect(languageFromSetCode('LOB-EN001')).toBe('English'); | |
| 47 | + expect(languageFromSetCode('LOB-FR001')).toBe('French'); | |
| 48 | + expect(languageFromSetCode('LOB-001')).toBeNull(); | |
| 49 | + }); | |
| 50 | +}); | |
added
connectors/api/ygoprodeck/index.ts
+216 −0
@@ -0,0 +1,216 @@ | ||
| 1 | +import { z } from 'zod'; | |
| 2 | +import { BaseConnector, type ConnectorMeta, type CrawlContext, type RawRecordInput, type RawRecordLike } from '@rareindex/connectors'; | |
| 3 | +import { type NormalizedRecord } from '@rareindex/shared'; | |
| 4 | +import { attrs, catalogItem, makeTitle, num, priceObservation } from '../_lib/shared.js'; | |
| 5 | + | |
| 6 | +const API = 'https://db.ygoprodeck.com/api/v7/cardinfo.php'; | |
| 7 | + | |
| 8 | +const CardSchema = z.object({ | |
| 9 | + id: z.number(), | |
| 10 | + name: z.string(), | |
| 11 | + type: z.string().optional(), | |
| 12 | + humanReadableCardType: z.string().optional(), | |
| 13 | + frameType: z.string().optional(), | |
| 14 | + race: z.string().optional(), | |
| 15 | + attribute: z.string().optional(), | |
| 16 | + archetype: z.string().optional(), | |
| 17 | + atk: z.number().nullable().optional(), | |
| 18 | + def: z.number().nullable().optional(), | |
| 19 | + level: z.number().nullable().optional(), | |
| 20 | + ygoprodeck_url: z.string().optional(), | |
| 21 | + card_sets: z.array(z.object({ set_name: z.string(), set_code: z.string(), set_rarity: z.string().optional(), set_rarity_code: z.string().optional(), set_price: z.string().optional() })).optional(), | |
| 22 | + card_images: z.array(z.object({ id: z.number(), image_url: z.string().optional(), image_url_small: z.string().optional(), image_url_cropped: z.string().optional() })).optional(), | |
| 23 | + card_prices: z.array(z.record(z.string(), z.string().nullable())).optional(), | |
| 24 | + misc_info: z.array(z.object({ konami_id: z.number().optional(), tcg_date: z.string().optional(), ocg_date: z.string().optional(), md_rarity: z.string().optional(), treated_as: z.string().optional() }).loose()).optional(), | |
| 25 | +}); | |
| 26 | +type YgoCard = z.infer<typeof CardSchema>; | |
| 27 | + | |
| 28 | +const KEEP = ['id', 'name', 'type', 'humanReadableCardType', 'frameType', 'race', 'attribute', 'archetype', 'atk', 'def', 'level', 'ygoprodeck_url', 'card_sets', 'card_images', 'card_prices', 'misc_info'] as const; | |
| 29 | + | |
| 30 | +export function trimCard(card: Record<string, unknown>): YgoCard { | |
| 31 | + const out: Record<string, unknown> = {}; | |
| 32 | + for (const k of KEEP) if (card[k] !== undefined) out[k] = card[k]; | |
| 33 | + if (Array.isArray(out.misc_info)) out.misc_info = (out.misc_info as Array<Record<string, unknown>>).map((m) => ({ konami_id: m.konami_id, tcg_date: m.tcg_date, ocg_date: m.ocg_date, md_rarity: m.md_rarity, treated_as: m.treated_as })); | |
| 34 | + return CardSchema.parse(out); | |
| 35 | +} | |
| 36 | + | |
| 37 | +/** Set code prefix → language marker (e.g. LOB-EN001 → EN, LOB-FR001 → FR, LOB-001 → unmarked). */ | |
| 38 | +export function languageFromSetCode(code: string): string | null { | |
| 39 | + const m = code.match(/^[A-Z0-9]+-([A-Z]{2})\d/); | |
| 40 | + if (!m) return null; | |
| 41 | + const map: Record<string, string> = { EN: 'English', FR: 'French', DE: 'German', IT: 'Italian', SP: 'Spanish', PT: 'Portuguese', JP: 'Japanese', KR: 'Korean', AE: 'English (Asian-English)', NA: 'English', E: 'English' }; | |
| 42 | + return map[m[1]!] ?? null; | |
| 43 | +} | |
| 44 | + | |
| 45 | +const CARD_PRICE_SOURCES: Array<[key: string, source: string, currency: 'USD' | 'EUR']> = [ | |
| 46 | + ['tcgplayer_price', 'tcgplayer', 'USD'], | |
| 47 | + ['cardmarket_price', 'cardmarket', 'EUR'], | |
| 48 | + ['ebay_price', 'ebay', 'USD'], | |
| 49 | + ['amazon_price', 'amazon', 'USD'], | |
| 50 | + ['coolstuffinc_price', 'coolstuffinc', 'USD'], | |
| 51 | +]; | |
| 52 | + | |
| 53 | +export class YgoProDeckConnector extends BaseConnector { | |
| 54 | + readonly version = '1.0.0'; | |
| 55 | + readonly parserVersion = '1.0.0'; | |
| 56 | + protected override minIntervalMs = 100; | |
| 57 | + | |
| 58 | + async *crawl(ctx: CrawlContext): AsyncIterable<RawRecordInput> { | |
| 59 | + const misc = ctx.meta.config.misc !== false; | |
| 60 | + const url = `${API}${misc ? '?misc=yes' : ''}`; | |
| 61 | + const res = await ctx.fetch(url, { engines: ['api'], timeoutMs: 180_000 }); | |
| 62 | + if (!res.success || !res.json) throw new Error(`ygoprodeck cardinfo failed: ${res.error}`); | |
| 63 | + const data = (res.json as { data?: Record<string, unknown>[] }).data ?? []; | |
| 64 | + if (data.length < 1000) ctx.anomaly('empty_page', `only ${data.length} cards returned`); | |
| 65 | + const fetchedAt = res.fetchedAt; | |
| 66 | + let count = 0; | |
| 67 | + for (const c of data) { | |
| 68 | + let card: YgoCard; | |
| 69 | + try { | |
| 70 | + card = trimCard(c); | |
| 71 | + } catch (err) { | |
| 72 | + ctx.anomaly('parse_failure', `card ${String(c.id)}: ${err instanceof Error ? err.message : String(err)}`); | |
| 73 | + continue; | |
| 74 | + } | |
| 75 | + yield { url: card.ygoprodeck_url ?? `${API}?id=${card.id}`, externalId: String(card.id), kind: 'catalog_item', engine: 'api', httpStatus: 200, payload: { card }, fetchedAt }; | |
| 76 | + count++; | |
| 77 | + if (this.reached(ctx, count)) break; | |
| 78 | + } | |
| 79 | + await ctx.setCursor({ lastRunAt: fetchedAt.toISOString(), count }); | |
| 80 | + } | |
| 81 | + | |
| 82 | + async normalize(raw: RawRecordLike): Promise<NormalizedRecord[]> { | |
| 83 | + const { card } = z.object({ card: CardSchema }).parse(raw.payload); | |
| 84 | + const misc = card.misc_info?.[0]; | |
| 85 | + const images = [card.card_images?.[0]?.image_url].filter((x): x is string => Boolean(x)); | |
| 86 | + const sourceUrl = card.ygoprodeck_url ?? raw.url; | |
| 87 | + const observedAt = raw.fetchedAt; | |
| 88 | + const out: NormalizedRecord[] = []; | |
| 89 | + const printings = card.card_sets?.length ? card.card_sets : []; | |
| 90 | + | |
| 91 | + const baseIdentifiers: Record<string, string> = { ygo_id: String(card.id) }; | |
| 92 | + if (misc?.konami_id) baseIdentifiers.konami_id = String(misc.konami_id); | |
| 93 | + const tcgYear = misc?.tcg_date ? Number(misc.tcg_date.slice(0, 4)) : null; | |
| 94 | + | |
| 95 | + const buildAttrs = (p: (typeof printings)[number] | null) => | |
| 96 | + attrs({ | |
| 97 | + categorySlug: 'yugioh', | |
| 98 | + franchise: 'Yu-Gi-Oh!', | |
| 99 | + brand: 'Konami', | |
| 100 | + set: p?.set_name ?? null, | |
| 101 | + setCode: p ? p.set_code.split('-')[0]! : null, | |
| 102 | + name: card.name, | |
| 103 | + number: p?.set_code ?? null, | |
| 104 | + year: p ? null : tcgYear, // per-printing release year is not provided by the API; do not guess | |
| 105 | + variant: null, | |
| 106 | + language: p ? languageFromSetCode(p.set_code) : null, | |
| 107 | + rarity: p?.set_rarity ?? null, | |
| 108 | + identifiers: { ...baseIdentifiers, ...(p ? { set_code: p.set_code } : {}) }, | |
| 109 | + metadata: { | |
| 110 | + cardType: card.humanReadableCardType ?? card.type ?? null, | |
| 111 | + frameType: card.frameType ?? null, | |
| 112 | + race: card.race ?? null, | |
| 113 | + attribute: card.attribute ?? null, | |
| 114 | + archetype: card.archetype ?? null, | |
| 115 | + atk: card.atk ?? null, | |
| 116 | + def: card.def ?? null, | |
| 117 | + level: card.level ?? null, | |
| 118 | + tcgDate: misc?.tcg_date ?? null, | |
| 119 | + ocgDate: misc?.ocg_date ?? null, | |
| 120 | + rarityCode: p?.set_rarity_code ?? null, | |
| 121 | + }, | |
| 122 | + }); | |
| 123 | + | |
| 124 | + // The same set code can appear with several rarities (e.g. Common + Secret Rare): keep each | |
| 125 | + // (set_code, rarity) pair once — they are distinct market objects. | |
| 126 | + const seen = new Set<string>(); | |
| 127 | + const unique = printings.filter((p) => { | |
| 128 | + const k = `${p.set_code}|${p.set_rarity ?? ''}`; | |
| 129 | + if (seen.has(k)) return false; | |
| 130 | + seen.add(k); | |
| 131 | + return true; | |
| 132 | + }); | |
| 133 | + const targets = unique.length ? unique : [null]; | |
| 134 | + const codeCounts = new Map<string, number>(); | |
| 135 | + for (const p of unique) codeCounts.set(p.set_code, (codeCounts.get(p.set_code) ?? 0) + 1); | |
| 136 | + const raritySlug = (r: string | undefined) => (r ?? 'unknown').toLowerCase().replace(/[^a-z0-9]+/g, '-'); | |
| 137 | + for (const [i, p] of targets.entries()) { | |
| 138 | + const a = buildAttrs(p); | |
| 139 | + const printingId = p ? `${card.id}:${p.set_code}${(codeCounts.get(p.set_code) ?? 1) > 1 ? `:${raritySlug(p.set_rarity)}` : ''}` : String(card.id); | |
| 140 | + const title = p ? `${card.name} · ${p.set_name} ${p.set_code}${p.set_rarity ? ` (${p.set_rarity})` : ''}` : makeTitle({ name: card.name }); | |
| 141 | + out.push( | |
| 142 | + catalogItem({ | |
| 143 | + kind: 'catalog_item', | |
| 144 | + connectorId: this.meta.id, | |
| 145 | + sourceId: this.meta.sourceId, | |
| 146 | + sourceUrl, | |
| 147 | + externalId: printingId, | |
| 148 | + rawTitle: title, | |
| 149 | + description: card.humanReadableCardType ?? null, | |
| 150 | + imageUrls: images, | |
| 151 | + attributes: a, | |
| 152 | + observedAt, | |
| 153 | + confidence: 0.95, | |
| 154 | + parserVersion: this.parserVersion, | |
| 155 | + releaseDate: null, | |
| 156 | + }), | |
| 157 | + ); | |
| 158 | + const setPrice = num(p?.set_price); | |
| 159 | + if (p && setPrice !== null) { | |
| 160 | + out.push( | |
| 161 | + priceObservation({ | |
| 162 | + kind: 'price_observation', | |
| 163 | + connectorId: this.meta.id, | |
| 164 | + sourceId: this.meta.sourceId, | |
| 165 | + sourceUrl, | |
| 166 | + externalId: `${printingId}:set_price`, | |
| 167 | + rawTitle: title, | |
| 168 | + imageUrls: images, | |
| 169 | + attributes: { ...a, metadata: { ...a.metadata, price_scope: 'printing', priceSource: 'ygoprodeck' } }, | |
| 170 | + observedAt, | |
| 171 | + confidence: 0.7, | |
| 172 | + parserVersion: this.parserVersion, | |
| 173 | + priceKind: 'guide_value', | |
| 174 | + price: setPrice, | |
| 175 | + currency: 'USD', | |
| 176 | + observationDate: observedAt, | |
| 177 | + sampleSize: null, | |
| 178 | + }), | |
| 179 | + ); | |
| 180 | + } | |
| 181 | + // Card-level marketplace prices attach to the first listed printing only. | |
| 182 | + if (i === 0) { | |
| 183 | + const cp = card.card_prices?.[0] ?? {}; | |
| 184 | + for (const [key, source, currency] of CARD_PRICE_SOURCES) { | |
| 185 | + const price = num(cp[key]); | |
| 186 | + if (price === null) continue; | |
| 187 | + out.push( | |
| 188 | + priceObservation({ | |
| 189 | + kind: 'price_observation', | |
| 190 | + connectorId: this.meta.id, | |
| 191 | + sourceId: this.meta.sourceId, | |
| 192 | + sourceUrl, | |
| 193 | + externalId: `${card.id}:${key}`, | |
| 194 | + rawTitle: title, | |
| 195 | + imageUrls: images, | |
| 196 | + attributes: { ...a, metadata: { ...a.metadata, price_scope: 'card', priceSource: source } }, | |
| 197 | + observedAt, | |
| 198 | + confidence: 0.6, | |
| 199 | + parserVersion: this.parserVersion, | |
| 200 | + priceKind: 'market', | |
| 201 | + price, | |
| 202 | + currency, | |
| 203 | + observationDate: observedAt, | |
| 204 | + sampleSize: null, | |
| 205 | + }), | |
| 206 | + ); | |
| 207 | + } | |
| 208 | + } | |
| 209 | + } | |
| 210 | + return out; | |
| 211 | + } | |
| 212 | +} | |
| 213 | + | |
| 214 | +export default function createConnector(meta: ConnectorMeta) { | |
| 215 | + return new YgoProDeckConnector(meta); | |
| 216 | +} | |
added
connectors/api/ygoprodeck/meta.json
+32 −0
@@ -0,0 +1,32 @@ | ||
| 1 | +{ | |
| 2 | + "id": "ygoprodeck", | |
| 3 | + "displayName": "YGOPRODeck (Yu-Gi-Oh!)", | |
| 4 | + "sourceId": "ygoprodeck", | |
| 5 | + "sourceName": "YGOPRODeck", | |
| 6 | + "sourceType": "catalog", | |
| 7 | + "sourceUrl": "https://ygoprodeck.com", | |
| 8 | + "module": "api/ygoprodeck", | |
| 9 | + "enginePriority": ["api"], | |
| 10 | + "categories": ["yugioh"], | |
| 11 | + "regions": ["US", "EU"], | |
| 12 | + "languages": ["en"], | |
| 13 | + "currency": ["USD", "EUR"], | |
| 14 | + "supportsListings": false, | |
| 15 | + "supportsSold": false, | |
| 16 | + "supportsAuctions": false, | |
| 17 | + "supportsImages": true, | |
| 18 | + "supportsCatalog": true, | |
| 19 | + "supportsPopulation": false, | |
| 20 | + "supportsLookup": false, | |
| 21 | + "refreshFrequencyMinutes": 1440, | |
| 22 | + "priority": "high", | |
| 23 | + "trustScore": 0.75, | |
| 24 | + "attributionRequired": true, | |
| 25 | + "termsUrl": "https://ygoprodeck.com/api-guide/", | |
| 26 | + "accessNotes": "Public API v7 (https://db.ygoprodeck.com/api/v7/cardinfo.php), no key; rate limit 20 req/s — a full crawl is ONE request (~21 MB, ~14.5k cards / ~44k printings) plus optional misc=yes. The API carries no price timestamp: card_sets[].set_price (USD, per printing) and card_prices (cardmarket EUR / tcgplayer / ebay / amazon / coolstuffinc USD, card-level) are recorded as price_observations dated at fetch time with confidence 0.7 and metadata.price_scope. Images may not be hot-linked in bulk per the API guide (we store URLs, never mirror). Yu-Gi-Oh! © Konami.", | |
| 27 | + "enabled": true, | |
| 28 | + "schemaVersion": "1.0", | |
| 29 | + "config": { | |
| 30 | + "misc": true | |
| 31 | + } | |
| 32 | +} | |
added
connectors/firecrawl/brickeconomy/_smoke.ts
+23 −0
@@ -0,0 +1,23 @@ | ||
| 1 | +/** Live smoke: pnpm tsx connectors/firecrawl/brickeconomy/_smoke.ts [seedUrl…] (CAPTURE=1 to save fixtures) */ | |
| 2 | +import { createRouter, createCrawlContext, getConnectorMeta } from '@rareindex/connectors'; | |
| 3 | +import { saveFixture } from '@rareindex/connectors/testing'; | |
| 4 | +import { env } from '@rareindex/shared'; | |
| 5 | +import createConnector from './index.js'; | |
| 6 | + | |
| 7 | +const e = env(); | |
| 8 | +const meta = getConnectorMeta('brickeconomy'); | |
| 9 | +const connector = createConnector(meta); | |
| 10 | +const router = createRouter({ firecrawlApiKey: e.FIRECRAWL_API_KEY, scrapflyApiKey: e.SCRAPFLY_API_KEY }); | |
| 11 | +const seeds = process.argv.slice(2); | |
| 12 | +const ctx = createCrawlContext({ router, meta: { ...meta, config: { ...meta.config, setsPerSeed: 3 } }, options: { mode: 'probe', limit: Number(process.env.LIMIT ?? 3), seeds: seeds.length ? seeds : undefined } }); | |
| 13 | + | |
| 14 | +for await (const raw of connector.crawl(ctx)) { | |
| 15 | + const recs = await connector.normalize({ ...raw, externalId: raw.externalId ?? null, fetchedAt: raw.fetchedAt ?? new Date() }); | |
| 16 | + console.log(`\n# ${raw.url} — ${recs.length} records`); | |
| 17 | + for (const r of recs) console.log(JSON.stringify(r).slice(0, 700)); | |
| 18 | + if (process.env.CAPTURE) { | |
| 19 | + const slug = raw.url.split('/').slice(-2).join('__'); | |
| 20 | + saveFixture('brickeconomy', slug, { raw: { url: raw.url, externalId: raw.externalId ?? null, kind: raw.kind, engine: raw.engine, fetchedAt: raw.fetchedAt ?? new Date(), payload: raw.payload }, expect: { minCount: 2, kinds: ['catalog_item', 'price_observation'] }, note: `captured live from ${raw.url}` }); | |
| 21 | + } | |
| 22 | +} | |
| 23 | +console.log('\nengine stats', ctx.engineStats, 'anomalies', ctx.anomalies); | |
added
connectors/firecrawl/brickeconomy/index.test.ts
+36 −0
@@ -0,0 +1,36 @@ | ||
| 1 | +import { describe, expect, it } from 'vitest'; | |
| 2 | +import { getConnectorMeta } from '@rareindex/connectors'; | |
| 3 | +import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; | |
| 4 | +import createConnector, { parseSetMarkdown } from './index.js'; | |
| 5 | + | |
| 6 | +const connector = createConnector(getConnectorMeta('brickeconomy')); | |
| 7 | + | |
| 8 | +describe('brickeconomy', () => { | |
| 9 | + runFixtureSuite(connector, it, expect); | |
| 10 | + | |
| 11 | + it('maps a retired set to catalog + new/used guide values', async () => { | |
| 12 | + const fx = loadFixture('brickeconomy', '10179-1__lego-star-wars-ultimate-collectors-millennium-falcon'); | |
| 13 | + const out = await connector.normalize(fx.raw); | |
| 14 | + const cat = out.find((r) => r.kind === 'catalog_item'); | |
| 15 | + if (cat?.kind !== 'catalog_item') throw new Error(); | |
| 16 | + expect(cat.attributes.categorySlug).toBe('lego_sets'); | |
| 17 | + expect(cat.attributes.number).toBe('10179'); | |
| 18 | + expect(cat.attributes.identifiers.lego_set_number).toBe('10179'); | |
| 19 | + expect(cat.attributes.franchise).toBe('Star Wars'); | |
| 20 | + expect(cat.attributes.year).toBe(2007); | |
| 21 | + expect(cat.attributes.originalMsrp).toBe(499.99); | |
| 22 | + expect(cat.attributes.originalMsrpCurrency).toBe('USD'); | |
| 23 | + const sealed = out.find((r) => r.kind === 'price_observation' && r.condition.completeness === 'sealed'); | |
| 24 | + const used = out.find((r) => r.kind === 'price_observation' && r.condition.completeness === 'used_complete' && r.priceKind === 'guide_value'); | |
| 25 | + if (sealed?.kind !== 'price_observation' || used?.kind !== 'price_observation') throw new Error(); | |
| 26 | + expect(sealed.price).toBeGreaterThan(used.price); | |
| 27 | + expect(sealed.currency).toBe('USD'); | |
| 28 | + }); | |
| 29 | + | |
| 30 | + it('parses the pricing markdown', () => { | |
| 31 | + const md = `#### Set Details\n\nSet number\n\n10179-1\n\nName\n\nUltimate Collector's Millennium Falcon\n\nTheme\n\n[Star Wars](https://x)\n\nSubtheme\n\n[Ultimate Collector Series](https://x)\n\nYear\n\n[2007](https://x)\n\nReleased\n\nOctober 1, 2007\n\nPieces\n\n5,195\n\n#### Set Pricing\n\nRetail price\n\n$499.99\n\nNew/Sealed\n\nValue\n\n**$2,946.69**\n\nGrowth\n\n+489.35%\n\nUsed\n\nValue\n\n$1,087.86\n\nRange\n\n$1,005.38 - $1,335.67\n`; | |
| 32 | + expect(parseSetMarkdown(md)).toMatchObject({ setNumber: '10179-1', name: "Ultimate Collector's Millennium Falcon", theme: 'Star Wars', subtheme: 'Ultimate Collector Series', year: 2007, pieces: 5195, retailPrice: 499.99, newValue: 2946.69, usedValue: 1087.86, usedRangeLow: 1005.38, usedRangeHigh: 1335.67, growthPct: 489.35 }); | |
| 33 | + const available = `#### Set Details\n\nSet number\n\n75192-1\n\nName\n\nMillennium Falcon\n\nYear\n\n[2017](x)\n\n#### Set Pricing\n\nRetail price\n\n$849.99\n\nMarket price\n\n$764.15-10.1%\n\nStill available at retail\n`; | |
| 34 | + expect(parseSetMarkdown(available)).toMatchObject({ setNumber: '75192-1', retailPrice: 849.99, newValue: 764.15, usedValue: null }); | |
| 35 | + }); | |
| 36 | +}); | |
added
connectors/firecrawl/brickeconomy/index.ts
+255 −0
@@ -0,0 +1,255 @@ | ||
| 1 | +import { z } from 'zod'; | |
| 2 | +import { BaseConnector, type ConnectorMeta, type CrawlContext, type RawRecordInput, type RawRecordLike } from '@rareindex/connectors'; | |
| 3 | +import { parsePrice, parseSourceDate, type AssetAttributes, type NormalizedCatalogItem, type NormalizedPriceObservation, type NormalizedRecord } from '@rareindex/shared'; | |
| 4 | + | |
| 5 | +/** | |
| 6 | + * BrickEconomy connector — LEGO set catalog + estimated values (New/Sealed, Used) + retail price. | |
| 7 | + * Raw payload = the markdown sections of the set page (Set Details, Set Pricing, Set Predictions); | |
| 8 | + * normalisation re-parses that markdown so parser fixes can be replayed on stored raw records. | |
| 9 | + */ | |
| 10 | + | |
| 11 | +const BASE = 'https://www.brickeconomy.com'; | |
| 12 | +const PARSER_VERSION = '1.0.0'; | |
| 13 | + | |
| 14 | +export const SetPayloadSchema = z.object({ | |
| 15 | + kind: z.literal('set_page'), | |
| 16 | + url: z.string(), | |
| 17 | + title: z.string(), | |
| 18 | + markdown: z.string(), | |
| 19 | + images: z.array(z.string()), | |
| 20 | +}); | |
| 21 | +export type SetPayload = z.infer<typeof SetPayloadSchema>; | |
| 22 | + | |
| 23 | +/** Extract "#### Section" blocks and return a compact markdown excerpt. */ | |
| 24 | +export function excerptSections(md: string): string { | |
| 25 | + const wanted = ['Set Details', 'Set Pricing', 'Set Predictions', 'Minifig Details', 'Minifig Pricing']; | |
| 26 | + const parts: string[] = []; | |
| 27 | + const re = /^####\s+(.+)$/gm; | |
| 28 | + const heads: Array<{ name: string; start: number; end: number }> = []; | |
| 29 | + let m: RegExpExecArray | null; | |
| 30 | + while ((m = re.exec(md))) heads.push({ name: m[1]!.trim(), start: m.index, end: md.length }); | |
| 31 | + for (let i = 0; i < heads.length; i++) heads[i]!.end = heads[i + 1]?.start ?? md.length; | |
| 32 | + for (const h of heads) if (wanted.includes(h.name)) parts.push(md.slice(h.start, h.end).trim()); | |
| 33 | + return parts.join('\n\n'); | |
| 34 | +} | |
| 35 | + | |
| 36 | +/** Read the value that follows a label line in the markdown ("Label\n\nValue"). */ | |
| 37 | +function field(md: string, label: string): string | null { | |
| 38 | + const re = new RegExp(`(?:^|\\n)${label.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*\\n+([^\\n]+)`, 'i'); | |
| 39 | + const m = md.match(re); | |
| 40 | + if (!m) return null; | |
| 41 | + const v = m[1]!.replace(/\[([^\]]+)\]\([^)]*\)/g, '$1').replace(/\*\*/g, '').trim(); | |
| 42 | + return v || null; | |
| 43 | +} | |
| 44 | + | |
| 45 | +export interface ParsedSet { | |
| 46 | + setNumber: string | null; | |
| 47 | + name: string | null; | |
| 48 | + theme: string | null; | |
| 49 | + subtheme: string | null; | |
| 50 | + year: number | null; | |
| 51 | + released: string | null; | |
| 52 | + retired: string | null; | |
| 53 | + availability: string | null; | |
| 54 | + pieces: number | null; | |
| 55 | + minifigs: number | null; | |
| 56 | + retailPrice: number | null; | |
| 57 | + newValue: number | null; | |
| 58 | + usedValue: number | null; | |
| 59 | + usedRangeLow: number | null; | |
| 60 | + usedRangeHigh: number | null; | |
| 61 | + growthPct: number | null; | |
| 62 | +} | |
| 63 | + | |
| 64 | +export function parseSetMarkdown(md: string): ParsedSet { | |
| 65 | + const details = md.slice(md.indexOf('#### Set Details'), md.indexOf('#### Set Pricing') > 0 ? md.indexOf('#### Set Pricing') : undefined); | |
| 66 | + const pricing = md.slice(md.indexOf('#### Set Pricing') >= 0 ? md.indexOf('#### Set Pricing') : md.length); | |
| 67 | + const num = (s: string | null) => { | |
| 68 | + if (!s) return null; | |
| 69 | + const p = parsePrice(s, 'USD'); | |
| 70 | + return p && p.amount > 0 ? p.amount : null; | |
| 71 | + }; | |
| 72 | + const int = (s: string | null) => { | |
| 73 | + const m = s?.replace(/,/g, '').match(/\d+/); | |
| 74 | + return m ? Number(m[0]) : null; | |
| 75 | + }; | |
| 76 | + const yearTxt = field(details, 'Year'); | |
| 77 | + // New/Sealed value: "New/Sealed\n\nValue\n\n**$2,946.69**" ; still-available sets: "Market price\n\n$764.15-10.1%" | |
| 78 | + const newBlock = pricing.match(/New\/Sealed\s*\n+Value\s*\n+([^\n]+)/i)?.[1] ?? null; | |
| 79 | + const marketPrice = pricing.match(/Market price\s*\n+\$?([\d,]+\.?\d*)/i)?.[1] ?? null; | |
| 80 | + const usedBlock = pricing.match(/Used\s*\n+Value\s*\n+([^\n]+)/i)?.[1] ?? null; | |
| 81 | + const usedRange = pricing.match(/Used[\s\S]{0,200}?Range\s*\n+\$?([\d,]+\.?\d*)\s*-\s*\$?([\d,]+\.?\d*)/i); | |
| 82 | + const growth = pricing.match(/(?:^|\n)Growth\s*\n+([+-]?[\d.]+)%/i)?.[1] ?? null; | |
| 83 | + return { | |
| 84 | + setNumber: field(details, 'Set number'), | |
| 85 | + name: field(details, 'Name'), | |
| 86 | + theme: field(details, 'Theme'), | |
| 87 | + subtheme: field(details, 'Subtheme'), | |
| 88 | + year: yearTxt ? int(yearTxt) : null, | |
| 89 | + released: field(details, 'Released'), | |
| 90 | + retired: field(details, 'Retired'), | |
| 91 | + availability: field(details, 'Availability'), | |
| 92 | + pieces: int(field(details, 'Pieces')), | |
| 93 | + minifigs: int(field(details, 'Minifigs')), | |
| 94 | + retailPrice: num(field(pricing, 'Retail price')), | |
| 95 | + newValue: num(newBlock) ?? (marketPrice ? Number(marketPrice.replace(/,/g, '')) : null), | |
| 96 | + usedValue: num(usedBlock), | |
| 97 | + usedRangeLow: usedRange ? Number(usedRange[1]!.replace(/,/g, '')) : null, | |
| 98 | + usedRangeHigh: usedRange ? Number(usedRange[2]!.replace(/,/g, '')) : null, | |
| 99 | + growthPct: growth ? Number(growth) : null, | |
| 100 | + }; | |
| 101 | +} | |
| 102 | + | |
| 103 | +export class BrickEconomyConnector extends BaseConnector { | |
| 104 | + readonly version = '1.0.0'; | |
| 105 | + readonly parserVersion = PARSER_VERSION; | |
| 106 | + override readonly urlPatterns = [/^https?:\/\/(www\.)?brickeconomy\.com\/set\/[^/]+\/[^/?#]+/i]; | |
| 107 | + protected override minIntervalMs = 1500; | |
| 108 | + | |
| 109 | + async *crawl(ctx: CrawlContext): AsyncIterable<RawRecordInput> { | |
| 110 | + const seeds = ctx.options.seeds?.length ? ctx.options.seeds : ((this.meta.config.seeds as string[] | undefined) ?? []); | |
| 111 | + const perSeed = Number(this.meta.config.setsPerSeed ?? 60); | |
| 112 | + const cursor = ctx.options.cursor ?? {}; | |
| 113 | + const done = new Set<string>((cursor.doneSeeds as string[] | undefined) ?? []); | |
| 114 | + let count = 0; | |
| 115 | + const seenSets = new Set<string>(); | |
| 116 | + for (const seed of seeds) { | |
| 117 | + if (done.has(seed) && ctx.options.mode !== 'backfill') continue; | |
| 118 | + if (ctx.signal?.aborted) return; | |
| 119 | + const setUrls = seed.includes('/set/') ? [seed] : await this.discover(ctx, seed, perSeed); | |
| 120 | + if (setUrls.length === 0) ctx.anomaly('empty_seed', seed); | |
| 121 | + for (const url of setUrls) { | |
| 122 | + if (this.reached(ctx, count)) return; | |
| 123 | + if (seenSets.has(url)) continue; | |
| 124 | + seenSets.add(url); | |
| 125 | + if (!(await ctx.shouldFetch(url))) continue; | |
| 126 | + await this.throttle(); | |
| 127 | + const rec = await this.fetchSet(ctx, url); | |
| 128 | + if (rec) { | |
| 129 | + count++; | |
| 130 | + yield rec; | |
| 131 | + } | |
| 132 | + } | |
| 133 | + done.add(seed); | |
| 134 | + await ctx.setCursor({ doneSeeds: [...done], updatedAt: new Date().toISOString() }); | |
| 135 | + } | |
| 136 | + await ctx.setCursor({ doneSeeds: [], updatedAt: new Date().toISOString() }); | |
| 137 | + } | |
| 138 | + | |
| 139 | + private async discover(ctx: CrawlContext, listUrl: string, max: number): Promise<string[]> { | |
| 140 | + await this.throttle(); | |
| 141 | + const res = await ctx.fetch(listUrl, { minQuality: 0.2 }); | |
| 142 | + const text = `${res.markdown ?? ''}\n${res.html ?? ''}`; | |
| 143 | + if (!res.success || !text.trim()) { | |
| 144 | + ctx.anomaly('discover_failed', `${listUrl}: ${res.error ?? res.httpStatus}`); | |
| 145 | + return []; | |
| 146 | + } | |
| 147 | + const urls = new Set<string>(); | |
| 148 | + for (const m of text.matchAll(/https?:\/\/www\.brickeconomy\.com\/set\/([0-9]+-[0-9]+)\/([a-z0-9-]+)/g)) urls.add(`${BASE}/set/${m[1]}/${m[2]}`); | |
| 149 | + for (const m of text.matchAll(/href="\/set\/([0-9]+-[0-9]+)\/([a-z0-9-]+)"/g)) urls.add(`${BASE}/set/${m[1]}/${m[2]}`); | |
| 150 | + return [...urls].slice(0, max); | |
| 151 | + } | |
| 152 | + | |
| 153 | + private async fetchSet(ctx: CrawlContext, url: string): Promise<RawRecordInput | null> { | |
| 154 | + const res = await ctx.fetch(url, { | |
| 155 | + expect: ['title', 'price', 'identifiers'], | |
| 156 | + parse: (r) => { | |
| 157 | + const md = r.markdown ?? ''; | |
| 158 | + const p = parseSetMarkdown(md); | |
| 159 | + return { title: p.name, price: p.newValue ?? p.usedValue ?? p.retailPrice, identifiers: p.setNumber ? { set: p.setNumber } : null }; | |
| 160 | + }, | |
| 161 | + }); | |
| 162 | + if (!res.success || !res.markdown) { | |
| 163 | + ctx.anomaly('set_fetch_failed', `${url}: ${res.error ?? res.httpStatus}`); | |
| 164 | + return null; | |
| 165 | + } | |
| 166 | + const md = res.markdown; | |
| 167 | + const title = md.match(/^#\s+(.+)$/m)?.[1]?.trim() ?? ''; | |
| 168 | + const images = [...new Set([...md.matchAll(/https:\/\/www\.brickeconomy\.com\/resources\/images\/sets\/[^\s)]+_large\.jpg/g)].map((m) => m[0]))].slice(0, 3); | |
| 169 | + const excerpt = excerptSections(md); | |
| 170 | + if (!excerpt.includes('Set number')) { | |
| 171 | + ctx.anomaly('parse_failure_details', url); | |
| 172 | + return null; | |
| 173 | + } | |
| 174 | + const payload: SetPayload = { kind: 'set_page', url, title, markdown: excerpt, images }; | |
| 175 | + const setNumber = parseSetMarkdown(excerpt).setNumber; | |
| 176 | + return { url, externalId: setNumber, kind: 'catalog_item', engine: res.engine, httpStatus: res.httpStatus, payload, fetchedAt: res.fetchedAt }; | |
| 177 | + } | |
| 178 | + | |
| 179 | + async lookup(url: string, ctx: CrawlContext): Promise<RawRecordInput[]> { | |
| 180 | + const rec = await this.fetchSet(ctx, url.split('?')[0]!); | |
| 181 | + return rec ? [rec] : []; | |
| 182 | + } | |
| 183 | + | |
| 184 | + async normalize(raw: RawRecordLike): Promise<NormalizedRecord[]> { | |
| 185 | + const p = SetPayloadSchema.parse(raw.payload); | |
| 186 | + const s = parseSetMarkdown(p.markdown); | |
| 187 | + if (!s.setNumber || !s.name) return []; | |
| 188 | + const baseNumber = s.setNumber.replace(/-\d+$/, ''); | |
| 189 | + const attributes: AssetAttributes = { | |
| 190 | + categorySlug: 'lego_sets', | |
| 191 | + subcategorySlug: null, | |
| 192 | + franchise: s.theme, | |
| 193 | + brand: 'LEGO', | |
| 194 | + series: s.subtheme, | |
| 195 | + set: s.theme, | |
| 196 | + setCode: null, | |
| 197 | + name: s.name, | |
| 198 | + model: null, | |
| 199 | + reference: null, | |
| 200 | + number: baseNumber, | |
| 201 | + year: s.year, | |
| 202 | + edition: null, | |
| 203 | + variant: s.setNumber.endsWith('-1') ? null : `variant ${s.setNumber.split('-')[1]}`, | |
| 204 | + language: null, | |
| 205 | + region: null, | |
| 206 | + country: null, | |
| 207 | + material: null, | |
| 208 | + size: null, | |
| 209 | + color: null, | |
| 210 | + rarity: null, | |
| 211 | + productionQuantity: null, | |
| 212 | + originalMsrp: s.retailPrice, | |
| 213 | + originalMsrpCurrency: s.retailPrice !== null ? 'USD' : null, | |
| 214 | + identifiers: { lego_set_number: baseNumber, brickeconomy_set: s.setNumber }, | |
| 215 | + metadata: { pieces: s.pieces, minifigs: s.minifigs, released: s.released, retired: s.retired, availability: s.availability, subtheme: s.subtheme, growth_pct: s.growthPct }, | |
| 216 | + }; | |
| 217 | + const observedAt = raw.fetchedAt; | |
| 218 | + const base = { | |
| 219 | + connectorId: this.meta.id, | |
| 220 | + sourceId: this.meta.sourceId, | |
| 221 | + sourceUrl: p.url, | |
| 222 | + externalId: s.setNumber, | |
| 223 | + rawTitle: p.title || `${baseNumber} LEGO ${s.theme ?? ''} ${s.name}`.trim(), | |
| 224 | + description: null, | |
| 225 | + imageUrls: p.images, | |
| 226 | + attributes, | |
| 227 | + grade: { grader: null, grade: null, qualifier: null, certificationNumber: null }, | |
| 228 | + observedAt, | |
| 229 | + confidence: 0.9, | |
| 230 | + parserVersion: PARSER_VERSION, | |
| 231 | + }; | |
| 232 | + const out: NormalizedRecord[] = []; | |
| 233 | + const catalog: NormalizedCatalogItem = { kind: 'catalog_item', ...base, condition: { condition: null, conditionRaw: null, completeness: null }, releaseDate: parseSourceDate(s.released) }; | |
| 234 | + out.push(catalog); | |
| 235 | + const obsDate = new Date(Date.UTC(observedAt.getUTCFullYear(), observedAt.getUTCMonth(), observedAt.getUTCDate())); | |
| 236 | + const obs = (price: number, completeness: 'sealed' | 'used_complete', priceKind: NormalizedPriceObservation['priceKind'], raw: string): NormalizedPriceObservation => ({ | |
| 237 | + kind: 'price_observation', | |
| 238 | + ...base, | |
| 239 | + condition: { condition: completeness, conditionRaw: raw, completeness }, | |
| 240 | + priceKind, | |
| 241 | + price, | |
| 242 | + currency: 'USD', | |
| 243 | + observationDate: obsDate, | |
| 244 | + sampleSize: null, | |
| 245 | + confidence: 0.8, | |
| 246 | + }); | |
| 247 | + if (s.newValue) out.push(obs(s.newValue, 'sealed', 'guide_value', 'New/Sealed value (BrickEconomy estimate)')); | |
| 248 | + if (s.usedValue) out.push(obs(s.usedValue, 'used_complete', 'guide_value', 'Used value (BrickEconomy estimate)')); | |
| 249 | + if (s.usedRangeLow) out.push(obs(s.usedRangeLow, 'used_complete', 'low', 'Used range low (BrickEconomy)')); | |
| 250 | + if (s.usedRangeHigh) out.push(obs(s.usedRangeHigh, 'used_complete', 'high', 'Used range high (BrickEconomy)')); | |
| 251 | + return out; | |
| 252 | + } | |
| 253 | +} | |
| 254 | + | |
| 255 | +export default (meta: ConnectorMeta) => new BrickEconomyConnector(meta); | |
added
connectors/firecrawl/brickeconomy/meta.json
+42 −0
@@ -0,0 +1,42 @@ | ||
| 1 | +{ | |
| 2 | + "id": "brickeconomy", | |
| 3 | + "displayName": "BrickEconomy", | |
| 4 | + "sourceId": "brickeconomy", | |
| 5 | + "sourceName": "BrickEconomy", | |
| 6 | + "sourceType": "pricing_guide", | |
| 7 | + "sourceUrl": "https://www.brickeconomy.com", | |
| 8 | + "module": "firecrawl/brickeconomy", | |
| 9 | + "enginePriority": ["firecrawl", "scrapfly"], | |
| 10 | + "categories": ["lego", "lego_sets"], | |
| 11 | + "regions": ["US"], | |
| 12 | + "languages": ["en"], | |
| 13 | + "currency": ["USD"], | |
| 14 | + "supportsListings": false, | |
| 15 | + "supportsSold": false, | |
| 16 | + "supportsAuctions": false, | |
| 17 | + "supportsImages": true, | |
| 18 | + "supportsCatalog": true, | |
| 19 | + "supportsPopulation": false, | |
| 20 | + "supportsLookup": true, | |
| 21 | + "refreshFrequencyMinutes": 4320, | |
| 22 | + "priority": "medium", | |
| 23 | + "trustScore": 0.65, | |
| 24 | + "attributionRequired": true, | |
| 25 | + "termsUrl": "https://www.brickeconomy.com/legal-terms", | |
| 26 | + "accessNotes": "Public set pages fetched through Firecrawl (markdown; ~1 credit/page). robots.txt allows all crawlers (explicitly including AI bots). Plain HTTPS returns 403 for non-browser agents, so Firecrawl is the primary engine and Scrapfly the fallback. We capture set facts (number, name, theme, subtheme, year, release/retire dates, pieces, minifigs), retail price, and BrickEconomy's estimated New/Sealed and Used values as guide observations — never as sales. Discovery via theme/top lists in config.seeds.", | |
| 27 | + "enabled": true, | |
| 28 | + "schemaVersion": "1.0", | |
| 29 | + "config": { | |
| 30 | + "seeds": [ | |
| 31 | + "https://www.brickeconomy.com/sets/top/most-valuable-lego-sets", | |
| 32 | + "https://www.brickeconomy.com/sets/theme/star-wars/subtheme/ultimate-collector-series", | |
| 33 | + "https://www.brickeconomy.com/sets/theme/icons", | |
| 34 | + "https://www.brickeconomy.com/sets/theme/ideas", | |
| 35 | + "https://www.brickeconomy.com/sets/theme/creator-expert", | |
| 36 | + "https://www.brickeconomy.com/sets/theme/harry-potter", | |
| 37 | + "https://www.brickeconomy.com/sets/theme/technic", | |
| 38 | + "https://www.brickeconomy.com/sets/retired" | |
| 39 | + ], | |
| 40 | + "setsPerSeed": 60 | |
| 41 | + } | |
| 42 | +} | |
added
connectors/firecrawl/phillips-watches/_smoke.ts
+22 −0
@@ -0,0 +1,22 @@ | ||
| 1 | +/** Live smoke: pnpm tsx connectors/firecrawl/phillips-watches/_smoke.ts [saleNumber…] (CAPTURE=1 to save fixtures) */ | |
| 2 | +import { createRouter, createCrawlContext, getConnectorMeta } from '@rareindex/connectors'; | |
| 3 | +import { saveFixture } from '@rareindex/connectors/testing'; | |
| 4 | +import { env } from '@rareindex/shared'; | |
| 5 | +import createConnector from './index.js'; | |
| 6 | + | |
| 7 | +const e = env(); | |
| 8 | +const meta = getConnectorMeta('phillips-watches'); | |
| 9 | +const connector = createConnector(meta); | |
| 10 | +const router = createRouter({ firecrawlApiKey: e.FIRECRAWL_API_KEY, scrapflyApiKey: e.SCRAPFLY_API_KEY }); | |
| 11 | +const seeds = process.argv.slice(2); | |
| 12 | +const ctx = createCrawlContext({ router, meta, options: { mode: 'probe', limit: Number(process.env.LIMIT ?? 1), seeds: seeds.length ? seeds : undefined } }); | |
| 13 | + | |
| 14 | +for await (const raw of connector.crawl(ctx)) { | |
| 15 | + const recs = await connector.normalize({ ...raw, externalId: raw.externalId ?? null, fetchedAt: raw.fetchedAt ?? new Date() }); | |
| 16 | + const p = raw.payload as { saleNumber: string; title: string; endDate: string | null; lotCount: number | null }; | |
| 17 | + const sales = recs.filter((r) => r.kind === 'sale'); | |
| 18 | + console.log(`\n# ${p.saleNumber} ${p.title} (${p.endDate}) — ${p.lotCount} lots → ${recs.length} records (${sales.length} sales)`); | |
| 19 | + for (const r of recs.slice(0, 3)) console.log(JSON.stringify(r).slice(0, 700)); | |
| 20 | + if (process.env.CAPTURE) saveFixture('phillips-watches', p.saleNumber, { raw: { url: raw.url, externalId: raw.externalId ?? null, kind: raw.kind, engine: raw.engine, fetchedAt: raw.fetchedAt ?? new Date(), payload: raw.payload }, expect: { minCount: 10, kinds: ['sale', 'auction_lot'] }, note: `captured live from ${raw.url}` }); | |
| 21 | +} | |
| 22 | +console.log('\nengine stats', ctx.engineStats, 'anomalies', ctx.anomalies); | |
added
connectors/firecrawl/phillips-watches/index.test.ts
+41 −0
@@ -0,0 +1,41 @@ | ||
| 1 | +import { describe, expect, it } from 'vitest'; | |
| 2 | +import { getConnectorMeta } from '@rareindex/connectors'; | |
| 3 | +import { listFixtures, loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; | |
| 4 | +import createConnector, { parseLots, parsePastSales } from './index.js'; | |
| 5 | + | |
| 6 | +const connector = createConnector(getConnectorMeta('phillips-watches')); | |
| 7 | + | |
| 8 | +describe('phillips-watches', () => { | |
| 9 | + runFixtureSuite(connector, it, expect); | |
| 10 | + | |
| 11 | + it('maps a sale page to auction sales with buyer premium included', async () => { | |
| 12 | + const name = listFixtures('phillips-watches')[0]!; | |
| 13 | + const out = await connector.normalize(loadFixture('phillips-watches', name).raw); | |
| 14 | + const sales = out.filter((r) => r.kind === 'sale'); | |
| 15 | + expect(sales.length).toBeGreaterThan(10); | |
| 16 | + const s = sales[0]; | |
| 17 | + if (s?.kind !== 'sale') throw new Error(); | |
| 18 | + expect(s.saleType).toBe('auction'); | |
| 19 | + expect(s.auctionHouse).toBe('Phillips'); | |
| 20 | + expect(s.buyerPremiumIncluded).toBe(true); | |
| 21 | + expect(['CHF', 'USD', 'HKD', 'GBP', 'EUR']).toContain(s.currency); | |
| 22 | + expect(s.attributes.brand).toBeTruthy(); | |
| 23 | + expect(s.lotNumber).toMatch(/^\d+/); | |
| 24 | + const rolex = sales.find((r) => r.kind === 'sale' && r.attributes.categorySlug === 'rolex'); | |
| 25 | + if (rolex?.kind === 'sale') expect(rolex.attributes.reference).toBeTruthy(); | |
| 26 | + }); | |
| 27 | + | |
| 28 | + it('parses markdown lot cards', () => { | |
| 29 | + const md = `## 2 Lots\n\n[\\\\\nNo Reserve\\\\\n4\\\\\n\\\\\nRolex\\\\\nRef. 116509\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF48,260](https://www.phillips.com/detail/rolex/214153)\n\n[\\\\\n\\\\\n5\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5320G-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000](https://www.phillips.com/detail/patek-philippe/214809)`; | |
| 30 | + const lots = parseLots(md); | |
| 31 | + expect(lots).toHaveLength(2); | |
| 32 | + expect(lots[0]).toMatchObject({ lotNumber: '4', maker: 'Rolex', reference: '116509', model: 'Cosmograph Daytona', estimateLow: 25000, estimateHigh: 50000, soldFor: 48260, currency: 'CHF', noReserve: true }); | |
| 33 | + expect(lots[1]).toMatchObject({ lotNumber: '5', maker: 'Patek Philippe', reference: '5320G-001', soldFor: null, estimateLow: 40000 }); | |
| 34 | + }); | |
| 35 | + | |
| 36 | + it('extracts past watch sales from the embedded JSON', () => { | |
| 37 | + const html = `x{"a":1,"departments":[{"departmentID":12,"departmentName":"Watches"}],"locationName":"GENEVA","startDateTimeOffset":"2025-03-05T12:00:00+01:00","endDateTimeOffset":"2025-03-12T16:00:00+01:00","saleNumber":"CH080125","auctionTitle":"Phillips Watches Online Auction: The Geneva Sessions Spring 2025"}y{"departments":[{"departmentName":"Contemporary"}],"saleNumber":"NY011126","auctionTitle":"Modern & Contemporary Art: Online Auction, New York"}`; | |
| 38 | + const sales = parsePastSales(html, 'watch'); | |
| 39 | + expect(sales).toEqual([{ saleNumber: 'CH080125', title: 'Phillips Watches Online Auction: The Geneva Sessions Spring 2025', location: 'GENEVA', startDate: '2025-03-05T12:00:00+01:00', endDate: '2025-03-12T16:00:00+01:00' }]); | |
| 40 | + }); | |
| 41 | +}); | |
added
connectors/firecrawl/phillips-watches/index.ts
+317 −0
@@ -0,0 +1,317 @@ | ||
| 1 | +import { z } from 'zod'; | |
| 2 | +import { BaseConnector, type ConnectorMeta, type CrawlContext, type RawRecordInput, type RawRecordLike } from '@rareindex/connectors'; | |
| 3 | +import { CurrencySchema, parsePrice, type AssetAttributes, type CurrencyCode, type NormalizedAuctionLot, type NormalizedRecord, type NormalizedSale } from '@rareindex/shared'; | |
| 4 | + | |
| 5 | +/** | |
| 6 | + * Phillips watch auction results. One raw record per sale (auction) holding the rendered lot list | |
| 7 | + * markdown; normalisation yields one sale per lot with a realised price (buyer's premium included, | |
| 8 | + * as published by Phillips) plus an auction_lot record for unsold/withdrawn lots. | |
| 9 | + */ | |
| 10 | + | |
| 11 | +const PARSER_VERSION = '1.0.0'; | |
| 12 | + | |
| 13 | +export const SalePayloadSchema = z.object({ | |
| 14 | + kind: z.literal('auction_results'), | |
| 15 | + url: z.string(), | |
| 16 | + saleNumber: z.string(), | |
| 17 | + title: z.string(), | |
| 18 | + location: z.string().nullable(), | |
| 19 | + startDate: z.string().nullable(), | |
| 20 | + endDate: z.string().nullable(), | |
| 21 | + lotCount: z.number().nullable(), | |
| 22 | + markdown: z.string(), | |
| 23 | +}); | |
| 24 | +export type SalePayload = z.infer<typeof SalePayloadSchema>; | |
| 25 | + | |
| 26 | +export interface PastSale { | |
| 27 | + saleNumber: string; | |
| 28 | + title: string; | |
| 29 | + location: string | null; | |
| 30 | + startDate: string | null; | |
| 31 | + endDate: string | null; | |
| 32 | +} | |
| 33 | + | |
| 34 | +/** Return the JSON object literal enclosing position `pos` (brace matching, string-aware). */ | |
| 35 | +function enclosingObject(text: string, pos: number): string | null { | |
| 36 | + let depth = 0; | |
| 37 | + let j = pos; | |
| 38 | + while (j > 0) { | |
| 39 | + const ch = text[j]; | |
| 40 | + if (ch === '}') depth++; | |
| 41 | + else if (ch === '{') { | |
| 42 | + if (depth === 0) break; | |
| 43 | + depth--; | |
| 44 | + } | |
| 45 | + j--; | |
| 46 | + } | |
| 47 | + if (text[j] !== '{') return null; | |
| 48 | + depth = 0; | |
| 49 | + let inStr = false; | |
| 50 | + for (let k = j; k < text.length; k++) { | |
| 51 | + const ch = text[k]; | |
| 52 | + if (inStr) { | |
| 53 | + if (ch === '\\') k++; | |
| 54 | + else if (ch === '"') inStr = false; | |
| 55 | + continue; | |
| 56 | + } | |
| 57 | + if (ch === '"') inStr = true; | |
| 58 | + else if (ch === '{') depth++; | |
| 59 | + else if (ch === '}') { | |
| 60 | + depth--; | |
| 61 | + if (depth === 0) return text.slice(j, k + 1); | |
| 62 | + } | |
| 63 | + } | |
| 64 | + return null; | |
| 65 | +} | |
| 66 | + | |
| 67 | +/** | |
| 68 | + * Extract past sales from the embedded JSON of /auctions/past. Each sale object carries | |
| 69 | + * saleNumber, auctionTitle, departments[{departmentName}], locationName, start/endDateTimeOffset. | |
| 70 | + * Filter = department name or title contains `filter` (case-insensitive), e.g. "watch". | |
| 71 | + */ | |
| 72 | +export function parsePastSales(htmlText: string, filter: string): PastSale[] { | |
| 73 | + const out = new Map<string, PastSale>(); | |
| 74 | + const re = /"saleNumber":"([A-Z]{2}\d{6})"/g; | |
| 75 | + let m: RegExpExecArray | null; | |
| 76 | + const f = filter.toLowerCase(); | |
| 77 | + while ((m = re.exec(htmlText))) { | |
| 78 | + const sn = m[1]!; | |
| 79 | + if (out.has(sn)) continue; | |
| 80 | + const literal = enclosingObject(htmlText, m.index); | |
| 81 | + if (!literal) continue; | |
| 82 | + let obj: Record<string, unknown>; | |
| 83 | + try { | |
| 84 | + obj = JSON.parse(literal) as Record<string, unknown>; | |
| 85 | + } catch { | |
| 86 | + continue; | |
| 87 | + } | |
| 88 | + if (obj.saleNumber !== sn) continue; | |
| 89 | + const title = String(obj.auctionTitle ?? obj.title ?? ''); | |
| 90 | + const departments = Array.isArray(obj.departments) ? (obj.departments as Array<{ departmentName?: string }>).map((d) => String(d.departmentName ?? '')) : []; | |
| 91 | + const hay = `${title} ${departments.join(' ')}`.toLowerCase(); | |
| 92 | + if (f && !hay.includes(f)) continue; | |
| 93 | + out.set(sn, { | |
| 94 | + saleNumber: sn, | |
| 95 | + title, | |
| 96 | + location: typeof obj.locationName === 'string' ? obj.locationName : null, | |
| 97 | + startDate: typeof obj.startDateTimeOffset === 'string' ? obj.startDateTimeOffset : null, | |
| 98 | + endDate: typeof obj.endDateTimeOffset === 'string' ? obj.endDateTimeOffset : null, | |
| 99 | + }); | |
| 100 | + } | |
| 101 | + return [...out.values()]; | |
| 102 | +} | |
| 103 | + | |
| 104 | +export interface ParsedLot { | |
| 105 | + lotNumber: string | null; | |
| 106 | + maker: string; | |
| 107 | + reference: string | null; | |
| 108 | + model: string | null; | |
| 109 | + estimateLow: number | null; | |
| 110 | + estimateHigh: number | null; | |
| 111 | + soldFor: number | null; | |
| 112 | + currency: CurrencyCode | null; | |
| 113 | + url: string; | |
| 114 | + image: string | null; | |
| 115 | + noReserve: boolean; | |
| 116 | + lines: string[]; | |
| 117 | +} | |
| 118 | + | |
| 119 | +const CUR_RE = /^(HK\$|US\$|S\$|CHF|USD|HKD|GBP|EUR|SGD|JPY|\$|£|€)\s?([\d,]+(?:\.\d+)?)/; | |
| 120 | +const SYMBOLS: Record<string, CurrencyCode> = { 'HK$': 'HKD', 'US$': 'USD', S$: 'SGD', $: 'USD', '£': 'GBP', '€': 'EUR' }; | |
| 121 | +function money(s: string): { amount: number; currency: CurrencyCode | null } | null { | |
| 122 | + const m = s.trim().match(CUR_RE); | |
| 123 | + if (!m) return null; | |
| 124 | + const sym = m[1]!; | |
| 125 | + const currency: CurrencyCode | null = SYMBOLS[sym] ?? (CurrencySchema.safeParse(sym).success ? (sym as CurrencyCode) : null); | |
| 126 | + return { amount: Number(m[2]!.replace(/,/g, '')), currency }; | |
| 127 | +} | |
| 128 | + | |
| 129 | +/** Parse markdown lot cards: "[\\ \\ 1\\ \\ Rolex\\ Ref. 116509\\ Cosmograph Daytona\\ \\ Estimate\\ \\ CHF25,000–50,000\\ \\ Sold For\\ \\ CHF48,260](https://www.phillips.com/detail/rolex/214153)" */ | |
| 130 | +export function parseLots(md: string): ParsedLot[] { | |
| 131 | + const out: ParsedLot[] = []; | |
| 132 | + const re = /\[!\[[^\]]*\]\(([^)]+)\)([\s\S]*?)\]\((https:\/\/www\.phillips\.com\/detail\/[^)]+)\)/g; | |
| 133 | + let m: RegExpExecArray | null; | |
| 134 | + while ((m = re.exec(md))) { | |
| 135 | + const image = m[1]!.split(' ')[0] ?? null; | |
| 136 | + const body = m[2]!; | |
| 137 | + const url = m[3]!; | |
| 138 | + const lines = body | |
| 139 | + .split(/\\\\\n|\n/) | |
| 140 | + .map((l) => l.replace(/\\$/g, '').trim()) | |
| 141 | + .filter((l) => l && l !== '\\'); | |
| 142 | + const noReserve = lines.some((l) => /no reserve/i.test(l)); | |
| 143 | + const content = lines.filter((l) => !/no reserve|brought to you/i.test(l)); | |
| 144 | + const lotIdx = content.findIndex((l) => /^\d{1,4}[A-Z]?$/.test(l)); | |
| 145 | + const lotNumber = lotIdx >= 0 ? content[lotIdx]! : null; | |
| 146 | + const estIdx = content.findIndex((l) => /^Estimate$/i.test(l)); | |
| 147 | + const soldIdx = content.findIndex((l) => /^Sold For$/i.test(l)); | |
| 148 | + const descLines = content.slice(lotIdx + 1, estIdx >= 0 ? estIdx : soldIdx >= 0 ? soldIdx : content.length); | |
| 149 | + const maker = descLines[0] ?? ''; | |
| 150 | + const refLine = descLines.find((l) => /^Ref\.?\s/i.test(l)) ?? null; | |
| 151 | + const reference = refLine ? refLine.replace(/^Ref\.?\s*/i, '').trim() : null; | |
| 152 | + const model = descLines.filter((l) => l !== maker && l !== refLine)[0] ?? null; | |
| 153 | + let estimateLow: number | null = null; | |
| 154 | + let estimateHigh: number | null = null; | |
| 155 | + let currency: CurrencyCode | null = null; | |
| 156 | + if (estIdx >= 0 && content[estIdx + 1]) { | |
| 157 | + const est = content[estIdx + 1]!; | |
| 158 | + const parts = est.split(/[–-]/); | |
| 159 | + const lo = money(parts[0]!); | |
| 160 | + if (lo) { | |
| 161 | + estimateLow = lo.amount; | |
| 162 | + currency = lo.currency; | |
| 163 | + const hi = parts[1] ? (money(parts[1]) ?? (Number(parts[1].replace(/[^\d.]/g, '')) || null)) : null; | |
| 164 | + estimateHigh = typeof hi === 'number' ? hi : (hi?.amount ?? null); | |
| 165 | + } | |
| 166 | + } | |
| 167 | + let soldFor: number | null = null; | |
| 168 | + if (soldIdx >= 0 && content[soldIdx + 1]) { | |
| 169 | + const sold = money(content[soldIdx + 1]!); | |
| 170 | + if (sold) { | |
| 171 | + soldFor = sold.amount; | |
| 172 | + currency = sold.currency ?? currency; | |
| 173 | + } | |
| 174 | + } | |
| 175 | + if (!maker) continue; | |
| 176 | + out.push({ lotNumber, maker, reference, model, estimateLow, estimateHigh, soldFor, currency, url, image, noReserve, lines: content }); | |
| 177 | + } | |
| 178 | + return out; | |
| 179 | +} | |
| 180 | + | |
| 181 | +const BRAND_CATEGORY: Array<[RegExp, string]> = [ | |
| 182 | + [/^rolex/i, 'rolex'], | |
| 183 | + [/^patek/i, 'patek_philippe'], | |
| 184 | + [/^audemars/i, 'audemars_piguet'], | |
| 185 | + [/^omega/i, 'omega'], | |
| 186 | +]; | |
| 187 | + | |
| 188 | +export class PhillipsWatchesConnector extends BaseConnector { | |
| 189 | + readonly version = '1.0.0'; | |
| 190 | + readonly parserVersion = PARSER_VERSION; | |
| 191 | + protected override minIntervalMs = 3000; | |
| 192 | + | |
| 193 | + async *crawl(ctx: CrawlContext): AsyncIterable<RawRecordInput> { | |
| 194 | + const pastUrl = String(this.meta.config.pastAuctionsUrl ?? 'https://www.phillips.com/auctions/past'); | |
| 195 | + const perRun = Number(this.meta.config.salesPerRun ?? 6); | |
| 196 | + const filter = String(this.meta.config.titleFilter ?? 'watch'); | |
| 197 | + const cursor = ctx.options.cursor ?? {}; | |
| 198 | + const done = new Set<string>((cursor.doneSales as string[] | undefined) ?? []); | |
| 199 | + let sales: PastSale[]; | |
| 200 | + if (ctx.options.seeds?.length) { | |
| 201 | + sales = ctx.options.seeds.map((s) => ({ saleNumber: s.replace(/.*\/auction\//, '').replace(/\/.*$/, ''), title: s, location: null, startDate: null, endDate: null })); | |
| 202 | + } else { | |
| 203 | + const list = await ctx.fetch(pastUrl, { engines: ['api'], responseType: 'text', minQuality: 0, timeoutMs: 60_000 }); | |
| 204 | + if (!list.success || !list.html) { | |
| 205 | + ctx.anomaly('past_list_failed', list.error ?? String(list.httpStatus)); | |
| 206 | + return; | |
| 207 | + } | |
| 208 | + sales = parsePastSales(list.html, filter).filter((s) => !s.endDate || new Date(s.endDate).getTime() < Date.now()); | |
| 209 | + // newest first | |
| 210 | + sales.sort((a, b) => (b.endDate ?? '').localeCompare(a.endDate ?? '')); | |
| 211 | + } | |
| 212 | + let count = 0; | |
| 213 | + let fetched = 0; | |
| 214 | + for (const sale of sales) { | |
| 215 | + if (ctx.signal?.aborted) return; | |
| 216 | + if (done.has(sale.saleNumber) && ctx.options.mode !== 'backfill') continue; | |
| 217 | + if (this.reached(ctx, count) || fetched >= perRun) break; | |
| 218 | + const url = `https://www.phillips.com/auction/${sale.saleNumber}`; | |
| 219 | + await this.throttle(); | |
| 220 | + fetched++; | |
| 221 | + const res = await ctx.fetch(url, { | |
| 222 | + waitForMs: 6000, | |
| 223 | + timeoutMs: 90_000, | |
| 224 | + expect: ['title', 'price', 'currency'], | |
| 225 | + parse: (r) => { | |
| 226 | + const lots = parseLots(r.markdown ?? ''); | |
| 227 | + const sold = lots.find((l) => l.soldFor); | |
| 228 | + return { title: lots[0]?.maker ?? null, price: sold?.soldFor ?? null, currency: sold?.currency ?? null }; | |
| 229 | + }, | |
| 230 | + }); | |
| 231 | + if (!res.success || !res.markdown) { | |
| 232 | + ctx.anomaly('sale_fetch_failed', `${sale.saleNumber}: ${res.error ?? res.httpStatus}`); | |
| 233 | + continue; | |
| 234 | + } | |
| 235 | + const md = res.markdown; | |
| 236 | + const lotCount = Number(md.match(/##\s+(\d+)\s+Lots/)?.[1]) || null; | |
| 237 | + const title = sale.title || md.match(/^#\s+(.+)$/m)?.[1] || sale.saleNumber; | |
| 238 | + const concluded = md.match(/Concluded\s*([A-Z][a-z]{2}\s+\d{1,2}\s+\d{4})/)?.[1] ?? null; | |
| 239 | + const lotsStart = md.indexOf('## '); | |
| 240 | + const payload: SalePayload = { kind: 'auction_results', url, saleNumber: sale.saleNumber, title, location: sale.location ?? md.match(/\n(Geneva|New York|Hong Kong|London)\n/)?.[1] ?? null, startDate: sale.startDate, endDate: sale.endDate ?? (concluded ? new Date(`${concluded} UTC`).toISOString() : null), lotCount, markdown: md.slice(lotsStart >= 0 ? lotsStart : 0) }; | |
| 241 | + const parsed = parseLots(payload.markdown); | |
| 242 | + if (parsed.length === 0) { | |
| 243 | + ctx.anomaly('parse_failure_lots', sale.saleNumber); | |
| 244 | + continue; | |
| 245 | + } | |
| 246 | + if (lotCount && parsed.length < lotCount * 0.5) ctx.anomaly('partial_lot_list', `${sale.saleNumber}: ${parsed.length}/${lotCount}`); | |
| 247 | + count++; | |
| 248 | + done.add(sale.saleNumber); | |
| 249 | + await ctx.setCursor({ doneSales: [...done].slice(-500), updatedAt: new Date().toISOString() }); | |
| 250 | + yield { url, externalId: sale.saleNumber, kind: 'sale', engine: res.engine, httpStatus: res.httpStatus, payload, fetchedAt: res.fetchedAt }; | |
| 251 | + } | |
| 252 | + } | |
| 253 | + | |
| 254 | + async normalize(raw: RawRecordLike): Promise<NormalizedRecord[]> { | |
| 255 | + const p = SalePayloadSchema.parse(raw.payload); | |
| 256 | + const lots = parseLots(p.markdown); | |
| 257 | + const saleDate = p.endDate ? new Date(p.endDate) : null; | |
| 258 | + const out: NormalizedRecord[] = []; | |
| 259 | + for (const lot of lots) { | |
| 260 | + const categorySlug = BRAND_CATEGORY.find(([re]) => re.test(lot.maker))?.[1] ?? 'other_watches'; | |
| 261 | + const currency = lot.currency; | |
| 262 | + const attributes: AssetAttributes = { | |
| 263 | + categorySlug, | |
| 264 | + subcategorySlug: null, | |
| 265 | + franchise: null, | |
| 266 | + brand: lot.maker, | |
| 267 | + series: null, | |
| 268 | + set: null, | |
| 269 | + setCode: null, | |
| 270 | + name: `${lot.maker} ${lot.model ?? lot.reference ?? ''}`.trim(), | |
| 271 | + model: lot.model, | |
| 272 | + reference: lot.reference, | |
| 273 | + number: null, | |
| 274 | + year: null, | |
| 275 | + edition: null, | |
| 276 | + variant: null, | |
| 277 | + language: null, | |
| 278 | + region: null, | |
| 279 | + country: null, | |
| 280 | + material: null, | |
| 281 | + size: null, | |
| 282 | + color: null, | |
| 283 | + rarity: null, | |
| 284 | + productionQuantity: null, | |
| 285 | + originalMsrp: null, | |
| 286 | + originalMsrpCurrency: null, | |
| 287 | + identifiers: { ...(lot.reference ? { reference: lot.reference } : {}), phillips_lot: lot.url.replace(/.*\/detail\//, '') }, | |
| 288 | + metadata: { sale_number: p.saleNumber, sale_title: p.title, estimate_low: lot.estimateLow, estimate_high: lot.estimateHigh, no_reserve: lot.noReserve }, | |
| 289 | + }; | |
| 290 | + const base = { | |
| 291 | + connectorId: this.meta.id, | |
| 292 | + sourceId: this.meta.sourceId, | |
| 293 | + sourceUrl: lot.url, | |
| 294 | + externalId: `${p.saleNumber}:${lot.lotNumber ?? lot.url}`, | |
| 295 | + rawTitle: `${lot.maker}${lot.reference ? ` Ref. ${lot.reference}` : ''}${lot.model ? ` ${lot.model}` : ''}`, | |
| 296 | + description: null, | |
| 297 | + imageUrls: lot.image ? [lot.image] : [], | |
| 298 | + attributes, | |
| 299 | + grade: { grader: null, grade: null, qualifier: null, certificationNumber: null }, | |
| 300 | + condition: { condition: null, conditionRaw: null, completeness: null }, | |
| 301 | + observedAt: raw.fetchedAt, | |
| 302 | + confidence: 0.92, | |
| 303 | + parserVersion: PARSER_VERSION, | |
| 304 | + }; | |
| 305 | + if (lot.soldFor && currency && saleDate) { | |
| 306 | + const sale: NormalizedSale = { kind: 'sale', ...base, saleType: 'auction', saleDate, price: lot.soldFor, currency, buyerPremiumIncluded: true, quantity: 1, isBundle: false, location: p.location, auctionHouse: 'Phillips', lotNumber: lot.lotNumber }; | |
| 307 | + out.push(sale); | |
| 308 | + } else { | |
| 309 | + const lotRec: NormalizedAuctionLot = { kind: 'auction_lot', ...base, auctionHouse: 'Phillips', auctionName: p.title, lotNumber: lot.lotNumber, startsAt: p.startDate ? new Date(p.startDate) : null, endsAt: saleDate, estimateLow: lot.estimateLow, estimateHigh: lot.estimateHigh, currentBid: null, currency, status: saleDate && saleDate.getTime() < Date.now() ? 'ended' : 'unknown', location: p.location }; | |
| 310 | + out.push(lotRec); | |
| 311 | + } | |
| 312 | + } | |
| 313 | + return out; | |
| 314 | + } | |
| 315 | +} | |
| 316 | + | |
| 317 | +export default (meta: ConnectorMeta) => new PhillipsWatchesConnector(meta); | |
added
connectors/firecrawl/phillips-watches/meta.json
+34 −0
@@ -0,0 +1,34 @@ | ||
| 1 | +{ | |
| 2 | + "id": "phillips-watches", | |
| 3 | + "displayName": "Phillips Watches (auction results)", | |
| 4 | + "sourceId": "phillips", | |
| 5 | + "sourceName": "Phillips", | |
| 6 | + "sourceType": "auction_house", | |
| 7 | + "sourceUrl": "https://www.phillips.com", | |
| 8 | + "module": "firecrawl/phillips-watches", | |
| 9 | + "enginePriority": ["firecrawl", "scrapfly"], | |
| 10 | + "categories": ["watches", "rolex", "patek_philippe", "audemars_piguet", "omega", "other_watches"], | |
| 11 | + "regions": ["CH", "US", "HK", "GB"], | |
| 12 | + "languages": ["en"], | |
| 13 | + "currency": ["CHF", "USD", "HKD", "GBP", "EUR"], | |
| 14 | + "supportsListings": false, | |
| 15 | + "supportsSold": true, | |
| 16 | + "supportsAuctions": true, | |
| 17 | + "supportsImages": true, | |
| 18 | + "supportsCatalog": false, | |
| 19 | + "supportsPopulation": false, | |
| 20 | + "supportsLookup": false, | |
| 21 | + "refreshFrequencyMinutes": 10080, | |
| 22 | + "priority": "high", | |
| 23 | + "trustScore": 0.95, | |
| 24 | + "attributionRequired": true, | |
| 25 | + "termsUrl": "https://www.phillips.com/about/terms", | |
| 26 | + "accessNotes": "Past watch sales are discovered from the public /auctions/past page (plain HTTPS; embedded JSON with saleNumber, title, end date, location). Each sale page is rendered through Firecrawl (JS wait ~6 s, 1 credit) to read the public lot list: lot number, maker, reference, model, estimate and 'Sold For' (Phillips publishes prices realised including buyer's premium). robots.txt disallows only /search and filter paths. No login, no bidder data. Large sales may lazy-load beyond the first ~70 lots — coverage is recorded per run.", | |
| 27 | + "enabled": true, | |
| 28 | + "schemaVersion": "1.0", | |
| 29 | + "config": { | |
| 30 | + "pastAuctionsUrl": "https://www.phillips.com/auctions/past", | |
| 31 | + "salesPerRun": 6, | |
| 32 | + "titleFilter": "watch" | |
| 33 | + } | |
| 34 | +} | |
modified
connectors/registry.json
+596 −1
@@ -1,4 +1,599 @@ | ||
| 1 | 1 | { |
| 2 | 2 | "version": "1.0", |
| 3 | − "connectors": [] | |
| 3 | + "connectors": [ | |
| 4 | + { | |
| 5 | + "id": "brickeconomy", | |
| 6 | + "displayName": "BrickEconomy", | |
| 7 | + "sourceId": "brickeconomy", | |
| 8 | + "sourceName": "BrickEconomy", | |
| 9 | + "sourceType": "pricing_guide", | |
| 10 | + "sourceUrl": "https://www.brickeconomy.com", | |
| 11 | + "module": "firecrawl/brickeconomy", | |
| 12 | + "enginePriority": [ | |
| 13 | + "firecrawl", | |
| 14 | + "scrapfly" | |
| 15 | + ], | |
| 16 | + "categories": [ | |
| 17 | + "lego", | |
| 18 | + "lego_sets" | |
| 19 | + ], | |
| 20 | + "regions": [ | |
| 21 | + "US" | |
| 22 | + ], | |
| 23 | + "languages": [ | |
| 24 | + "en" | |
| 25 | + ], | |
| 26 | + "currency": [ | |
| 27 | + "USD" | |
| 28 | + ], | |
| 29 | + "supportsListings": false, | |
| 30 | + "supportsSold": false, | |
| 31 | + "supportsAuctions": false, | |
| 32 | + "supportsImages": true, | |
| 33 | + "supportsCatalog": true, | |
| 34 | + "supportsPopulation": false, | |
| 35 | + "supportsLookup": true, | |
| 36 | + "refreshFrequencyMinutes": 4320, | |
| 37 | + "priority": "medium", | |
| 38 | + "trustScore": 0.65, | |
| 39 | + "attributionRequired": true, | |
| 40 | + "termsUrl": "https://www.brickeconomy.com/legal-terms", | |
| 41 | + "accessNotes": "Public set pages fetched through Firecrawl (markdown; ~1 credit/page). robots.txt allows all crawlers (explicitly including AI bots). Plain HTTPS returns 403 for non-browser agents, so Firecrawl is the primary engine and Scrapfly the fallback. We capture set facts (number, name, theme, subtheme, year, release/retire dates, pieces, minifigs), retail price, and BrickEconomy's estimated New/Sealed and Used values as guide observations — never as sales. Discovery via theme/top lists in config.seeds.", | |
| 42 | + "enabled": true, | |
| 43 | + "schemaVersion": "1.0", | |
| 44 | + "config": { | |
| 45 | + "seeds": [ | |
| 46 | + "https://www.brickeconomy.com/sets/top/most-valuable-lego-sets", | |
| 47 | + "https://www.brickeconomy.com/sets/theme/star-wars/subtheme/ultimate-collector-series", | |
| 48 | + "https://www.brickeconomy.com/sets/theme/icons", | |
| 49 | + "https://www.brickeconomy.com/sets/theme/ideas", | |
| 50 | + "https://www.brickeconomy.com/sets/theme/creator-expert", | |
| 51 | + "https://www.brickeconomy.com/sets/theme/harry-potter", | |
| 52 | + "https://www.brickeconomy.com/sets/theme/technic", | |
| 53 | + "https://www.brickeconomy.com/sets/retired" | |
| 54 | + ], | |
| 55 | + "setsPerSeed": 60 | |
| 56 | + } | |
| 57 | + }, | |
| 58 | + { | |
| 59 | + "id": "chrono24", | |
| 60 | + "displayName": "Chrono24", | |
| 61 | + "sourceId": "chrono24", | |
| 62 | + "sourceName": "Chrono24", | |
| 63 | + "sourceType": "marketplace", | |
| 64 | + "sourceUrl": "https://www.chrono24.com", | |
| 65 | + "module": "scrapfly/chrono24", | |
| 66 | + "enginePriority": [ | |
| 67 | + "scrapfly", | |
| 68 | + "firecrawl" | |
| 69 | + ], | |
| 70 | + "categories": [ | |
| 71 | + "watches", | |
| 72 | + "rolex", | |
| 73 | + "patek_philippe", | |
| 74 | + "audemars_piguet", | |
| 75 | + "omega", | |
| 76 | + "other_watches" | |
| 77 | + ], | |
| 78 | + "regions": [ | |
| 79 | + "global" | |
| 80 | + ], | |
| 81 | + "languages": [ | |
| 82 | + "en" | |
| 83 | + ], | |
| 84 | + "currency": [ | |
| 85 | + "USD" | |
| 86 | + ], | |
| 87 | + "supportsListings": true, | |
| 88 | + "supportsSold": false, | |
| 89 | + "supportsAuctions": false, | |
| 90 | + "supportsImages": true, | |
| 91 | + "supportsCatalog": false, | |
| 92 | + "supportsPopulation": false, | |
| 93 | + "supportsLookup": false, | |
| 94 | + "refreshFrequencyMinutes": 720, | |
| 95 | + "priority": "high", | |
| 96 | + "trustScore": 0.7, | |
| 97 | + "attributionRequired": true, | |
| 98 | + "termsUrl": "https://www.chrono24.com/info/terms-of-use.htm", | |
| 99 | + "accessNotes": "Public model listing pages (e.g. /rolex/daytona--mod2.htm) fetched through Scrapfly without JS rendering (Cloudflare shield → ~40 credits/page); robots.txt allows these paths (Crawl-delay 0.1). Each page embeds a schema.org ItemList of Offers (name, price in the site currency, image, listing URL) — we store asking prices as listings only, never as sales. No login, no per-listing detail fetch (seller details stay on Chrono24). Model pages are configured in config.seeds; pagination via --modN-P.htm.", | |
| 100 | + "enabled": true, | |
| 101 | + "schemaVersion": "1.0", | |
| 102 | + "config": { | |
| 103 | + "seeds": [ | |
| 104 | + "/rolex/daytona--mod2.htm", | |
| 105 | + "/rolex/submariner--mod1.htm", | |
| 106 | + "/rolex/gmt-master-ii--mod3.htm", | |
| 107 | + "/rolex/datejust--mod4.htm", | |
| 108 | + "/rolex/day-date--mod6.htm", | |
| 109 | + "/rolex/explorer--mod8.htm", | |
| 110 | + "/patekphilippe/nautilus--mod15.htm", | |
| 111 | + "/patekphilippe/aquanaut--mod16.htm", | |
| 112 | + "/patekphilippe/calatrava--mod14.htm", | |
| 113 | + "/audemarspiguet/royal-oak--mod20.htm", | |
| 114 | + "/audemarspiguet/royal-oak-offshore--mod21.htm", | |
| 115 | + "/omega/speedmaster--mod24.htm", | |
| 116 | + "/omega/seamaster--mod22.htm", | |
| 117 | + "/cartier/santos--mod38.htm", | |
| 118 | + "/tudor/black-bay--mod1128.htm", | |
| 119 | + "/vacheronconstantin/overseas--mod1024.htm" | |
| 120 | + ], | |
| 121 | + "pagesPerSeed": 2, | |
| 122 | + "pageSize": 120 | |
| 123 | + } | |
| 124 | + }, | |
| 125 | + { | |
| 126 | + "id": "comicconnect", | |
| 127 | + "displayName": "ComicConnect (sold archive)", | |
| 128 | + "sourceId": "comicconnect", | |
| 129 | + "sourceName": "ComicConnect", | |
| 130 | + "sourceType": "auction_house", | |
| 131 | + "sourceUrl": "https://www.comicconnect.com", | |
| 132 | + "module": "api/comicconnect", | |
| 133 | + "enginePriority": [ | |
| 134 | + "api", | |
| 135 | + "firecrawl", | |
| 136 | + "scrapfly" | |
| 137 | + ], | |
| 138 | + "categories": [ | |
| 139 | + "comics", | |
| 140 | + "marvel_comics", | |
| 141 | + "dc_comics", | |
| 142 | + "independent_comics" | |
| 143 | + ], | |
| 144 | + "regions": [ | |
| 145 | + "US" | |
| 146 | + ], | |
| 147 | + "languages": [ | |
| 148 | + "en" | |
| 149 | + ], | |
| 150 | + "currency": [ | |
| 151 | + "USD" | |
| 152 | + ], | |
| 153 | + "supportsListings": false, | |
| 154 | + "supportsSold": true, | |
| 155 | + "supportsAuctions": true, | |
| 156 | + "supportsImages": true, | |
| 157 | + "supportsCatalog": false, | |
| 158 | + "supportsPopulation": false, | |
| 159 | + "supportsLookup": false, | |
| 160 | + "refreshFrequencyMinutes": 720, | |
| 161 | + "priority": "high", | |
| 162 | + "trustScore": 0.9, | |
| 163 | + "attributionRequired": true, | |
| 164 | + "termsUrl": "https://www.comicconnect.com/terms", | |
| 165 | + "accessNotes": "Public sold archive (/browse/comics/?filtertype=Sold, ~479k results, 20 per page) fetched over plain HTTPS with the RareIndex user agent. robots.txt: Allow / with Content-Signal search=yes, ai-train=no (we only index sale facts and link back). Each card exposes title, publisher + grade, sold date/time, 'Sold For' price and whether a 15% buyer's premium applies (bp attribute) — we store hammer price with buyer_premium_included=false and keep the premium note in metadata. No login, no bidder data. 1.5 s politeness delay.", | |
| 166 | + "enabled": true, | |
| 167 | + "schemaVersion": "1.0", | |
| 168 | + "config": { | |
| 169 | + "browsePath": "/browse/comics/", | |
| 170 | + "pagesPerRun": 25, | |
| 171 | + "sortType": "ended_desc" | |
| 172 | + } | |
| 173 | + }, | |
| 174 | + { | |
| 175 | + "id": "goldin", | |
| 176 | + "displayName": "Goldin (sold auction results)", | |
| 177 | + "sourceId": "goldin", | |
| 178 | + "sourceName": "Goldin", | |
| 179 | + "sourceType": "auction_house", | |
| 180 | + "sourceUrl": "https://goldin.co", | |
| 181 | + "module": "scrapfly/goldin", | |
| 182 | + "enginePriority": [ | |
| 183 | + "scrapfly" | |
| 184 | + ], | |
| 185 | + "categories": [ | |
| 186 | + "pokemon", | |
| 187 | + "magic_the_gathering", | |
| 188 | + "yugioh", | |
| 189 | + "one_piece_card_game", | |
| 190 | + "basketball_cards", | |
| 191 | + "baseball_cards", | |
| 192 | + "football_cards", | |
| 193 | + "hockey_cards", | |
| 194 | + "soccer_cards", | |
| 195 | + "f1_cards", | |
| 196 | + "sports_memorabilia", | |
| 197 | + "marvel_comics", | |
| 198 | + "nintendo_games", | |
| 199 | + "non_sport_cards" | |
| 200 | + ], | |
| 201 | + "regions": [ | |
| 202 | + "US" | |
| 203 | + ], | |
| 204 | + "languages": [ | |
| 205 | + "en" | |
| 206 | + ], | |
| 207 | + "currency": [ | |
| 208 | + "USD" | |
| 209 | + ], | |
| 210 | + "supportsListings": false, | |
| 211 | + "supportsSold": true, | |
| 212 | + "supportsAuctions": false, | |
| 213 | + "supportsImages": true, | |
| 214 | + "supportsCatalog": false, | |
| 215 | + "supportsPopulation": false, | |
| 216 | + "supportsLookup": true, | |
| 217 | + "refreshFrequencyMinutes": 360, | |
| 218 | + "priority": "high", | |
| 219 | + "trustScore": 0.9, | |
| 220 | + "attributionRequired": true, | |
| 221 | + "termsUrl": "https://goldin.co/useragreement", | |
| 222 | + "accessNotes": "Public 'Sold Items' result grids (https://goldin.co/buy/sc/<subcategory>?show_only=Sold%20Items&sort=Most_Recent_Bids&number_of_lots=240) rendered through Scrapfly (asp + JS rendering, ~6 credits per page of 240 sold lots). goldin.co/robots.txt allows /buy/ and /item/ and disallows /api/; we never call goldin.co/api ourselves — the lot data is read from the XHR (lots_v2 on their CloudFront search endpoint) that the public page performs during rendering, exactly what a browser does. Plain HTTP and Firecrawl return the empty SPA shell / an Akamai challenge. Prices: the grid shows the final price INCLUDING buyer's premium (current_price × (1 + buyer_premium%)); we store that as the sale price with buyerPremiumIncluded=true and keep the hammer price and BP % in metadata. Sale date = lot end_timestamp; lots whose end_timestamp is in the future (placeholder private-sale dates like 2235-06-04) are skipped and counted as anomalies. Cert numbers appear only in item-page descriptions (lookup).", | |
| 223 | + "enabled": true, | |
| 224 | + "schemaVersion": "1.0", | |
| 225 | + "config": { | |
| 226 | + "seeds": [ | |
| 227 | + { | |
| 228 | + "path": "/buy/sc/pokemon", | |
| 229 | + "categorySlug": "pokemon" | |
| 230 | + }, | |
| 231 | + { | |
| 232 | + "path": "/buy/sc/Magic_The_Gathering", | |
| 233 | + "categorySlug": "magic_the_gathering" | |
| 234 | + }, | |
| 235 | + { | |
| 236 | + "path": "/buy/sc/Yu-Gi-Oh!", | |
| 237 | + "categorySlug": "yugioh" | |
| 238 | + }, | |
| 239 | + { | |
| 240 | + "path": "/buy/sc/One_Piece", | |
| 241 | + "categorySlug": "one_piece_card_game" | |
| 242 | + }, | |
| 243 | + { | |
| 244 | + "path": "/buy/sc/Basketball", | |
| 245 | + "categorySlug": "basketball_cards", | |
| 246 | + "sport": "basketball" | |
| 247 | + }, | |
| 248 | + { | |
| 249 | + "path": "/buy/sc/Baseball", | |
| 250 | + "categorySlug": "baseball_cards", | |
| 251 | + "sport": "baseball" | |
| 252 | + }, | |
| 253 | + { | |
| 254 | + "path": "/buy/sc/Football", | |
| 255 | + "categorySlug": "football_cards", | |
| 256 | + "sport": "football" | |
| 257 | + }, | |
| 258 | + { | |
| 259 | + "path": "/buy/sc/Hockey", | |
| 260 | + "categorySlug": "hockey_cards", | |
| 261 | + "sport": "hockey" | |
| 262 | + }, | |
| 263 | + { | |
| 264 | + "path": "/buy/sc/Soccer", | |
| 265 | + "categorySlug": "soccer_cards", | |
| 266 | + "sport": "soccer" | |
| 267 | + }, | |
| 268 | + { | |
| 269 | + "path": "/buy/sc/Racing", | |
| 270 | + "categorySlug": "f1_cards", | |
| 271 | + "sport": "racing" | |
| 272 | + }, | |
| 273 | + { | |
| 274 | + "path": "/buy/sc/Marvel", | |
| 275 | + "categorySlug": "marvel_comics" | |
| 276 | + }, | |
| 277 | + { | |
| 278 | + "path": "/buy/sc/Nintendo", | |
| 279 | + "categorySlug": "nintendo_games" | |
| 280 | + } | |
| 281 | + ], | |
| 282 | + "pageSize": 240, | |
| 283 | + "maxPagesPerSeed": 40, | |
| 284 | + "renderingWaitMs": 6000 | |
| 285 | + } | |
| 286 | + }, | |
| 287 | + { | |
| 288 | + "id": "phillips-watches", | |
| 289 | + "displayName": "Phillips Watches (auction results)", | |
| 290 | + "sourceId": "phillips", | |
| 291 | + "sourceName": "Phillips", | |
| 292 | + "sourceType": "auction_house", | |
| 293 | + "sourceUrl": "https://www.phillips.com", | |
| 294 | + "module": "firecrawl/phillips-watches", | |
| 295 | + "enginePriority": [ | |
| 296 | + "firecrawl", | |
| 297 | + "scrapfly" | |
| 298 | + ], | |
| 299 | + "categories": [ | |
| 300 | + "watches", | |
| 301 | + "rolex", | |
| 302 | + "patek_philippe", | |
| 303 | + "audemars_piguet", | |
| 304 | + "omega", | |
| 305 | + "other_watches" | |
| 306 | + ], | |
| 307 | + "regions": [ | |
| 308 | + "CH", | |
| 309 | + "US", | |
| 310 | + "HK", | |
| 311 | + "GB" | |
| 312 | + ], | |
| 313 | + "languages": [ | |
| 314 | + "en" | |
| 315 | + ], | |
| 316 | + "currency": [ | |
| 317 | + "CHF", | |
| 318 | + "USD", | |
| 319 | + "HKD", | |
| 320 | + "GBP", | |
| 321 | + "EUR" | |
| 322 | + ], | |
| 323 | + "supportsListings": false, | |
| 324 | + "supportsSold": true, | |
| 325 | + "supportsAuctions": true, | |
| 326 | + "supportsImages": true, | |
| 327 | + "supportsCatalog": false, | |
| 328 | + "supportsPopulation": false, | |
| 329 | + "supportsLookup": false, | |
| 330 | + "refreshFrequencyMinutes": 10080, | |
| 331 | + "priority": "high", | |
| 332 | + "trustScore": 0.95, | |
| 333 | + "attributionRequired": true, | |
| 334 | + "termsUrl": "https://www.phillips.com/about/terms", | |
| 335 | + "accessNotes": "Past watch sales are discovered from the public /auctions/past page (plain HTTPS; embedded JSON with saleNumber, title, end date, location). Each sale page is rendered through Firecrawl (JS wait ~6 s, 1 credit) to read the public lot list: lot number, maker, reference, model, estimate and 'Sold For' (Phillips publishes prices realised including buyer's premium). robots.txt disallows only /search and filter paths. No login, no bidder data. Large sales may lazy-load beyond the first ~70 lots — coverage is recorded per run.", | |
| 336 | + "enabled": true, | |
| 337 | + "schemaVersion": "1.0", | |
| 338 | + "config": { | |
| 339 | + "pastAuctionsUrl": "https://www.phillips.com/auctions/past", | |
| 340 | + "salesPerRun": 6, | |
| 341 | + "titleFilter": "watch" | |
| 342 | + } | |
| 343 | + }, | |
| 344 | + { | |
| 345 | + "id": "pokemontcg", | |
| 346 | + "displayName": "Pokémon TCG API (pokemontcg.io)", | |
| 347 | + "sourceId": "pokemontcg", | |
| 348 | + "sourceName": "Pokémon TCG API", | |
| 349 | + "sourceType": "catalog", | |
| 350 | + "sourceUrl": "https://pokemontcg.io", | |
| 351 | + "module": "api/pokemontcg", | |
| 352 | + "enginePriority": [ | |
| 353 | + "api", | |
| 354 | + "feed" | |
| 355 | + ], | |
| 356 | + "categories": [ | |
| 357 | + "pokemon" | |
| 358 | + ], | |
| 359 | + "regions": [ | |
| 360 | + "US", | |
| 361 | + "EU" | |
| 362 | + ], | |
| 363 | + "languages": [ | |
| 364 | + "en" | |
| 365 | + ], | |
| 366 | + "currency": [ | |
| 367 | + "USD", | |
| 368 | + "EUR" | |
| 369 | + ], | |
| 370 | + "supportsListings": false, | |
| 371 | + "supportsSold": false, | |
| 372 | + "supportsAuctions": false, | |
| 373 | + "supportsImages": true, | |
| 374 | + "supportsCatalog": true, | |
| 375 | + "supportsPopulation": false, | |
| 376 | + "supportsLookup": false, | |
| 377 | + "refreshFrequencyMinutes": 1440, | |
| 378 | + "priority": "high", | |
| 379 | + "trustScore": 0.8, | |
| 380 | + "attributionRequired": true, | |
| 381 | + "termsUrl": "https://docs.pokemontcg.io/", | |
| 382 | + "accessNotes": "Public REST API v2 (https://api.pokemontcg.io/v2). Optional X-Api-Key (POKEMONTCG_API_KEY) raises limits (20k/day) — without a key ~1k/day and 30/min. Crawl = sets, then cards per set (pageSize 250, cursor {setIndex,page}). The API is intermittently unavailable (5xx); the connector retries with backoff and falls back to the maintainers' public GitHub mirror (PokemonTCG/pokemon-tcg-data, same card schema, no prices) for the catalog when the API keeps failing. Prices are TCGplayer (USD, per printing variant: normal/holofoil/reverseHolofoil/1stEdition…) and Cardmarket (EUR) daily aggregates with their own updatedAt → stored as price_observations, never as sales. Pokémon © Nintendo/Creatures/GAME FREAK; data attributed to pokemontcg.io.", | |
| 383 | + "enabled": true, | |
| 384 | + "schemaVersion": "1.0", | |
| 385 | + "config": { | |
| 386 | + "pageSize": 250, | |
| 387 | + "requestIntervalMs": 2100, | |
| 388 | + "mirrorBase": "https://raw.githubusercontent.com/PokemonTCG/pokemon-tcg-data/master" | |
| 389 | + } | |
| 390 | + }, | |
| 391 | + { | |
| 392 | + "id": "pricecharting", | |
| 393 | + "displayName": "PriceCharting", | |
| 394 | + "sourceId": "pricecharting", | |
| 395 | + "sourceName": "PriceCharting", | |
| 396 | + "sourceType": "pricing_guide", | |
| 397 | + "sourceUrl": "https://www.pricecharting.com", | |
| 398 | + "module": "api/pricecharting", | |
| 399 | + "enginePriority": [ | |
| 400 | + "api", | |
| 401 | + "firecrawl", | |
| 402 | + "scrapfly" | |
| 403 | + ], | |
| 404 | + "categories": [ | |
| 405 | + "video_games", | |
| 406 | + "nintendo_games", | |
| 407 | + "sega_games", | |
| 408 | + "playstation_games", | |
| 409 | + "xbox_games", | |
| 410 | + "atari_retro_games", | |
| 411 | + "pc_games", | |
| 412 | + "lego_sets", | |
| 413 | + "funko", | |
| 414 | + "comics", | |
| 415 | + "marvel_comics", | |
| 416 | + "dc_comics", | |
| 417 | + "independent_comics" | |
| 418 | + ], | |
| 419 | + "regions": [ | |
| 420 | + "US" | |
| 421 | + ], | |
| 422 | + "languages": [ | |
| 423 | + "en" | |
| 424 | + ], | |
| 425 | + "currency": [ | |
| 426 | + "USD" | |
| 427 | + ], | |
| 428 | + "supportsListings": false, | |
| 429 | + "supportsSold": true, | |
| 430 | + "supportsAuctions": false, | |
| 431 | + "supportsImages": true, | |
| 432 | + "supportsCatalog": true, | |
| 433 | + "supportsPopulation": false, | |
| 434 | + "supportsLookup": true, | |
| 435 | + "refreshFrequencyMinutes": 1440, | |
| 436 | + "priority": "high", | |
| 437 | + "trustScore": 0.7, | |
| 438 | + "attributionRequired": true, | |
| 439 | + "termsUrl": "https://www.pricecharting.com/page/terms-of-service", | |
| 440 | + "accessNotes": "Public product pages fetched over plain HTTPS with the RareIndex user agent (robots.txt only disallows /buy, /publish-offer, /stripe-connect). Each product page exposes PriceCharting guide values per condition and a table of recently completed eBay sales (date, title, price, eBay item id) — we store those as sales with the PriceCharting page as source URL. No account, no API key, no photos (TimeWarp is paid and not used). Console listings paginate through the public ?format=json cursor endpoint. ~1 request per product, 1.5 s politeness delay.", | |
| 441 | + "enabled": true, | |
| 442 | + "schemaVersion": "1.0", | |
| 443 | + "config": { | |
| 444 | + "seeds": [ | |
| 445 | + "nintendo-64", | |
| 446 | + "nes", | |
| 447 | + "super-nintendo", | |
| 448 | + "gamecube", | |
| 449 | + "gameboy", | |
| 450 | + "gameboy-color", | |
| 451 | + "gameboy-advance", | |
| 452 | + "nintendo-ds", | |
| 453 | + "nintendo-switch", | |
| 454 | + "wii", | |
| 455 | + "playstation", | |
| 456 | + "playstation-2", | |
| 457 | + "playstation-3", | |
| 458 | + "playstation-4", | |
| 459 | + "playstation-5", | |
| 460 | + "psp", | |
| 461 | + "xbox", | |
| 462 | + "xbox-360", | |
| 463 | + "xbox-one", | |
| 464 | + "xbox-series-x", | |
| 465 | + "sega-genesis", | |
| 466 | + "sega-dreamcast", | |
| 467 | + "sega-saturn", | |
| 468 | + "sega-master-system", | |
| 469 | + "sega-game-gear", | |
| 470 | + "atari-2600", | |
| 471 | + "neo-geo-aes", | |
| 472 | + "turbografx-16", | |
| 473 | + "pc-games", | |
| 474 | + "lego-star-wars", | |
| 475 | + "lego-creator", | |
| 476 | + "lego-technic", | |
| 477 | + "lego-icons", | |
| 478 | + "lego-harry-potter", | |
| 479 | + "lego-ideas", | |
| 480 | + "lego-marvel-super-heroes", | |
| 481 | + "lego-ninjago", | |
| 482 | + "lego-castle", | |
| 483 | + "lego-space", | |
| 484 | + "lego-modular-buildings", | |
| 485 | + "funko-pop-marvel", | |
| 486 | + "funko-pop-star-wars", | |
| 487 | + "funko-pop-disney", | |
| 488 | + "funko-pop-animation", | |
| 489 | + "funko-pop-television", | |
| 490 | + "funko-pop-movies", | |
| 491 | + "funko-pop-games", | |
| 492 | + "funko-pop-rocks", | |
| 493 | + "funko-pop-comics", | |
| 494 | + "comic-books-amazing-spider-man", | |
| 495 | + "comic-books-batman", | |
| 496 | + "comic-books-action-comics", | |
| 497 | + "comic-books-detective-comics", | |
| 498 | + "comic-books-x-men", | |
| 499 | + "comic-books-incredible-hulk", | |
| 500 | + "comic-books-fantastic-four", | |
| 501 | + "comic-books-avengers", | |
| 502 | + "comic-books-spawn", | |
| 503 | + "comic-books-walking-dead" | |
| 504 | + ], | |
| 505 | + "productsPerConsole": 200, | |
| 506 | + "sort": "popularity" | |
| 507 | + } | |
| 508 | + }, | |
| 509 | + { | |
| 510 | + "id": "scryfall", | |
| 511 | + "displayName": "Scryfall (Magic: The Gathering)", | |
| 512 | + "sourceId": "scryfall", | |
| 513 | + "sourceName": "Scryfall", | |
| 514 | + "sourceType": "catalog", | |
| 515 | + "sourceUrl": "https://scryfall.com", | |
| 516 | + "module": "api/scryfall", | |
| 517 | + "enginePriority": [ | |
| 518 | + "api" | |
| 519 | + ], | |
| 520 | + "categories": [ | |
| 521 | + "magic_the_gathering" | |
| 522 | + ], | |
| 523 | + "regions": [ | |
| 524 | + "US", | |
| 525 | + "EU" | |
| 526 | + ], | |
| 527 | + "languages": [ | |
| 528 | + "en" | |
| 529 | + ], | |
| 530 | + "currency": [ | |
| 531 | + "USD", | |
| 532 | + "EUR" | |
| 533 | + ], | |
| 534 | + "supportsListings": false, | |
| 535 | + "supportsSold": false, | |
| 536 | + "supportsAuctions": false, | |
| 537 | + "supportsImages": true, | |
| 538 | + "supportsCatalog": true, | |
| 539 | + "supportsPopulation": false, | |
| 540 | + "supportsLookup": true, | |
| 541 | + "refreshFrequencyMinutes": 1440, | |
| 542 | + "priority": "high", | |
| 543 | + "trustScore": 0.85, | |
| 544 | + "attributionRequired": true, | |
| 545 | + "termsUrl": "https://scryfall.com/docs/api", | |
| 546 | + "accessNotes": "Official public API, no key. Bulk 'default_cards' JSONL (gzip, ~78 MB, refreshed daily) is streamed for the full catalog; single-card lookups use /cards/<set>/<number>. Scryfall asks for ≤10 req/s (we pace 100 ms), an identifying User-Agent and Accept headers. Prices (usd/usd_foil/usd_etched/eur/eur_foil) are Scryfall's daily market aggregates from TCGplayer/Cardmarket → stored as price_observations, never as sales. Card data © Wizards of the Coast; Scryfall requests attribution and no implication of endorsement.", | |
| 547 | + "enabled": true, | |
| 548 | + "schemaVersion": "1.0", | |
| 549 | + "config": { | |
| 550 | + "bulkType": "default_cards", | |
| 551 | + "requestIntervalMs": 100 | |
| 552 | + } | |
| 553 | + }, | |
| 554 | + { | |
| 555 | + "id": "ygoprodeck", | |
| 556 | + "displayName": "YGOPRODeck (Yu-Gi-Oh!)", | |
| 557 | + "sourceId": "ygoprodeck", | |
| 558 | + "sourceName": "YGOPRODeck", | |
| 559 | + "sourceType": "catalog", | |
| 560 | + "sourceUrl": "https://ygoprodeck.com", | |
| 561 | + "module": "api/ygoprodeck", | |
| 562 | + "enginePriority": [ | |
| 563 | + "api" | |
| 564 | + ], | |
| 565 | + "categories": [ | |
| 566 | + "yugioh" | |
| 567 | + ], | |
| 568 | + "regions": [ | |
| 569 | + "US", | |
| 570 | + "EU" | |
| 571 | + ], | |
| 572 | + "languages": [ | |
| 573 | + "en" | |
| 574 | + ], | |
| 575 | + "currency": [ | |
| 576 | + "USD", | |
| 577 | + "EUR" | |
| 578 | + ], | |
| 579 | + "supportsListings": false, | |
| 580 | + "supportsSold": false, | |
| 581 | + "supportsAuctions": false, | |
| 582 | + "supportsImages": true, | |
| 583 | + "supportsCatalog": true, | |
| 584 | + "supportsPopulation": false, | |
| 585 | + "supportsLookup": false, | |
| 586 | + "refreshFrequencyMinutes": 1440, | |
| 587 | + "priority": "high", | |
| 588 | + "trustScore": 0.75, | |
| 589 | + "attributionRequired": true, | |
| 590 | + "termsUrl": "https://ygoprodeck.com/api-guide/", | |
| 591 | + "accessNotes": "Public API v7 (https://db.ygoprodeck.com/api/v7/cardinfo.php), no key; rate limit 20 req/s — a full crawl is ONE request (~21 MB, ~14.5k cards / ~44k printings) plus optional misc=yes. The API carries no price timestamp: card_sets[].set_price (USD, per printing) and card_prices (cardmarket EUR / tcgplayer / ebay / amazon / coolstuffinc USD, card-level) are recorded as price_observations dated at fetch time with confidence 0.7 and metadata.price_scope. Images may not be hot-linked in bulk per the API guide (we store URLs, never mirror). Yu-Gi-Oh! © Konami.", | |
| 592 | + "enabled": true, | |
| 593 | + "schemaVersion": "1.0", | |
| 594 | + "config": { | |
| 595 | + "misc": true | |
| 596 | + } | |
| 597 | + } | |
| 598 | + ] | |
| 4 | 599 | } |
added
connectors/scrapfly/chrono24/_smoke.ts
+24 −0
@@ -0,0 +1,24 @@ | ||
| 1 | +/** Live smoke: pnpm tsx connectors/scrapfly/chrono24/_smoke.ts [/brand/model--modN.htm …] (CAPTURE=1 to save fixtures). ~40 Scrapfly credits per page. */ | |
| 2 | +import { createRouter, createCrawlContext, getConnectorMeta } from '@rareindex/connectors'; | |
| 3 | +import { saveFixture } from '@rareindex/connectors/testing'; | |
| 4 | +import { env } from '@rareindex/shared'; | |
| 5 | +import createConnector from './index.js'; | |
| 6 | + | |
| 7 | +const e = env(); | |
| 8 | +const meta = getConnectorMeta('chrono24'); | |
| 9 | +const connector = createConnector(meta); | |
| 10 | +const router = createRouter({ firecrawlApiKey: e.FIRECRAWL_API_KEY, scrapflyApiKey: e.SCRAPFLY_API_KEY }); | |
| 11 | +const seeds = process.argv.slice(2); | |
| 12 | +const ctx = createCrawlContext({ router, meta: { ...meta, config: { ...meta.config, pagesPerSeed: 1 } }, options: { mode: 'probe', limit: Number(process.env.LIMIT ?? 1), seeds: seeds.length ? seeds : undefined } }); | |
| 13 | + | |
| 14 | +for await (const raw of connector.crawl(ctx)) { | |
| 15 | + const recs = await connector.normalize({ ...raw, externalId: raw.externalId ?? null, fetchedAt: raw.fetchedAt ?? new Date() }); | |
| 16 | + const p = raw.payload as { brand: string; model: string; offers: unknown[]; totalListings: number | null }; | |
| 17 | + console.log(`\n# ${raw.url} — ${p.brand} ${p.model}: ${p.offers.length} offers on page, ${p.totalListings} total → ${recs.length} listings`); | |
| 18 | + for (const r of recs.slice(0, 3)) console.log(JSON.stringify(r).slice(0, 700)); | |
| 19 | + if (process.env.CAPTURE) { | |
| 20 | + const slug = raw.url.split('/').slice(-2).join('__').replace(/\.htm$/, ''); | |
| 21 | + saveFixture('chrono24', slug, { raw: { url: raw.url, externalId: raw.externalId ?? null, kind: raw.kind, engine: raw.engine, fetchedAt: raw.fetchedAt ?? new Date(), payload: raw.payload }, expect: { minCount: 10, kinds: ['listing'] }, note: `captured live from ${raw.url}` }); | |
| 22 | + } | |
| 23 | +} | |
| 24 | +console.log('\nengine stats', ctx.engineStats, 'anomalies', ctx.anomalies); | |
added
connectors/scrapfly/chrono24/index.test.ts
+47 −0
@@ -0,0 +1,47 @@ | ||
| 1 | +import { describe, expect, it } from 'vitest'; | |
| 2 | +import { getConnectorMeta } from '@rareindex/connectors'; | |
| 3 | +import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; | |
| 4 | +import createConnector, { parseModelPage } from './index.js'; | |
| 5 | + | |
| 6 | +const connector = createConnector(getConnectorMeta('chrono24')); | |
| 7 | + | |
| 8 | +describe('chrono24', () => { | |
| 9 | + runFixtureSuite(connector, it, expect); | |
| 10 | + | |
| 11 | + it('maps a Rolex Daytona model page to listings', async () => { | |
| 12 | + const fx = loadFixture('chrono24', 'rolex__daytona--mod2'); | |
| 13 | + const out = await connector.normalize(fx.raw); | |
| 14 | + expect(out.length).toBeGreaterThan(20); | |
| 15 | + const l = out[0]; | |
| 16 | + if (l?.kind !== 'listing') throw new Error(); | |
| 17 | + expect(l.attributes.categorySlug).toBe('rolex'); | |
| 18 | + expect(l.attributes.brand).toBe('Rolex'); | |
| 19 | + expect(l.attributes.model).toBe('Daytona'); | |
| 20 | + expect(l.listingType).toBe('fixed_price'); | |
| 21 | + expect(l.price).toBeGreaterThan(1000); | |
| 22 | + expect(l.currency).toBe('USD'); | |
| 23 | + expect(l.sourceUrl).toMatch(/--id\d+\.htm$/); | |
| 24 | + expect(l.attributes.identifiers.chrono24_id).toMatch(/^\d+$/); | |
| 25 | + const withRef = out.filter((r) => r.kind === 'listing' && r.attributes.reference); | |
| 26 | + expect(withRef.length).toBeGreaterThan(out.length / 2); | |
| 27 | + }); | |
| 28 | + | |
| 29 | + it('parses the AggregateOffer JSON-LD', () => { | |
| 30 | + const html = `<script type="application/ld+json">{"@context":"http://schema.org","@graph":[{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","item":{"@id":"https://www.chrono24.com/","name":"Chrono24"},"position":1},{"@type":"ListItem","item":{"@id":"https://www.chrono24.com/rolex/index.htm","name":"Rolex watches"},"position":2},{"@type":"ListItem","item":{"@id":"https://www.chrono24.com/rolex/daytona--mod2.htm","name":"Daytona watches"},"position":3}]},{"@type":"AggregateOffer","priceCurrency":"USD","offerCount":2,"offers":[{"@type":"Offer","name":"Rolex Daytona 116500LN Panda 40mm Full Set 2019","price":"31495","priceCurrency":"USD","image":[{"@type":"ImageObject","contentUrl":"https://img.chrono24.com/a.jpg"}],"url":"https://www.chrono24.com/rolex/daytona--id48341690.htm"}]}]}</script>`; | |
| 31 | + const p = parseModelPage(html, 'https://www.chrono24.com/rolex/daytona--mod2.htm'); | |
| 32 | + expect(p.brand).toBe('Rolex'); | |
| 33 | + expect(p.model).toBe('Daytona'); | |
| 34 | + expect(p.offers).toEqual([{ name: 'Rolex Daytona 116500LN Panda 40mm Full Set 2019', price: 31495, currency: 'USD', url: 'https://www.chrono24.com/rolex/daytona--id48341690.htm', image: 'https://img.chrono24.com/a.jpg' }]); | |
| 35 | + }); | |
| 36 | + | |
| 37 | + it('derives reference, year, size and completeness from the offer name', async () => { | |
| 38 | + const raw = { url: 'https://www.chrono24.com/rolex/daytona--mod2.htm', externalId: null, kind: 'listing' as const, engine: 'scrapfly' as const, fetchedAt: new Date('2026-09-07T00:00:00Z'), payload: { kind: 'model_page', url: 'https://www.chrono24.com/rolex/daytona--mod2.htm', brand: 'Rolex', model: 'Daytona', breadcrumb: [], totalListings: 1, offers: [{ name: 'Rolex Daytona 116500LN Panda 40mm Full Set 2019 Unworn', price: 31495, currency: 'USD', url: 'https://www.chrono24.com/rolex/daytona--id1.htm', image: null }] } }; | |
| 39 | + const [l] = await connector.normalize(raw); | |
| 40 | + if (l?.kind !== 'listing') throw new Error(); | |
| 41 | + expect(l.attributes.reference).toBe('116500LN'); | |
| 42 | + expect(l.attributes.year).toBe(2019); | |
| 43 | + expect(l.attributes.size).toBe('40mm'); | |
| 44 | + expect(l.condition.completeness).toBe('full_set'); | |
| 45 | + expect(l.condition.condition).toBe('unworn'); | |
| 46 | + }); | |
| 47 | +}); | |
added
connectors/scrapfly/chrono24/index.ts
+189 −0
@@ -0,0 +1,189 @@ | ||
| 1 | +import { z } from 'zod'; | |
| 2 | +import { BaseConnector, html as H, type ConnectorMeta, type CrawlContext, type RawRecordInput, type RawRecordLike } from '@rareindex/connectors'; | |
| 3 | +import { normalizeCondition } from '@rareindex/taxonomy'; | |
| 4 | +import { CurrencySchema, extractYear, type AssetAttributes, type NormalizedListing, type NormalizedRecord } from '@rareindex/shared'; | |
| 5 | + | |
| 6 | +/** | |
| 7 | + * Chrono24 connector — watch listings (asking prices) from public model pages. | |
| 8 | + * The page's schema.org ItemList of Offers is the extraction contract; one raw record per page. | |
| 9 | + */ | |
| 10 | + | |
| 11 | +const BASE = 'https://www.chrono24.com'; | |
| 12 | +const PARSER_VERSION = '1.0.0'; | |
| 13 | + | |
| 14 | +export const OfferSchema = z.object({ name: z.string(), price: z.number(), currency: z.string(), url: z.string(), image: z.string().nullable() }); | |
| 15 | +export const PagePayloadSchema = z.object({ | |
| 16 | + kind: z.literal('model_page'), | |
| 17 | + url: z.string(), | |
| 18 | + brand: z.string(), | |
| 19 | + model: z.string(), | |
| 20 | + breadcrumb: z.array(z.string()), | |
| 21 | + offers: z.array(OfferSchema), | |
| 22 | + totalListings: z.number().nullable(), | |
| 23 | +}); | |
| 24 | +export type PagePayload = z.infer<typeof PagePayloadSchema>; | |
| 25 | + | |
| 26 | +const BRAND_CATEGORY: Record<string, string> = { rolex: 'rolex', patekphilippe: 'patek_philippe', 'patek-philippe': 'patek_philippe', audemarspiguet: 'audemars_piguet', 'audemars-piguet': 'audemars_piguet', omega: 'omega' }; | |
| 27 | +const BRAND_NAME: Record<string, string> = { rolex: 'Rolex', patekphilippe: 'Patek Philippe', audemarspiguet: 'Audemars Piguet', omega: 'Omega', cartier: 'Cartier', tudor: 'Tudor', vacheronconstantin: 'Vacheron Constantin', breitling: 'Breitling', iwc: 'IWC', jaegerlecoultre: 'Jaeger-LeCoultre', alangesoehne: 'A. Lange & Söhne', richardmille: 'Richard Mille', grandseiko: 'Grand Seiko', tagheuer: 'TAG Heuer', panerai: 'Panerai', hublot: 'Hublot', zenith: 'Zenith', breguet: 'Breguet', blancpain: 'Blancpain' }; | |
| 28 | + | |
| 29 | +/** Watch reference heuristics: 116500LN, 126610LV, 5711/1A-010, 15400ST.OO.1220ST.01, 311.30.42.30.01.005, RM 011 */ | |
| 30 | +const REF_RE = /\b(\d{4,6}[A-Z]{0,3}(?:\/\d[A-Z0-9]*)?(?:-\d{3})?|\d{5}[A-Z]{2}\.[A-Z]{2}\.\d{4}[A-Z]{2}\.\d{2}|\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d{2}\.\d{3}|RM\s?\d{2,3}(?:-\d{2})?)\b/; | |
| 31 | + | |
| 32 | +export function parseModelPage(htmlText: string, url: string): PagePayload { | |
| 33 | + const ld = H.jsonLd(htmlText); | |
| 34 | + const crumbs: string[] = []; | |
| 35 | + const offers: z.infer<typeof OfferSchema>[] = []; | |
| 36 | + for (const block of ld) { | |
| 37 | + const type = block['@type']; | |
| 38 | + if (type === 'BreadcrumbList') { | |
| 39 | + for (const it of (block.itemListElement as Array<{ item?: { name?: string } }>) ?? []) if (it.item?.name) crumbs.push(it.item.name); | |
| 40 | + } | |
| 41 | + // Listings are published as an AggregateOffer whose `offers` array holds one Offer per watch. | |
| 42 | + const offerList = type === 'AggregateOffer' ? ((block.offers as Array<Record<string, unknown>>) ?? []) : type === 'ItemList' ? (((block.itemListElement as Array<Record<string, unknown>>) ?? []).map((el) => (el.item as Record<string, unknown> | undefined) ?? el)) : []; | |
| 43 | + if (offerList.length) { | |
| 44 | + const defaultCurrency = String(block.priceCurrency ?? ''); | |
| 45 | + for (const off of offerList) { | |
| 46 | + const t = off?.['@type']; | |
| 47 | + if (t !== 'Offer' && t !== 'Product') continue; | |
| 48 | + const priceRaw = off.price ?? (off.offers as { price?: unknown } | undefined)?.price; | |
| 49 | + const price = Number(priceRaw); | |
| 50 | + const currency = String(off.priceCurrency ?? (off.offers as { priceCurrency?: unknown } | undefined)?.priceCurrency ?? defaultCurrency); | |
| 51 | + const href = String(off.url ?? ''); | |
| 52 | + if (!Number.isFinite(price) || price <= 0 || !href) continue; | |
| 53 | + const img = off.image; | |
| 54 | + const image = Array.isArray(img) ? ((img[0] as { contentUrl?: string; url?: string } | string) ?? null) : (img as string | null | undefined) ?? null; | |
| 55 | + offers.push({ name: String(off.name ?? '').replace(/\s+/g, ' ').trim(), price, currency, url: href, image: typeof image === 'string' ? image : (image?.contentUrl ?? image?.url ?? null) }); | |
| 56 | + } | |
| 57 | + } | |
| 58 | + } | |
| 59 | + const pathBrand = url.match(/chrono24\.com\/([a-z-]+)\//)?.[1] ?? ''; | |
| 60 | + const brand = BRAND_NAME[pathBrand] ?? crumbs[1]?.replace(/\s+watches?$/i, '') ?? pathBrand; | |
| 61 | + const model = (crumbs[crumbs.length - 1] ?? '').replace(/\s+watches?$/i, ''); | |
| 62 | + const total = htmlText.match(/([\d,.]+)\s+(?:listings|watches)\b/)?.[1] ?? null; | |
| 63 | + return { kind: 'model_page', url, brand, model, breadcrumb: crumbs, offers, totalListings: total ? Number(total.replace(/[,.]/g, '')) : null }; | |
| 64 | +} | |
| 65 | + | |
| 66 | +export class Chrono24Connector extends BaseConnector { | |
| 67 | + readonly version = '1.0.0'; | |
| 68 | + readonly parserVersion = PARSER_VERSION; | |
| 69 | + protected override minIntervalMs = 2000; | |
| 70 | + | |
| 71 | + async *crawl(ctx: CrawlContext): AsyncIterable<RawRecordInput> { | |
| 72 | + const seeds = ctx.options.seeds?.length ? ctx.options.seeds : ((this.meta.config.seeds as string[] | undefined) ?? []); | |
| 73 | + const pages = Number(this.meta.config.pagesPerSeed ?? 1); | |
| 74 | + const pageSize = Number(this.meta.config.pageSize ?? 120); | |
| 75 | + let count = 0; | |
| 76 | + for (const seed of seeds) { | |
| 77 | + if (ctx.signal?.aborted) return; | |
| 78 | + for (let page = 1; page <= pages; page++) { | |
| 79 | + if (this.reached(ctx, count)) return; | |
| 80 | + const path = page === 1 ? seed : seed.replace(/--mod(\d+)\.htm$/, `--mod$1-${page}.htm`); | |
| 81 | + const url = `${path.startsWith('http') ? path : BASE + path}?pageSize=${pageSize}&showpage=${page}`; | |
| 82 | + await this.throttle(); | |
| 83 | + const res = await ctx.fetch(url, { | |
| 84 | + renderJs: false, | |
| 85 | + country: 'us', | |
| 86 | + responseType: 'text', | |
| 87 | + expect: ['title', 'price', 'currency', 'images'], | |
| 88 | + parse: (r) => { | |
| 89 | + if (!r.html) return null; | |
| 90 | + const p = parseModelPage(r.html, url); | |
| 91 | + const first = p.offers[0]; | |
| 92 | + return { title: p.model || null, price: first?.price ?? null, currency: first?.currency ?? null, images: p.offers.filter((o) => o.image).map((o) => o.image) }; | |
| 93 | + }, | |
| 94 | + }); | |
| 95 | + if (!res.success || !res.html) { | |
| 96 | + ctx.anomaly('page_fetch_failed', `${url}: ${res.error ?? res.httpStatus}`); | |
| 97 | + break; | |
| 98 | + } | |
| 99 | + const payload = parseModelPage(res.html, url.split('?')[0]!); | |
| 100 | + if (payload.offers.length === 0) { | |
| 101 | + ctx.anomaly('empty_page', url); | |
| 102 | + break; | |
| 103 | + } | |
| 104 | + count++; | |
| 105 | + yield { url: url.split('?')[0]!, externalId: `${seed}#${page}`, kind: 'listing', engine: res.engine, httpStatus: res.httpStatus, payload, fetchedAt: res.fetchedAt }; | |
| 106 | + } | |
| 107 | + } | |
| 108 | + } | |
| 109 | + | |
| 110 | + async normalize(raw: RawRecordLike): Promise<NormalizedRecord[]> { | |
| 111 | + const p = PagePayloadSchema.parse(raw.payload); | |
| 112 | + const pathBrand = p.url.match(/chrono24\.com\/([a-z-]+)\//)?.[1] ?? ''; | |
| 113 | + const categorySlug = BRAND_CATEGORY[pathBrand] ?? 'other_watches'; | |
| 114 | + const out: NormalizedListing[] = []; | |
| 115 | + const seen = new Set<string>(); | |
| 116 | + for (const o of p.offers) { | |
| 117 | + const id = o.url.match(/--id(\d+)\.htm/)?.[1] ?? o.url; | |
| 118 | + if (seen.has(id)) continue; | |
| 119 | + seen.add(id); | |
| 120 | + const cur = CurrencySchema.safeParse(o.currency); | |
| 121 | + if (!cur.success) continue; | |
| 122 | + // First reference-looking token that is not a plain year (e.g. "UNWORN 2024 126500LN" → 126500LN). | |
| 123 | + const ref = [...o.name.matchAll(new RegExp(REF_RE.source, 'g'))].map((m) => m[1]!.replace(/\s+/g, ' ')).find((r) => !/^(18|19|20)\d{2}$/.test(r)) ?? null; | |
| 124 | + const year = extractYear(o.name); | |
| 125 | + const lower = o.name.toLowerCase(); | |
| 126 | + const conditionRaw = /unworn|brand new|new\b/.test(lower) ? 'Unworn' : /\bmint\b|like new|excellent/.test(lower) ? 'Excellent' : /pre-owned|used/.test(lower) ? 'Pre-owned' : null; | |
| 127 | + const completeness = /full set|box (?:and|&|\/) papers|box\/papers|complete set/.test(lower) ? 'full_set' : /papers/.test(lower) ? 'papers_only' : /\bbox\b/.test(lower) ? 'box_only' : null; | |
| 128 | + const attributes: AssetAttributes = { | |
| 129 | + categorySlug, | |
| 130 | + subcategorySlug: null, | |
| 131 | + franchise: null, | |
| 132 | + brand: p.brand, | |
| 133 | + series: null, | |
| 134 | + set: null, | |
| 135 | + setCode: null, | |
| 136 | + name: `${p.brand} ${p.model}`.trim(), | |
| 137 | + model: p.model, | |
| 138 | + reference: ref, | |
| 139 | + number: null, | |
| 140 | + year, | |
| 141 | + edition: null, | |
| 142 | + variant: null, | |
| 143 | + language: null, | |
| 144 | + region: null, | |
| 145 | + country: null, | |
| 146 | + material: /platinum/.test(lower) ? 'platinum' : /yellow gold|rose gold|everose|white gold|18k|gold/.test(lower) ? 'gold' : /two[- ]tone|rolesor/.test(lower) ? 'two-tone' : /steel|stainless/.test(lower) ? 'steel' : /titanium/.test(lower) ? 'titanium' : /ceramic/.test(lower) ? 'ceramic' : null, | |
| 147 | + size: o.name.match(/\b(\d{2}(?:\.\d)?)\s?mm\b/i)?.[1] ? `${o.name.match(/\b(\d{2}(?:\.\d)?)\s?mm\b/i)![1]}mm` : null, | |
| 148 | + color: null, | |
| 149 | + rarity: null, | |
| 150 | + productionQuantity: null, | |
| 151 | + originalMsrp: null, | |
| 152 | + originalMsrpCurrency: null, | |
| 153 | + identifiers: { ...(ref ? { reference: ref } : {}), chrono24_id: id }, | |
| 154 | + metadata: { model_page: p.url }, | |
| 155 | + }; | |
| 156 | + out.push({ | |
| 157 | + kind: 'listing', | |
| 158 | + connectorId: this.meta.id, | |
| 159 | + sourceId: this.meta.sourceId, | |
| 160 | + sourceUrl: o.url, | |
| 161 | + externalId: id, | |
| 162 | + rawTitle: o.name, | |
| 163 | + description: null, | |
| 164 | + imageUrls: o.image ? [o.image] : [], | |
| 165 | + attributes, | |
| 166 | + grade: { grader: null, grade: null, qualifier: null, certificationNumber: null }, | |
| 167 | + condition: { condition: normalizeCondition(categorySlug, conditionRaw), conditionRaw, completeness }, | |
| 168 | + observedAt: raw.fetchedAt, | |
| 169 | + confidence: 0.8, | |
| 170 | + parserVersion: PARSER_VERSION, | |
| 171 | + listingType: 'fixed_price', | |
| 172 | + price: o.price, | |
| 173 | + currency: cur.data, | |
| 174 | + seller: null, | |
| 175 | + sellerReputation: null, | |
| 176 | + location: null, | |
| 177 | + shippingCost: null, | |
| 178 | + quantity: 1, | |
| 179 | + listedAt: null, | |
| 180 | + endsAt: null, | |
| 181 | + availability: 'available', | |
| 182 | + bidCount: null, | |
| 183 | + }); | |
| 184 | + } | |
| 185 | + return out; | |
| 186 | + } | |
| 187 | +} | |
| 188 | + | |
| 189 | +export default (meta: ConnectorMeta) => new Chrono24Connector(meta); | |
added
connectors/scrapfly/chrono24/meta.json
+40 −0
@@ -0,0 +1,40 @@ | ||
| 1 | +{ | |
| 2 | + "id": "chrono24", | |
| 3 | + "displayName": "Chrono24", | |
| 4 | + "sourceId": "chrono24", | |
| 5 | + "sourceName": "Chrono24", | |
| 6 | + "sourceType": "marketplace", | |
| 7 | + "sourceUrl": "https://www.chrono24.com", | |
| 8 | + "module": "scrapfly/chrono24", | |
| 9 | + "enginePriority": ["scrapfly", "firecrawl"], | |
| 10 | + "categories": ["watches", "rolex", "patek_philippe", "audemars_piguet", "omega", "other_watches"], | |
| 11 | + "regions": ["global"], | |
| 12 | + "languages": ["en"], | |
| 13 | + "currency": ["USD"], | |
| 14 | + "supportsListings": true, | |
| 15 | + "supportsSold": false, | |
| 16 | + "supportsAuctions": false, | |
| 17 | + "supportsImages": true, | |
| 18 | + "supportsCatalog": false, | |
| 19 | + "supportsPopulation": false, | |
| 20 | + "supportsLookup": false, | |
| 21 | + "refreshFrequencyMinutes": 720, | |
| 22 | + "priority": "high", | |
| 23 | + "trustScore": 0.7, | |
| 24 | + "attributionRequired": true, | |
| 25 | + "termsUrl": "https://www.chrono24.com/info/terms-of-use.htm", | |
| 26 | + "accessNotes": "Public model listing pages (e.g. /rolex/daytona--mod2.htm) fetched through Scrapfly without JS rendering (Cloudflare shield → ~40 credits/page); robots.txt allows these paths (Crawl-delay 0.1). Each page embeds a schema.org ItemList of Offers (name, price in the site currency, image, listing URL) — we store asking prices as listings only, never as sales. No login, no per-listing detail fetch (seller details stay on Chrono24). Model pages are configured in config.seeds; pagination via --modN-P.htm.", | |
| 27 | + "enabled": true, | |
| 28 | + "schemaVersion": "1.0", | |
| 29 | + "config": { | |
| 30 | + "seeds": [ | |
| 31 | + "/rolex/daytona--mod2.htm", "/rolex/submariner--mod1.htm", "/rolex/gmt-master-ii--mod3.htm", "/rolex/datejust--mod4.htm", "/rolex/day-date--mod6.htm", "/rolex/explorer--mod8.htm", | |
| 32 | + "/patekphilippe/nautilus--mod15.htm", "/patekphilippe/aquanaut--mod16.htm", "/patekphilippe/calatrava--mod14.htm", | |
| 33 | + "/audemarspiguet/royal-oak--mod20.htm", "/audemarspiguet/royal-oak-offshore--mod21.htm", | |
| 34 | + "/omega/speedmaster--mod24.htm", "/omega/seamaster--mod22.htm", | |
| 35 | + "/cartier/santos--mod38.htm", "/tudor/black-bay--mod1128.htm", "/vacheronconstantin/overseas--mod1024.htm" | |
| 36 | + ], | |
| 37 | + "pagesPerSeed": 2, | |
| 38 | + "pageSize": 120 | |
| 39 | + } | |
| 40 | +} | |
added
connectors/scrapfly/goldin/_smoke.ts
+24 −0
@@ -0,0 +1,24 @@ | ||
| 1 | +/** | |
| 2 | + * Live smoke test: renders one Goldin "Sold Items" page per selected seed through Scrapfly and prints | |
| 3 | + * normalised sales. Usage: SCRAPFLY_API_KEY=… pnpm tsx connectors/scrapfly/goldin/_smoke.ts [categorySlug…] | |
| 4 | + * Costs ~6 Scrapfly credits per page. | |
| 5 | + */ | |
| 6 | +import { createCrawlContext, createRouter, getConnectorMeta } from '@rareindex/connectors'; | |
| 7 | +import { childLogger } from '@rareindex/shared'; | |
| 8 | +import createConnector from './index.js'; | |
| 9 | + | |
| 10 | +const meta = getConnectorMeta('goldin'); | |
| 11 | +const connector = createConnector(meta); | |
| 12 | +const router = createRouter({ scrapflyApiKey: process.env.SCRAPFLY_API_KEY, firecrawlApiKey: process.env.FIRECRAWL_API_KEY }); | |
| 13 | +const categories = process.argv.slice(2); | |
| 14 | +const ctx = createCrawlContext({ router, meta, options: { mode: 'probe', limit: 10, categories: categories.length ? categories : ['pokemon'] }, log: childLogger({ connector: meta.id, smoke: true }) }); | |
| 15 | + | |
| 16 | +let total = 0; | |
| 17 | +for await (const raw of connector.crawl(ctx)) { | |
| 18 | + const records = await connector.normalize({ ...raw, externalId: raw.externalId ?? null, fetchedAt: raw.fetchedAt ?? new Date() }); | |
| 19 | + total += records.length; | |
| 20 | + const p = raw.payload as { total: number | null; lots: unknown[]; seed: { path: string } }; | |
| 21 | + console.log(`page ${raw.url} → ${p.lots.length} lots (source total ${p.total}) → ${records.length} sales`); | |
| 22 | + for (const r of records.slice(0, 3)) console.log(JSON.stringify(r, null, 1)); | |
| 23 | +} | |
| 24 | +console.log({ totalNormalized: total, engineStats: ctx.engineStats, anomalies: ctx.anomalies }); | |
added
connectors/scrapfly/goldin/classify.ts
+105 −0
@@ -0,0 +1,105 @@ | ||
| 1 | +/** Title heuristics specific to Goldin lot titles. Kept out of the canonical domain model (§196.6). */ | |
| 2 | + | |
| 3 | +export interface SeedLike { | |
| 4 | + path: string; | |
| 5 | + categorySlug: string; | |
| 6 | + sport?: string; | |
| 7 | +} | |
| 8 | + | |
| 9 | +const MEMORABILIA = /\b(game[- ]?used|game[- ]?worn|match[- ]?worn|jersey|uniform|helmet|cleats?|sneakers?|shoes?|glove|bat\b|baseball\b(?! card)|basketball\b(?! card)|football\b(?! card)|puck|stick|ball\b|ticket|stub|program|photo(?:graph)?|pennant|poster|ring\b|medal|trophy|magazine|sports illustrated|cover|seat|wristband|shorts|pants|jacket|cap\b|hat\b|signed (?:bat|ball|jersey|helmet|photo)|loa\b|mears)\b/i; | |
| 10 | +const CARD_HINT = /#\d|\bpsa\b|\bbgs\b|\bsgc\b|\bcgc\b|\bbeckett\b|\brookie\b|\brc\b|\brefractor\b|\bprizm\b|\bchrome\b|\bauto(?:graph)?\b.*\/\d+|\bcard\b/i; | |
| 11 | +const COMIC_HINT = /\bcgc\b|\bcbcs\b|\bcomic|#\d+\s*\(19|#\d+\s*\(20|newsstand|1st appearance/i; | |
| 12 | +const CONSOLE_HINT = /\bconsole\b|\bsystem\b|\bcontroller\b|\bgame boy\b(?!.*(?:cartridge|game))/i; | |
| 13 | + | |
| 14 | +const SPORT_CARD_SLUG: Record<string, string> = { basketball: 'basketball_cards', baseball: 'baseball_cards', football: 'football_cards', hockey: 'hockey_cards', soccer: 'soccer_cards', racing: 'f1_cards' }; | |
| 15 | + | |
| 16 | +export function classifyGoldinTitle(title: string, seed: SeedLike, breadcrumb: string[] = []): string { | |
| 17 | + const t = title; | |
| 18 | + if (seed.sport) { | |
| 19 | + const cardSlug = SPORT_CARD_SLUG[seed.sport] ?? 'other_sports_cards'; | |
| 20 | + if (MEMORABILIA.test(t) && !CARD_HINT.test(t)) return 'sports_memorabilia'; | |
| 21 | + if (MEMORABILIA.test(t) && /\b(jersey|helmet|bat|ball|ticket|photo|program|magazine|cover|ring|medal|trophy)\b/i.test(t) && !/#\d/.test(t)) return 'sports_memorabilia'; | |
| 22 | + if (seed.sport === 'racing' && !/\bf1\b|formula 1|formula one/i.test(t)) return 'other_sports_cards'; | |
| 23 | + return cardSlug; | |
| 24 | + } | |
| 25 | + switch (seed.categorySlug) { | |
| 26 | + case 'marvel_comics': | |
| 27 | + return COMIC_HINT.test(t) ? 'marvel_comics' : 'non_sport_cards'; | |
| 28 | + case 'nintendo_games': | |
| 29 | + return CONSOLE_HINT.test(t) ? 'gaming_hardware' : 'nintendo_games'; | |
| 30 | + case 'sports_memorabilia': { | |
| 31 | + const crumbs = breadcrumb.join(' ').toLowerCase(); | |
| 32 | + if (/pokemon/.test(crumbs) || /\bpokemon\b/i.test(t)) return 'pokemon'; | |
| 33 | + if (/magic: the gathering|\bmtg\b/i.test(t)) return 'magic_the_gathering'; | |
| 34 | + if (/yu-gi-oh/i.test(t)) return 'yugioh'; | |
| 35 | + if (/one piece/i.test(t)) return 'one_piece_card_game'; | |
| 36 | + for (const [sport, slug] of Object.entries(SPORT_CARD_SLUG)) { | |
| 37 | + if (new RegExp(`\\b${sport}\\b`, 'i').test(crumbs)) return MEMORABILIA.test(t) && !CARD_HINT.test(t) ? 'sports_memorabilia' : slug; | |
| 38 | + } | |
| 39 | + if (CARD_HINT.test(t) && !MEMORABILIA.test(t)) return 'other_sports_cards'; | |
| 40 | + return 'sports_memorabilia'; | |
| 41 | + } | |
| 42 | + default: | |
| 43 | + return seed.categorySlug; | |
| 44 | + } | |
| 45 | +} | |
| 46 | + | |
| 47 | +export function isBundleTitle(title: string): boolean { | |
| 48 | + return /\blot of\b|\((\d{2,})\+?\)|\bcollection\b|\bcomplete set\b|\bpartial set\b|\bset break\b|\bbundle\b|\bx\d{2,}\b|\bcase\b.*\bboxes\b/i.test(title); | |
| 49 | +} | |
| 50 | + | |
| 51 | +const BRANDS = ['Topps Chrome', 'Topps Finest', 'Bowman Chrome', 'Panini Prizm', 'Panini Select', 'Panini Mosaic', 'Panini Donruss Optic', 'Panini National Treasures', 'Panini Flawless', 'Panini Immaculate', 'Panini Contenders', 'Upper Deck', 'O-Pee-Chee', 'Topps', 'Bowman', 'Panini', 'Fleer', 'Donruss', 'Score', 'Leaf', 'Futera', 'Skybox', 'Hoops', 'Stadium Club', 'Goudey', 'Play Ball', 'Pokemon', 'Magic: The Gathering', 'Yu-Gi-Oh!', 'One Piece']; | |
| 52 | + | |
| 53 | +const POKEMON_SETS = ['Base Set 2', 'Base Set', 'Shadowless', 'Jungle', 'Fossil', 'Team Rocket', 'Gym Heroes', 'Gym Challenge', 'Neo Genesis', 'Neo Discovery', 'Neo Revelation', 'Neo Destiny', 'Legendary Collection', 'Expedition', 'Aquapolis', 'Skyridge', 'Black Star Promo', 'Southern Islands', 'EX Ruby & Sapphire', 'EX Team Rocket Returns', 'EX Deoxys', 'EX Dragon Frontiers', 'EX Holon Phantoms', 'Evolutions', 'Hidden Fates', 'Shining Fates', 'Champion’s Path', "Champion's Path", 'Celebrations', 'Evolving Skies', 'Brilliant Stars', 'Astral Radiance', 'Lost Origin', 'Silver Tempest', 'Crown Zenith', 'Scarlet & Violet 151', '151', 'Obsidian Flames', 'Paldea Evolved', 'Paradox Rift', 'Paldean Fates', 'Temporal Forces', 'Twilight Masquerade', 'Shrouded Fable', 'Stellar Crown', 'Surging Sparks', 'Prismatic Evolutions', 'Journey Together', 'Destined Rivals', 'Call of Legends', 'Vivid Voltage', 'Chilling Reign', 'Fusion Strike', 'Sword & Shield', 'Sun & Moon', 'XY Evolutions', 'Plasma Storm', 'Mega Evolution']; | |
| 54 | + | |
| 55 | +export interface CardAttrs { | |
| 56 | + name: string | null; | |
| 57 | + brand: string | null; | |
| 58 | + set: string | null; | |
| 59 | + number: string | null; | |
| 60 | + variant: string | null; | |
| 61 | +} | |
| 62 | + | |
| 63 | +/** Best-effort structured fields from a Goldin title; anything uncertain stays null. */ | |
| 64 | +export function parseCardAttributes(title: string, categorySlug: string): CardAttrs { | |
| 65 | + const clean = title.replace(/\s+-\s+(PSA|BGS|SGC|CGC|Beckett|TAG|WATA|VGA)\b.*$/i, '').trim(); | |
| 66 | + let brand: string | null = null; | |
| 67 | + for (const b of BRANDS) { | |
| 68 | + if (new RegExp(`\\b${b.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\b`, 'i').test(clean)) { | |
| 69 | + brand = b; | |
| 70 | + break; | |
| 71 | + } | |
| 72 | + } | |
| 73 | + let set: string | null = null; | |
| 74 | + if (categorySlug === 'pokemon') { | |
| 75 | + for (const s of POKEMON_SETS) { | |
| 76 | + if (new RegExp(`\\b${s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\b`, 'i').test(clean)) { | |
| 77 | + set = s; | |
| 78 | + break; | |
| 79 | + } | |
| 80 | + } | |
| 81 | + } else if (brand && /_cards$/.test(categorySlug)) { | |
| 82 | + const m = clean.match(new RegExp(`\\b(\\d{4}(?:-\\d{2})?)\\s+(${brand.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?:\\s+[A-Z][\\w'&.-]*){0,3})`, 'i')); | |
| 83 | + if (m) set = m[2]!.trim(); | |
| 84 | + } | |
| 85 | + const num = clean.match(/#\s?([A-Za-z]{0,4}-?\d{1,4}[A-Za-z]{0,2}(?:\/\d{1,3})?)/); | |
| 86 | + const number = num ? num[1]! : null; | |
| 87 | + const variantBits: string[] = []; | |
| 88 | + for (const re of [/\b1st Edition\b/i, /\bShadowless\b/i, /\bHolo(?:foil)?\b/i, /\bReverse Holo\b/i, /\bRefractor\b/i, /\bSilver Prizm\b/i, /\bGold\b(?! Medal)/i, /\bAuto(?:graph)?\b/i, /\bRookie\b|\bRC\b/, /\bPatch\b/i, /\b\/\d{1,3}\b/]) { | |
| 89 | + const m = clean.match(re); | |
| 90 | + if (m) variantBits.push(m[0]); | |
| 91 | + } | |
| 92 | + const variant = variantBits.length ? variantBits.join(' ') : null; | |
| 93 | + // name: text after the card number, or after brand/set, stripped of variant words | |
| 94 | + let name: string | null = null; | |
| 95 | + if (num && num.index !== undefined) { | |
| 96 | + const after = clean.slice(num.index + num[0].length).replace(/^[\s\-–:]+/, ''); | |
| 97 | + name = after.split(/\s+-\s+|\(|,|\bPSA\b|\bBGS\b|\bCGC\b|\bSGC\b/i)[0]!.trim() || null; | |
| 98 | + } | |
| 99 | + if (!name) { | |
| 100 | + const stripped = clean.replace(/^\d{4}(?:-\d{2})?\s+/, '').replace(brand ? new RegExp(brand.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i') : /$^/, '').replace(set ? new RegExp(set.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i') : /$^/, '').replace(/\s+/g, ' ').trim(); | |
| 101 | + name = stripped.split(/\s+-\s+|\(/)[0]!.trim() || null; | |
| 102 | + } | |
| 103 | + if (name) name = name.replace(/\b(1st Edition|Shadowless|Holo(?:foil)?|Reverse Holo|Refractor|Rookie|RC|Auto(?:graph)?)\b/gi, '').replace(/\s+/g, ' ').trim() || null; | |
| 104 | + return { name, brand, set, number, variant }; | |
| 105 | +} | |
added
connectors/scrapfly/goldin/index.test.ts
+82 −0
@@ -0,0 +1,82 @@ | ||
| 1 | +import { describe, expect, it } from 'vitest'; | |
| 2 | +import { getConnectorMeta } from '@rareindex/connectors'; | |
| 3 | +import { loadFixture, runFixtureSuite } from '@rareindex/connectors/testing'; | |
| 4 | +import createConnector, { parseGoldinDisplayDate, parseGoldinGrade, soldPageUrl } from './index.js'; | |
| 5 | +import { classifyGoldinTitle, isBundleTitle, parseCardAttributes } from './classify.js'; | |
| 6 | + | |
| 7 | +const connector = createConnector(getConnectorMeta('goldin')); | |
| 8 | + | |
| 9 | +describe('goldin connector', () => { | |
| 10 | + runFixtureSuite(connector, it, expect); | |
| 11 | + | |
| 12 | + it('applies buyer premium and keeps the hammer price', async () => { | |
| 13 | + const fx = loadFixture('goldin', 'pokemon-sold-page'); | |
| 14 | + const out = await connector.normalize(fx.raw); | |
| 15 | + const lot = (fx.raw.payload as { lots: Array<{ lot_id: string; current_price: number; buyer_premium: number; title: string; end_timestamp: string }> }).lots[0]!; | |
| 16 | + const rec = out.find((r) => r.kind === 'sale' && r.externalId === lot.lot_id); | |
| 17 | + expect(rec && rec.kind === 'sale').toBe(true); | |
| 18 | + if (!rec || rec.kind !== 'sale') return; | |
| 19 | + expect(rec.price).toBeCloseTo(lot.current_price * (1 + lot.buyer_premium / 100), 2); | |
| 20 | + expect(rec.buyerPremiumIncluded).toBe(true); | |
| 21 | + expect(rec.attributes.metadata.hammer_price).toBe(lot.current_price); | |
| 22 | + expect(rec.saleDate.toISOString().slice(0, 19)).toBe(new Date(lot.end_timestamp).toISOString().slice(0, 19)); | |
| 23 | + expect(rec.currency).toBe('USD'); | |
| 24 | + expect(rec.auctionHouse).toBe('Goldin'); | |
| 25 | + expect(rec.sourceUrl).toMatch(/^https:\/\/goldin\.co\/item\//); | |
| 26 | + expect(rec.attributes.categorySlug).toBe('pokemon'); | |
| 27 | + }); | |
| 28 | + | |
| 29 | + it('extracts grades from Goldin titles', async () => { | |
| 30 | + const fx = loadFixture('goldin', 'pokemon-sold-page'); | |
| 31 | + const out = await connector.normalize(fx.raw); | |
| 32 | + const graded = out.flatMap((r) => (r.kind === 'sale' && /PSA GEM MT 10/.test(r.rawTitle) ? [r] : [])); | |
| 33 | + expect(graded.length).toBeGreaterThan(0); | |
| 34 | + for (const g of graded) expect(g.grade).toMatchObject({ grader: 'psa', grade: '10' }); | |
| 35 | + }); | |
| 36 | + | |
| 37 | + it('skips placeholder future end dates and unsold lots', async () => { | |
| 38 | + const fx = loadFixture('goldin', 'pokemon-sold-page'); | |
| 39 | + const payload = structuredClone(fx.raw.payload) as { lots: Array<Record<string, unknown>> }; | |
| 40 | + const keepId = payload.lots[0]!.lot_id; | |
| 41 | + payload.lots = [ | |
| 42 | + { ...payload.lots[0]!, lot_id: 'future', end_timestamp: '2235-06-04T00:00:00Z' }, | |
| 43 | + { ...payload.lots[0]!, lot_id: 'unsold', status: 'Completed_Unsold' }, | |
| 44 | + { ...payload.lots[0]!, lot_id: 'zero', current_price: 0 }, | |
| 45 | + payload.lots[0]!, | |
| 46 | + ]; | |
| 47 | + const out = await connector.normalize({ ...fx.raw, payload }); | |
| 48 | + expect(out.map((r) => (r.kind === 'sale' ? r.externalId : null))).toEqual([keepId]); | |
| 49 | + }); | |
| 50 | + | |
| 51 | + it('normalises a sold item page (lookup) with cert number', async () => { | |
| 52 | + const fx = loadFixture('goldin', 'item-sold-page'); | |
| 53 | + const out = await connector.normalize(fx.raw); | |
| 54 | + expect(out.length).toBe(1); | |
| 55 | + const r = out[0]!; | |
| 56 | + expect(r.kind).toBe('sale'); | |
| 57 | + if (r.kind !== 'sale') return; | |
| 58 | + expect(r.price).toBe(25726); | |
| 59 | + expect(r.attributes.metadata.hammer_price).toBe(21438); | |
| 60 | + expect(r.saleDate.toISOString()).toBe('2012-11-18T02:16:00.000Z'); | |
| 61 | + expect(r.buyerPremiumIncluded).toBe(true); | |
| 62 | + }); | |
| 63 | + | |
| 64 | + it('helpers', () => { | |
| 65 | + expect(parseGoldinGrade('2019 Pokemon Sun & Moon Team Up #33 Pikachu & Zekrom GX Tag Team - PSA GEM MT 10')).toMatchObject({ grader: 'psa', grade: '10' }); | |
| 66 | + expect(parseGoldinGrade('2003-04 Topps Chrome #111 LeBron James Rookie Card')).toMatchObject({ grader: null, grade: null }); | |
| 67 | + expect(soldPageUrl('/buy/sc/pokemon', 2, 240)).toBe('https://goldin.co/buy/sc/pokemon?page=2&number_of_lots=240&show_only=Sold%20Items&sort=Most_Recent_Bids'); | |
| 68 | + expect(parseGoldinDisplayDate('Sat, 11/17/12, 10:16 PM EDT')?.toISOString()).toBe('2012-11-18T02:16:00.000Z'); | |
| 69 | + expect(parseGoldinDisplayDate('Sun, 9/06/26, 9:02 PM PDT')?.toISOString()).toBe('2026-09-07T04:02:00.000Z'); | |
| 70 | + expect(classifyGoldinTitle('2003-04 Topps Chrome #111 LeBron James Rookie Card - PSA GEM MT 10', { path: '/buy/sc/Basketball', categorySlug: 'basketball_cards', sport: 'basketball' })).toBe('basketball_cards'); | |
| 71 | + expect(classifyGoldinTitle('1994-95 Patrick Ewing Game Used New York Knicks Home Jersey (Beckett)', { path: '/buy/sc/Basketball', categorySlug: 'basketball_cards', sport: 'basketball' })).toBe('sports_memorabilia'); | |
| 72 | + expect(classifyGoldinTitle('Amazing Spider-Man #300 (1988 Marvel) - CGC 9.8', { path: '/buy/sc/Marvel', categorySlug: 'marvel_comics' })).toBe('marvel_comics'); | |
| 73 | + expect(isBundleTitle('1993 Magic: The Gathering Unlimited Collection (250+)')).toBe(true); | |
| 74 | + expect(isBundleTitle('2000 Pokemon Black Star Promo #23 Zapdos - PSA GEM MT 10')).toBe(false); | |
| 75 | + const a = parseCardAttributes('2000 Pokemon Black Star Promo #23 Zapdos - PSA GEM MT 10', 'pokemon'); | |
| 76 | + expect(a).toMatchObject({ brand: 'Pokemon', set: 'Black Star Promo', number: '23', name: 'Zapdos' }); | |
| 77 | + const b = parseCardAttributes('2003-04 Topps Chrome #111 LeBron James Rookie Card - PSA GEM MT 10', 'basketball_cards'); | |
| 78 | + expect(b.brand).toBe('Topps Chrome'); | |
| 79 | + expect(b.number).toBe('111'); | |
| 80 | + expect(b.name).toMatch(/^LeBron James/); | |
| 81 | + }); | |
| 82 | +}); | |
added
connectors/scrapfly/goldin/index.ts
+371 −0
@@ -0,0 +1,371 @@ | ||
| 1 | +import { z } from 'zod'; | |
| 2 | +import { BaseConnector, html as H, type ConnectorMeta, type CrawlContext, type RawRecordInput, type RawRecordLike } from '@rareindex/connectors'; | |
| 3 | +import { NormalizedSaleSchema, extractYear, parsePrice, type NormalizedRecord } from '@rareindex/shared'; | |
| 4 | +import { parseGradeFromTitle } from '@rareindex/taxonomy'; | |
| 5 | +import { classifyGoldinTitle, parseCardAttributes, isBundleTitle } from './classify.js'; | |
| 6 | +import { scrapflyRender, type ScrapflyRenderResult } from './scrapfly-render.js'; | |
| 7 | + | |
| 8 | +/** | |
| 9 | + * Goldin — sold auction results (§110). Primary engine: Scrapfly (JS rendering + ASP). | |
| 10 | + * Data source = the lots_v2 search XHR performed by Goldin's own public "Sold Items" grid. | |
| 11 | + * See meta.json accessNotes for the access/legal rationale. | |
| 12 | + */ | |
| 13 | + | |
| 14 | +const IMAGE_CDN = 'https://d2tt46f3mh26nl.cloudfront.net/public/Lots'; | |
| 15 | +const SITE = 'https://goldin.co'; | |
| 16 | + | |
| 17 | +export const GoldinLotSchema = z.object({ | |
| 18 | + lot_id: z.string(), | |
| 19 | + title: z.string(), | |
| 20 | + meta_slug: z.string(), | |
| 21 | + current_price: z.number().nullable().optional(), | |
| 22 | + buyer_premium: z.number().nullable().optional(), | |
| 23 | + end_timestamp: z.string().nullable().optional(), | |
| 24 | + start_timestamp: z.string().nullable().optional(), | |
| 25 | + status: z.string().nullable().optional(), | |
| 26 | + auction_id: z.string().nullable().optional(), | |
| 27 | + auction_type: z.string().nullable().optional(), | |
| 28 | + lot_number: z.number().nullable().optional(), | |
| 29 | + number_of_bids: z.number().nullable().optional(), | |
| 30 | + primary_image_name: z.string().nullable().optional(), | |
| 31 | +}); | |
| 32 | +export type GoldinLot = z.infer<typeof GoldinLotSchema>; | |
| 33 | + | |
| 34 | +export const SeedSchema = z.object({ path: z.string(), categorySlug: z.string(), sport: z.string().optional() }); | |
| 35 | +export type Seed = z.infer<typeof SeedSchema>; | |
| 36 | + | |
| 37 | +/** Raw payload for one rendered "Sold Items" page. */ | |
| 38 | +export const SoldPagePayloadSchema = z.object({ | |
| 39 | + kind: z.literal('sold_page'), | |
| 40 | + seed: SeedSchema, | |
| 41 | + page: z.number().int(), | |
| 42 | + pageUrl: z.string(), | |
| 43 | + request: z.record(z.string(), z.unknown()), | |
| 44 | + total: z.number().nullable(), | |
| 45 | + lots: z.array(GoldinLotSchema), | |
| 46 | + auctions: z.record(z.string(), z.object({ title: z.string().nullable().optional(), auction_type: z.string().nullable().optional(), end_timestamp: z.string().nullable().optional(), buyer_premium: z.number().nullable().optional() })).default({}), | |
| 47 | +}); | |
| 48 | +export type SoldPagePayload = z.infer<typeof SoldPagePayloadSchema>; | |
| 49 | + | |
| 50 | +/** Raw payload for one rendered item page (lookup). Text is pre-flattened; no HTML stored. */ | |
| 51 | +export const ItemPagePayloadSchema = z.object({ | |
| 52 | + kind: z.literal('item_page'), | |
| 53 | + url: z.string(), | |
| 54 | + title: z.string(), | |
| 55 | + breadcrumb: z.array(z.string()).default([]), | |
| 56 | + totalPriceText: z.string().nullable(), | |
| 57 | + winningBidText: z.string().nullable(), | |
| 58 | + endedText: z.string().nullable(), | |
| 59 | + bidsText: z.string().nullable(), | |
| 60 | + sold: z.boolean(), | |
| 61 | + description: z.string().nullable(), | |
| 62 | + images: z.array(z.string()).default([]), | |
| 63 | + lotNumber: z.string().nullable(), | |
| 64 | +}); | |
| 65 | +export type ItemPagePayload = z.infer<typeof ItemPagePayloadSchema>; | |
| 66 | + | |
| 67 | +const ConfigSchema = z.object({ | |
| 68 | + seeds: z.array(SeedSchema).default([]), | |
| 69 | + pageSize: z.number().int().min(24).max(240).default(240), | |
| 70 | + maxPagesPerSeed: z.number().int().min(1).default(40), | |
| 71 | + renderingWaitMs: z.number().int().default(6000), | |
| 72 | +}); | |
| 73 | + | |
| 74 | +function parseUtc(s: string | null | undefined): Date | null { | |
| 75 | + if (!s) return null; | |
| 76 | + const iso = /[zZ]$|[+-]\d{2}:?\d{2}$/.test(s) ? s : `${s}Z`; | |
| 77 | + const d = new Date(iso); | |
| 78 | + return Number.isNaN(d.getTime()) ? null : d; | |
| 79 | +} | |
| 80 | + | |
| 81 | +/** | |
| 82 | + * Goldin titles end with " - <GRADER> <GRADE>" (e.g. "- PSA GEM MT 10"). Parse that suffix first so that | |
| 83 | + * words like "Tag Team" inside the card name are not mistaken for TAG grading. | |
| 84 | + */ | |
| 85 | +export function parseGoldinGrade(title: string): ReturnType<typeof parseGradeFromTitle> { | |
| 86 | + const parts = title.split(/\s+-\s+/); | |
| 87 | + for (let i = parts.length - 1; i >= 1; i--) { | |
| 88 | + const g = parseGradeFromTitle(parts[i]!); | |
| 89 | + if (g.grader && g.grader !== 'raw' && g.grade) return g; | |
| 90 | + } | |
| 91 | + const g = parseGradeFromTitle(title); | |
| 92 | + if (g.grader === 'tag' && !/\bTAG\s+\d/i.test(title)) return { grader: null, grade: null, qualifier: null }; | |
| 93 | + return g; | |
| 94 | +} | |
| 95 | + | |
| 96 | +export function soldPageUrl(seedPath: string, page: number, pageSize: number): string { | |
| 97 | + return `${SITE}${seedPath}?page=${page}&number_of_lots=${pageSize}&show_only=Sold%20Items&sort=Most_Recent_Bids`; | |
| 98 | +} | |
| 99 | + | |
| 100 | +/** Pick the lots_v2 XHR that carries the seed filter (the page also fires an unfiltered call). */ | |
| 101 | +export function extractLotsXhr(render: ScrapflyRenderResult): { request: Record<string, unknown>; total: number | null; lots: unknown[] } | null { | |
| 102 | + const candidates = render.xhr.filter((x) => x.url.includes('/api/lots_v2') && x.responseBody); | |
| 103 | + let best: { request: Record<string, unknown>; total: number | null; lots: unknown[] } | null = null; | |
| 104 | + for (const c of candidates) { | |
| 105 | + try { | |
| 106 | + const req = (JSON.parse(c.requestBody ?? '{}') as { search?: Record<string, unknown> }).search ?? {}; | |
| 107 | + const body = JSON.parse(c.responseBody!) as { searchalgolia?: { lots?: unknown[]; total?: string | number } }; | |
| 108 | + const sa = body.searchalgolia; | |
| 109 | + if (!sa?.lots) continue; | |
| 110 | + const filtered = Boolean(req.sub_category || req.category || req.keyword); | |
| 111 | + const total = sa.total === undefined ? null : Number(sa.total); | |
| 112 | + const cand = { request: req, total: Number.isFinite(total as number) ? (total as number) : null, lots: sa.lots }; | |
| 113 | + if (filtered || !best) best = cand; | |
| 114 | + } catch { | |
| 115 | + /* skip malformed */ | |
| 116 | + } | |
| 117 | + } | |
| 118 | + return best; | |
| 119 | +} | |
| 120 | + | |
| 121 | +export function extractAuctionsXhr(render: ScrapflyRenderResult): SoldPagePayload['auctions'] { | |
| 122 | + const out: SoldPagePayload['auctions'] = {}; | |
| 123 | + for (const x of render.xhr) { | |
| 124 | + if (!x.url.endsWith('/api/auctions') || !x.responseBody || x.responseBody.length < 1000) continue; | |
| 125 | + try { | |
| 126 | + const body = JSON.parse(x.responseBody) as { auctions?: Array<Record<string, unknown>> }; | |
| 127 | + for (const a of body.auctions ?? []) { | |
| 128 | + const id = a.auction_id as string | undefined; | |
| 129 | + if (!id) continue; | |
| 130 | + out[id] = { title: (a.title as string) ?? null, auction_type: (a.auction_type as string) ?? null, end_timestamp: (a.end_timestamp as string) ?? null, buyer_premium: typeof a.buyer_premium === 'number' ? a.buyer_premium : null }; | |
| 131 | + } | |
| 132 | + } catch { | |
| 133 | + /* ignore */ | |
| 134 | + } | |
| 135 | + } | |
| 136 | + return out; | |
| 137 | +} | |
| 138 | + | |
| 139 | +/** Flatten a rendered item page into a compact payload (no HTML persisted). */ | |
| 140 | +export function parseItemPage(url: string, pageHtml: string): ItemPagePayload { | |
| 141 | + const $ = H.load(pageHtml); | |
| 142 | + $('script, style, noscript').remove(); | |
| 143 | + const text = $('body').text().replace(/\s+/g, ' ').trim(); | |
| 144 | + const title = $('h1').first().text().trim() || ($('title').text().split('|')[0] ?? '').trim(); | |
| 145 | + const winning = text.match(/\$([\d,]+(?:\.\d{2})?)\s*Winning Bid/i); | |
| 146 | + // Live lots also embed a hidden "Lot Sold" template, so only the winning-bid figure proves a sale. | |
| 147 | + const sold = winning !== null; | |
| 148 | + // total price appears right before the winning bid on sold pages, or before "with Buyer’s Premium" on live ones | |
| 149 | + let total: string | null = null; | |
| 150 | + if (winning) { | |
| 151 | + const before = text.slice(Math.max(0, winning.index! - 40), winning.index!); | |
| 152 | + const m = before.match(/\$([\d,]+(?:\.\d{2})?)\s*$/); | |
| 153 | + total = m ? `$${m[1]}` : null; | |
| 154 | + } else { | |
| 155 | + const m = text.match(/\$([\d,]+(?:\.\d{2})?)\s*with Buyer/i); | |
| 156 | + total = m ? `$${m[1]}` : null; | |
| 157 | + } | |
| 158 | + const ended = text.match(/((?:Sun|Mon|Tue|Wed|Thu|Fri|Sat),\s*\d{1,2}\/\d{1,2}\/\d{2,4},\s*\d{1,2}:\d{2}\s*[AP]M\s*(?:P[SD]T|E[SD]T|C[SD]T|M[SD]T|UTC|GMT))/); | |
| 159 | + const bids = text.match(/(?:^|\s|\|)(\d{1,4}) bids?\b/i); | |
| 160 | + const lot = text.match(/Lot #(\d+)/); | |
| 161 | + const descIdx = text.indexOf('Description'); | |
| 162 | + const description = descIdx >= 0 ? text.slice(descIdx + 'Description'.length, descIdx + 3000).split(/You are viewing a lot in|Want to Sell on Goldin/)[0]!.trim() : null; | |
| 163 | + const crumbs: string[] = []; | |
| 164 | + $('[data-testid^="lot-breadcrumb-"]').each((_, el) => { | |
| 165 | + const t = $(el).text().trim(); | |
| 166 | + if (t) crumbs.push(t); | |
| 167 | + }); | |
| 168 | + const images = new Set<string>(); | |
| 169 | + $('img[src*="cloudfront.net/public/Lots/"]').each((_, el) => { | |
| 170 | + const src = $(el).attr('src'); | |
| 171 | + if (src) images.add(src); | |
| 172 | + }); | |
| 173 | + return { kind: 'item_page', url, title, breadcrumb: crumbs, totalPriceText: total, winningBidText: winning ? `$${winning[1]}` : null, endedText: ended ? ended[1]! : null, bidsText: bids ? bids[1]! : null, sold, description, images: [...images].slice(0, 6), lotNumber: lot ? lot[1]! : null }; | |
| 174 | +} | |
| 175 | + | |
| 176 | +/** Parse Goldin's display date "Sat, 11/17/12, 10:16 PM EDT" → UTC Date. */ | |
| 177 | +export function parseGoldinDisplayDate(s: string | null | undefined): Date | null { | |
| 178 | + if (!s) return null; | |
| 179 | + const m = s.match(/(\d{1,2})\/(\d{1,2})\/(\d{2,4}),\s*(\d{1,2}):(\d{2})\s*([AP]M)\s*([A-Z]{2,4})/); | |
| 180 | + if (!m) return null; | |
| 181 | + const month = Number(m[1]); | |
| 182 | + const day = Number(m[2]); | |
| 183 | + let year = Number(m[3]); | |
| 184 | + if (year < 100) year += 2000; | |
| 185 | + let hour = Number(m[4]) % 12; | |
| 186 | + if (m[6] === 'PM') hour += 12; | |
| 187 | + const minute = Number(m[5]); | |
| 188 | + const tzOffsets: Record<string, number> = { PDT: -7, PST: -8, EDT: -4, EST: -5, CDT: -5, CST: -6, MDT: -6, MST: -7, UTC: 0, GMT: 0 }; | |
| 189 | + const off = tzOffsets[m[7]!] ?? -7; | |
| 190 | + return new Date(Date.UTC(year, month - 1, day, hour - off, minute)); | |
| 191 | +} | |
| 192 | + | |
| 193 | +export default function createConnector(meta: ConnectorMeta) { | |
| 194 | + return new GoldinConnector(meta); | |
| 195 | +} | |
| 196 | + | |
| 197 | +export class GoldinConnector extends BaseConnector { | |
| 198 | + readonly version = '1.0.0'; | |
| 199 | + readonly parserVersion = '1.0.0'; | |
| 200 | + override readonly urlPatterns = [/^https?:\/\/(www\.)?goldin\.co\/item\/[^/?#]+/i]; | |
| 201 | + protected override minIntervalMs = 2000; | |
| 202 | + private readonly config = ConfigSchema.parse(this.meta.config ?? {}); | |
| 203 | + | |
| 204 | + private apiKey(): string { | |
| 205 | + const key = process.env.SCRAPFLY_API_KEY; | |
| 206 | + if (!key) throw new Error('goldin connector requires SCRAPFLY_API_KEY'); | |
| 207 | + return key; | |
| 208 | + } | |
| 209 | + | |
| 210 | + private async render(ctx: CrawlContext, url: string): Promise<ScrapflyRenderResult> { | |
| 211 | + await this.throttle(); | |
| 212 | + const stats = (ctx.engineStats.scrapfly ??= { attempts: 0, success: 0, credits: 0, ms: 0 }); | |
| 213 | + stats.attempts++; | |
| 214 | + const res = await scrapflyRender(url, { apiKey: this.apiKey(), renderingWaitMs: this.config.renderingWaitMs, country: 'us' }); | |
| 215 | + stats.credits += res.cost; | |
| 216 | + stats.ms += res.durationMs; | |
| 217 | + if (res.ok) stats.success++; | |
| 218 | + else ctx.anomaly('blocked_request', `${url}: ${res.error ?? `status ${res.status}`}`); | |
| 219 | + return res; | |
| 220 | + } | |
| 221 | + | |
| 222 | + async *crawl(ctx: CrawlContext): AsyncIterable<RawRecordInput> { | |
| 223 | + const seeds = ctx.options.categories?.length ? this.config.seeds.filter((s) => ctx.options.categories!.includes(s.categorySlug)) : this.config.seeds; | |
| 224 | + const cursor = { ...(ctx.options.cursor ?? {}) } as Record<string, { lastEnd?: string }>; | |
| 225 | + const pageSize = ctx.options.mode === 'probe' ? 24 : this.config.pageSize; | |
| 226 | + let yielded = 0; | |
| 227 | + for (const seed of seeds) { | |
| 228 | + if (ctx.signal?.aborted) return; | |
| 229 | + const lastEnd = ctx.options.mode === 'incremental' ? cursor[seed.path]?.lastEnd : undefined; | |
| 230 | + let newestSeen: string | undefined; | |
| 231 | + const maxPages = ctx.options.mode === 'probe' ? 1 : this.config.maxPagesPerSeed; | |
| 232 | + for (let page = 1; page <= maxPages; page++) { | |
| 233 | + const url = soldPageUrl(seed.path, page, pageSize); | |
| 234 | + const render = await this.render(ctx, url); | |
| 235 | + if (!render.ok) break; | |
| 236 | + const xhr = extractLotsXhr(render); | |
| 237 | + if (!xhr) { | |
| 238 | + ctx.anomaly('empty_page', `${url}: no lots_v2 response captured`); | |
| 239 | + break; | |
| 240 | + } | |
| 241 | + const lots = xhr.lots.map((l) => GoldinLotSchema.safeParse(l)).filter((r) => r.success).map((r) => r.data); | |
| 242 | + if (lots.length !== xhr.lots.length) ctx.anomaly('parse_failure', `${xhr.lots.length - lots.length} lots failed schema on ${url}`); | |
| 243 | + if (lots.length === 0) break; | |
| 244 | + const auctions = extractAuctionsXhr(render); | |
| 245 | + const usedAuctions: SoldPagePayload['auctions'] = {}; | |
| 246 | + for (const l of lots) if (l.auction_id && auctions[l.auction_id]) usedAuctions[l.auction_id] = auctions[l.auction_id]!; | |
| 247 | + const payload: SoldPagePayload = { kind: 'sold_page', seed, page, pageUrl: url, request: xhr.request, total: xhr.total, lots, auctions: usedAuctions }; | |
| 248 | + const realEnds = lots.map((l) => parseUtc(l.end_timestamp)).filter((d): d is Date => d !== null && d.getTime() <= Date.now() + 86_400_000); | |
| 249 | + const newest = realEnds.reduce<Date | null>((a, d) => (!a || d > a ? d : a), null); | |
| 250 | + const oldest = realEnds.reduce<Date | null>((a, d) => (!a || d < a ? d : a), null); | |
| 251 | + if (newest && (!newestSeen || newest.toISOString() > newestSeen)) newestSeen = newest.toISOString(); | |
| 252 | + yield { url, externalId: `${seed.path}#${page}`, kind: 'sale', engine: 'scrapfly', httpStatus: render.status, payload, fetchedAt: new Date() }; | |
| 253 | + yielded += lots.length; | |
| 254 | + if (this.reached(ctx, yielded)) return; | |
| 255 | + if (lastEnd && oldest && oldest.toISOString() <= lastEnd) break; // caught up with previous run | |
| 256 | + if (xhr.total !== null && page * pageSize >= xhr.total) break; | |
| 257 | + } | |
| 258 | + if (newestSeen) { | |
| 259 | + cursor[seed.path] = { lastEnd: newestSeen }; | |
| 260 | + await ctx.setCursor(cursor); | |
| 261 | + } | |
| 262 | + } | |
| 263 | + } | |
| 264 | + | |
| 265 | + async lookup(url: string, ctx: CrawlContext): Promise<RawRecordInput[]> { | |
| 266 | + const render = await this.render(ctx, url); | |
| 267 | + if (!render.ok || !render.html) return []; | |
| 268 | + const payload = parseItemPage(url, render.html); | |
| 269 | + return [{ url, externalId: url.split('/item/')[1]?.split(/[?#]/)[0] ?? null, kind: 'sale', engine: 'scrapfly', httpStatus: render.status, payload, fetchedAt: new Date() }]; | |
| 270 | + } | |
| 271 | + | |
| 272 | + async normalize(raw: RawRecordLike): Promise<NormalizedRecord[]> { | |
| 273 | + const p = raw.payload as { kind?: string }; | |
| 274 | + if (p?.kind === 'item_page') return this.normalizeItem(raw, ItemPagePayloadSchema.parse(raw.payload)); | |
| 275 | + const page = SoldPagePayloadSchema.parse(raw.payload); | |
| 276 | + const out: NormalizedRecord[] = []; | |
| 277 | + const now = Date.now() + 86_400_000; | |
| 278 | + for (const lot of page.lots) { | |
| 279 | + if (lot.status && lot.status !== 'Completed_Sold') continue; | |
| 280 | + const saleDate = parseUtc(lot.end_timestamp); | |
| 281 | + if (!saleDate || saleDate.getTime() > now || lot.current_price === null || lot.current_price === undefined || lot.current_price <= 0) continue; | |
| 282 | + const bp = lot.buyer_premium ?? page.auctions[lot.auction_id ?? '']?.buyer_premium ?? null; | |
| 283 | + const price = bp !== null ? Math.round(lot.current_price * (1 + bp / 100) * 100) / 100 : lot.current_price; | |
| 284 | + const grade = parseGoldinGrade(lot.title); | |
| 285 | + const categorySlug = classifyGoldinTitle(lot.title, page.seed); | |
| 286 | + const card = parseCardAttributes(lot.title, categorySlug); | |
| 287 | + const auction = lot.auction_id ? page.auctions[lot.auction_id] : undefined; | |
| 288 | + const auctionType = (lot.auction_type ?? auction?.auction_type ?? '').toLowerCase(); | |
| 289 | + const record = NormalizedSaleSchema.parse({ | |
| 290 | + kind: 'sale', | |
| 291 | + connectorId: this.meta.id, | |
| 292 | + sourceId: this.meta.sourceId, | |
| 293 | + sourceUrl: `${SITE}/item/${lot.meta_slug}`, | |
| 294 | + externalId: lot.lot_id, | |
| 295 | + rawTitle: lot.title, | |
| 296 | + description: null, | |
| 297 | + imageUrls: lot.primary_image_name ? [`${IMAGE_CDN}/${lot.lot_id}/${lot.primary_image_name}@1x`] : [], | |
| 298 | + attributes: { | |
| 299 | + categorySlug, | |
| 300 | + name: card.name ?? lot.title, | |
| 301 | + brand: card.brand, | |
| 302 | + set: card.set, | |
| 303 | + number: card.number, | |
| 304 | + year: extractYear(lot.title), | |
| 305 | + variant: card.variant, | |
| 306 | + identifiers: { goldin_lot_id: lot.lot_id, goldin_slug: lot.meta_slug }, | |
| 307 | + metadata: { auction_id: lot.auction_id ?? null, auction_title: auction?.title ?? null, auction_type: lot.auction_type ?? auction?.auction_type ?? null, hammer_price: lot.current_price, buyer_premium_pct: bp, lot_number: lot.lot_number ?? null, bids: lot.number_of_bids ?? null, goldin_seed: page.seed.path }, | |
| 308 | + }, | |
| 309 | + grade: { grader: grade.grader, grade: grade.grade, qualifier: grade.qualifier, certificationNumber: null }, | |
| 310 | + condition: {}, | |
| 311 | + observedAt: raw.fetchedAt, | |
| 312 | + confidence: grade.grader ? 0.9 : 0.8, | |
| 313 | + parserVersion: this.parserVersion, | |
| 314 | + saleType: auctionType.includes('fixed') ? 'fixed_price' : 'auction', | |
| 315 | + saleDate, | |
| 316 | + price, | |
| 317 | + currency: 'USD', | |
| 318 | + buyerPremiumIncluded: bp !== null, | |
| 319 | + quantity: 1, | |
| 320 | + isBundle: isBundleTitle(lot.title), | |
| 321 | + location: 'US', | |
| 322 | + auctionHouse: 'Goldin', | |
| 323 | + lotNumber: lot.lot_number !== null && lot.lot_number !== undefined ? String(lot.lot_number) : null, | |
| 324 | + }); | |
| 325 | + out.push(record); | |
| 326 | + } | |
| 327 | + return out; | |
| 328 | + } | |
| 329 | + | |
| 330 | + private normalizeItem(raw: RawRecordLike, item: ItemPagePayload): NormalizedRecord[] { | |
| 331 | + if (!item.sold) return []; | |
| 332 | + const total = parsePrice(item.totalPriceText, 'USD'); | |
| 333 | + const hammer = parsePrice(item.winningBidText, 'USD'); | |
| 334 | + const saleDate = parseGoldinDisplayDate(item.endedText); | |
| 335 | + const amount = total?.amount ?? hammer?.amount; | |
| 336 | + if (!amount || !saleDate) return []; | |
| 337 | + const grade = parseGoldinGrade(item.title); | |
| 338 | + const cert = item.description?.match(/\b(?:PSA|BGS|CGC|SGC|Beckett)\b[^()]{0,40}\((\d{6,12})\)/i)?.[1] ?? item.description?.match(/\b(?:cert(?:ification)?(?:\s*(?:no|#|number))?)[:\s#]*(\d{6,12})/i)?.[1] ?? null; | |
| 339 | + const seedGuess = { path: 'lookup', categorySlug: item.breadcrumb.map((b) => b.toLowerCase()).includes('pokemon') ? 'pokemon' : 'sports_memorabilia' }; | |
| 340 | + const categorySlug = classifyGoldinTitle(item.title, seedGuess, item.breadcrumb); | |
| 341 | + const card = parseCardAttributes(item.title, categorySlug); | |
| 342 | + return [ | |
| 343 | + NormalizedSaleSchema.parse({ | |
| 344 | + kind: 'sale', | |
| 345 | + connectorId: this.meta.id, | |
| 346 | + sourceId: this.meta.sourceId, | |
| 347 | + sourceUrl: item.url, | |
| 348 | + externalId: raw.externalId ?? item.url, | |
| 349 | + rawTitle: item.title, | |
| 350 | + description: item.description, | |
| 351 | + imageUrls: item.images, | |
| 352 | + attributes: { categorySlug, name: card.name ?? item.title, brand: card.brand, set: card.set, number: card.number, year: extractYear(item.title), variant: card.variant, identifiers: { goldin_slug: raw.externalId ?? '' }, metadata: { hammer_price: hammer?.amount ?? null, breadcrumb: item.breadcrumb, lot_number: item.lotNumber } }, | |
| 353 | + grade: { grader: grade.grader, grade: grade.grade, qualifier: grade.qualifier, certificationNumber: cert }, | |
| 354 | + condition: {}, | |
| 355 | + observedAt: raw.fetchedAt, | |
| 356 | + confidence: 0.85, | |
| 357 | + parserVersion: this.parserVersion, | |
| 358 | + saleType: 'auction', | |
| 359 | + saleDate, | |
| 360 | + price: amount, | |
| 361 | + currency: 'USD', | |
| 362 | + buyerPremiumIncluded: total ? true : null, | |
| 363 | + quantity: 1, | |
| 364 | + isBundle: isBundleTitle(item.title), | |
| 365 | + location: 'US', | |
| 366 | + auctionHouse: 'Goldin', | |
| 367 | + lotNumber: item.lotNumber, | |
| 368 | + }), | |
| 369 | + ]; | |
| 370 | + } | |
| 371 | +} | |
added
connectors/scrapfly/goldin/meta.json
+48 −0
@@ -0,0 +1,48 @@ | ||
| 1 | +{ | |
| 2 | + "id": "goldin", | |
| 3 | + "displayName": "Goldin (sold auction results)", | |
| 4 | + "sourceId": "goldin", | |
| 5 | + "sourceName": "Goldin", | |
| 6 | + "sourceType": "auction_house", | |
| 7 | + "sourceUrl": "https://goldin.co", | |
| 8 | + "module": "scrapfly/goldin", | |
| 9 | + "enginePriority": ["scrapfly"], | |
| 10 | + "categories": ["pokemon", "magic_the_gathering", "yugioh", "one_piece_card_game", "basketball_cards", "baseball_cards", "football_cards", "hockey_cards", "soccer_cards", "f1_cards", "sports_memorabilia", "marvel_comics", "nintendo_games", "non_sport_cards"], | |
| 11 | + "regions": ["US"], | |
| 12 | + "languages": ["en"], | |
| 13 | + "currency": ["USD"], | |
| 14 | + "supportsListings": false, | |
| 15 | + "supportsSold": true, | |
| 16 | + "supportsAuctions": false, | |
| 17 | + "supportsImages": true, | |
| 18 | + "supportsCatalog": false, | |
| 19 | + "supportsPopulation": false, | |
| 20 | + "supportsLookup": true, | |
| 21 | + "refreshFrequencyMinutes": 360, | |
| 22 | + "priority": "high", | |
| 23 | + "trustScore": 0.9, | |
| 24 | + "attributionRequired": true, | |
| 25 | + "termsUrl": "https://goldin.co/useragreement", | |
| 26 | + "accessNotes": "Public 'Sold Items' result grids (https://goldin.co/buy/sc/<subcategory>?show_only=Sold%20Items&sort=Most_Recent_Bids&number_of_lots=240) rendered through Scrapfly (asp + JS rendering, ~6 credits per page of 240 sold lots). goldin.co/robots.txt allows /buy/ and /item/ and disallows /api/; we never call goldin.co/api ourselves — the lot data is read from the XHR (lots_v2 on their CloudFront search endpoint) that the public page performs during rendering, exactly what a browser does. Plain HTTP and Firecrawl return the empty SPA shell / an Akamai challenge. Prices: the grid shows the final price INCLUDING buyer's premium (current_price × (1 + buyer_premium%)); we store that as the sale price with buyerPremiumIncluded=true and keep the hammer price and BP % in metadata. Sale date = lot end_timestamp; lots whose end_timestamp is in the future (placeholder private-sale dates like 2235-06-04) are skipped and counted as anomalies. Cert numbers appear only in item-page descriptions (lookup).", | |
| 27 | + "enabled": true, | |
| 28 | + "schemaVersion": "1.0", | |
| 29 | + "config": { | |
| 30 | + "seeds": [ | |
| 31 | + { "path": "/buy/sc/pokemon", "categorySlug": "pokemon" }, | |
| 32 | + { "path": "/buy/sc/Magic_The_Gathering", "categorySlug": "magic_the_gathering" }, | |
| 33 | + { "path": "/buy/sc/Yu-Gi-Oh!", "categorySlug": "yugioh" }, | |
| 34 | + { "path": "/buy/sc/One_Piece", "categorySlug": "one_piece_card_game" }, | |
| 35 | + { "path": "/buy/sc/Basketball", "categorySlug": "basketball_cards", "sport": "basketball" }, | |
| 36 | + { "path": "/buy/sc/Baseball", "categorySlug": "baseball_cards", "sport": "baseball" }, | |
| 37 | + { "path": "/buy/sc/Football", "categorySlug": "football_cards", "sport": "football" }, | |
| 38 | + { "path": "/buy/sc/Hockey", "categorySlug": "hockey_cards", "sport": "hockey" }, | |
| 39 | + { "path": "/buy/sc/Soccer", "categorySlug": "soccer_cards", "sport": "soccer" }, | |
| 40 | + { "path": "/buy/sc/Racing", "categorySlug": "f1_cards", "sport": "racing" }, | |
| 41 | + { "path": "/buy/sc/Marvel", "categorySlug": "marvel_comics" }, | |
| 42 | + { "path": "/buy/sc/Nintendo", "categorySlug": "nintendo_games" } | |
| 43 | + ], | |
| 44 | + "pageSize": 240, | |
| 45 | + "maxPagesPerSeed": 40, | |
| 46 | + "renderingWaitMs": 6000 | |
| 47 | + } | |
| 48 | +} | |
added
connectors/scrapfly/goldin/scrapfly-render.ts
+65 −0
@@ -0,0 +1,65 @@ | ||
| 1 | +/** | |
| 2 | + * Minimal Scrapfly render helper that exposes `browser_data.xhr_call` (the XHR requests/responses the | |
| 3 | + * rendered page performed). The shared engine in @rareindex/connectors only returns the page content; | |
| 4 | + * Goldin's lot data lives in the page's own search XHR, so this connector needs the browser data. | |
| 5 | + * TODO(framework): add `FetchOptions.captureXhr` + `ExtractionResult.browserData` and drop this file. | |
| 6 | + */ | |
| 7 | +export interface XhrCall { | |
| 8 | + url: string; | |
| 9 | + method: string; | |
| 10 | + requestBody: string | null; | |
| 11 | + responseBody: string | null; | |
| 12 | + status: number | null; | |
| 13 | +} | |
| 14 | + | |
| 15 | +export interface ScrapflyRenderResult { | |
| 16 | + ok: boolean; | |
| 17 | + status: number | null; | |
| 18 | + html: string | null; | |
| 19 | + xhr: XhrCall[]; | |
| 20 | + cost: number; | |
| 21 | + durationMs: number; | |
| 22 | + error: string | null; | |
| 23 | +} | |
| 24 | + | |
| 25 | +export interface RenderOptions { | |
| 26 | + apiKey: string; | |
| 27 | + renderingWaitMs?: number; | |
| 28 | + country?: string; | |
| 29 | + timeoutMs?: number; | |
| 30 | +} | |
| 31 | + | |
| 32 | +export async function scrapflyRender(url: string, o: RenderOptions): Promise<ScrapflyRenderResult> { | |
| 33 | + const started = Date.now(); | |
| 34 | + const params = new URLSearchParams({ key: o.apiKey, url, asp: 'true', render_js: 'true', country: (o.country ?? 'us').toLowerCase(), retry: 'true', rendering_wait: String(Math.min(o.renderingWaitMs ?? 6000, 25_000)) }); | |
| 35 | + const ctrl = new AbortController(); | |
| 36 | + const timer = setTimeout(() => ctrl.abort(), (o.timeoutMs ?? 170_000) + 5_000); | |
| 37 | + try { | |
| 38 | + const res = await fetch(`https://api.scrapfly.io/scrape?${params.toString()}`, { signal: ctrl.signal }); | |
| 39 | + const text = await res.text(); | |
| 40 | + let json: any; | |
| 41 | + try { | |
| 42 | + json = JSON.parse(text); | |
| 43 | + } catch { | |
| 44 | + return { ok: false, status: null, html: null, xhr: [], cost: 0, durationMs: Date.now() - started, error: `scrapfly HTTP ${res.status}: ${text.slice(0, 160)}` }; | |
| 45 | + } | |
| 46 | + const r = json.result ?? {}; | |
| 47 | + const cost: number = json.context?.cost?.total ?? 0; | |
| 48 | + if (!res.ok) return { ok: false, status: null, html: null, xhr: [], cost, durationMs: Date.now() - started, error: `scrapfly HTTP ${res.status}: ${json.message ?? r.error?.message ?? 'error'}` }; | |
| 49 | + const xhrRaw: any[] = r.browser_data?.xhr_call ?? []; | |
| 50 | + const xhr: XhrCall[] = xhrRaw.map((c) => ({ | |
| 51 | + url: String(c.url ?? ''), | |
| 52 | + method: String(c.method ?? 'GET'), | |
| 53 | + requestBody: typeof c.body === 'string' ? c.body : c.body ? JSON.stringify(c.body) : null, | |
| 54 | + responseBody: typeof c.response?.body === 'string' ? c.response.body : c.response?.body ? JSON.stringify(c.response.body) : null, | |
| 55 | + status: c.response?.status ?? null, | |
| 56 | + })); | |
| 57 | + const status: number | null = r.status_code ?? null; | |
| 58 | + const ok = r.success !== false && (status === null || status < 400); | |
| 59 | + return { ok, status, html: r.content ?? null, xhr, cost, durationMs: Date.now() - started, error: ok ? null : (r.error?.message ?? `status ${status}`) }; | |
| 60 | + } catch (err) { | |
| 61 | + return { ok: false, status: null, html: null, xhr: [], cost: 0, durationMs: Date.now() - started, error: err instanceof Error ? err.message : String(err) }; | |
| 62 | + } finally { | |
| 63 | + clearTimeout(timer); | |
| 64 | + } | |
| 65 | +} | |
added
data/fixtures/brickeconomy/10123-1__lego-star-wars-cloud-city.json
+27 −0
@@ -0,0 +1,27 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.brickeconomy.com/set/10123-1/lego-star-wars-cloud-city", | |
| 4 | + "externalId": "10123-1", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "firecrawl", | |
| 7 | + "fetchedAt": "2026-09-07T04:35:42.868Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "set_page", | |
| 10 | + "url": "https://www.brickeconomy.com/set/10123-1/lego-star-wars-cloud-city", | |
| 11 | + "title": "", | |
| 12 | + "markdown": "#### Set Details\n\nSet number\n\n10123-1\n\nName\n\nCloud City\n\nTheme\n\n[Star Wars](https://www.brickeconomy.com/sets/theme/star-wars)\n\nSubtheme\n\n[Episode V](https://www.brickeconomy.com/sets/theme/star-wars/subtheme/episode-v)\n\nYear\n\n[2003](https://www.brickeconomy.com/sets/year/2003/theme/star-wars/subtheme/episode-v)\n\nAvailability\n\nRetired\n\nPieces\n\n698 (PPP $0.14)\n\nMinifigs\n\n7(Value $4,802.66)\n\n\n\n#### Set Pricing\n\nRetail price\n\n$99.99\n\nNew/Sealed\n\nValue\n\n**$17,444.85**\n\nGrowth\n\n+17346.59%\n\nAnnual growth\n\n+15.93%\n\n2025 growth\n\n+13.54%\n\nFuture growth\n\n+6.57% (2-3 year outlook)\n\n90-day change\n\n11.20%\n\nUsed\n\nValue\n\n$3,500.00\n\nRange\n\n$3,160.00 - $4,200.00\n\n#### Set Predictions\n\nNew/Sealed\n\nToday's value\n\n$17,444.85\n\n1 year forecast\n\n$18,075.46+3.61%\n\n5 year forecast\n\n$22,839.54+30.92%\n\n$22,177\n\n$23,456\n\n10123 Cloud City is projected to be valued between $22,177 - $23,456 within five years.\n\nInsights\n\nReleased in the early 2000s and long retired, Cloud City (10123) is an Episode V Star Wars exclusive with era-specific minifigure prints like the arm-printed Boba Fett and early Lando Calrissian, and scarce sealed examples and unique elements sustain collector interest despite reissue risk from later Bespin releases.", | |
| 13 | + "images": [ | |
| 14 | + "https://www.brickeconomy.com/resources/images/sets/lego-10123-1_large.jpg" | |
| 15 | + ] | |
| 16 | + } | |
| 17 | + }, | |
| 18 | + "expect": { | |
| 19 | + "minCount": 2, | |
| 20 | + "kinds": [ | |
| 21 | + "catalog_item", | |
| 22 | + "price_observation" | |
| 23 | + ] | |
| 24 | + }, | |
| 25 | + "note": "captured live from https://www.brickeconomy.com/set/10123-1/lego-star-wars-cloud-city", | |
| 26 | + "capturedAt": "2026-09-07T04:35:42.870Z" | |
| 27 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/brickeconomy/10179-1__lego-star-wars-ultimate-collectors-millennium-falcon.json
+27 −0
@@ -0,0 +1,27 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.brickeconomy.com/set/10179-1/lego-star-wars-ultimate-collectors-millennium-falcon", | |
| 4 | + "externalId": "10179-1", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "firecrawl", | |
| 7 | + "fetchedAt": "2026-09-07T04:35:38.269Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "set_page", | |
| 10 | + "url": "https://www.brickeconomy.com/set/10179-1/lego-star-wars-ultimate-collectors-millennium-falcon", | |
| 11 | + "title": "", | |
| 12 | + "markdown": "#### Set Details\n\nSet number\n\n10179-1\n\nName\n\nUltimate Collector's Millennium Falcon\n\nTheme\n\n[Star Wars](https://www.brickeconomy.com/sets/theme/star-wars)\n\nSubtheme\n\n[Ultimate Collector Series](https://www.brickeconomy.com/sets/theme/star-wars/subtheme/ultimate-collector-series)\n\nYear\n\n[2007](https://www.brickeconomy.com/sets/year/2007/theme/star-wars/subtheme/ultimate-collector-series)\n\nReleased\n\nOctober 24, 2007\n\nRetired\n\nMay 4, 2010\n\nAvailability\n\nRetired\n\nPieces\n\n5,197 (PPP $0.10)\n\nMinifigs\n\n5(Value $106.58)\n\n\n\n(1 exclusive)\n\n#### Set Pricing\n\nRetail price\n\n$499.99\n\nNew/Sealed\n\nValue\n\n**$2,946.69**\n\nGrowth\n\n+489.35%\n\nAnnual growth\n\n+11.51%\n\n2025 growth\n\n+4.47%\n\nFuture growth\n\n+6.82% (2-3 year outlook)\n\n90-day change\n\n17.80%\n\nUsed\n\nValue\n\n$1,087.86\n\nRange\n\n$1,005.38 - $1,335.67\n\n#### Set Predictions\n\nNew/Sealed\n\nToday's value\n\n$2,946.69\n\n1 year forecast\n\n$3,057.22+3.75%\n\n5 year forecast\n\n$3,787.44+28.53%\n\n$3,678\n\n$3,890\n\n10179 Ultimate Collector's Millennium Falcon is projected to be valued between $3,678 - $3,890 within five years.\n\nInsights\n\nReleased in 2007 and retired in 2010, the Ultimate Collector's Millennium Falcon (10179) is a milestone UCS minifigure-scale Falcon whose early certificate variants and limited supply keep original examples scarce, and while long-term collector demand has supported appreciation, later remakes have added periodic volatility.", | |
| 13 | + "images": [ | |
| 14 | + "https://www.brickeconomy.com/resources/images/sets/lego-10179-1_large.jpg" | |
| 15 | + ] | |
| 16 | + } | |
| 17 | + }, | |
| 18 | + "expect": { | |
| 19 | + "minCount": 2, | |
| 20 | + "kinds": [ | |
| 21 | + "catalog_item", | |
| 22 | + "price_observation" | |
| 23 | + ] | |
| 24 | + }, | |
| 25 | + "note": "captured live from https://www.brickeconomy.com/set/10179-1/lego-star-wars-ultimate-collectors-millennium-falcon", | |
| 26 | + "capturedAt": "2026-09-07T04:35:38.269Z" | |
| 27 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/brickeconomy/75192-1__lego-star-wars-millennium-falcon.json
+27 −0
@@ -0,0 +1,27 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.brickeconomy.com/set/75192-1/lego-star-wars-millennium-falcon", | |
| 4 | + "externalId": "75192-1", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "firecrawl", | |
| 7 | + "fetchedAt": "2026-09-07T04:35:36.650Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "set_page", | |
| 10 | + "url": "https://www.brickeconomy.com/set/75192-1/lego-star-wars-millennium-falcon", | |
| 11 | + "title": "", | |
| 12 | + "markdown": "#### Set Details\n\nSet number\n\n75192-1\n\nName\n\nMillennium Falcon\n\nTheme\n\n[Star Wars](https://www.brickeconomy.com/sets/theme/star-wars)\n\nSubtheme\n\n[Ultimate Collector Series](https://www.brickeconomy.com/sets/theme/star-wars/subtheme/ultimate-collector-series)\n\nYear\n\n[2017](https://www.brickeconomy.com/sets/year/2017/theme/star-wars/subtheme/ultimate-collector-series)\n\nReleased\n\nJanuary 10, 2018\n\nAvailability\n\nExclusive\n\nPieces\n\n7,541 (PPP $0.11)\n\nMinifigs\n\n8(Value $112.37)\n\n\n\n#### Set Pricing\n\nRetail price\n\n$849.99\n\nMarket price\n\n$764.15-10.1%\n\nStill available at retail\n\nPrices are currently low for this set.\n\n$764 is low\n\n$850\n\n$900\n\nThis LEGO set typically sells between $850-$900 locally.\n\n#### Set Predictions\n\nRetirement\n\nEnd of 2026 79.9%\n\nNew/Sealed\n\nRetirement pop\n\n+13.96%\n\nAnnual growth\n\n+7.09% (first year)\n\n+6.74% (second year)\n\n1 year retired\n\n$1,037.33Late 2027\n\n5 years retired\n\n$1,187 - $1,313\n\n$1,187\n\n$1,313\n\nThe estimated value of 75192 Millennium Falcon is projected to range between $1,187 - $1,313 within five years of retirement.", | |
| 13 | + "images": [ | |
| 14 | + "https://www.brickeconomy.com/resources/images/sets/lego-75192-1_large.jpg" | |
| 15 | + ] | |
| 16 | + } | |
| 17 | + }, | |
| 18 | + "expect": { | |
| 19 | + "minCount": 2, | |
| 20 | + "kinds": [ | |
| 21 | + "catalog_item", | |
| 22 | + "price_observation" | |
| 23 | + ] | |
| 24 | + }, | |
| 25 | + "note": "captured live from https://www.brickeconomy.com/set/75192-1/lego-star-wars-millennium-falcon", | |
| 26 | + "capturedAt": "2026-09-07T04:35:36.655Z" | |
| 27 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/chrono24/rolex__daytona--mod2.json
+864 −0
@@ -0,0 +1,864 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.chrono24.com/rolex/daytona--mod2.htm", | |
| 4 | + "externalId": "/rolex/daytona--mod2.htm#1", | |
| 5 | + "kind": "listing", | |
| 6 | + "engine": "scrapfly", | |
| 7 | + "fetchedAt": "2026-09-07T04:42:04.594Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "model_page", | |
| 10 | + "url": "https://www.chrono24.com/rolex/daytona--mod2.htm", | |
| 11 | + "brand": "Rolex", | |
| 12 | + "model": "Daytona", | |
| 13 | + "breadcrumb": [ | |
| 14 | + "Chrono24: the global marketplace for luxury watches", | |
| 15 | + "Rolex watches", | |
| 16 | + "Daytona watches" | |
| 17 | + ], | |
| 18 | + "offers": [ | |
| 19 | + { | |
| 20 | + "name": "Rolex UNWORN 2024 126500LN Daytona 40mm White “Panda” Dial", | |
| 21 | + "price": 37250, | |
| 22 | + "currency": "USD", | |
| 23 | + "url": "https://www.chrono24.com/rolex/unworn-2024-126500ln-daytona-40mm-white-panda-dial--id40983017.htm", | |
| 24 | + "image": "https://img.chrono24.com/images/uhren/r82r2z1a8vsn-3xvfxvze8ivg4y35pwzqbzdn-ExtraLarge.jpg" | |
| 25 | + }, | |
| 26 | + { | |
| 27 | + "name": "Rolex Cosmograph Daytona Paul Newman Watch Ref. 6239", | |
| 28 | + "price": 325000, | |
| 29 | + "currency": "USD", | |
| 30 | + "url": "https://www.chrono24.com/rolex/cosmograph-daytona-paul-newman-watch-ref-6239--id48254267.htm", | |
| 31 | + "image": "https://img.chrono24.com/images/uhren/48254267-gqsjfrtfdfbg9ztxaiqeo1vz-ExtraLarge.jpg" | |
| 32 | + }, | |
| 33 | + { | |
| 34 | + "name": "Rolex Daytona ROLEX DAYTONA ZENITH NO PAPER NO BOX", | |
| 35 | + "price": 15700, | |
| 36 | + "currency": "USD", | |
| 37 | + "url": "https://www.chrono24.com/rolex/daytona--id48059590.htm", | |
| 38 | + "image": "https://img.chrono24.com/images/uhren/vynseay70wpj-v7pe632cb98pmee02wcpub53-ExtraLarge.jpg" | |
| 39 | + }, | |
| 40 | + { | |
| 41 | + "name": "Rolex Daytona Pikachu 116518LN 18k Yellow Gold Oysterflex Box 2025 Service Card", | |
| 42 | + "price": 47995, | |
| 43 | + "currency": "USD", | |
| 44 | + "url": "https://www.chrono24.com/rolex/daytona-pikachu-116518ln-18k-yellow-gold-oysterflex-box-2025-service-card--id46829874.htm", | |
| 45 | + "image": "https://img.chrono24.com/images/uhren/46829874-8exp9fzp2jntntswpw4urpx9-ExtraLarge.jpg" | |
| 46 | + }, | |
| 47 | + { | |
| 48 | + "name": "Rolex Daytona Zenith", | |
| 49 | + "price": 33000, | |
| 50 | + "currency": "USD", | |
| 51 | + "url": "https://www.chrono24.com/rolex/daytona--id48007790.htm", | |
| 52 | + "image": "https://img.chrono24.com/images/uhren/oys90sc9nsxa-f977rtxyunkbt2bt84utn8sd-ExtraLarge.jpg" | |
| 53 | + }, | |
| 54 | + { | |
| 55 | + "name": "Rolex Daytona 2018 Black/Black 40mm Index Oyster Preowned 116500", | |
| 56 | + "price": 27400, | |
| 57 | + "currency": "USD", | |
| 58 | + "url": "https://www.chrono24.com/rolex/daytona-2018-blackblack-40mm-index-oyster-preowned-116500--id47804923.htm", | |
| 59 | + "image": "https://img.chrono24.com/images/uhren/47804923-rhc3hm9g65kkvemt85ub1cz3-ExtraLarge.jpg" | |
| 60 | + }, | |
| 61 | + { | |
| 62 | + "name": "Rolex Daytona", | |
| 63 | + "price": 19999, | |
| 64 | + "currency": "USD", | |
| 65 | + "url": "https://www.chrono24.com/rolex/daytona--id46892301.htm", | |
| 66 | + "image": "https://img.chrono24.com/images/uhren/46892301-p8xpwyyfxmb2uve6nk1r3sw1-ExtraLarge.jpg" | |
| 67 | + }, | |
| 68 | + { | |
| 69 | + "name": "Rolex Daytona 2017 "Panda" 116500LN White Dial 40mm", | |
| 70 | + "price": 31495, | |
| 71 | + "currency": "USD", | |
| 72 | + "url": "https://www.chrono24.com/rolex/daytona--id48341690.htm", | |
| 73 | + "image": "https://img.chrono24.com/images/uhren/48341690-twjedfq4dapcsa7n1nrwcl9t-ExtraLarge.jpg" | |
| 74 | + }, | |
| 75 | + { | |
| 76 | + "name": "Rolex Daytona 116500LN "Panda" Ceramic Bezel Stainless Steel Daytona 116500LN Panda", | |
| 77 | + "price": 29500, | |
| 78 | + "currency": "USD", | |
| 79 | + "url": "https://www.chrono24.com/rolex/rolex-daytona-116500ln-panda-ceramic-bezel--id46801043.htm", | |
| 80 | + "image": "https://img.chrono24.com/images/uhren/46801043-mz59jovaa3aonihs5m5lxrtx-ExtraLarge.jpg" | |
| 81 | + }, | |
| 82 | + { | |
| 83 | + "name": "Rolex Daytona", | |
| 84 | + "price": 34900, | |
| 85 | + "currency": "USD", | |
| 86 | + "url": "https://www.chrono24.com/rolex/daytona--id46780801.htm", | |
| 87 | + "image": "https://img.chrono24.com/images/uhren/h9zzq600dxfl-662n473t1o8os0dxhswx0qh1-ExtraLarge.jpg" | |
| 88 | + }, | |
| 89 | + { | |
| 90 | + "name": "Rolex Daytona 40mm Black Dial Ceramic Bezel Stainless Steel 116500LN", | |
| 91 | + "price": 25899, | |
| 92 | + "currency": "USD", | |
| 93 | + "url": "https://www.chrono24.com/rolex/daytona-40mm-black-dial-ceramic-bezel-stainless-steel-116500ln--id47872422.htm", | |
| 94 | + "image": "https://img.chrono24.com/images/uhren/9ci91zg74d10-6jnmh2mfzo8q09bqzdo1q2q3-ExtraLarge.jpg" | |
| 95 | + }, | |
| 96 | + { | |
| 97 | + "name": "Rolex Daytona", | |
| 98 | + "price": 56000, | |
| 99 | + "currency": "USD", | |
| 100 | + "url": "https://www.chrono24.com/rolex/daytona--id45968044.htm", | |
| 101 | + "image": "https://img.chrono24.com/images/uhren/45968044-sfclpj6blrtjtji7h8vnvg23-ExtraLarge.jpg" | |
| 102 | + }, | |
| 103 | + { | |
| 104 | + "name": "Rolex Daytona", | |
| 105 | + "price": 28995, | |
| 106 | + "currency": "USD", | |
| 107 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id44787355.htm", | |
| 108 | + "image": "https://img.chrono24.com/images/uhren/44787355-hcb0zw2iluazexcg3ma7b2re-ExtraLarge.jpg" | |
| 109 | + }, | |
| 110 | + { | |
| 111 | + "name": "Rolex - Pre-owned Two Tone Yellow Gold Daytona Zenith White Dial 16523", | |
| 112 | + "price": 17500, | |
| 113 | + "currency": "USD", | |
| 114 | + "url": "https://www.chrono24.com/rolex/--pre-owned-two-tone-yellow-gold-daytona-zenith-white-dial-16523--id47276742.htm", | |
| 115 | + "image": "https://img.chrono24.com/images/uhren/47276742-5q2shcrevglbta8bfhg0ich8-ExtraLarge.jpg" | |
| 116 | + }, | |
| 117 | + { | |
| 118 | + "name": "Rolex Daytona With 2022 Service papers", | |
| 119 | + "price": 28999, | |
| 120 | + "currency": "USD", | |
| 121 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id47576287.htm", | |
| 122 | + "image": "https://img.chrono24.com/images/uhren/47576287-uih5or86s28wnda5g90r63as-ExtraLarge.jpg" | |
| 123 | + }, | |
| 124 | + { | |
| 125 | + "name": "Rolex MINT 2014 Rolex Daytona Chocolate Arabic Ceramic 116515 Rose Gold Rubber Watch Box", | |
| 126 | + "price": 32951, | |
| 127 | + "currency": "USD", | |
| 128 | + "url": "https://www.chrono24.com/rolex/mint-2014-rolex-daytona-chocolate-arabic-ceramic-116515-rose-gold-rubber-watch-box--id47154966.htm", | |
| 129 | + "image": "https://img.chrono24.com/images/uhren/47154966-r6dkf7h2erkfsl6r23zasbm2-ExtraLarge.jpg" | |
| 130 | + }, | |
| 131 | + { | |
| 132 | + "name": "Rolex Daytona 2004 FULL SET Cosmograph Daytona White Dial 40mm 116520", | |
| 133 | + "price": 23299, | |
| 134 | + "currency": "USD", | |
| 135 | + "url": "https://www.chrono24.com/rolex/daytona--id48048581.htm", | |
| 136 | + "image": "https://img.chrono24.com/images/uhren/81q2hpwrm3kk-0kzitltnu3d6tax8d5dw8lfl-ExtraLarge.jpg" | |
| 137 | + }, | |
| 138 | + { | |
| 139 | + "name": "Rolex Daytona Unworn 2026 White Panda 40mm Index Oyster 126500LN", | |
| 140 | + "price": 39290, | |
| 141 | + "currency": "USD", | |
| 142 | + "url": "https://www.chrono24.com/rolex/daytona-unworn-2026-white-panda-40mm-index-oyster-126500ln--id47842605.htm", | |
| 143 | + "image": "https://img.chrono24.com/images/uhren/47842605-e3q7sc06mymx5yk9efp7tl49-ExtraLarge.jpg" | |
| 144 | + }, | |
| 145 | + { | |
| 146 | + "name": "Rolex Daytona Rainbow", | |
| 147 | + "price": 308000, | |
| 148 | + "currency": "USD", | |
| 149 | + "url": "https://www.chrono24.com/rolex/daytona-rainbow--id44687753.htm", | |
| 150 | + "image": "https://img.chrono24.com/images/uhren/44687753-e4c6ur8979pbf6u5gbgbf7rb-ExtraLarge.jpg" | |
| 151 | + }, | |
| 152 | + { | |
| 153 | + "name": "Rolex Daytona 2017 Rolex Daytona Panda Excellent Condition, OG Box/Papers", | |
| 154 | + "price": 31195, | |
| 155 | + "currency": "USD", | |
| 156 | + "url": "https://www.chrono24.com/rolex/daytona--id45800859.htm", | |
| 157 | + "image": "https://img.chrono24.com/images/uhren/1iplmlt4nsmo-6zzh4jdl4zp8phcburmu383p-ExtraLarge.jpg" | |
| 158 | + }, | |
| 159 | + { | |
| 160 | + "name": "Rolex Daytona 2026 Factory Service Card", | |
| 161 | + "price": 23499, | |
| 162 | + "currency": "USD", | |
| 163 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id45885316.htm", | |
| 164 | + "image": "https://img.chrono24.com/images/uhren/45885316-by0veudk4p3ffsofi5ndc1s5-ExtraLarge.jpg" | |
| 165 | + }, | |
| 166 | + { | |
| 167 | + "name": "Rolex Daytona 2012 CHOCOLATE ARABIC DIAL", | |
| 168 | + "price": 34995, | |
| 169 | + "currency": "USD", | |
| 170 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id47802361.htm", | |
| 171 | + "image": "https://img.chrono24.com/images/uhren/47802361-lw346s7790pprv17rl3z5fnt-ExtraLarge.jpg" | |
| 172 | + }, | |
| 173 | + { | |
| 174 | + "name": "Rolex In Stock 2026 Daytona Panda Dial 126500LN Oyster Bracelet", | |
| 175 | + "price": 40995, | |
| 176 | + "currency": "USD", | |
| 177 | + "url": "https://www.chrono24.com/rolex/rolex-in-stock-2026-daytona-panda-dial-126500ln-oyster-bracelet--id46376273.htm", | |
| 178 | + "image": "https://img.chrono24.com/images/uhren/46376273-xpp94t8kf4bksaz4ozeis72a-ExtraLarge.jpg" | |
| 179 | + }, | |
| 180 | + { | |
| 181 | + "name": "Rolex Yellow Gold and Steel Daytona Black Index Dial - Oyster Bracelet 126503", | |
| 182 | + "price": 29000, | |
| 183 | + "currency": "USD", | |
| 184 | + "url": "https://www.chrono24.com/rolex/rolex-yellow-gold-and-steel-daytona-black-index-dial---oyster-bracelet-126503--id33344357.htm", | |
| 185 | + "image": "https://img.chrono24.com/images/uhren/33344357-f7ryhk8x464kpgm478p7bova-ExtraLarge.jpg" | |
| 186 | + }, | |
| 187 | + { | |
| 188 | + "name": "Rolex 2008 Daytona 116520 White Dial SS Oyster No Papers 40mm", | |
| 189 | + "price": 22250, | |
| 190 | + "currency": "USD", | |
| 191 | + "url": "https://www.chrono24.com/rolex/rolex-2008-daytona-116520-white-dial-ss-oyster-no-papers-40mm--id46562562.htm", | |
| 192 | + "image": "https://img.chrono24.com/images/uhren/46562562-p4ek3bk0gsobstovxxi3r0zf-ExtraLarge.jpg" | |
| 193 | + }, | |
| 194 | + { | |
| 195 | + "name": "Rolex 116519LN Daytona 40 mm "Ghost" Dial Oysterflex Bracelet Box 2017", | |
| 196 | + "price": 41500, | |
| 197 | + "currency": "USD", | |
| 198 | + "url": "https://www.chrono24.com/rolex/116519ln-daytona-40-mm-ghost-dial-oysterflex-bracelet-box-2017--id47484399.htm", | |
| 199 | + "image": "https://img.chrono24.com/images/uhren/47484399-jumo4mcgy5j0dfoneuvtw5rz-ExtraLarge.jpg" | |
| 200 | + }, | |
| 201 | + { | |
| 202 | + "name": "Rolex Daytona Black Dial - New Reference 126500LN 2024 unworn", | |
| 203 | + "price": 29999, | |
| 204 | + "currency": "USD", | |
| 205 | + "url": "https://www.chrono24.com/rolex/daytona--id48188163.htm", | |
| 206 | + "image": "https://img.chrono24.com/images/uhren/48188163-gqxngcth3rhqh7wrsob602o5-ExtraLarge.jpg" | |
| 207 | + }, | |
| 208 | + { | |
| 209 | + "name": "Rolex Daytona Ice Blue Dial Platinum "Platona"", | |
| 210 | + "price": 95999, | |
| 211 | + "currency": "USD", | |
| 212 | + "url": "https://www.chrono24.com/rolex/rolex-daytona-ice-blue-dial-platinum-platona--id48011553.htm", | |
| 213 | + "image": "https://img.chrono24.com/images/uhren/48011553-ikfx7ztz8dv5109jse7hhuo4-ExtraLarge.jpg" | |
| 214 | + }, | |
| 215 | + { | |
| 216 | + "name": "Rolex Daytona 1983 Big Red", | |
| 217 | + "price": 94000, | |
| 218 | + "currency": "USD", | |
| 219 | + "url": "https://www.chrono24.com/rolex/daytona--id45057975.htm", | |
| 220 | + "image": "https://img.chrono24.com/images/uhren/ts0ydmvv1lyy-hvwq1vawg95o2pkm983nyk7w-ExtraLarge.jpg" | |
| 221 | + }, | |
| 222 | + { | |
| 223 | + "name": "Rolex UNWORN Daytona 126519 White Gold Silver Dial Black Sundials Oysterflex Rubber Strap Full Set, Unworn Complete Box & Papers", | |
| 224 | + "price": 59825, | |
| 225 | + "currency": "USD", | |
| 226 | + "url": "https://www.chrono24.com/rolex/unworn-daytona-126519-white-gold-silver-dial-black-sundials-oysterflex-rubber-strap--id37443939.htm", | |
| 227 | + "image": "https://img.chrono24.com/images/uhren/37443939-uvywtfhfuwt3jkzpubd4zq6y-ExtraLarge.jpg" | |
| 228 | + }, | |
| 229 | + { | |
| 230 | + "name": "Rolex Daytona Champagne Dial Two Tone Yellow Gold Oyster 126503 Full Set", | |
| 231 | + "price": 26800, | |
| 232 | + "currency": "USD", | |
| 233 | + "url": "https://www.chrono24.com/rolex/rolex-daytona-champagne-dial-two-tone-yellow-gold-oyster-126503--id48028076.htm", | |
| 234 | + "image": "https://img.chrono24.com/images/uhren/48028076-y7x3jnasqz1b8qn4nzdivqp0-ExtraLarge.jpg" | |
| 235 | + }, | |
| 236 | + { | |
| 237 | + "name": "Rolex Daytona Full Set", | |
| 238 | + "price": 47000, | |
| 239 | + "currency": "USD", | |
| 240 | + "url": "https://www.chrono24.com/rolex/daytona--id47737648.htm", | |
| 241 | + "image": "https://img.chrono24.com/images/uhren/z9501e6xlajw-juvzgx1hg3g1nr38zvbcwjqf-ExtraLarge.jpg" | |
| 242 | + }, | |
| 243 | + { | |
| 244 | + "name": "Rolex Daytona Cosmograph Daytona Panda White Dial Chrono Oyster 116500ln", | |
| 245 | + "price": 32999, | |
| 246 | + "currency": "USD", | |
| 247 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id41933068.htm", | |
| 248 | + "image": "https://img.chrono24.com/images/uhren/41933068-sgm47l57otshms6tziz67tyz-ExtraLarge.jpg" | |
| 249 | + }, | |
| 250 | + { | |
| 251 | + "name": "Rolex Daytona Chocolate Arabic Dial on Oysterflex Bracelet 116515LN 2012", | |
| 252 | + "price": 34500, | |
| 253 | + "currency": "USD", | |
| 254 | + "url": "https://www.chrono24.com/rolex/daytona-chocolate-arabic-dial-on-oysterflex-bracelet-116515ln-2012--id48343319.htm", | |
| 255 | + "image": "https://img.chrono24.com/images/uhren/48343319-o98db2efulm8zpidu4867o5b-ExtraLarge.jpg" | |
| 256 | + }, | |
| 257 | + { | |
| 258 | + "name": "Rolex 116595RBOW Daytona Rainbow Rose Gold", | |
| 259 | + "price": 415000, | |
| 260 | + "currency": "USD", | |
| 261 | + "url": "https://www.chrono24.com/rolex/116595rbow-daytona-rainbow-rose-gold--id44352232.htm", | |
| 262 | + "image": "https://img.chrono24.com/images/uhren/hjmlir6tw3ke-q4bf3jgr4f6ljo8ixnt5516k-ExtraLarge.jpg" | |
| 263 | + }, | |
| 264 | + { | |
| 265 | + "name": "Rolex UNWORN 116508 Cosmograph Daytona 18k Yellow Gold Oyster Bracelet 40mm Green Dial", | |
| 266 | + "price": 88425, | |
| 267 | + "currency": "USD", | |
| 268 | + "url": "https://www.chrono24.com/rolex/rolex-unworn-116508-cosmograph-daytona-18k-yellow-gold-oyster-bracelet-40mm-green-dial--id23205010.htm", | |
| 269 | + "image": "https://img.chrono24.com/images/uhren/23205010-0jeve62jx3exrnsubi85ndmo-ExtraLarge.jpg" | |
| 270 | + }, | |
| 271 | + { | |
| 272 | + "name": "Rolex Daytona White Gold Black Dial "Baby Lemans" Oysterflex", | |
| 273 | + "price": 46999, | |
| 274 | + "currency": "USD", | |
| 275 | + "url": "https://www.chrono24.com/rolex/rolex-daytona-white-gold-black-dial-baby-lemans-oysterflex--id48011494.htm", | |
| 276 | + "image": "https://img.chrono24.com/images/uhren/48011494-43zs75zjfaegspb1rkmyi0kw-ExtraLarge.jpg" | |
| 277 | + }, | |
| 278 | + { | |
| 279 | + "name": "Rolex Daytona New 2026 Full set Daytona Panda", | |
| 280 | + "price": 37950, | |
| 281 | + "currency": "USD", | |
| 282 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id47036463.htm", | |
| 283 | + "image": "https://img.chrono24.com/images/uhren/47036463-19ahs51o093f4b5vzw7jm3wk-ExtraLarge.jpg" | |
| 284 | + }, | |
| 285 | + { | |
| 286 | + "name": "Rolex Daytona Black and Rose Dial Rose Gold Rubber Oyster-flex Bracelet", | |
| 287 | + "price": 44995, | |
| 288 | + "currency": "USD", | |
| 289 | + "url": "https://www.chrono24.com/rolex/rolex-daytona-black-and-rose-dial-rose-gold-rubber-oyster-flex-bracelet--id46034927.htm", | |
| 290 | + "image": "https://img.chrono24.com/images/uhren/46034927-11x0jid1cd595pq882eymu9x-ExtraLarge.jpg" | |
| 291 | + }, | |
| 292 | + { | |
| 293 | + "name": "Rolex Daytona Cosmograph Daytona Panda White Dial Chrono Oyster 116500ln", | |
| 294 | + "price": 32000, | |
| 295 | + "currency": "USD", | |
| 296 | + "url": "https://www.chrono24.com/rolex/daytona--id47467343.htm", | |
| 297 | + "image": "https://img.chrono24.com/images/uhren/47467343-0osfjjgkp612aqlbhhfcrsz2-ExtraLarge.jpg" | |
| 298 | + }, | |
| 299 | + { | |
| 300 | + "name": "Rolex Daytona Zenith 16520 Complete True Collector Set", | |
| 301 | + "price": 29855, | |
| 302 | + "currency": "USD", | |
| 303 | + "url": "https://www.chrono24.com/rolex/daytona--id46547125.htm", | |
| 304 | + "image": "https://img.chrono24.com/images/uhren/46547125-lq9pz7ggnx0z5cl34y93ujnf-ExtraLarge.jpg" | |
| 305 | + }, | |
| 306 | + { | |
| 307 | + "name": "Rolex UNWORN Daytona 116503 Black Index Dial Two Tone Yellow Gold Stainless Steel Full Set, Unworn Complete Box & Papers", | |
| 308 | + "price": 25425, | |
| 309 | + "currency": "USD", | |
| 310 | + "url": "https://www.chrono24.com/rolex/rolex-unworn-daytona-116503-black-index-dial-two-tone-yellow-gold-stainless-steel--id11902212.htm", | |
| 311 | + "image": "https://img.chrono24.com/images/uhren/11902212-0cqe4a4uob3gnbzo0rruefr0-ExtraLarge.jpg" | |
| 312 | + }, | |
| 313 | + { | |
| 314 | + "name": "Rolex Daytona ROLEX 116506 DAYTONA ICE BLUE INDEX PLATINUM 2026", | |
| 315 | + "price": 94999, | |
| 316 | + "currency": "USD", | |
| 317 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id47264372.htm", | |
| 318 | + "image": "https://img.chrono24.com/images/uhren/47264372-x99zlyst99jdw6xg9zf5e22m-ExtraLarge.jpg" | |
| 319 | + }, | |
| 320 | + { | |
| 321 | + "name": "Rolex 116506 Platinum Daytona Baguette Dial", | |
| 322 | + "price": 105000, | |
| 323 | + "currency": "USD", | |
| 324 | + "url": "https://www.chrono24.com/rolex/116506-platinum-daytona-baguette-dial--id39483622.htm", | |
| 325 | + "image": "https://img.chrono24.com/images/uhren/ro52u07ejwvf-axvhb51gwfm8b2ho3hb8fdo9-ExtraLarge.jpg" | |
| 326 | + }, | |
| 327 | + { | |
| 328 | + "name": "Rolex Daytona 2026 Unworn 40mm "Platona" Cosmograph Baguette Dial", | |
| 329 | + "price": 135250, | |
| 330 | + "currency": "USD", | |
| 331 | + "url": "https://www.chrono24.com/rolex/daytona--id47662791.htm", | |
| 332 | + "image": "https://img.chrono24.com/images/uhren/47662791-z6ev91e0th1mnc4i22nxexo0-ExtraLarge.jpg" | |
| 333 | + }, | |
| 334 | + { | |
| 335 | + "name": "Rolex Daytona Silver "Ghost" Dial", | |
| 336 | + "price": 44999, | |
| 337 | + "currency": "USD", | |
| 338 | + "url": "https://www.chrono24.com/rolex/daytona-silver-ghost-dial--id45886055.htm", | |
| 339 | + "image": "https://img.chrono24.com/images/uhren/45886055-6wiuolzjsxyi0hte0x5fb4rb-ExtraLarge.jpg" | |
| 340 | + }, | |
| 341 | + { | |
| 342 | + "name": "Rolex Le Mans Daytona 126528LN Le Mans Daytona Yellow Gold", | |
| 343 | + "price": 220000, | |
| 344 | + "currency": "USD", | |
| 345 | + "url": "https://www.chrono24.com/rolex/rolex-le-mans-daytona--id47107552.htm", | |
| 346 | + "image": "https://img.chrono24.com/images/uhren/47107552-ojhgnky33p827ve4uhklmh16-ExtraLarge.jpg" | |
| 347 | + }, | |
| 348 | + { | |
| 349 | + "name": "Rolex Daytona 40mm Yellow Gold Cosmograph Green Index Dial (116508)", | |
| 350 | + "price": 80000, | |
| 351 | + "currency": "USD", | |
| 352 | + "url": "https://www.chrono24.com/rolex/rolex-daytona-40mm-yellow-gold-cosmograph-green-index-dial-116508--id21222403.htm", | |
| 353 | + "image": "https://img.chrono24.com/images/uhren/21222403-pq37aqrzk9osliwbw9r2ncb4-ExtraLarge.jpg" | |
| 354 | + }, | |
| 355 | + { | |
| 356 | + "name": "Rolex Daytona, 116500LN, Black Dial Ready 2 Ship, Complete Set, Excellent Condition, Ceramic", | |
| 357 | + "price": 27995, | |
| 358 | + "currency": "USD", | |
| 359 | + "url": "https://www.chrono24.com/rolex/rolex-daytona-116500ln-black-dial--id47993377.htm", | |
| 360 | + "image": "https://img.chrono24.com/images/uhren/47993377-yu5zao0xczvsobk31c8izzix-ExtraLarge.jpg" | |
| 361 | + }, | |
| 362 | + { | |
| 363 | + "name": "Rolex Daytona NEW June 2026 Champagne Dial", | |
| 364 | + "price": 27850, | |
| 365 | + "currency": "USD", | |
| 366 | + "url": "https://www.chrono24.com/rolex/daytona--id46820218.htm", | |
| 367 | + "image": "https://img.chrono24.com/images/uhren/46820218-bguzge7y0jyoo7dhkrgs4ty9-ExtraLarge.jpg" | |
| 368 | + }, | |
| 369 | + { | |
| 370 | + "name": "Rolex MINT COMPLETE SET Cosmograph Daytona Black Dial Stainless Steel Oyster Bracelet 116520", | |
| 371 | + "price": 25995, | |
| 372 | + "currency": "USD", | |
| 373 | + "url": "https://www.chrono24.com/rolex/rolex-mint-complete-set-cosmograph-daytona-black-dial-stainless-steel-oyster-bracelet-116520--id44389376.htm", | |
| 374 | + "image": "https://img.chrono24.com/images/uhren/44389376-tuyxf4fod18741toktjj0dw0-ExtraLarge.jpg" | |
| 375 | + }, | |
| 376 | + { | |
| 377 | + "name": "Rolex UNWORN Cosmograph Daytona 126515 Rose Gold Chocolate Brown Index Dial Oysterflex Rubber Strap", | |
| 378 | + "price": 56325, | |
| 379 | + "currency": "USD", | |
| 380 | + "url": "https://www.chrono24.com/rolex/rolex-unworn-cosmograph-daytona-126515-rose-gold-chocolate-brown-index-dial--id41709462.htm", | |
| 381 | + "image": "https://img.chrono24.com/images/uhren/41709462-k5ptc7ruoqs2jbabiuewus6y-ExtraLarge.jpg" | |
| 382 | + }, | |
| 383 | + { | |
| 384 | + "name": "Rolex Daytona 6263", | |
| 385 | + "price": 295000, | |
| 386 | + "currency": "USD", | |
| 387 | + "url": "https://www.chrono24.com/rolex/daytona-6263--id44735333.htm", | |
| 388 | + "image": "https://img.chrono24.com/images/uhren/44735333-xbhw568qbhc9mzc5p5l2i0if-ExtraLarge.jpg" | |
| 389 | + }, | |
| 390 | + { | |
| 391 | + "name": "Rolex Daytona UNWORN 2026 Pikachu YML Gold/Black 40mm Index Oysterflex 126518LN", | |
| 392 | + "price": 68995, | |
| 393 | + "currency": "USD", | |
| 394 | + "url": "https://www.chrono24.com/rolex/daytona-unworn-2026-pikachu-yml-goldblack-40mm-index-oysterflex-126518ln--id47842596.htm", | |
| 395 | + "image": "https://img.chrono24.com/images/uhren/47842596-yxkugipfk30s4xt8sc42zz90-ExtraLarge.jpg" | |
| 396 | + }, | |
| 397 | + { | |
| 398 | + "name": "Rolex Daytona UNWORN 2026 Sundust/Black 40mm Index Oyster 126505", | |
| 399 | + "price": 64995, | |
| 400 | + "currency": "USD", | |
| 401 | + "url": "https://www.chrono24.com/rolex/daytona-unworn-2026-sundustblack-40mm-index-oyster-126505--id47248125.htm", | |
| 402 | + "image": "https://img.chrono24.com/images/uhren/47248125-y4wr4aq6coolxit6ud5lqzf8-ExtraLarge.jpg" | |
| 403 | + }, | |
| 404 | + { | |
| 405 | + "name": "Rolex Daytona White Dial Panda", | |
| 406 | + "price": 31999, | |
| 407 | + "currency": "USD", | |
| 408 | + "url": "https://www.chrono24.com/rolex/daytona-white-dial-panda--id38786770.htm", | |
| 409 | + "image": "https://img.chrono24.com/images/uhren/38786770-kcwd2d1pddr5078w31ngcj4v-ExtraLarge.jpg" | |
| 410 | + }, | |
| 411 | + { | |
| 412 | + "name": "Rolex Daytona NEW 2026 Daytona 40mm Black Dial 126500LN - Complete Set", | |
| 413 | + "price": 33399, | |
| 414 | + "currency": "USD", | |
| 415 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id46668428.htm", | |
| 416 | + "image": "https://img.chrono24.com/images/uhren/46668428-coqvxtw4oxpgjphxrdurz1zm-ExtraLarge.jpg" | |
| 417 | + }, | |
| 418 | + { | |
| 419 | + "name": "Rolex Daytona Ghost White Gold Oysterflex 116519LN Grey Dial Full Set Like New", | |
| 420 | + "price": 45800, | |
| 421 | + "currency": "USD", | |
| 422 | + "url": "https://www.chrono24.com/rolex/daytona-ghost-white-gold-oysterflex-116519ln-grey-dial--id31519416.htm", | |
| 423 | + "image": "https://img.chrono24.com/images/uhren/31519416-vdndhf7qw8isdldn3i2i4h2w-ExtraLarge.jpg" | |
| 424 | + }, | |
| 425 | + { | |
| 426 | + "name": "Rolex Daytona 116519 Turquoise Dial 18k White Gold Wristwatch Full Set", | |
| 427 | + "price": 107000, | |
| 428 | + "currency": "USD", | |
| 429 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id42928076.htm", | |
| 430 | + "image": "https://img.chrono24.com/images/uhren/42928076-nuawv7oimms6amtp1wltrtgs-ExtraLarge.jpg" | |
| 431 | + }, | |
| 432 | + { | |
| 433 | + "name": "Rolex Daytona 116503 White Dial Two Tone Mens Watch Box Papers", | |
| 434 | + "price": 22999, | |
| 435 | + "currency": "USD", | |
| 436 | + "url": "https://www.chrono24.com/rolex/daytona-116503-white-dial-two-tone-mens-watch-box-papers--id42193431.htm", | |
| 437 | + "image": "https://img.chrono24.com/images/uhren/42193431-82bpf4y9cmibdeww390vr5lt-ExtraLarge.jpg" | |
| 438 | + }, | |
| 439 | + { | |
| 440 | + "name": "Rolex Daytona DAYTONA ON THEATER STRAP 2017 COMPLETE SET", | |
| 441 | + "price": 29000, | |
| 442 | + "currency": "USD", | |
| 443 | + "url": "https://www.chrono24.com/rolex/daytona--id47958822.htm", | |
| 444 | + "image": "https://img.chrono24.com/images/uhren/chk9fwqgwz09-5oaggbnzm5b2z8urwashrhxw-ExtraLarge.jpg" | |
| 445 | + }, | |
| 446 | + { | |
| 447 | + "name": "Rolex Cosmograph Daytona Yellow Gold Black Paul Newman", | |
| 448 | + "price": 54850, | |
| 449 | + "currency": "USD", | |
| 450 | + "url": "https://www.chrono24.com/rolex/rolex-cosmograph-daytona--id46531878.htm", | |
| 451 | + "image": "https://img.chrono24.com/images/uhren/46531878-8zfqriivaprtwzzlem6hggf0-ExtraLarge.jpg" | |
| 452 | + }, | |
| 453 | + { | |
| 454 | + "name": "Rolex Daytona Unworn 2026 Everose Gold 40mm Meteorite Dial Oysterflex", | |
| 455 | + "price": 85100, | |
| 456 | + "currency": "USD", | |
| 457 | + "url": "https://www.chrono24.com/rolex/daytona--id47662993.htm", | |
| 458 | + "image": "https://img.chrono24.com/images/uhren/47662993-6zz00lr1tehb5uok0oayt91o-ExtraLarge.jpg" | |
| 459 | + }, | |
| 460 | + { | |
| 461 | + "name": "Rolex Daytona 40mm 18K Yellow Gold White Diamond Dial & Yellow Gold Bezel 16528 All Factory Diamond Dial, Zenith Movement", | |
| 462 | + "price": 39850, | |
| 463 | + "currency": "USD", | |
| 464 | + "url": "https://www.chrono24.com/rolex/rolex-rolex-daytona-40mm-18k-yellow-gold-white-diamond-dial--yellow-gold-bezel-16528--id45156338.htm", | |
| 465 | + "image": "https://img.chrono24.com/images/uhren/45156338-m9yvf6np1huwinu55d6wup4o-ExtraLarge.jpg" | |
| 466 | + }, | |
| 467 | + { | |
| 468 | + "name": "Rolex Cosmograph Daytona Rose Gold Dial Black Subdials Oysterflex 116515LN", | |
| 469 | + "price": 47000, | |
| 470 | + "currency": "USD", | |
| 471 | + "url": "https://www.chrono24.com/rolex/rolex-cosmograph-daytona-rose-gold-dial-black-subdials-oysterflex-116515ln--id26730122.htm", | |
| 472 | + "image": "https://img.chrono24.com/images/uhren/26730122-vf57m6afdlsqgx0ldly658ol-ExtraLarge.jpg" | |
| 473 | + }, | |
| 474 | + { | |
| 475 | + "name": "Rolex - Pre-owned Stainless Steel Daytona "Big Daytona" Black Dial 6240", | |
| 476 | + "price": 115000, | |
| 477 | + "currency": "USD", | |
| 478 | + "url": "https://www.chrono24.com/rolex/--pre-owned-stainless-steel-daytona-big-daytona-black-dial-6240--id48237595.htm", | |
| 479 | + "image": "https://img.chrono24.com/images/uhren/48237595-tlk8ae7ef6ll768zti4icrdo-ExtraLarge.jpg" | |
| 480 | + }, | |
| 481 | + { | |
| 482 | + "name": "Rolex UNPOLISHED 1997 Good Condition Daytona Steel Black Dial 16520", | |
| 483 | + "price": 26495, | |
| 484 | + "currency": "USD", | |
| 485 | + "url": "https://www.chrono24.com/rolex/unpolished-1997-good-condition-daytona-steel-black-dial-16520--id47543639.htm", | |
| 486 | + "image": "https://img.chrono24.com/images/uhren/47543639-p88dll8ez6dxakug6t48zut5-ExtraLarge.jpg" | |
| 487 | + }, | |
| 488 | + { | |
| 489 | + "name": "Rolex Daytona Panda Like New Condition Comes Box", | |
| 490 | + "price": 28900, | |
| 491 | + "currency": "USD", | |
| 492 | + "url": "https://www.chrono24.com/rolex/daytona--id48398685.htm", | |
| 493 | + "image": "https://img.chrono24.com/images/uhren/9ofnbe6scwtl-kjn5yjuo8sueb52nogubigw9-ExtraLarge.jpg" | |
| 494 | + }, | |
| 495 | + { | |
| 496 | + "name": "Rolex NEW 2026 Daytona 40mm 126506 Platinum Ice Blue Diamond Baguette Dial", | |
| 497 | + "price": 138325, | |
| 498 | + "currency": "USD", | |
| 499 | + "url": "https://www.chrono24.com/rolex/new-2026-daytona-40mm-126506-platinum-ice-blue-diamond-baguette-dial--id45476868.htm", | |
| 500 | + "image": "https://img.chrono24.com/images/uhren/c89mhbcl87i4-8ou8b7al2np5gnkuqatc074m-ExtraLarge.jpg" | |
| 501 | + }, | |
| 502 | + { | |
| 503 | + "name": "Rolex Daytona Full Set with Box, Papers, Green Tag; Excellent Condition", | |
| 504 | + "price": 30568, | |
| 505 | + "currency": "USD", | |
| 506 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id47536427.htm", | |
| 507 | + "image": "https://img.chrono24.com/images/uhren/47536427-27h2v7gletjs25y4eg879vwg-ExtraLarge.jpg" | |
| 508 | + }, | |
| 509 | + { | |
| 510 | + "name": "Rolex Daytona 116500LN - Mint - White Dial - Panda!", | |
| 511 | + "price": 30950, | |
| 512 | + "currency": "USD", | |
| 513 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id47559625.htm", | |
| 514 | + "image": "https://img.chrono24.com/images/uhren/47559625-zuo61goaoak470xh5le4qn39-ExtraLarge.jpg" | |
| 515 | + }, | |
| 516 | + { | |
| 517 | + "name": "Rolex Daytona Rolex Daytona Sundust Dial Rose Gold Full Set Box & Paper", | |
| 518 | + "price": 51000, | |
| 519 | + "currency": "USD", | |
| 520 | + "url": "https://www.chrono24.com/rolex/daytona--id48046984.htm", | |
| 521 | + "image": "https://img.chrono24.com/images/uhren/48046984-wgc1ptjqgcv7cx94tfn5fvks-ExtraLarge.jpg" | |
| 522 | + }, | |
| 523 | + { | |
| 524 | + "name": "Rolex Daytona Panda 2025 - New Style Box", | |
| 525 | + "price": 36495, | |
| 526 | + "currency": "USD", | |
| 527 | + "url": "https://www.chrono24.com/rolex/daytona-panda-2025---new-style-box--id42798945.htm", | |
| 528 | + "image": "https://img.chrono24.com/images/uhren/j27142j9sgi0-h9mes2te5iryr9gkbisjw9pe-ExtraLarge.jpg" | |
| 529 | + }, | |
| 530 | + { | |
| 531 | + "name": "Rolex Daytona SUPER MINT BLACK CERAMIC DAYTONA", | |
| 532 | + "price": 27500, | |
| 533 | + "currency": "USD", | |
| 534 | + "url": "https://www.chrono24.com/rolex/daytona--id47960968.htm", | |
| 535 | + "image": "https://img.chrono24.com/images/uhren/n3cjr06y2fcn-ckid8yu2sinf7z2cwdemfxrr-ExtraLarge.jpg" | |
| 536 | + }, | |
| 537 | + { | |
| 538 | + "name": "Rolex Daytona 116520 40mm with a White Dial and Rolex Box + Papers", | |
| 539 | + "price": 23995, | |
| 540 | + "currency": "USD", | |
| 541 | + "url": "https://www.chrono24.com/rolex/daytona--id47560800.htm", | |
| 542 | + "image": "https://img.chrono24.com/images/uhren/uz3jiaq5zim7-voyucxxu685y1e5ms5e6b1l8-ExtraLarge.jpg" | |
| 543 | + }, | |
| 544 | + { | |
| 545 | + "name": "Rolex UNPOLISHED 1999 EXCELLENT Condition Daytona White Gold Mother-of-Pearl Arabic Dial 16519 FULL SET Zenith Movement", | |
| 546 | + "price": 38495, | |
| 547 | + "currency": "USD", | |
| 548 | + "url": "https://www.chrono24.com/rolex/unpolished-1999-excellent-condition-daytona-white-gold-mother-of-pearl-arabic-dial-16519--id48316112.htm", | |
| 549 | + "image": "https://img.chrono24.com/images/uhren/48316112-r6houfu2uonvjdpgtt63e0si-ExtraLarge.jpg" | |
| 550 | + }, | |
| 551 | + { | |
| 552 | + "name": "Rolex Daytona on Oysterflex, Rose gold, ceramic bezel with black dial", | |
| 553 | + "price": 48750, | |
| 554 | + "currency": "USD", | |
| 555 | + "url": "https://www.chrono24.com/rolex/rolex-daytona-on-oysterflex-rose-gold-ceramic-bezel-with-black-dial--id47909290.htm", | |
| 556 | + "image": "https://img.chrono24.com/images/uhren/47909290-kdde9klx0urqcvtskf8k3p35-ExtraLarge.jpg" | |
| 557 | + }, | |
| 558 | + { | |
| 559 | + "name": "Rolex Daytona UNWORN 2026 Pikachu YML 40mm Golden/Black Index Oyster 126508", | |
| 560 | + "price": 75950, | |
| 561 | + "currency": "USD", | |
| 562 | + "url": "https://www.chrono24.com/rolex/daytona-unworn-2026-pikachu-yml-40mm-goldenblack-index-oyster-126508--id47955408.htm", | |
| 563 | + "image": "https://img.chrono24.com/images/uhren/47955408-szax0mn0ib34hmp1wh2lsmlc-ExtraLarge.jpg" | |
| 564 | + }, | |
| 565 | + { | |
| 566 | + "name": "Rolex Unworn 2026 Daytona "Ghost" 126519LN Oyster-flex 18K White Gold In Stock", | |
| 567 | + "price": 59995, | |
| 568 | + "currency": "USD", | |
| 569 | + "url": "https://www.chrono24.com/rolex/rolex-unworn-2026-daytona-ghost-126519ln-oyster-flex-18k-white-gold--in-stock--id46268875.htm", | |
| 570 | + "image": "https://img.chrono24.com/images/uhren/46268875-0ad96zpp6ns736d8er4xmkzt-ExtraLarge.jpg" | |
| 571 | + }, | |
| 572 | + { | |
| 573 | + "name": "Rolex Daytona Full Set", | |
| 574 | + "price": 30400, | |
| 575 | + "currency": "USD", | |
| 576 | + "url": "https://www.chrono24.com/rolex/daytona--id47981989.htm", | |
| 577 | + "image": "https://img.chrono24.com/images/uhren/4701sqi92xs4-or2nus80129cfd3an5xwu90q-ExtraLarge.jpg" | |
| 578 | + }, | |
| 579 | + { | |
| 580 | + "name": "Rolex Daytona 2026 Unworn Yellow Gold 'Tiffany" 41mm Turquoise Dial", | |
| 581 | + "price": 97495, | |
| 582 | + "currency": "USD", | |
| 583 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id47663169.htm", | |
| 584 | + "image": "https://img.chrono24.com/images/uhren/47663169-09k6jfq5xaraa78fz15n8wtd-ExtraLarge.jpg" | |
| 585 | + }, | |
| 586 | + { | |
| 587 | + "name": "Rolex Daytona Rainbow Full Set Box & Papers", | |
| 588 | + "price": 473000, | |
| 589 | + "currency": "USD", | |
| 590 | + "url": "https://www.chrono24.com/rolex/daytona-rainbow--id45591631.htm", | |
| 591 | + "image": "https://img.chrono24.com/images/uhren/45591631-jiokoo05rlpe96xvy3gpuh2b-ExtraLarge.jpg" | |
| 592 | + }, | |
| 593 | + { | |
| 594 | + "name": "Rolex Daytona 2024 126505-0003 Chronograph Cosmograph Daytona Everose / Sundust - Black / Oyster", | |
| 595 | + "price": 52000, | |
| 596 | + "currency": "USD", | |
| 597 | + "url": "https://www.chrono24.com/rolex/daytona-2024-126505-0003-chronograph-cosmograph-daytona-everose--sundust---black--oyster--id47499556.htm", | |
| 598 | + "image": "https://img.chrono24.com/images/uhren/47499556-m1lygkdm3ecsj3jhp6xc2ba4-ExtraLarge.jpg" | |
| 599 | + }, | |
| 600 | + { | |
| 601 | + "name": "Rolex Daytona White Stick Dial Yellow Gold 16518 Cosmograph Zenith", | |
| 602 | + "price": 44500, | |
| 603 | + "currency": "USD", | |
| 604 | + "url": "https://www.chrono24.com/rolex/daytona-white-stick-dial-yellow-gold-16518-cosmograph-zenith--id26240716.htm", | |
| 605 | + "image": "https://img.chrono24.com/images/uhren/26240716-ukndlho7z5obuit0grcqrrna-ExtraLarge.jpg" | |
| 606 | + }, | |
| 607 | + { | |
| 608 | + "name": "Rolex Like NEW 2023 Cosmograph Daytona White Gold Meteorite Dial 116519LN FULL SET Oysterflex", | |
| 609 | + "price": 89995, | |
| 610 | + "currency": "USD", | |
| 611 | + "url": "https://www.chrono24.com/rolex/like-new-2023-cosmograph-daytona-white-gold-meteorite-dial-116519ln--id44498001.htm", | |
| 612 | + "image": "https://img.chrono24.com/images/uhren/44498001-uo8nr33rms4lyxkfv530vx8n-ExtraLarge.jpg" | |
| 613 | + }, | |
| 614 | + { | |
| 615 | + "name": "Rolex 'le Mans' Daytona 2025 ROLEX 126525LN DAYTONA "LE MANS" 2025 UNWORN", | |
| 616 | + "price": 204000, | |
| 617 | + "currency": "USD", | |
| 618 | + "url": "https://www.chrono24.com/rolex/rolex-le-mans-daytona--2025--id47681712.htm", | |
| 619 | + "image": "https://img.chrono24.com/images/uhren/47681712-dkxhxs3iaou95zl6ffhyq31b-ExtraLarge.jpg" | |
| 620 | + }, | |
| 621 | + { | |
| 622 | + "name": "Rolex Le Mans Daytona UNWORN 2026 Le Mans", | |
| 623 | + "price": 204995, | |
| 624 | + "currency": "USD", | |
| 625 | + "url": "https://www.chrono24.com/rolex/rolex-le-mans-daytona--id46621243.htm", | |
| 626 | + "image": "https://img.chrono24.com/images/uhren/46621243-kd4vda8q1q0age4ti52uff5y-ExtraLarge.jpg" | |
| 627 | + }, | |
| 628 | + { | |
| 629 | + "name": "Rolex Daytona Rose Gold Chocolate Oysterflex Unworn White Tag", | |
| 630 | + "price": 45900, | |
| 631 | + "currency": "USD", | |
| 632 | + "url": "https://www.chrono24.com/rolex/daytona-rose-gold-chocolate-oysterflex-unworn-white-tag--id47662083.htm", | |
| 633 | + "image": "https://img.chrono24.com/images/uhren/wv8gqcfeur3l-rgkz5fgblq8mkbk6oaskk2sp-ExtraLarge.jpg" | |
| 634 | + }, | |
| 635 | + { | |
| 636 | + "name": "Rolex Daytona Black Dial", | |
| 637 | + "price": 27099, | |
| 638 | + "currency": "USD", | |
| 639 | + "url": "https://www.chrono24.com/rolex/daytona-black-dial--id28484494.htm", | |
| 640 | + "image": "https://img.chrono24.com/images/uhren/f5v6pasgis7a-rqv97ur5qg6n618efe32cmh6-ExtraLarge.jpg" | |
| 641 | + }, | |
| 642 | + { | |
| 643 | + "name": "Rolex NEW Daytona 126503 White Index Dial Two Tone Yellow Gold Stainless Steel", | |
| 644 | + "price": 28725, | |
| 645 | + "currency": "USD", | |
| 646 | + "url": "https://www.chrono24.com/rolex/rolex-new-daytona-126503-white-index-dial-two-tone-yellow-gold-stainless-steel--id38062427.htm", | |
| 647 | + "image": "https://img.chrono24.com/images/uhren/38062427-geydh5jeg7x3aintvyva3dyq-ExtraLarge.jpg" | |
| 648 | + }, | |
| 649 | + { | |
| 650 | + "name": "Rolex Daytona 2025 Ghost 40mm Silver Steel/Black Index Oyster 126509", | |
| 651 | + "price": 62800, | |
| 652 | + "currency": "USD", | |
| 653 | + "url": "https://www.chrono24.com/rolex/daytona-2025-ghost-40mm-silver-steelblack-index-oyster-126509--id47160942.htm", | |
| 654 | + "image": "https://img.chrono24.com/images/uhren/47160942-l624e3zs7n9j7s6eabtdy7hw-ExtraLarge.jpg" | |
| 655 | + }, | |
| 656 | + { | |
| 657 | + "name": "Rolex NEW 2026 Daytona "Baby Le Mans" 40mm 126519LN White Gold Black Dial", | |
| 658 | + "price": 51870, | |
| 659 | + "currency": "USD", | |
| 660 | + "url": "https://www.chrono24.com/rolex/rolex-new-2026-daytona-baby-le-mans-40mm-126519ln-white-gold-black-dial--id46818789.htm", | |
| 661 | + "image": "https://img.chrono24.com/images/uhren/46818789-rc9t84oy7bqfzook6ovbegv6-ExtraLarge.jpg" | |
| 662 | + }, | |
| 663 | + { | |
| 664 | + "name": "Rolex Daytona Black Dial Black Bezel Oyster 116500LN 2023 Full Set Like New", | |
| 665 | + "price": 29300, | |
| 666 | + "currency": "USD", | |
| 667 | + "url": "https://www.chrono24.com/rolex/rolex-daytona-black-dial-black-bezel-oyster-116500ln--id47560941.htm", | |
| 668 | + "image": "https://img.chrono24.com/images/uhren/47560941-jj2bhsjudzsxm8os4zzxswjj-ExtraLarge.jpg" | |
| 669 | + }, | |
| 670 | + { | |
| 671 | + "name": "Rolex Like NEW 2024 Daytona Rose Gold Black Diamond Dial 126515LN FULL SET Oysterflex", | |
| 672 | + "price": 48995, | |
| 673 | + "currency": "USD", | |
| 674 | + "url": "https://www.chrono24.com/rolex/like-new-2024-daytona-rose-gold-black-diamond-dial-126515ln--id48362949.htm", | |
| 675 | + "image": "https://img.chrono24.com/images/uhren/48362949-2keqiqcutz9eii18tctx7vgo-ExtraLarge.jpg" | |
| 676 | + }, | |
| 677 | + { | |
| 678 | + "name": "Rolex Daytona Black Diamond Dial Oysterflex 2021 Watch and card", | |
| 679 | + "price": 40200, | |
| 680 | + "currency": "USD", | |
| 681 | + "url": "https://www.chrono24.com/rolex/daytona-black-diamond-dial-oysterflex-2021--id48045897.htm", | |
| 682 | + "image": "https://img.chrono24.com/images/uhren/9a6p5aloeou4-lakz9w4zec65cwc8lvf373p0-ExtraLarge.jpg" | |
| 683 | + }, | |
| 684 | + { | |
| 685 | + "name": "Rolex UNWORN Daytona 116518 Yellow Gold 40mm Black Paul Newman Index Dial Black Oysterflex Unworn Complete Box & Papers", | |
| 686 | + "price": 49425, | |
| 687 | + "currency": "USD", | |
| 688 | + "url": "https://www.chrono24.com/rolex/rolex-unworn-daytona-116518-yellow-gold-40mm-black-paul-newman-index-dial-black-oysterflex--id21187164.htm", | |
| 689 | + "image": "https://img.chrono24.com/images/uhren/21187164-tdv8un5d657fec6c9trj2g3o-ExtraLarge.jpg" | |
| 690 | + }, | |
| 691 | + { | |
| 692 | + "name": "Rolex 1993 Daytona 16528 Champagne Inverted 6 Dial YG Oyster Unpolished 40mm", | |
| 693 | + "price": 39750, | |
| 694 | + "currency": "USD", | |
| 695 | + "url": "https://www.chrono24.com/rolex/rolex-1993-daytona-16528-champagne-inverted-6-dial-yg-oyster-unpolished-40mm--id47020343.htm", | |
| 696 | + "image": "https://img.chrono24.com/images/uhren/47020343-tm7yd8npf6t2bnpmxz9z7n9d-ExtraLarge.jpg" | |
| 697 | + }, | |
| 698 | + { | |
| 699 | + "name": "Rolex Daytona Chocolate Dial Rose Gold", | |
| 700 | + "price": 58999, | |
| 701 | + "currency": "USD", | |
| 702 | + "url": "https://www.chrono24.com/rolex/rolex-daytona-chocolate-dial-rose-gold--id48010607.htm", | |
| 703 | + "image": "https://img.chrono24.com/images/uhren/48010607-riq0wx55ygd7h3m0exlnbpue-ExtraLarge.jpg" | |
| 704 | + }, | |
| 705 | + { | |
| 706 | + "name": "Rolex Daytona 2025 Yellow Gold Two-Tone 40mm White Dial", | |
| 707 | + "price": 25995, | |
| 708 | + "currency": "USD", | |
| 709 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id48341060.htm", | |
| 710 | + "image": "https://img.chrono24.com/images/uhren/48341060-zjn0sim6l896w3seok47exnq-ExtraLarge.jpg" | |
| 711 | + }, | |
| 712 | + { | |
| 713 | + "name": "Rolex Daytona 126506 DAYTONA ICE BLUE STICK PLATINUM OPEN CASE BACK 2026", | |
| 714 | + "price": 124499, | |
| 715 | + "currency": "USD", | |
| 716 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id47941281.htm", | |
| 717 | + "image": "https://img.chrono24.com/images/uhren/47941281-y21fzm370aaus16jewata0ey-ExtraLarge.jpg" | |
| 718 | + }, | |
| 719 | + { | |
| 720 | + "name": "Rolex 2025 Daytona 40mm 126518LN Yellow Gold Oysterflex Meteorite Dial", | |
| 721 | + "price": 87805, | |
| 722 | + "currency": "USD", | |
| 723 | + "url": "https://www.chrono24.com/rolex/2025-daytona-40mm-126518ln-yellow-gold-oysterflex-meteorite-dial--id46422267.htm", | |
| 724 | + "image": "https://img.chrono24.com/images/uhren/46422267-0qo8atxyah08ji1v0ujna514-ExtraLarge.jpg" | |
| 725 | + }, | |
| 726 | + { | |
| 727 | + "name": "Rolex Daytona NEW 2026 Platinum Open Caseback Oyster Bracelet Brown Ceramic Bezel", | |
| 728 | + "price": 134995, | |
| 729 | + "currency": "USD", | |
| 730 | + "url": "https://www.chrono24.com/rolex/rolex-daytona-new-2026-platinum-open-caseback-oyster-bracelet-brown-ceramic-bezel--id46644455.htm", | |
| 731 | + "image": "https://img.chrono24.com/images/uhren/46644455-9fc0n8txpdrvogg04gqq7zok-ExtraLarge.jpg" | |
| 732 | + }, | |
| 733 | + { | |
| 734 | + "name": "Rolex Daytona Panda", | |
| 735 | + "price": 25350, | |
| 736 | + "currency": "USD", | |
| 737 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id47262657.htm", | |
| 738 | + "image": "https://img.chrono24.com/images/uhren/47262657-ns1tzz35xip2dzpbosw37gcs-ExtraLarge.jpg" | |
| 739 | + }, | |
| 740 | + { | |
| 741 | + "name": "Rolex Daytona 116515LN “CHOCO ARABIC” Brown Arabic Dial Rose Gold 40mm 2016", | |
| 742 | + "price": 36000, | |
| 743 | + "currency": "USD", | |
| 744 | + "url": "https://www.chrono24.com/rolex/daytona-116515ln-choco-arabic-brown-arabic-dial-rose-gold-40mm-2016--id47484407.htm", | |
| 745 | + "image": "https://img.chrono24.com/images/uhren/tx7wn8yl20a3-2j5gmcunilbh64bfke537w8u-ExtraLarge.jpg" | |
| 746 | + }, | |
| 747 | + { | |
| 748 | + "name": "Rolex Daytona Discontinued White/Panda Ceramic Bezel Full Set 116500LN", | |
| 749 | + "price": 32000, | |
| 750 | + "currency": "USD", | |
| 751 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id48406807.htm", | |
| 752 | + "image": "https://img.chrono24.com/images/uhren/48406807-iulk9ktsmp8r7z5czzyg6bq1-ExtraLarge.jpg" | |
| 753 | + }, | |
| 754 | + { | |
| 755 | + "name": "Rolex 2006 Daytona 116509 Black Racing Dial White Gold 18kt Oyster No Paper 40mm", | |
| 756 | + "price": 33750, | |
| 757 | + "currency": "USD", | |
| 758 | + "url": "https://www.chrono24.com/rolex/rolex-2006-daytona-116509-black-racing-dial-white-gold-18kt-oyster-no-paper-40mm--id46564050.htm", | |
| 759 | + "image": "https://img.chrono24.com/images/uhren/46564050-roelx3pwkzviqlgmupjy9k8m-ExtraLarge.jpg" | |
| 760 | + }, | |
| 761 | + { | |
| 762 | + "name": "Rolex Daytona Zenith White Panda Dial Two Tone Gold and Steel 16523 RARE Dial - Inverted 6", | |
| 763 | + "price": 18500, | |
| 764 | + "currency": "USD", | |
| 765 | + "url": "https://www.chrono24.com/rolex/daytona-zenith-white-panda-dial-two-tone-gold-and-steel-16523--id45408353.htm", | |
| 766 | + "image": "https://img.chrono24.com/images/uhren/m8kolipd173f-3l9irzf11bejpumxomfkxekb-ExtraLarge.jpg" | |
| 767 | + }, | |
| 768 | + { | |
| 769 | + "name": "Rolex Daytona Paul Newman Yellow Gold Black Dial Red Hand 116518LN Oysterflex 2022 Unworn Full Set", | |
| 770 | + "price": 48000, | |
| 771 | + "currency": "USD", | |
| 772 | + "url": "https://www.chrono24.com/rolex/daytona-paul-newman-yellow-gold-black-dial-red-hand-116518ln-oysterflex--id44772404.htm", | |
| 773 | + "image": "https://img.chrono24.com/images/uhren/44772404-jro97k647kedoj4lytxryttl-ExtraLarge.jpg" | |
| 774 | + }, | |
| 775 | + { | |
| 776 | + "name": "Rolex 40mm Daytona 18K Yellow Gold Cosmograph Yellow Gold Dial Mens Watch 116508", | |
| 777 | + "price": 46499, | |
| 778 | + "currency": "USD", | |
| 779 | + "url": "https://www.chrono24.com/rolex/rolex-40mm-daytona-18k-yellow-gold-cosmograph-yellow-gold-dial-mens-watch-116508--id44302176.htm", | |
| 780 | + "image": "https://img.chrono24.com/images/uhren/44302176-0r93x5gteht151yrx9z1ppyh-ExtraLarge.jpg" | |
| 781 | + }, | |
| 782 | + { | |
| 783 | + "name": "Rolex Daytona ROLEX 116506 DAYTONA ICE BLUE INDEX PLATINUM", | |
| 784 | + "price": 95999, | |
| 785 | + "currency": "USD", | |
| 786 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id46919563.htm", | |
| 787 | + "image": "https://img.chrono24.com/images/uhren/46919563-cg2bynw1va3xx9emrprb7b44-ExtraLarge.jpg" | |
| 788 | + }, | |
| 789 | + { | |
| 790 | + "name": "Rolex Daytona 116515LN", | |
| 791 | + "price": 37000, | |
| 792 | + "currency": "USD", | |
| 793 | + "url": "https://www.chrono24.com/rolex/daytona-116515ln--id47990589.htm", | |
| 794 | + "image": "https://img.chrono24.com/images/uhren/47990589-j0z9lh9dwll83bvjfuyv4o2h-ExtraLarge.jpg" | |
| 795 | + }, | |
| 796 | + { | |
| 797 | + "name": "Rolex Daytona NEW 2026 126500LN White Panda Dial Stainless Steel Ceramic Bezel", | |
| 798 | + "price": 39995, | |
| 799 | + "currency": "USD", | |
| 800 | + "url": "https://www.chrono24.com/rolex/rolex-daytona-new-2026-126500ln-white-panda-dial-stainless-steel-ceramic-bezel--id46670778.htm", | |
| 801 | + "image": "https://img.chrono24.com/images/uhren/46670778-quyj66zw1wv1kyp1lts7gjsh-ExtraLarge.jpg" | |
| 802 | + }, | |
| 803 | + { | |
| 804 | + "name": "Rolex COMPLETE SET Daytona 116500LN White Dial Ceramic Bezel Panda Pre-Owned", | |
| 805 | + "price": 33425, | |
| 806 | + "currency": "USD", | |
| 807 | + "url": "https://www.chrono24.com/rolex/rolex-complete-set-daytona-116500ln-white-dial-ceramic-bezel--panda-pre-owned--id25377812.htm", | |
| 808 | + "image": "https://img.chrono24.com/images/uhren/25377812-mlosxjbhnx4hg9sy0hp2d07j-ExtraLarge.jpg" | |
| 809 | + }, | |
| 810 | + { | |
| 811 | + "name": "Rolex 2001 Daytona 40mm 16523 Two-Tone White Dial", | |
| 812 | + "price": 16425, | |
| 813 | + "currency": "USD", | |
| 814 | + "url": "https://www.chrono24.com/rolex/rolex-2001-daytona-40mm-16523-two-tone-white-dial--id48418475.htm", | |
| 815 | + "image": "https://img.chrono24.com/images/uhren/48418475-lujy1izlh4rn50gjfqkfk7b4-ExtraLarge.jpg" | |
| 816 | + }, | |
| 817 | + { | |
| 818 | + "name": "Rolex Daytona Yellow Gold MOP Baguette Diamond Bezel Watch Service card included", | |
| 819 | + "price": 145000, | |
| 820 | + "currency": "USD", | |
| 821 | + "url": "https://www.chrono24.com/rolex/rolex-daytona-yellow-gold-mop-baguette-diamond-bezel-watch--id45885756.htm", | |
| 822 | + "image": "https://img.chrono24.com/images/uhren/45885756-sogovyhbgneex20d9tg1k193-ExtraLarge.jpg" | |
| 823 | + }, | |
| 824 | + { | |
| 825 | + "name": "Rolex Daytona 2025 Cosmograph 40mm Black Dial Black Ceramic Bezel", | |
| 826 | + "price": 30795, | |
| 827 | + "currency": "USD", | |
| 828 | + "url": "https://www.chrono24.com/rolex/rolex-daytona--id48341551.htm", | |
| 829 | + "image": "https://img.chrono24.com/images/uhren/48341551-cc2qg78fb1sweaj3517py5p6-ExtraLarge.jpg" | |
| 830 | + }, | |
| 831 | + { | |
| 832 | + "name": "Rolex UNWORN 126506 Daytona Platinum Ice Blue Baguette Dial 40mm Oyster Bracelet Ceramic Full Set, Unworn Complete Box & Papers", | |
| 833 | + "price": 147425, | |
| 834 | + "currency": "USD", | |
| 835 | + "url": "https://www.chrono24.com/rolex/rolex-unworn-126506-daytona-platinum-ice-blue-baguette-dial-40mm-oyster-bracelet-ceramic--id48361793.htm", | |
| 836 | + "image": "https://img.chrono24.com/images/uhren/48361793-nibc4jv7kj4t9yfzuhatqrv7-ExtraLarge.jpg" | |
| 837 | + }, | |
| 838 | + { | |
| 839 | + "name": "Rolex 2024 Card Rolex Daytona Cosmograph 126500ln Black 40mm Steel Oyster Watch", | |
| 840 | + "price": 29790, | |
| 841 | + "currency": "USD", | |
| 842 | + "url": "https://www.chrono24.com/rolex/2024-card-rolex-daytona-cosmograph-126500ln-black-40mm-steel-oyster-watch--id47901365.htm", | |
| 843 | + "image": "https://img.chrono24.com/images/uhren/47901365-99g2hq2o7717h17jhldjrp3l-ExtraLarge.jpg" | |
| 844 | + }, | |
| 845 | + { | |
| 846 | + "name": "Rolex UNWORN COMPLETE SET Daytona 116505 Chocolate Index Dial Rose Gold Oyster Bracelet 40mm Full Set, Unworn Complete Box & Papers", | |
| 847 | + "price": 65425, | |
| 848 | + "currency": "USD", | |
| 849 | + "url": "https://www.chrono24.com/rolex/rolex-unworn-complete-set-daytona-116505-chocolate-index-dial-rose-gold-oyster-bracelet-40mm--id33444926.htm", | |
| 850 | + "image": "https://img.chrono24.com/images/uhren/33444926-udhz962w6vv1dz76ls1aovhw-ExtraLarge.jpg" | |
| 851 | + } | |
| 852 | + ], | |
| 853 | + "totalListings": 674080 | |
| 854 | + } | |
| 855 | + }, | |
| 856 | + "expect": { | |
| 857 | + "minCount": 10, | |
| 858 | + "kinds": [ | |
| 859 | + "listing" | |
| 860 | + ] | |
| 861 | + }, | |
| 862 | + "note": "captured live from https://www.chrono24.com/rolex/daytona--mod2.htm", | |
| 863 | + "capturedAt": "2026-09-07T04:42:04.684Z" | |
| 864 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/comicconnect/sold-comics-page-1.json
+285 −0
@@ -0,0 +1,285 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.comicconnect.com/browse/comics/?filtertype=Sold&sort_type=ended_desc&page=1", | |
| 4 | + "externalId": "sold:/browse/comics/:1", | |
| 5 | + "kind": "sale", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:39:30.572Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "sold_page", | |
| 10 | + "url": "https://www.comicconnect.com/browse/comics/?filtertype=Sold&sort_type=ended_desc&page=1", | |
| 11 | + "page": 1, | |
| 12 | + "totalResults": 479121, | |
| 13 | + "cards": [ | |
| 14 | + { | |
| 15 | + "itemId": "1101270", | |
| 16 | + "url": "https://www.comicconnect.com/item/1101270", | |
| 17 | + "title": "YOUNG AVENGERS (2005-06) #1", | |
| 18 | + "gradeLine": "Marvel CGC NM/M: 9.8", | |
| 19 | + "soldOn": "Friday, 08/14/2026 12:23 AM", | |
| 20 | + "soldFor": 187.45, | |
| 21 | + "saleType": "auction", | |
| 22 | + "buyersPremium": true, | |
| 23 | + "noReserve": true, | |
| 24 | + "comments": "white pages 1st app. of Young Avengers", | |
| 25 | + "image": "https://www.comicconnect.com/coverimages/gallery425/you41-36.jpg" | |
| 26 | + }, | |
| 27 | + { | |
| 28 | + "itemId": "1101285", | |
| 29 | + "url": "https://www.comicconnect.com/item/1101285", | |
| 30 | + "title": "X-MEN (1963-2011) #282", | |
| 31 | + "gradeLine": "Marvel CGC NM/M: 9.8", | |
| 32 | + "soldOn": "Friday, 08/14/2026 12:23 AM", | |
| 33 | + "soldFor": 80, | |
| 34 | + "saleType": "auction", | |
| 35 | + "buyersPremium": true, | |
| 36 | + "noReserve": true, | |
| 37 | + "comments": "white pages 1st app. of Bishop, Malcolm & Randall; COMIC BOOK IMPACT rating of 6 (CBI)", | |
| 38 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27329.jpg" | |
| 39 | + }, | |
| 40 | + { | |
| 41 | + "itemId": "1103869", | |
| 42 | + "url": "https://www.comicconnect.com/item/1103869", | |
| 43 | + "title": "X-MEN: AGE OF APOCALYPSE GROUP LOT #1 Comic Book Group Lot", | |
| 44 | + "gradeLine": "Marvel NM: 9.4", | |
| 45 | + "soldOn": "Friday, 08/14/2026 12:23 AM", | |
| 46 | + "soldFor": 47, | |
| 47 | + "saleType": "auction", | |
| 48 | + "buyersPremium": true, | |
| 49 | + "noReserve": true, | |
| 50 | + "comments": "40 Comic Group Lot; 12 Age of Apocalypse Titles covering most of the event, see below for Title/Issue info; Avg Grade 9.2/9.4+", | |
| 51 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m190-1.jpg" | |
| 52 | + }, | |
| 53 | + { | |
| 54 | + "itemId": "1103760", | |
| 55 | + "url": "https://www.comicconnect.com/item/1103760", | |
| 56 | + "title": "YOUNG AVENGERS (2005-06) #12", | |
| 57 | + "gradeLine": "Marvel CGC NM/M: 9.8", | |
| 58 | + "soldOn": "Friday, 08/14/2026 12:21 AM", | |
| 59 | + "soldFor": 50, | |
| 60 | + "saleType": "auction", | |
| 61 | + "buyersPremium": true, | |
| 62 | + "noReserve": true, | |
| 63 | + "comments": "white pages", | |
| 64 | + "image": "https://www.comicconnect.com/coverimages/gallery425/you41-38.jpg" | |
| 65 | + }, | |
| 66 | + { | |
| 67 | + "itemId": "1101272", | |
| 68 | + "url": "https://www.comicconnect.com/item/1101272", | |
| 69 | + "title": "YOUNG AVENGERS (2005-06) #6", | |
| 70 | + "gradeLine": "Marvel CGC NM/M: 9.8", | |
| 71 | + "soldOn": "Friday, 08/14/2026 12:21 AM", | |
| 72 | + "soldFor": 51, | |
| 73 | + "saleType": "auction", | |
| 74 | + "buyersPremium": true, | |
| 75 | + "noReserve": true, | |
| 76 | + "comments": "white pages Jim Cheung/John Dell cover/art; Avengers app.", | |
| 77 | + "image": "https://www.comicconnect.com/coverimages/gallery425/you41-37.jpg" | |
| 78 | + }, | |
| 79 | + { | |
| 80 | + "itemId": "1101276", | |
| 81 | + "url": "https://www.comicconnect.com/item/1101276", | |
| 82 | + "title": "X-MEN (1991-2012) #30", | |
| 83 | + "gradeLine": "Marvel CGC NM/M: 9.8", | |
| 84 | + "soldOn": "Friday, 08/14/2026 12:21 AM", | |
| 85 | + "soldFor": 104, | |
| 86 | + "saleType": "auction", | |
| 87 | + "buyersPremium": true, | |
| 88 | + "noReserve": true, | |
| 89 | + "comments": "off-white to white pages; Newsstand Edition wedding of Jean Grey & Scott Summers; Comic Book Impact rating of 6 (CBI)", | |
| 90 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m13-922.jpg" | |
| 91 | + }, | |
| 92 | + { | |
| 93 | + "itemId": "1103810", | |
| 94 | + "url": "https://www.comicconnect.com/item/1103810", | |
| 95 | + "title": "X-MEN GROUP LOT #1 Comic Book Group Lot", | |
| 96 | + "gradeLine": "Marvel VF/NM: 9.0", | |
| 97 | + "soldOn": "Friday, 08/14/2026 12:21 AM", | |
| 98 | + "soldFor": 31, | |
| 99 | + "saleType": "auction", | |
| 100 | + "buyersPremium": true, | |
| 101 | + "noReserve": true, | |
| 102 | + "comments": "24 Comic Group Lot; Incl. Bishop, Magik & X-Force #1; Avg Grade 9.2/9.4", | |
| 103 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m88-75.jpg" | |
| 104 | + }, | |
| 105 | + { | |
| 106 | + "itemId": "1102138", | |
| 107 | + "url": "https://www.comicconnect.com/item/1102138", | |
| 108 | + "title": "YEAR OF THE VILLAIN: HELL ARISEN #3", | |
| 109 | + "gradeLine": "DC CGC NM/M: 9.8", | |
| 110 | + "soldOn": "Friday, 08/14/2026 12:19 AM", | |
| 111 | + "soldFor": 67, | |
| 112 | + "saleType": "auction", | |
| 113 | + "buyersPremium": true, | |
| 114 | + "noReserve": true, | |
| 115 | + "comments": "white pages Steve Epting/Javier Fernandez art; 1st full app. of Punchline (Alexis Kaye) (4/20)", | |
| 116 | + "image": "https://www.comicconnect.com/coverimages/gallery425/yea2-7_1.jpg" | |
| 117 | + }, | |
| 118 | + { | |
| 119 | + "itemId": "1103460", | |
| 120 | + "url": "https://www.comicconnect.com/item/1103460", | |
| 121 | + "title": "X-MEN 2099 (1993-96) #1 Comic Book Group Lot", | |
| 122 | + "gradeLine": "Marvel VF/NM: 9.0", | |
| 123 | + "soldOn": "Friday, 08/14/2026 12:19 AM", | |
| 124 | + "soldFor": 24, | |
| 125 | + "saleType": "auction", | |
| 126 | + "buyersPremium": true, | |
| 127 | + "noReserve": true, | |
| 128 | + "comments": "45 Comic Group Lot; Includes ; Avg Grade 8.5/9.0", | |
| 129 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m12-43.jpg" | |
| 130 | + }, | |
| 131 | + { | |
| 132 | + "itemId": "1103824", | |
| 133 | + "url": "https://www.comicconnect.com/item/1103824", | |
| 134 | + "title": "X-MEN GROUP LOT #1 Comic Book Group Lot", | |
| 135 | + "gradeLine": "Marvel VF/NM: 9.0", | |
| 136 | + "soldOn": "Friday, 08/14/2026 12:19 AM", | |
| 137 | + "soldFor": 24, | |
| 138 | + "saleType": "auction", | |
| 139 | + "buyersPremium": true, | |
| 140 | + "noReserve": true, | |
| 141 | + "comments": "44 Comic Group Lot; Incl. Astonishing X-Men, Ultimate X-Men, Mutant X and X-Force, see below for all Title/Issue info; Avg Grade 8.5/9.0", | |
| 142 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m88-76.jpg" | |
| 143 | + }, | |
| 144 | + { | |
| 145 | + "itemId": "1104560", | |
| 146 | + "url": "https://www.comicconnect.com/item/1104560", | |
| 147 | + "title": "X-MEN (1963-2011) #176 Comic Book Group Lot", | |
| 148 | + "gradeLine": "Marvel VF-: 7.5", | |
| 149 | + "soldOn": "Friday, 08/14/2026 12:19 AM", | |
| 150 | + "soldFor": 98, | |
| 151 | + "saleType": "auction", | |
| 152 | + "buyersPremium": true, | |
| 153 | + "noReserve": true, | |
| 154 | + "comments": "47 Comic Group Lot; Keys Include. #239(x2), 244, 184, 256, 281-283, 294 and a lot more! See below for all issues; Avg Grade 7.0/7.5", | |
| 155 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27434.jpg" | |
| 156 | + }, | |
| 157 | + { | |
| 158 | + "itemId": "1103765", | |
| 159 | + "url": "https://www.comicconnect.com/item/1103765", | |
| 160 | + "title": "X-MEN (1991-2012) #24 Comic Book Group Lot", | |
| 161 | + "gradeLine": "Marvel NM: 9.4", | |
| 162 | + "soldOn": "Friday, 08/14/2026 12:19 AM", | |
| 163 | + "soldFor": 30, | |
| 164 | + "saleType": "auction", | |
| 165 | + "buyersPremium": true, | |
| 166 | + "noReserve": true, | |
| 167 | + "comments": "Group lot of 35 issues of the X-Men (1991) series; see below for full issue list; average grade 9.4", | |
| 168 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m13-925.jpg" | |
| 169 | + }, | |
| 170 | + { | |
| 171 | + "itemId": "1101287", | |
| 172 | + "url": "https://www.comicconnect.com/item/1101287", | |
| 173 | + "title": "X-MEN (1991-2012) #4", | |
| 174 | + "gradeLine": "Marvel CGC NM/M: 9.8", | |
| 175 | + "soldOn": "Friday, 08/14/2026 12:17 AM", | |
| 176 | + "soldFor": 102, | |
| 177 | + "saleType": "auction", | |
| 178 | + "buyersPremium": true, | |
| 179 | + "noReserve": true, | |
| 180 | + "comments": "white pages Jim Lee cover/art; Scott Williams/John Byrne inks; 1st app. Omega Red; Comic Book Impact rating of 6 (CBI)", | |
| 181 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m13-923.jpg" | |
| 182 | + }, | |
| 183 | + { | |
| 184 | + "itemId": "1103767", | |
| 185 | + "url": "https://www.comicconnect.com/item/1103767", | |
| 186 | + "title": "X-MEN (1991-2012) #77 Comic Book Group Lot", | |
| 187 | + "gradeLine": "Marvel NM: 9.4", | |
| 188 | + "soldOn": "Friday, 08/14/2026 12:17 AM", | |
| 189 | + "soldFor": 20, | |
| 190 | + "saleType": "auction", | |
| 191 | + "buyersPremium": true, | |
| 192 | + "noReserve": true, | |
| 193 | + "comments": "Group lot of 40 issues of the X-Men (1991) series; see below for full issue list; average grade 9.4", | |
| 194 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m13-926.jpg" | |
| 195 | + }, | |
| 196 | + { | |
| 197 | + "itemId": "1103986", | |
| 198 | + "url": "https://www.comicconnect.com/item/1103986", | |
| 199 | + "title": "X-MEN (1963-2011) #121 Comic Book Group Lot", | |
| 200 | + "gradeLine": "Marvel VF: 8.0", | |
| 201 | + "soldOn": "Friday, 08/14/2026 12:17 AM", | |
| 202 | + "soldFor": 357.65, | |
| 203 | + "saleType": "auction", | |
| 204 | + "buyersPremium": true, | |
| 205 | + "noReserve": true, | |
| 206 | + "comments": "Group lot of 9 Bronze Age issues: #121-128, 130; John Byrne art! average grade: 8.0; estimated BV: $400+", | |
| 207 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27406.jpg" | |
| 208 | + }, | |
| 209 | + { | |
| 210 | + "itemId": "1102950", | |
| 211 | + "url": "https://www.comicconnect.com/item/1102950", | |
| 212 | + "title": "X-MEN (1963-2011) #173 Comic Book Group Lot", | |
| 213 | + "gradeLine": "Marvel VF-: 7.5", | |
| 214 | + "soldOn": "Friday, 08/14/2026 12:17 AM", | |
| 215 | + "soldFor": 84, | |
| 216 | + "saleType": "auction", | |
| 217 | + "buyersPremium": true, | |
| 218 | + "noReserve": true, | |
| 219 | + "comments": "28 Comic Book Group Lot; Includes #170-180, 182, 187, 190, 284-293, 297-299, 325 Special edition; Avg Grade 7.0/7.5", | |
| 220 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27340.jpg" | |
| 221 | + }, | |
| 222 | + { | |
| 223 | + "itemId": "1103887", | |
| 224 | + "url": "https://www.comicconnect.com/item/1103887", | |
| 225 | + "title": "X-MEN (1991-2012) #1 Comic Book Group Lot", | |
| 226 | + "gradeLine": "Marvel NM-: 9.2", | |
| 227 | + "soldOn": "Friday, 08/14/2026 12:17 AM", | |
| 228 | + "soldFor": 140, | |
| 229 | + "saleType": "auction", | |
| 230 | + "buyersPremium": true, | |
| 231 | + "noReserve": true, | |
| 232 | + "comments": "99 Comic Group Lot; Has #1-91, includes #1 variants & Annuals '93, '95, '96, '97; Avg Grade 9.0/9.2 Jim Lee cover/art; 1st app of the Acolytes; 1st team app of X-Men Gold/Blue; 4 different variants exist to form a single image.", | |
| 233 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m13-928.jpg" | |
| 234 | + }, | |
| 235 | + { | |
| 236 | + "itemId": "1103850", | |
| 237 | + "url": "https://www.comicconnect.com/item/1103850", | |
| 238 | + "title": "X-MEN (1963-2011) #282", | |
| 239 | + "gradeLine": "Marvel CGC NM/M: 9.8", | |
| 240 | + "soldOn": "Friday, 08/14/2026 12:15 AM", | |
| 241 | + "soldFor": 112, | |
| 242 | + "saleType": "auction", | |
| 243 | + "buyersPremium": true, | |
| 244 | + "noReserve": true, | |
| 245 | + "comments": "white pages 1st app. of Bishop, Malcolm & Randall; COMIC BOOK IMPACT rating of 6 (CBI)", | |
| 246 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27361.jpg" | |
| 247 | + }, | |
| 248 | + { | |
| 249 | + "itemId": "1104032", | |
| 250 | + "url": "https://www.comicconnect.com/item/1104032", | |
| 251 | + "title": "X-MEN (1963-2011) #67 Comic Book Group Lot", | |
| 252 | + "gradeLine": "Marvel F/VF: 7.0", | |
| 253 | + "soldOn": "Friday, 08/14/2026 12:15 AM", | |
| 254 | + "soldFor": 640.55, | |
| 255 | + "saleType": "auction", | |
| 256 | + "buyersPremium": true, | |
| 257 | + "noReserve": true, | |
| 258 | + "comments": "Lot of 15 X-Men comics including #67-80,82; the first-half of the X-Men reprints!; Average Grade: 7.0; Grade range: 5.0-9.0", | |
| 259 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27419.jpg" | |
| 260 | + }, | |
| 261 | + { | |
| 262 | + "itemId": "1103979", | |
| 263 | + "url": "https://www.comicconnect.com/item/1103979", | |
| 264 | + "title": "X-MEN (1963-2011) #105", | |
| 265 | + "gradeLine": "Marvel VF/NM: 9.0", | |
| 266 | + "soldOn": "Friday, 08/14/2026 12:15 AM", | |
| 267 | + "soldFor": 52, | |
| 268 | + "saleType": "auction", | |
| 269 | + "buyersPremium": true, | |
| 270 | + "noReserve": true, | |
| 271 | + "comments": "Dave Cockrum cover; Claremont/Cockrum cameo; COMIC BOOK RATING of 7 (CBI)", | |
| 272 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27401.jpg" | |
| 273 | + } | |
| 274 | + ] | |
| 275 | + } | |
| 276 | + }, | |
| 277 | + "expect": { | |
| 278 | + "minCount": 10, | |
| 279 | + "kinds": [ | |
| 280 | + "sale" | |
| 281 | + ] | |
| 282 | + }, | |
| 283 | + "note": "captured live from https://www.comicconnect.com/browse/comics/?filtertype=Sold&sort_type=ended_desc&page=1", | |
| 284 | + "capturedAt": "2026-09-07T04:39:30.615Z" | |
| 285 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/comicconnect/sold-comics-page-2.json
+285 −0
@@ -0,0 +1,285 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.comicconnect.com/browse/comics/?filtertype=Sold&sort_type=ended_desc&page=2", | |
| 4 | + "externalId": "sold:/browse/comics/:2", | |
| 5 | + "kind": "sale", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:39:35.808Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "sold_page", | |
| 10 | + "url": "https://www.comicconnect.com/browse/comics/?filtertype=Sold&sort_type=ended_desc&page=2", | |
| 11 | + "page": 2, | |
| 12 | + "totalResults": 479121, | |
| 13 | + "cards": [ | |
| 14 | + { | |
| 15 | + "itemId": "1102887", | |
| 16 | + "url": "https://www.comicconnect.com/item/1102887", | |
| 17 | + "title": "X-MEN (1963-2011) #282", | |
| 18 | + "gradeLine": "Marvel CGC NM: 9.4", | |
| 19 | + "soldOn": "Friday, 08/14/2026 12:15 AM", | |
| 20 | + "soldFor": 40, | |
| 21 | + "saleType": "auction", | |
| 22 | + "buyersPremium": true, | |
| 23 | + "noReserve": true, | |
| 24 | + "comments": "white pages 1st app. of Bishop, Malcolm & Randall; COMIC BOOK IMPACT rating of 6 (CBI)", | |
| 25 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27336.jpg" | |
| 26 | + }, | |
| 27 | + { | |
| 28 | + "itemId": "1102864", | |
| 29 | + "url": "https://www.comicconnect.com/item/1102864", | |
| 30 | + "title": "X-MEN (1963-2011) #266", | |
| 31 | + "gradeLine": "Marvel CGC NM: 9.4", | |
| 32 | + "soldOn": "Friday, 08/14/2026 12:13 AM", | |
| 33 | + "soldFor": 180.55, | |
| 34 | + "saleType": "auction", | |
| 35 | + "buyersPremium": true, | |
| 36 | + "noReserve": true, | |
| 37 | + "comments": "white pages; Newsstand Edition 1st full app of Gambit, Mystique app; Andy Kubert cover", | |
| 38 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27335.jpg" | |
| 39 | + }, | |
| 40 | + { | |
| 41 | + "itemId": "1102948", | |
| 42 | + "url": "https://www.comicconnect.com/item/1102948", | |
| 43 | + "title": "X-MEN (1963-2011) #158 Comic Book Group Lot", | |
| 44 | + "gradeLine": "Marvel VF-: 7.5", | |
| 45 | + "soldOn": "Friday, 08/14/2026 12:13 AM", | |
| 46 | + "soldFor": 76, | |
| 47 | + "saleType": "auction", | |
| 48 | + "buyersPremium": true, | |
| 49 | + "noReserve": true, | |
| 50 | + "comments": "18 Comic Book Group Lot; Includes #151-166, 168-169, All Newsstand Editions; Avg Grade 7.0/7.5", | |
| 51 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27339.jpg" | |
| 52 | + }, | |
| 53 | + { | |
| 54 | + "itemId": "1103980", | |
| 55 | + "url": "https://www.comicconnect.com/item/1103980", | |
| 56 | + "title": "X-MEN (1963-2011) #95 Comic Book Group Lot", | |
| 57 | + "gradeLine": "Marvel VG/F: 5.0", | |
| 58 | + "soldOn": "Friday, 08/14/2026 12:13 AM", | |
| 59 | + "soldFor": 443.9, | |
| 60 | + "saleType": "auction", | |
| 61 | + "buyersPremium": true, | |
| 62 | + "noReserve": true, | |
| 63 | + "comments": "Group lot of 8 classic Bronze Age issues: #95-97, 99, 100, 102, 104, 106 (#97 & 100 are UK PRICE VARIANTS); includes 1st appearance of Havok! average grade: 5.0/5.5; estimated BV: $250+", | |
| 64 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27402.jpg" | |
| 65 | + }, | |
| 66 | + { | |
| 67 | + "itemId": "1102863", | |
| 68 | + "url": "https://www.comicconnect.com/item/1102863", | |
| 69 | + "title": "X-MEN (1963-2011) #140", | |
| 70 | + "gradeLine": "Marvel CGC NM/M: 9.8", | |
| 71 | + "soldOn": "Friday, 08/14/2026 12:11 AM", | |
| 72 | + "soldFor": 112, | |
| 73 | + "saleType": "auction", | |
| 74 | + "buyersPremium": true, | |
| 75 | + "noReserve": true, | |
| 76 | + "comments": "ow/white pages John Byrne cover/art; Alpha Flight disbands, Wendigo battle cover; COMIC BOOK IMPACT rating of 7 (CBI)", | |
| 77 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27334.jpg" | |
| 78 | + }, | |
| 79 | + { | |
| 80 | + "itemId": "1103994", | |
| 81 | + "url": "https://www.comicconnect.com/item/1103994", | |
| 82 | + "title": "X-MEN (1963-2011) #131 Comic Book Group Lot", | |
| 83 | + "gradeLine": "Marvel VF/VF+: 8.2", | |
| 84 | + "soldOn": "Friday, 08/14/2026 12:11 AM", | |
| 85 | + "soldFor": 299, | |
| 86 | + "saleType": "auction", | |
| 87 | + "buyersPremium": true, | |
| 88 | + "noReserve": true, | |
| 89 | + "comments": "Group lot of 7 issues: #131-137;The Dark Phoenix Saga Parts 3-9; John Byrne art; avg grade: 8.0/8.5; estimated BV: $300+", | |
| 90 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27408.jpg" | |
| 91 | + }, | |
| 92 | + { | |
| 93 | + "itemId": "1099215", | |
| 94 | + "url": "https://www.comicconnect.com/item/1099215", | |
| 95 | + "title": "X-MEN (1963-2011) #129", | |
| 96 | + "gradeLine": "Marvel CGC FN+: 6.5", | |
| 97 | + "soldOn": "Friday, 08/14/2026 12:11 AM", | |
| 98 | + "soldFor": 84, | |
| 99 | + "saleType": "auction", | |
| 100 | + "buyersPremium": true, | |
| 101 | + "noReserve": true, | |
| 102 | + "comments": "white pages; Newsstand Edition 1st app of Kitty Pryde; 1st app of Emma Frost; 1st team app of Hellfire Club (in shadows); Dark Phoenix saga Part 1, Byrne cover; COMIC BOOK IMPACT rating of 8 (CBI)", | |
| 103 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27291.jpg" | |
| 104 | + }, | |
| 105 | + { | |
| 106 | + "itemId": "1103995", | |
| 107 | + "url": "https://www.comicconnect.com/item/1103995", | |
| 108 | + "title": "X-MEN (1963-2011) #138 Comic Book Group Lot", | |
| 109 | + "gradeLine": "Marvel VF++: 8.8", | |
| 110 | + "soldOn": "Friday, 08/14/2026 12:11 AM", | |
| 111 | + "soldFor": 213.9, | |
| 112 | + "saleType": "auction", | |
| 113 | + "buyersPremium": true, | |
| 114 | + "noReserve": true, | |
| 115 | + "comments": "Group lot of six Bronze Age issues: #128-144; Days of Future Past; John Byrne art; avg grade: 8.5+; estimated BV: $350+", | |
| 116 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27409.jpg" | |
| 117 | + }, | |
| 118 | + { | |
| 119 | + "itemId": "1102891", | |
| 120 | + "url": "https://www.comicconnect.com/item/1102891", | |
| 121 | + "title": "X-MEN (1963-2011) #131", | |
| 122 | + "gradeLine": "Marvel CGC VF-: 7.5", | |
| 123 | + "soldOn": "Friday, 08/14/2026 12:10 AM", | |
| 124 | + "soldFor": 49, | |
| 125 | + "saleType": "auction", | |
| 126 | + "buyersPremium": true, | |
| 127 | + "noReserve": true, | |
| 128 | + "comments": "ow pages Byrne cvr/art; 2nd Dazzler, Emma Frost app; COMIC BOOK IMPACT rating of 6 (CBI)", | |
| 129 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27337.jpg" | |
| 130 | + }, | |
| 131 | + { | |
| 132 | + "itemId": "1099967", | |
| 133 | + "url": "https://www.comicconnect.com/item/1099967", | |
| 134 | + "title": "X-MEN (1963-2011) #112", | |
| 135 | + "gradeLine": "Marvel CGC F/VF: 7.0", | |
| 136 | + "soldOn": "Friday, 08/14/2026 12:10 AM", | |
| 137 | + "soldFor": 36, | |
| 138 | + "saleType": "auction", | |
| 139 | + "buyersPremium": true, | |
| 140 | + "noReserve": true, | |
| 141 | + "comments": "ow/white pages classic Perez cover, Byrne art; Magneto app; COMIC BOOK IMPACT rating of 7 (CBI)", | |
| 142 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27308.jpg" | |
| 143 | + }, | |
| 144 | + { | |
| 145 | + "itemId": "1103982", | |
| 146 | + "url": "https://www.comicconnect.com/item/1103982", | |
| 147 | + "title": "X-MEN (1963-2011) #111", | |
| 148 | + "gradeLine": "Marvel VF/NM: 9.0", | |
| 149 | + "soldOn": "Friday, 08/14/2026 12:10 AM", | |
| 150 | + "soldFor": 41, | |
| 151 | + "saleType": "auction", | |
| 152 | + "buyersPremium": true, | |
| 153 | + "noReserve": true, | |
| 154 | + "comments": "Byrne art; Cockrum bondage cover; COMIC BOOK IMPACT rating of 6 (CBI)", | |
| 155 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27403.jpg" | |
| 156 | + }, | |
| 157 | + { | |
| 158 | + "itemId": "1103764", | |
| 159 | + "url": "https://www.comicconnect.com/item/1103764", | |
| 160 | + "title": "X-MEN (1963-2011) #109", | |
| 161 | + "gradeLine": "Marvel CGC VF+: 8.5", | |
| 162 | + "soldOn": "Friday, 08/14/2026 12:07 AM", | |
| 163 | + "soldFor": 140, | |
| 164 | + "saleType": "auction", | |
| 165 | + "buyersPremium": true, | |
| 166 | + "noReserve": true, | |
| 167 | + "comments": "white pages; Signature Series: Chris Claremont 1st app of Weapon Alpha (later becomes Guardian); Dave Cockrum cover; John Byrne art", | |
| 168 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27357.jpg" | |
| 169 | + }, | |
| 170 | + { | |
| 171 | + "itemId": "1103983", | |
| 172 | + "url": "https://www.comicconnect.com/item/1103983", | |
| 173 | + "title": "X-MEN (1963-2011) #104 Comic Book Group Lot", | |
| 174 | + "gradeLine": "Marvel FN: 6.0", | |
| 175 | + "soldOn": "Friday, 08/14/2026 12:07 AM", | |
| 176 | + "soldFor": 266.8, | |
| 177 | + "saleType": "auction", | |
| 178 | + "buyersPremium": true, | |
| 179 | + "noReserve": true, | |
| 180 | + "comments": "Group lot of 13 Bronze Age issues #104, 107-110, 112-119; John Byrne art! avg grade: 6.0/6.5; estimated BV: $325+", | |
| 181 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27404.jpg" | |
| 182 | + }, | |
| 183 | + { | |
| 184 | + "itemId": "1104035", | |
| 185 | + "url": "https://www.comicconnect.com/item/1104035", | |
| 186 | + "title": "X-MEN (1963-2011) #80 Comic Book Group Lot", | |
| 187 | + "gradeLine": "Marvel VG/F: 5.0", | |
| 188 | + "soldOn": "Friday, 08/14/2026 12:07 AM", | |
| 189 | + "soldFor": 207, | |
| 190 | + "saleType": "auction", | |
| 191 | + "buyersPremium": true, | |
| 192 | + "noReserve": true, | |
| 193 | + "comments": "Lot of 14 X-Men comics including #80-93; the second-half of the X-Men reprints!; Average Grade: 5.0; Grade Range: 2.5-6.5", | |
| 194 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27420.jpg" | |
| 195 | + }, | |
| 196 | + { | |
| 197 | + "itemId": "1103763", | |
| 198 | + "url": "https://www.comicconnect.com/item/1103763", | |
| 199 | + "title": "X-MEN (1963-2011) #108", | |
| 200 | + "gradeLine": "Marvel CGC VF: 8.0", | |
| 201 | + "soldOn": "Friday, 08/14/2026 12:07 AM", | |
| 202 | + "soldFor": 65, | |
| 203 | + "saleType": "auction", | |
| 204 | + "buyersPremium": true, | |
| 205 | + "noReserve": true, | |
| 206 | + "comments": "white pages Dave Cockrum cvr; John Byrne art begins; Corsair revealed as father of Cyclops & Havok; COMIC BOOK IMPACT rating of 7 (CBI)", | |
| 207 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27356.jpg" | |
| 208 | + }, | |
| 209 | + { | |
| 210 | + "itemId": "1103972", | |
| 211 | + "url": "https://www.comicconnect.com/item/1103972", | |
| 212 | + "title": "X-MEN (1963-2011) #57 Comic Book Group Lot", | |
| 213 | + "gradeLine": "Marvel FN-: 5.5", | |
| 214 | + "soldOn": "Friday, 08/14/2026 12:05 AM", | |
| 215 | + "soldFor": 278.3, | |
| 216 | + "saleType": "auction", | |
| 217 | + "buyersPremium": true, | |
| 218 | + "noReserve": true, | |
| 219 | + "comments": "Group lot of 5 classic Neal Adams Silver Age issues: #57-60, 62; includes 1st appearance of Havok! average grade: 5.5; estimated BV: $250+", | |
| 220 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27397.jpg" | |
| 221 | + }, | |
| 222 | + { | |
| 223 | + "itemId": "1104014", | |
| 224 | + "url": "https://www.comicconnect.com/item/1104014", | |
| 225 | + "title": "X-MEN (1963-2011) #64", | |
| 226 | + "gradeLine": "Marvel VG: 4.0", | |
| 227 | + "soldOn": "Friday, 08/14/2026 12:05 AM", | |
| 228 | + "soldFor": 44, | |
| 229 | + "saleType": "auction", | |
| 230 | + "buyersPremium": true, | |
| 231 | + "noReserve": true, | |
| 232 | + "comments": "1st app. Sunfire; COMIC BOOK IMPACT rating of 7 (CBI)", | |
| 233 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27415.jpg" | |
| 234 | + }, | |
| 235 | + { | |
| 236 | + "itemId": "1103963", | |
| 237 | + "url": "https://www.comicconnect.com/item/1103963", | |
| 238 | + "title": "X-MEN (1963-2011) #50", | |
| 239 | + "gradeLine": "Marvel G/VG: 3.0", | |
| 240 | + "soldOn": "Friday, 08/14/2026 12:05 AM", | |
| 241 | + "soldFor": 135, | |
| 242 | + "saleType": "auction", | |
| 243 | + "buyersPremium": true, | |
| 244 | + "noReserve": true, | |
| 245 | + "comments": "Steranko cover/art; 2nd app. Polaris; origin of Beast, New X-Men logo; COMIC BOOK IMPACT rating of 7 (CBI)", | |
| 246 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27393.jpg" | |
| 247 | + }, | |
| 248 | + { | |
| 249 | + "itemId": "1104024", | |
| 250 | + "url": "https://www.comicconnect.com/item/1104024", | |
| 251 | + "title": "X-MEN (1963-2011) #65", | |
| 252 | + "gradeLine": "Marvel VF-: 7.5", | |
| 253 | + "soldOn": "Friday, 08/14/2026 12:03 AM", | |
| 254 | + "soldFor": 59, | |
| 255 | + "saleType": "auction", | |
| 256 | + "buyersPremium": true, | |
| 257 | + "noReserve": true, | |
| 258 | + "comments": "off-white to white pages Adams art; comic BOOK IMPACT rating of 6 (CBI)", | |
| 259 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27417.jpg" | |
| 260 | + }, | |
| 261 | + { | |
| 262 | + "itemId": "1104020", | |
| 263 | + "url": "https://www.comicconnect.com/item/1104020", | |
| 264 | + "title": "X-MEN (1963-2011) #62", | |
| 265 | + "gradeLine": "Marvel VF-: 7.5", | |
| 266 | + "soldOn": "Friday, 08/14/2026 12:03 AM", | |
| 267 | + "soldFor": 65, | |
| 268 | + "saleType": "auction", | |
| 269 | + "buyersPremium": true, | |
| 270 | + "noReserve": true, | |
| 271 | + "comments": "off-white to white pages Neal Adams cover/art; 1st team app of the Savage Land Mutates; 1st time Magneto removed helmet; COMIC BOOK IMPACT rating of 6 (CBI)", | |
| 272 | + "image": "https://www.comicconnect.com/coverimages/gallery425/x-m1-27416.jpg" | |
| 273 | + } | |
| 274 | + ] | |
| 275 | + } | |
| 276 | + }, | |
| 277 | + "expect": { | |
| 278 | + "minCount": 10, | |
| 279 | + "kinds": [ | |
| 280 | + "sale" | |
| 281 | + ] | |
| 282 | + }, | |
| 283 | + "note": "captured live from https://www.comicconnect.com/browse/comics/?filtertype=Sold&sort_type=ended_desc&page=2", | |
| 284 | + "capturedAt": "2026-09-07T04:39:35.829Z" | |
| 285 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/goldin/item-sold-page.json
+40 −0
@@ -0,0 +1,40 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://goldin.co/item/exceptional-1930s-babe-ruth-signed-bat-psa-dnaibzy1", | |
| 4 | + "externalId": "exceptional-1930s-babe-ruth-signed-bat-psa-dnaibzy1", | |
| 5 | + "kind": "sale", | |
| 6 | + "engine": "scrapfly", | |
| 7 | + "fetchedAt": "2026-09-07T04:35:10.641Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "item_page", | |
| 10 | + "url": "https://goldin.co/item/exceptional-1930s-babe-ruth-signed-bat-psa-dnaibzy1", | |
| 11 | + "title": "Exceptional 1930s Babe Ruth Signed Bat PSA/DNA", | |
| 12 | + "breadcrumb": [ | |
| 13 | + "Home" | |
| 14 | + ], | |
| 15 | + "totalPriceText": "$25,726", | |
| 16 | + "winningBidText": "$21,438", | |
| 17 | + "endedText": "Sat, 11/17/12, 10:16 PM EDT", | |
| 18 | + "bidsText": null, | |
| 19 | + "sold": true, | |
| 20 | + "description": "With record prices being set every day for high quality single signed Ruth balls, we are proud to offer a single signed Ruth bat. Autographed Ruth bats are far rarer then autographed Ruth baseballs. Compare the price of a Mantle bat to a Mantle ball, for example. It seems to us that single signed Ruth bats may be one of the most undervalued collectibles in the hobby, and certainly one of the rarest. We now offer you a chance to take advantage of that, as we offer a PSA/DNA certified single signed Babe Ruth model autographed bat. It is a full size H+B Louisville Slugger with walnut finish and an engraved version of Ruth's signature, \"George 'Babe' Ruth.\" Overall condition is EX/MT or better. It is signed \"Babe Ruth\" (\"8\" in strength) in black ink directly to the right of the barrel label. The signature has had a light coat of shellac to protect it. Full Letter of Authenticity from PSA/DNA.", | |
| 21 | + "images": [ | |
| 22 | + "https://d2tt46f3mh26nl.cloudfront.net/public/Lots/201210-1508-3000-5aee2cea-5aee-2cea-3b3c-0a8f6d78ab5c/694a_lg@2x", | |
| 23 | + "https://d2tt46f3mh26nl.cloudfront.net/public/Lots/201210-1508-3000-5aee2cea-5aee-2cea-3b3c-0a8f6d78ab5c/694b_lg@2x", | |
| 24 | + "https://d2tt46f3mh26nl.cloudfront.net/public/Lots/201210-1508-3000-5aee2cea-5aee-2cea-3b3c-0a8f6d78ab5c/694c_lg@2x" | |
| 25 | + ], | |
| 26 | + "lotNumber": "4" | |
| 27 | + } | |
| 28 | + }, | |
| 29 | + "expect": { | |
| 30 | + "count": 1, | |
| 31 | + "kinds": [ | |
| 32 | + "sale" | |
| 33 | + ], | |
| 34 | + "first": { | |
| 35 | + "price": 25726, | |
| 36 | + "auctionHouse": "Goldin" | |
| 37 | + } | |
| 38 | + }, | |
| 39 | + "note": "Sold item page captured live via Scrapfly render; flattened by parseItemPage (no HTML stored)." | |
| 40 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/goldin/mtg-sold-page.json
+509 −0
@@ -0,0 +1,509 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://goldin.co/buy/sc/Magic_The_Gathering?page=1&number_of_lots=24&show_only=Sold%20Items&sort=Most_Recent_Bids", | |
| 4 | + "externalId": "/buy/sc/Magic_The_Gathering#1", | |
| 5 | + "kind": "sale", | |
| 6 | + "engine": "scrapfly", | |
| 7 | + "fetchedAt": "2026-09-07T04:34:00.189378+00:00", | |
| 8 | + "payload": { | |
| 9 | + "kind": "sold_page", | |
| 10 | + "seed": { | |
| 11 | + "path": "/buy/sc/Magic_The_Gathering", | |
| 12 | + "categorySlug": "magic_the_gathering" | |
| 13 | + }, | |
| 14 | + "page": 1, | |
| 15 | + "pageUrl": "https://goldin.co/buy/sc/Magic_The_Gathering?page=1&number_of_lots=24&show_only=Sold%20Items&sort=Most_Recent_Bids", | |
| 16 | + "request": { | |
| 17 | + "queryType": "Most_Recent_Bids", | |
| 18 | + "sub_category": [ | |
| 19 | + "Magic The Gathering" | |
| 20 | + ], | |
| 21 | + "size": 24, | |
| 22 | + "from": 0, | |
| 23 | + "show_only": "Sold", | |
| 24 | + "hasAnalyticsConsent": false | |
| 25 | + }, | |
| 26 | + "total": 1614, | |
| 27 | + "lots": [ | |
| 28 | + { | |
| 29 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 30 | + "auction_type": "Weekly", | |
| 31 | + "buyer_premium": 22.0, | |
| 32 | + "company_id": "", | |
| 33 | + "current_price": 4257, | |
| 34 | + "end_timestamp": "2026-09-07T03:39:24Z", | |
| 35 | + "lot_id": "202607-2117-5923-70720bbf-6002-4921-8da9-eeda2ac06bf8", | |
| 36 | + "lot_number": 1033, | |
| 37 | + "meta_slug": "1993-magic-the-gathering-unlimited-collection-250-featuring-crusade-wome83n", | |
| 38 | + "min_bid_price": 10, | |
| 39 | + "number_of_bids": 49, | |
| 40 | + "primary_image_name": "7ee9714e-1544-4a66-aaa8-61c527378fcb", | |
| 41 | + "reserve_amount": 0.0, | |
| 42 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 43 | + "status": "Completed_Sold", | |
| 44 | + "title": "1993 Magic: The Gathering Unlimited Collection (250+) - Featuring Crusade, Word of Command, Wheel of Fortune Cards" | |
| 45 | + }, | |
| 46 | + { | |
| 47 | + "auction_id": "202607-0713-0842-dce30d81-2299-45d9-810e-9936c533b60c", | |
| 48 | + "auction_type": "Weekly", | |
| 49 | + "buyer_premium": 22.0, | |
| 50 | + "company_id": "", | |
| 51 | + "current_price": 5608, | |
| 52 | + "end_timestamp": "2026-08-31T03:00:19Z", | |
| 53 | + "lot_id": "202607-2117-5923-4839e469-152d-4c09-b4f1-aa2f5204bc77", | |
| 54 | + "lot_number": 1275, | |
| 55 | + "meta_slug": "1993-magic-the-gathering-beta-collection-300-featuring-crusade-dark-ri7kf0f", | |
| 56 | + "min_bid_price": 10, | |
| 57 | + "number_of_bids": 61, | |
| 58 | + "primary_image_name": "ed4a25fc-be4c-42fd-8083-8c53e77da7d4", | |
| 59 | + "reserve_amount": 0.0, | |
| 60 | + "start_timestamp": "2026-08-19T21:00:00Z", | |
| 61 | + "status": "Completed_Sold", | |
| 62 | + "title": "1993 Magic: The Gathering Beta Collection (300+) - Featuring Crusade, Dark Ritual, Manabarbs Cards" | |
| 63 | + }, | |
| 64 | + { | |
| 65 | + "auction_id": "202607-0713-0842-dce30d81-2299-45d9-810e-9936c533b60c", | |
| 66 | + "auction_type": "Weekly", | |
| 67 | + "buyer_premium": 22.0, | |
| 68 | + "company_id": "", | |
| 69 | + "current_price": 1451, | |
| 70 | + "end_timestamp": "2026-08-31T02:30:53.092236", | |
| 71 | + "lot_id": "202607-2813-4249-5cda4f75-5a93-44ae-86c5-89763b31c2b9", | |
| 72 | + "lot_number": 1040, | |
| 73 | + "meta_slug": "1977-magic-the-gathering-portal-open-shelf-talker-case-includes-1-shelf2ktn", | |
| 74 | + "min_bid_price": 10, | |
| 75 | + "number_of_bids": 12, | |
| 76 | + "primary_image_name": "bb822d4f-173d-46a0-8f6e-26a3eeb550e6", | |
| 77 | + "reserve_amount": 0.0, | |
| 78 | + "start_timestamp": "2026-08-19T21:00:00Z", | |
| 79 | + "status": "Completed_Sold", | |
| 80 | + "title": "1997 Magic: The Gathering Portal Open Shelf Talker Case - Includes 1 Shelf Talker Display" | |
| 81 | + }, | |
| 82 | + { | |
| 83 | + "auction_id": "202607-0713-0154-1ee3f852-8b1a-496f-88f4-ffcbdc89997a", | |
| 84 | + "auction_type": "Weekly", | |
| 85 | + "buyer_premium": 22.0, | |
| 86 | + "company_id": "", | |
| 87 | + "current_price": 1270, | |
| 88 | + "end_timestamp": "2026-08-24T02:56:43Z", | |
| 89 | + "lot_id": "202607-2813-4249-480352a9-4b8e-49a9-9eb1-3b36b0c562de", | |
| 90 | + "lot_number": 1298, | |
| 91 | + "meta_slug": "1997-magic-the-gathering-portal-open-shelf-talker-case-includes-1-shel5vngz", | |
| 92 | + "min_bid_price": 10, | |
| 93 | + "number_of_bids": 37, | |
| 94 | + "primary_image_name": "ea125580-cc8b-4958-b613-cbd6e5c7fcde", | |
| 95 | + "reserve_amount": 0.0, | |
| 96 | + "start_timestamp": "2026-08-12T21:00:00Z", | |
| 97 | + "status": "Completed_Sold", | |
| 98 | + "title": "1997 Magic: The Gathering Portal Open Shelf Talker Case - Includes 1 Shelf Talker Display" | |
| 99 | + }, | |
| 100 | + { | |
| 101 | + "auction_id": "202607-0713-0154-1ee3f852-8b1a-496f-88f4-ffcbdc89997a", | |
| 102 | + "auction_type": "Weekly", | |
| 103 | + "buyer_premium": 22.0, | |
| 104 | + "company_id": "", | |
| 105 | + "current_price": 3372, | |
| 106 | + "end_timestamp": "2026-08-24T02:30:58.038918", | |
| 107 | + "lot_id": "202607-2117-5923-7c7e81db-4dd1-4eb8-b3f1-f2e8149bf6d5", | |
| 108 | + "lot_number": 1022, | |
| 109 | + "meta_slug": "1993-magic-the-gathering-alpha-collection-100-featuring-sunglasses-ofyjxfk", | |
| 110 | + "min_bid_price": 10, | |
| 111 | + "number_of_bids": 60, | |
| 112 | + "primary_image_name": "d50c0658-5e3d-4270-a221-c9bb960d5923", | |
| 113 | + "reserve_amount": 0.0, | |
| 114 | + "start_timestamp": "2026-08-12T21:00:00Z", | |
| 115 | + "status": "Completed_Sold", | |
| 116 | + "title": "1993 Magic: The Gathering Alpha Collection (100+) - Featuring Sunglasses of Urza, Clone, Blaze of Glory Cards" | |
| 117 | + }, | |
| 118 | + { | |
| 119 | + "auction_id": "202607-0713-0154-1ee3f852-8b1a-496f-88f4-ffcbdc89997a", | |
| 120 | + "auction_type": "Weekly", | |
| 121 | + "buyer_premium": 22.0, | |
| 122 | + "company_id": "", | |
| 123 | + "current_price": 42, | |
| 124 | + "end_timestamp": "2026-08-24T02:30:57.371076", | |
| 125 | + "lot_id": "202602-0920-1226-72e49507-c119-4377-9289-871ef25525c0", | |
| 126 | + "lot_number": 1257, | |
| 127 | + "meta_slug": "1994-magic-the-gathering-revised-edition-rare-mana-vault5b189", | |
| 128 | + "min_bid_price": 10, | |
| 129 | + "number_of_bids": 3, | |
| 130 | + "primary_image_name": "86b5da09-3ca5-4275-acd2-fa38b9d53374", | |
| 131 | + "reserve_amount": 0.0, | |
| 132 | + "start_timestamp": "2026-08-12T21:00:00Z", | |
| 133 | + "status": "Completed_Sold", | |
| 134 | + "title": "1994 Magic: The Gathering Revised Mana Vault - PSA NM 7" | |
| 135 | + }, | |
| 136 | + { | |
| 137 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 138 | + "auction_type": "Weekly", | |
| 139 | + "buyer_premium": 22.0, | |
| 140 | + "company_id": "", | |
| 141 | + "current_price": 345, | |
| 142 | + "end_timestamp": "2026-08-17T02:30:20.252057", | |
| 143 | + "lot_id": "202602-0918-2109-c7a753fb-6b13-450f-950a-d6d128da1beb", | |
| 144 | + "lot_number": 1699, | |
| 145 | + "meta_slug": "1994-magic-the-gathering-revised-edition-rare-bayou0ubiv", | |
| 146 | + "min_bid_price": 10, | |
| 147 | + "number_of_bids": 12, | |
| 148 | + "primary_image_name": "a9485e2b-c872-4e72-b2ec-fd0c21d861c9", | |
| 149 | + "reserve_amount": 0.0, | |
| 150 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 151 | + "status": "Completed_Sold", | |
| 152 | + "title": "1994 Magic: The Gathering Revised Bayou - PSA NM-MT 8" | |
| 153 | + }, | |
| 154 | + { | |
| 155 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 156 | + "auction_type": "Weekly", | |
| 157 | + "buyer_premium": 22.0, | |
| 158 | + "company_id": "", | |
| 159 | + "current_price": 856, | |
| 160 | + "end_timestamp": "2026-08-17T02:30:20.574467", | |
| 161 | + "lot_id": "202602-0918-2107-6154e7fe-fb7e-41bc-8ae9-8ae6cf42958a", | |
| 162 | + "lot_number": 1710, | |
| 163 | + "meta_slug": "1994-magic-the-gathering-revised-edition-rare-volcanic-island9tqde", | |
| 164 | + "min_bid_price": 10, | |
| 165 | + "number_of_bids": 20, | |
| 166 | + "primary_image_name": "1f18e808-764a-42ba-8b6a-b31b64863b93", | |
| 167 | + "reserve_amount": 0.0, | |
| 168 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 169 | + "status": "Completed_Sold", | |
| 170 | + "title": "1994 Magic: The Gathering Revised Volcanic Island - PSA NM-MT 8" | |
| 171 | + }, | |
| 172 | + { | |
| 173 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 174 | + "auction_type": "Weekly", | |
| 175 | + "buyer_premium": 22.0, | |
| 176 | + "company_id": "", | |
| 177 | + "current_price": 322, | |
| 178 | + "end_timestamp": "2026-08-17T02:30:19.536092", | |
| 179 | + "lot_id": "202602-0918-2108-4a26343c-a111-4b8b-a59f-7ba3fdd88fbf", | |
| 180 | + "lot_number": 1696, | |
| 181 | + "meta_slug": "1994-magic-the-gathering-revised-edition-rare-badlandsu7mlk", | |
| 182 | + "min_bid_price": 10, | |
| 183 | + "number_of_bids": 26, | |
| 184 | + "primary_image_name": "5197c7e7-190a-4072-b17a-7825563950c0", | |
| 185 | + "reserve_amount": 0.0, | |
| 186 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 187 | + "status": "Completed_Sold", | |
| 188 | + "title": "1994 Magc: The Gathering Revised Badlands - PSA NM-MT 8" | |
| 189 | + }, | |
| 190 | + { | |
| 191 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 192 | + "auction_type": "Weekly", | |
| 193 | + "buyer_premium": 22.0, | |
| 194 | + "company_id": "", | |
| 195 | + "current_price": 350, | |
| 196 | + "end_timestamp": "2026-08-17T02:30:20.712235", | |
| 197 | + "lot_id": "202602-0918-2109-7367cfae-223d-4094-867f-bed95df3940c", | |
| 198 | + "lot_number": 1711, | |
| 199 | + "meta_slug": "1994-magic-the-gathering-revised-edition-wheel-of-fortuneamchj", | |
| 200 | + "min_bid_price": 10, | |
| 201 | + "number_of_bids": 34, | |
| 202 | + "primary_image_name": "7faa8352-acc4-44a0-a212-f69473d297ab", | |
| 203 | + "reserve_amount": 0.0, | |
| 204 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 205 | + "status": "Completed_Sold", | |
| 206 | + "title": "1994 Magic: The Gathering Revised Wheel of Fortune - PSA NM 7" | |
| 207 | + }, | |
| 208 | + { | |
| 209 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 210 | + "auction_type": "Weekly", | |
| 211 | + "buyer_premium": 22.0, | |
| 212 | + "company_id": "", | |
| 213 | + "current_price": 450, | |
| 214 | + "end_timestamp": "2026-08-17T02:30:20.044141", | |
| 215 | + "lot_id": "202602-0918-2109-ddc12ca9-ff79-4e43-a508-410821567291", | |
| 216 | + "lot_number": 1706, | |
| 217 | + "meta_slug": "1994-magic-the-gathering-revised-edition-rare-tropical-island7l76c", | |
| 218 | + "min_bid_price": 10, | |
| 219 | + "number_of_bids": 14, | |
| 220 | + "primary_image_name": "5aecc706-8fd3-4cce-9739-55ade13762b1", | |
| 221 | + "reserve_amount": 0.0, | |
| 222 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 223 | + "status": "Completed_Sold", | |
| 224 | + "title": "1994 Magic: The Gathering Revised Tropical Island - PSA NM-MT 8" | |
| 225 | + }, | |
| 226 | + { | |
| 227 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 228 | + "auction_type": "Weekly", | |
| 229 | + "buyer_premium": 22.0, | |
| 230 | + "company_id": "", | |
| 231 | + "current_price": 14, | |
| 232 | + "end_timestamp": "2026-08-17T02:30:20.247525", | |
| 233 | + "lot_id": "202602-0920-1226-8761b964-c254-48c1-8b82-bd7f2f1b0dab", | |
| 234 | + "lot_number": 1698, | |
| 235 | + "meta_slug": "1994-magic-the-gathering-legends-willow-satyrdmnv3", | |
| 236 | + "min_bid_price": 10, | |
| 237 | + "number_of_bids": 3, | |
| 238 | + "primary_image_name": "7fb6bdb4-0fe7-402f-a771-de96cf8b16a4", | |
| 239 | + "reserve_amount": 0.0, | |
| 240 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 241 | + "status": "Completed_Sold", | |
| 242 | + "title": "1994 Magic: The Gathering Legends Willow Satyr - PSA NM-MT 8" | |
| 243 | + }, | |
| 244 | + { | |
| 245 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 246 | + "auction_type": "Weekly", | |
| 247 | + "buyer_premium": 22.0, | |
| 248 | + "company_id": "", | |
| 249 | + "current_price": 90, | |
| 250 | + "end_timestamp": "2026-08-17T02:30:20.311727", | |
| 251 | + "lot_id": "202607-0719-1231-ecff865d-01d4-4700-9894-94a8cb30e930", | |
| 252 | + "lot_number": 1811, | |
| 253 | + "meta_slug": "2024-magic-the-gathering-aetherdrift-factory-sealed-booster-box-36-pac0hk1k", | |
| 254 | + "min_bid_price": 10, | |
| 255 | + "number_of_bids": 7, | |
| 256 | + "primary_image_name": "9692aab2-b9c5-4a07-92e2-bb3b7456bfb4", | |
| 257 | + "reserve_amount": 0.0, | |
| 258 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 259 | + "status": "Completed_Sold", | |
| 260 | + "title": "2024 Magic: The Gathering Aetherdrift Factory-Sealed Booster Box (36 Packs)" | |
| 261 | + }, | |
| 262 | + { | |
| 263 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 264 | + "auction_type": "Weekly", | |
| 265 | + "buyer_premium": 22.0, | |
| 266 | + "company_id": "", | |
| 267 | + "current_price": 310, | |
| 268 | + "end_timestamp": "2026-08-17T02:30:20.068221", | |
| 269 | + "lot_id": "202602-0918-2108-215b514a-3490-4ea8-9bf2-37232ab9401f", | |
| 270 | + "lot_number": 1705, | |
| 271 | + "meta_slug": "1994-magic-the-gathering-revised-edition-rare-taigab6vk5", | |
| 272 | + "min_bid_price": 10, | |
| 273 | + "number_of_bids": 9, | |
| 274 | + "primary_image_name": "7debe0c8-6ec8-41ae-b373-5d8cffe35ba9", | |
| 275 | + "reserve_amount": 0.0, | |
| 276 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 277 | + "status": "Completed_Sold", | |
| 278 | + "title": "1994 Magic: The Gathering Revised Taiga - PSA NM-MT 8" | |
| 279 | + }, | |
| 280 | + { | |
| 281 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 282 | + "auction_type": "Weekly", | |
| 283 | + "buyer_premium": 22.0, | |
| 284 | + "company_id": "", | |
| 285 | + "current_price": 22, | |
| 286 | + "end_timestamp": "2026-08-17T02:30:20.594645", | |
| 287 | + "lot_id": "202602-0918-2109-b33405fb-ba63-4eba-9ae3-c42d1c092d2e", | |
| 288 | + "lot_number": 1697, | |
| 289 | + "meta_slug": "1994-magic-the-gathering-antiquities-uncommon-gate-to-phyrexiabmz78", | |
| 290 | + "min_bid_price": 10, | |
| 291 | + "number_of_bids": 5, | |
| 292 | + "primary_image_name": "c9383e02-aaf7-4ff8-87db-dbb159d1d737", | |
| 293 | + "reserve_amount": 0.0, | |
| 294 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 295 | + "status": "Completed_Sold", | |
| 296 | + "title": "1994 Magic: The Gathering Antiquities Gate to Phyrexia - PSA NM 7" | |
| 297 | + }, | |
| 298 | + { | |
| 299 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 300 | + "auction_type": "Weekly", | |
| 301 | + "buyer_premium": 22.0, | |
| 302 | + "company_id": "", | |
| 303 | + "current_price": 375, | |
| 304 | + "end_timestamp": "2026-08-17T02:30:20.248697", | |
| 305 | + "lot_id": "202602-0920-1226-315542b4-70ec-4e60-ac91-79f532cefb85", | |
| 306 | + "lot_number": 1694, | |
| 307 | + "meta_slug": "1993-magic-the-gathering-arabian-nights-drop-of-honeyjejlb", | |
| 308 | + "min_bid_price": 10, | |
| 309 | + "number_of_bids": 11, | |
| 310 | + "primary_image_name": "0f790213-5fca-4a72-a5fe-d9b9b0608473", | |
| 311 | + "reserve_amount": 0.0, | |
| 312 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 313 | + "status": "Completed_Sold", | |
| 314 | + "title": "1993 Magic: The Gathering Arabian Nights Drop of Honey - PSA EX 5" | |
| 315 | + }, | |
| 316 | + { | |
| 317 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 318 | + "auction_type": "Weekly", | |
| 319 | + "buyer_premium": 22.0, | |
| 320 | + "company_id": "", | |
| 321 | + "current_price": 57, | |
| 322 | + "end_timestamp": "2026-08-17T02:30:20.170606", | |
| 323 | + "lot_id": "202602-0918-2109-57ab6f53-f272-42a0-a3af-19f266c3006b", | |
| 324 | + "lot_number": 1704, | |
| 325 | + "meta_slug": "1994-magic-the-gathering-revised-edition-shivan-dragonxx7ng", | |
| 326 | + "min_bid_price": 10, | |
| 327 | + "number_of_bids": 13, | |
| 328 | + "primary_image_name": "228cc0c9-999b-42bd-afad-269ee4d48c84", | |
| 329 | + "reserve_amount": 0.0, | |
| 330 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 331 | + "status": "Completed_Sold", | |
| 332 | + "title": "1994 Magic: The Gathering Revised Shivan Dragon - PSA NM-MT 8" | |
| 333 | + }, | |
| 334 | + { | |
| 335 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 336 | + "auction_type": "Weekly", | |
| 337 | + "buyer_premium": 22.0, | |
| 338 | + "company_id": "", | |
| 339 | + "current_price": 625, | |
| 340 | + "end_timestamp": "2026-08-17T02:30:20.543334", | |
| 341 | + "lot_id": "202602-0918-2108-268ed0be-2d02-4894-b5fd-d20b4fd44a1a", | |
| 342 | + "lot_number": 1707, | |
| 343 | + "meta_slug": "1994-magic-the-gathering-revised-edition-rare-tundrapstn4", | |
| 344 | + "min_bid_price": 10, | |
| 345 | + "number_of_bids": 25, | |
| 346 | + "primary_image_name": "4ca8a6eb-8d39-428c-ac44-07fdcb2b1de8", | |
| 347 | + "reserve_amount": 0.0, | |
| 348 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 349 | + "status": "Completed_Sold", | |
| 350 | + "title": "1994 Magic: The Gathering Revised Tundra - PSA NM-MT 8" | |
| 351 | + }, | |
| 352 | + { | |
| 353 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 354 | + "auction_type": "Weekly", | |
| 355 | + "buyer_premium": 22.0, | |
| 356 | + "company_id": "", | |
| 357 | + "current_price": 700, | |
| 358 | + "end_timestamp": "2026-08-17T02:30:20.602634", | |
| 359 | + "lot_id": "202602-0918-2108-b8720e60-45e1-460a-886a-ccf4ecb07b22", | |
| 360 | + "lot_number": 1708, | |
| 361 | + "meta_slug": "1994-magic-the-gathering-revised-edition-rare-underground-seabsowh", | |
| 362 | + "min_bid_price": 10, | |
| 363 | + "number_of_bids": 37, | |
| 364 | + "primary_image_name": "f0a37394-f9b9-46c3-b2f7-8fc845792434", | |
| 365 | + "reserve_amount": 0.0, | |
| 366 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 367 | + "status": "Completed_Sold", | |
| 368 | + "title": "1994 Magic: The Gathering Revised Underground Sea - PSA NM-MT 8" | |
| 369 | + }, | |
| 370 | + { | |
| 371 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 372 | + "auction_type": "Weekly", | |
| 373 | + "buyer_premium": 22.0, | |
| 374 | + "company_id": "", | |
| 375 | + "current_price": 106, | |
| 376 | + "end_timestamp": "2026-08-17T02:30:19.883826", | |
| 377 | + "lot_id": "202602-0920-1226-d835c383-7ef9-4359-a8dd-efc390fe470f", | |
| 378 | + "lot_number": 1700, | |
| 379 | + "meta_slug": "1994-magic-the-gathering-revised-edition-rare-mana-vaulthucae", | |
| 380 | + "min_bid_price": 10, | |
| 381 | + "number_of_bids": 27, | |
| 382 | + "primary_image_name": "1236eb23-a9cb-421a-90c1-0a9833a83fd3", | |
| 383 | + "reserve_amount": 0.0, | |
| 384 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 385 | + "status": "Completed_Sold", | |
| 386 | + "title": "1994 Magic: The Gathering Revised Mana Vault - PSA MINT 9" | |
| 387 | + }, | |
| 388 | + { | |
| 389 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 390 | + "auction_type": "Weekly", | |
| 391 | + "buyer_premium": 22.0, | |
| 392 | + "company_id": "", | |
| 393 | + "current_price": 351, | |
| 394 | + "end_timestamp": "2026-08-17T02:30:19.684722", | |
| 395 | + "lot_id": "202602-0918-2108-06026957-1ea5-4241-a010-5dac5404c1c8", | |
| 396 | + "lot_number": 1703, | |
| 397 | + "meta_slug": "1994-magic-the-gathering-revised-edition-rare-scrublandqobia", | |
| 398 | + "min_bid_price": 10, | |
| 399 | + "number_of_bids": 17, | |
| 400 | + "primary_image_name": "fa5bc846-7453-4119-95b2-d22423c41ca5", | |
| 401 | + "reserve_amount": 0.0, | |
| 402 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 403 | + "status": "Completed_Sold", | |
| 404 | + "title": "1994 Magic: The Gathering Revised Scrubland - PSA MINT 9" | |
| 405 | + }, | |
| 406 | + { | |
| 407 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 408 | + "auction_type": "Weekly", | |
| 409 | + "buyer_premium": 22.0, | |
| 410 | + "company_id": "", | |
| 411 | + "current_price": 14, | |
| 412 | + "end_timestamp": "2026-08-17T02:30:19.981953", | |
| 413 | + "lot_id": "202602-0918-2109-886727b3-057c-4a6a-be10-725e552242bc", | |
| 414 | + "lot_number": 1709, | |
| 415 | + "meta_slug": "1994-magic-the-gathering-revised-edition-vesuvan-doppelgangersqxjw", | |
| 416 | + "min_bid_price": 10, | |
| 417 | + "number_of_bids": 3, | |
| 418 | + "primary_image_name": "bdab5c3f-691f-4d65-bb52-24274417dc97", | |
| 419 | + "reserve_amount": 0.0, | |
| 420 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 421 | + "status": "Completed_Sold", | |
| 422 | + "title": "1994 Magic: The Gathering Revised Vesuvian Doppelganger - PSA NM-MT 8" | |
| 423 | + }, | |
| 424 | + { | |
| 425 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 426 | + "auction_type": "Weekly", | |
| 427 | + "buyer_premium": 22.0, | |
| 428 | + "company_id": "", | |
| 429 | + "current_price": 460, | |
| 430 | + "end_timestamp": "2026-08-17T02:30:20.245417", | |
| 431 | + "lot_id": "202608-0317-1304-edeb3597-b6ba-4754-a27b-457b177084dd", | |
| 432 | + "lot_number": 1810, | |
| 433 | + "meta_slug": "2002-magic-the-gathering-judgement-unopened-fat-pack-pair-2-packsn05c7", | |
| 434 | + "min_bid_price": 10, | |
| 435 | + "number_of_bids": 23, | |
| 436 | + "primary_image_name": "5424db04-bea0-4503-8398-416b612b33be", | |
| 437 | + "reserve_amount": 0.0, | |
| 438 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 439 | + "status": "Completed_Sold", | |
| 440 | + "title": "2002 Magic: The Gathering Judgement Unopened Fat Pack Pair (2 Packs)" | |
| 441 | + }, | |
| 442 | + { | |
| 443 | + "auction_id": "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b", | |
| 444 | + "auction_type": "Weekly", | |
| 445 | + "buyer_premium": 22.0, | |
| 446 | + "company_id": "", | |
| 447 | + "current_price": 325, | |
| 448 | + "end_timestamp": "2026-08-17T02:30:20.853518", | |
| 449 | + "lot_id": "202602-0918-2108-8a04d7e2-afd9-473a-ae7a-fa044a6320b6", | |
| 450 | + "lot_number": 1702, | |
| 451 | + "meta_slug": "1994-magic-the-gathering-revised-edition-rare-savannahtgxno", | |
| 452 | + "min_bid_price": 10, | |
| 453 | + "number_of_bids": 12, | |
| 454 | + "primary_image_name": "90afdecd-9c75-4f28-be31-8b244054bd96", | |
| 455 | + "reserve_amount": 0.0, | |
| 456 | + "start_timestamp": "2026-08-05T21:00:00Z", | |
| 457 | + "status": "Completed_Sold", | |
| 458 | + "title": "1994 Magic: The Gathering Revised Savannah - PSA NM 7" | |
| 459 | + } | |
| 460 | + ], | |
| 461 | + "auctions": { | |
| 462 | + "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00": { | |
| 463 | + "title": "TCG Weekly Auction Aug 26 - Sep 6", | |
| 464 | + "auction_type": "Weekly", | |
| 465 | + "end_timestamp": "2026-09-07T02:00:00Z", | |
| 466 | + "buyer_premium": 22, | |
| 467 | + "status": "Completed" | |
| 468 | + }, | |
| 469 | + "202607-0713-0842-dce30d81-2299-45d9-810e-9936c533b60c": { | |
| 470 | + "title": "TCG Weekly Auction Aug 19 - Aug 30 ", | |
| 471 | + "auction_type": "Weekly", | |
| 472 | + "end_timestamp": "2026-08-31T02:00:00Z", | |
| 473 | + "buyer_premium": 22, | |
| 474 | + "status": "Completed" | |
| 475 | + }, | |
| 476 | + "202607-0713-0154-1ee3f852-8b1a-496f-88f4-ffcbdc89997a": { | |
| 477 | + "title": "TCG Weekly Auction Aug 12 - Aug 23 ", | |
| 478 | + "auction_type": "Weekly", | |
| 479 | + "end_timestamp": "2026-08-24T02:00:00Z", | |
| 480 | + "buyer_premium": 22, | |
| 481 | + "status": "Completed" | |
| 482 | + }, | |
| 483 | + "202607-0712-5741-0ab0e1c3-d82d-49b3-9af8-2a5ccc6f844b": { | |
| 484 | + "title": "TCG Weekly Auction Aug 5 - Aug 16", | |
| 485 | + "auction_type": "Weekly", | |
| 486 | + "end_timestamp": "2026-08-17T02:00:00Z", | |
| 487 | + "buyer_premium": 22, | |
| 488 | + "status": "Completed" | |
| 489 | + } | |
| 490 | + } | |
| 491 | + } | |
| 492 | + }, | |
| 493 | + "expect": { | |
| 494 | + "count": 24, | |
| 495 | + "kinds": [ | |
| 496 | + "sale" | |
| 497 | + ], | |
| 498 | + "requiredFields": [ | |
| 499 | + "saleDate", | |
| 500 | + "price", | |
| 501 | + "currency", | |
| 502 | + "rawTitle", | |
| 503 | + "attributes.categorySlug", | |
| 504 | + "sourceUrl", | |
| 505 | + "externalId" | |
| 506 | + ] | |
| 507 | + }, | |
| 508 | + "note": "Captured live from the Goldin Sold Items grid (lots_v2 XHR during Scrapfly rendering). Prices include buyer premium." | |
| 509 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/goldin/pokemon-sold-page.json
+488 −0
@@ -0,0 +1,488 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://goldin.co/buy/sc/pokemon?page=1&number_of_lots=24&show_only=Sold%20Items&sort=Most_Recent_Bids", | |
| 4 | + "externalId": "/buy/sc/pokemon#1", | |
| 5 | + "kind": "sale", | |
| 6 | + "engine": "scrapfly", | |
| 7 | + "fetchedAt": "2026-09-07T04:34:00.181681+00:00", | |
| 8 | + "payload": { | |
| 9 | + "kind": "sold_page", | |
| 10 | + "seed": { | |
| 11 | + "path": "/buy/sc/pokemon", | |
| 12 | + "categorySlug": "pokemon" | |
| 13 | + }, | |
| 14 | + "page": 1, | |
| 15 | + "pageUrl": "https://goldin.co/buy/sc/pokemon?page=1&number_of_lots=24&show_only=Sold%20Items&sort=Most_Recent_Bids", | |
| 16 | + "request": { | |
| 17 | + "queryType": "Most_Recent_Bids", | |
| 18 | + "sub_category": [ | |
| 19 | + "pokemon" | |
| 20 | + ], | |
| 21 | + "size": 24, | |
| 22 | + "from": 0, | |
| 23 | + "show_only": "Sold", | |
| 24 | + "hasAnalyticsConsent": false | |
| 25 | + }, | |
| 26 | + "total": 53285, | |
| 27 | + "lots": [ | |
| 28 | + { | |
| 29 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 30 | + "auction_type": "Weekly", | |
| 31 | + "buyer_premium": 22.0, | |
| 32 | + "company_id": "", | |
| 33 | + "current_price": 500, | |
| 34 | + "end_timestamp": "2026-09-07T04:02:26Z", | |
| 35 | + "lot_id": "202608-1914-3146-fce3844b-d44d-4394-8ec7-cf6d7da0f883", | |
| 36 | + "lot_number": 1331, | |
| 37 | + "meta_slug": "2026-pokemon-mega-evolution-ascended-heroes-factory-sealed-elite-train4i8ru", | |
| 38 | + "min_bid_price": 10, | |
| 39 | + "number_of_bids": 32, | |
| 40 | + "primary_image_name": "8803f0ca-22d9-4439-a2ea-fb85fdb05b0f", | |
| 41 | + "reserve_amount": 0.0, | |
| 42 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 43 | + "status": "Completed_Sold", | |
| 44 | + "title": "2026 Pokemon Mega Evolution Ascended Heroes Factory-Sealed Elite Trainer Box Collection (3 Boxes) - Possible Full Art Mega Gengar ex, Pikachu ex, Mega Dragonite ex Cards" | |
| 45 | + }, | |
| 46 | + { | |
| 47 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 48 | + "auction_type": "Weekly", | |
| 49 | + "buyer_premium": 22.0, | |
| 50 | + "company_id": "", | |
| 51 | + "current_price": 1330, | |
| 52 | + "end_timestamp": "2026-09-07T03:48:50Z", | |
| 53 | + "lot_id": "202608-2513-1321-023f0fb4-925f-4089-8052-29015582687f", | |
| 54 | + "lot_number": 1045, | |
| 55 | + "meta_slug": "2007-pokemon-japanese-promo-battle-road-spring-diamond-pearl-tag-battlvymmq", | |
| 56 | + "min_bid_price": 10, | |
| 57 | + "number_of_bids": 54, | |
| 58 | + "primary_image_name": "b27cc958-0ddc-4eff-9cbb-61dca90c2a32", | |
| 59 | + "reserve_amount": 0.0, | |
| 60 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 61 | + "status": "Completed_Sold", | |
| 62 | + "title": "2007 Pokemon Japanese Promo Battle Road Spring Diamond & Pearl Tag Battle Holo Time - Space Distortion - PSA GEM MT 10" | |
| 63 | + }, | |
| 64 | + { | |
| 65 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 66 | + "auction_type": "Weekly", | |
| 67 | + "buyer_premium": 22.0, | |
| 68 | + "company_id": "", | |
| 69 | + "current_price": 80, | |
| 70 | + "end_timestamp": "2026-09-07T03:43:07Z", | |
| 71 | + "lot_id": "202608-1914-3146-e37da6db-8cc0-4874-9a9c-46f3ffe65dc0", | |
| 72 | + "lot_number": 1334, | |
| 73 | + "meta_slug": "2026-pokemon-mega-evolution-chaos-rising-factory-sealed-blister-pack-c8kzxl", | |
| 74 | + "min_bid_price": 10, | |
| 75 | + "number_of_bids": 27, | |
| 76 | + "primary_image_name": "9f26764a-b7f6-41ca-9087-adc1994ddbc5", | |
| 77 | + "reserve_amount": 0.0, | |
| 78 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 79 | + "status": "Completed_Sold", | |
| 80 | + "title": "2026 Pokemon Mega Evolution Chaos Rising Factory-Sealed Blister Pack Collection With Toxel Promo (18 Packs) - Possible Mega Greninja ex Special Illustration Rare Cards" | |
| 81 | + }, | |
| 82 | + { | |
| 83 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 84 | + "auction_type": "Weekly", | |
| 85 | + "buyer_premium": 22.0, | |
| 86 | + "company_id": "", | |
| 87 | + "current_price": 4652, | |
| 88 | + "end_timestamp": "2026-09-07T03:39:21Z", | |
| 89 | + "lot_id": "202608-2614-4047-38b69898-7182-4166-9143-a30f84c987ad", | |
| 90 | + "lot_number": 1038, | |
| 91 | + "meta_slug": "2000-pokemon-promo-top-deck-magazine-wizards-gold-stamp-63-wartortle-py4u6t", | |
| 92 | + "min_bid_price": 10, | |
| 93 | + "number_of_bids": 41, | |
| 94 | + "primary_image_name": "59584fec-9e1a-4cf2-b02c-869c6c2abc5f", | |
| 95 | + "reserve_amount": 0.0, | |
| 96 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 97 | + "status": "Completed_Sold", | |
| 98 | + "title": "2000 Pokemon Promo Top Deck Magazine Wizards Gold Stamp #63 Wartortle - PSA GEM MT 10" | |
| 99 | + }, | |
| 100 | + { | |
| 101 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 102 | + "auction_type": "Weekly", | |
| 103 | + "buyer_premium": 22.0, | |
| 104 | + "company_id": "", | |
| 105 | + "current_price": 229, | |
| 106 | + "end_timestamp": "2026-09-07T03:39:04Z", | |
| 107 | + "lot_id": "202608-2614-4047-c03ccf6b-8393-4a78-b116-2e2eb9a38da0", | |
| 108 | + "lot_number": 1124, | |
| 109 | + "meta_slug": "2000-pokemon-black-star-promo-23-zapdos-psa-gem-mt-10rl2xt", | |
| 110 | + "min_bid_price": 10, | |
| 111 | + "number_of_bids": 25, | |
| 112 | + "primary_image_name": "b91ff621-a42a-4604-bdb1-89504bdaf75d", | |
| 113 | + "reserve_amount": 0.0, | |
| 114 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 115 | + "status": "Completed_Sold", | |
| 116 | + "title": "2000 Pokemon Black Star Promo #23 Zapdos - PSA GEM MT 10" | |
| 117 | + }, | |
| 118 | + { | |
| 119 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 120 | + "auction_type": "Weekly", | |
| 121 | + "buyer_premium": 22.0, | |
| 122 | + "company_id": "", | |
| 123 | + "current_price": 450, | |
| 124 | + "end_timestamp": "2026-09-07T03:37:35Z", | |
| 125 | + "lot_id": "202608-1820-4748-1e11f0b1-a48c-4b6f-8e9f-202256a89b27", | |
| 126 | + "lot_number": 1198, | |
| 127 | + "meta_slug": "2020-pokemon-sword-shield-zacian-zamazenta-factory-sealed-ultra-premiud4bg6", | |
| 128 | + "min_bid_price": 10, | |
| 129 | + "number_of_bids": 27, | |
| 130 | + "primary_image_name": "0d8f376f-b720-4e52-be30-096889afd204", | |
| 131 | + "reserve_amount": 0.0, | |
| 132 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 133 | + "status": "Completed_Sold", | |
| 134 | + "title": "2020 Pokemon Sword & Shield Zacian & Zamazenta Factory-Sealed Ultra Premium Collection (16 Packs)" | |
| 135 | + }, | |
| 136 | + { | |
| 137 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 138 | + "auction_type": "Weekly", | |
| 139 | + "buyer_premium": 22.0, | |
| 140 | + "company_id": "", | |
| 141 | + "current_price": 401, | |
| 142 | + "end_timestamp": "2026-09-07T03:36:40Z", | |
| 143 | + "lot_id": "202608-1914-3146-7195fb18-db2f-4522-8516-01d17a9dcb44", | |
| 144 | + "lot_number": 1215, | |
| 145 | + "meta_slug": "2021-pokemon-sword-and-shield-shining-fates-factory-sealed-elite-traint40o5", | |
| 146 | + "min_bid_price": 10, | |
| 147 | + "number_of_bids": 44, | |
| 148 | + "primary_image_name": "83127153-250b-4db3-a73b-76fd21826df2", | |
| 149 | + "reserve_amount": 0.0, | |
| 150 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 151 | + "status": "Completed_Sold", | |
| 152 | + "title": "2021 Pokemon Sword and Shield Shining Fates Factory-Sealed Elite Trainer Box Collection (3) - Possible Charizard VMAX Cards" | |
| 153 | + }, | |
| 154 | + { | |
| 155 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 156 | + "auction_type": "Weekly", | |
| 157 | + "buyer_premium": 22.0, | |
| 158 | + "company_id": "", | |
| 159 | + "current_price": 1105, | |
| 160 | + "end_timestamp": "2026-09-07T03:36:40Z", | |
| 161 | + "lot_id": "202608-1914-3146-1bc896a3-4404-4142-9740-d8ddece6e40e", | |
| 162 | + "lot_number": 1228, | |
| 163 | + "meta_slug": "2022-pokemon-sword-shield-ultra-premium-collection-charizard-factory-sfftat", | |
| 164 | + "min_bid_price": 10, | |
| 165 | + "number_of_bids": 54, | |
| 166 | + "primary_image_name": "2255ed3c-ffa6-4e63-b905-adc16c57fef6", | |
| 167 | + "reserve_amount": 0.0, | |
| 168 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 169 | + "status": "Completed_Sold", | |
| 170 | + "title": "2022 Pokemon Sword & Shield Ultra Premium Collection: Charizard Factory-Sealed Box Pair (2 Boxes, 16 Packs Per Box) - Including Charizard V, Charizard VMAX, Charizard VSTAR Promo Cards" | |
| 171 | + }, | |
| 172 | + { | |
| 173 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 174 | + "auction_type": "Weekly", | |
| 175 | + "buyer_premium": 22.0, | |
| 176 | + "company_id": "", | |
| 177 | + "current_price": 91, | |
| 178 | + "end_timestamp": "2026-09-07T03:36:40Z", | |
| 179 | + "lot_id": "202608-1719-2617-ed6c8546-98f1-4691-91c4-819c979e9aa8", | |
| 180 | + "lot_number": 1258, | |
| 181 | + "meta_slug": "2024-pokemon-scarlet-violet-factory-sealed-twilight-masquerade-elite-tg75y8", | |
| 182 | + "min_bid_price": 10, | |
| 183 | + "number_of_bids": 14, | |
| 184 | + "primary_image_name": "057f7a01-2331-426e-a866-1921df41e6b8", | |
| 185 | + "reserve_amount": 0.0, | |
| 186 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 187 | + "status": "Completed_Sold", | |
| 188 | + "title": "2024 Pokemon Scarlet & Violet Factory-Sealed Twilight Masquerade Elite Trainer Box (9 Packs) - Possible Greninja ex Special Illustration Rare Card" | |
| 189 | + }, | |
| 190 | + { | |
| 191 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 192 | + "auction_type": "Weekly", | |
| 193 | + "buyer_premium": 22.0, | |
| 194 | + "company_id": "", | |
| 195 | + "current_price": 1001, | |
| 196 | + "end_timestamp": "2026-09-07T03:34:45Z", | |
| 197 | + "lot_id": "202608-1914-3152-571930a4-2df4-4e4e-a373-4a03e94d6b08", | |
| 198 | + "lot_number": 1035, | |
| 199 | + "meta_slug": "1999-pokemon-topps-tv-series-1-character-cards-tv2-pikachu-psa-gem-mtsdpkp", | |
| 200 | + "min_bid_price": 10, | |
| 201 | + "number_of_bids": 48, | |
| 202 | + "primary_image_name": "3bfcdb81-9c85-46d7-baef-0a81310a1742", | |
| 203 | + "reserve_amount": 0.0, | |
| 204 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 205 | + "status": "Completed_Sold", | |
| 206 | + "title": "1999 Pokemon Topps TV Series 1 Character Cards #TV2 Pikachu - PSA GEM MT 10" | |
| 207 | + }, | |
| 208 | + { | |
| 209 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 210 | + "auction_type": "Weekly", | |
| 211 | + "buyer_premium": 22.0, | |
| 212 | + "company_id": "", | |
| 213 | + "current_price": 405, | |
| 214 | + "end_timestamp": "2026-09-07T03:32:27Z", | |
| 215 | + "lot_id": "202607-3013-4327-6014ae22-acec-45d2-8822-0ef5f00238cf", | |
| 216 | + "lot_number": 1117, | |
| 217 | + "meta_slug": "1999-pokemon-jungle-1st-edition-holo-7-nidoqueen-psa-mint-94jg0b", | |
| 218 | + "min_bid_price": 10, | |
| 219 | + "number_of_bids": 21, | |
| 220 | + "primary_image_name": "e7ade7af-7a6b-4d1c-8ce7-e80ad7374e86", | |
| 221 | + "reserve_amount": 0.0, | |
| 222 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 223 | + "status": "Completed_Sold", | |
| 224 | + "title": "1999 Pokemon Jungle 1st Edition Holo #7 Nidoqueen - PSA MINT 9" | |
| 225 | + }, | |
| 226 | + { | |
| 227 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 228 | + "auction_type": "Weekly", | |
| 229 | + "buyer_premium": 22.0, | |
| 230 | + "company_id": "", | |
| 231 | + "current_price": 805, | |
| 232 | + "end_timestamp": "2026-09-07T03:26:27Z", | |
| 233 | + "lot_id": "202608-1820-4747-d3c5e937-5426-4e41-bbc8-3591fd0cd79e", | |
| 234 | + "lot_number": 1291, | |
| 235 | + "meta_slug": "2025-pokemon-prismatic-evolutions-factory-sealed-pokemon-center-elite6mi2w", | |
| 236 | + "min_bid_price": 10, | |
| 237 | + "number_of_bids": 30, | |
| 238 | + "primary_image_name": "49d45dfb-b60c-4681-a6d4-e6d2d379d7f6", | |
| 239 | + "reserve_amount": 0.0, | |
| 240 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 241 | + "status": "Completed_Sold", | |
| 242 | + "title": "2025 Pokemon Prismatic Evolutions Factory-Sealed Pokemon Center Elite Trainer Box Pair (2 Boxes/11 Packs Per Box) - Possible Umbreon ex, Espeon ex, Sylveon ex Cards" | |
| 243 | + }, | |
| 244 | + { | |
| 245 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 246 | + "auction_type": "Weekly", | |
| 247 | + "buyer_premium": 22.0, | |
| 248 | + "company_id": "", | |
| 249 | + "current_price": 205, | |
| 250 | + "end_timestamp": "2026-09-07T03:25:42Z", | |
| 251 | + "lot_id": "202608-1820-4748-e9dd4322-696c-4505-b6ec-ee4b0fc8e8b2", | |
| 252 | + "lot_number": 1218, | |
| 253 | + "meta_slug": "2022-pokemon-go-factory-sealed-tin-collection-6-tins-4-packs-per-tin-p4ixlm", | |
| 254 | + "min_bid_price": 10, | |
| 255 | + "number_of_bids": 19, | |
| 256 | + "primary_image_name": "def668d3-7c7d-49cf-804e-903ce71f486f", | |
| 257 | + "reserve_amount": 0.0, | |
| 258 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 259 | + "status": "Completed_Sold", | |
| 260 | + "title": "2022 Pokemon Go Factory-Sealed Tin Collection (6 Tins/ 4 Packs Per Tin) - Possible Mewtwo V Full Art Card" | |
| 261 | + }, | |
| 262 | + { | |
| 263 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 264 | + "auction_type": "Weekly", | |
| 265 | + "buyer_premium": 22.0, | |
| 266 | + "company_id": "", | |
| 267 | + "current_price": 195, | |
| 268 | + "end_timestamp": "2026-09-07T03:24:59Z", | |
| 269 | + "lot_id": "202608-1720-5238-a0c92cf2-99aa-437b-8ca7-d577d6139775", | |
| 270 | + "lot_number": 1296, | |
| 271 | + "meta_slug": "2025-pokemon-scarlet-violet-black-bolt-factory-sealed-booster-bundle-6xqly4", | |
| 272 | + "min_bid_price": 10, | |
| 273 | + "number_of_bids": 30, | |
| 274 | + "primary_image_name": "ea0f2d20-adc4-428f-bbff-6ead06b3b73b", | |
| 275 | + "reserve_amount": 0.0, | |
| 276 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 277 | + "status": "Completed_Sold", | |
| 278 | + "title": "2025 Pokemon Scarlet & Violet Black Bolt Factory-Sealed Booster Bundle Collection (3 Boxes/6 Packs Per) - Possible Zekrom ex, Victini, Seismitoad Cards" | |
| 279 | + }, | |
| 280 | + { | |
| 281 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 282 | + "auction_type": "Weekly", | |
| 283 | + "buyer_premium": 22.0, | |
| 284 | + "company_id": "", | |
| 285 | + "current_price": 180, | |
| 286 | + "end_timestamp": "2026-09-07T03:23:51Z", | |
| 287 | + "lot_id": "202608-1820-4748-f4025b4d-3f38-4fd1-b86d-888eb0bf3a6e", | |
| 288 | + "lot_number": 1241, | |
| 289 | + "meta_slug": "2023-pokemon-scarlet-violet-151-factory-sealed-mini-tin-collection-5-txykxr", | |
| 290 | + "min_bid_price": 10, | |
| 291 | + "number_of_bids": 22, | |
| 292 | + "primary_image_name": "2c6ea27e-3d8d-4888-9371-b7cbfd06bee4", | |
| 293 | + "reserve_amount": 0.0, | |
| 294 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 295 | + "status": "Completed_Sold", | |
| 296 | + "title": "2023 Pokemon Scarlet & Violet 151 Factory-Sealed Mini Tin Collection (5 Tins/2 Packs Per Tin) - Possible Charizard ex, Blastoise ex, Venusaur ex" | |
| 297 | + }, | |
| 298 | + { | |
| 299 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 300 | + "auction_type": "Weekly", | |
| 301 | + "buyer_premium": 22.0, | |
| 302 | + "company_id": "", | |
| 303 | + "current_price": 225, | |
| 304 | + "end_timestamp": "2026-09-07T03:23:38Z", | |
| 305 | + "lot_id": "202608-1814-1639-c00e86ed-8b85-4bb5-aa52-2c61e72763a2", | |
| 306 | + "lot_number": 1345, | |
| 307 | + "meta_slug": "2026-pokemon-mega-evolution-perfect-order-factory-sealed-pokemon-centeonh70", | |
| 308 | + "min_bid_price": 10, | |
| 309 | + "number_of_bids": 21, | |
| 310 | + "primary_image_name": "372c8250-4cf9-4c45-96ac-766cdc5e61a0", | |
| 311 | + "reserve_amount": 0.0, | |
| 312 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 313 | + "status": "Completed_Sold", | |
| 314 | + "title": "2026 Pokemon Mega Evolution Perfect Order Factory-Sealed Pokemon Center Elite Trainer Box Pair (2 Boxes/ 11 Packs Per Box) - Possible Mega Zygarde ex, Meowth ex, Rosa's Encouragement Cards" | |
| 315 | + }, | |
| 316 | + { | |
| 317 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 318 | + "auction_type": "Weekly", | |
| 319 | + "buyer_premium": 22.0, | |
| 320 | + "company_id": "", | |
| 321 | + "current_price": 1931, | |
| 322 | + "end_timestamp": "2026-09-07T03:23:23Z", | |
| 323 | + "lot_id": "202608-1914-3148-c285ca79-b336-4789-8c3e-483092a6e028", | |
| 324 | + "lot_number": 1072, | |
| 325 | + "meta_slug": "2022-pokemon-sword-and-shield-silver-tempest-factory-sealed-sleeved-bom1gl1", | |
| 326 | + "min_bid_price": 10, | |
| 327 | + "number_of_bids": 58, | |
| 328 | + "primary_image_name": "a41f6edc-4e02-4628-87ff-8fa7a53bc255", | |
| 329 | + "reserve_amount": 0.0, | |
| 330 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 331 | + "status": "Completed_Sold", | |
| 332 | + "title": "2022 Pokemon Sword and Shield Silver Tempest Factory-Sealed Sleeved Booster Pack Case (144 Packs) - Possible Alolan Vulpix VSTAR, Lugia V, Lugia VSTAR" | |
| 333 | + }, | |
| 334 | + { | |
| 335 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 336 | + "auction_type": "Weekly", | |
| 337 | + "buyer_premium": 22.0, | |
| 338 | + "company_id": "", | |
| 339 | + "current_price": 1702, | |
| 340 | + "end_timestamp": "2026-09-07T03:23:19Z", | |
| 341 | + "lot_id": "202606-1617-1858-6c0341be-d150-40b5-9bdc-7fd02dac9d7e", | |
| 342 | + "lot_number": 1087, | |
| 343 | + "meta_slug": "1996-pokemon-japanese-base-set-holo-6-charizardomdlr", | |
| 344 | + "min_bid_price": 10, | |
| 345 | + "number_of_bids": 47, | |
| 346 | + "primary_image_name": "f5bb8fba-ce8a-4c84-be89-43ec770fd45b", | |
| 347 | + "reserve_amount": 0.0, | |
| 348 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 349 | + "status": "Completed_Sold", | |
| 350 | + "title": "1996 Pokemon Base Set Japanese Rare Holofoil #6 Charizard - BGS NM-MT+ 8.5" | |
| 351 | + }, | |
| 352 | + { | |
| 353 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 354 | + "auction_type": "Weekly", | |
| 355 | + "buyer_premium": 22.0, | |
| 356 | + "company_id": "", | |
| 357 | + "current_price": 83, | |
| 358 | + "end_timestamp": "2026-09-07T03:23:09Z", | |
| 359 | + "lot_id": "202608-2513-1320-e5f415bc-5763-46bb-aae5-12139ddbed69", | |
| 360 | + "lot_number": 1037, | |
| 361 | + "meta_slug": "2000-pokemon-japanese-promo-trainer-champion-road-2000-fruit-of-miraclkz5iu", | |
| 362 | + "min_bid_price": 10, | |
| 363 | + "number_of_bids": 23, | |
| 364 | + "primary_image_name": "6b65bee0-b5f0-4e78-b0b1-2d9335e7c5c8", | |
| 365 | + "reserve_amount": 0.0, | |
| 366 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 367 | + "status": "Completed_Sold", | |
| 368 | + "title": "2000 Pokemon Japanese Promo Trainer - Champion Road 2000 Fruit of Miracle - PSA MINT 9" | |
| 369 | + }, | |
| 370 | + { | |
| 371 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 372 | + "auction_type": "Weekly", | |
| 373 | + "buyer_premium": 22.0, | |
| 374 | + "company_id": "", | |
| 375 | + "current_price": 3251, | |
| 376 | + "end_timestamp": "2026-09-07T03:17:43Z", | |
| 377 | + "lot_id": "202608-2518-3215-a4cc54fd-75ab-42b6-b06b-fa5d06a8da54", | |
| 378 | + "lot_number": 1039, | |
| 379 | + "meta_slug": "2001-pokemon-neo-discovery-factory-sealed-2-pack-blister-possible-rareq4f47", | |
| 380 | + "min_bid_price": 10, | |
| 381 | + "number_of_bids": 36, | |
| 382 | + "primary_image_name": "d7661b87-84ff-444e-a039-23232a82b07f", | |
| 383 | + "reserve_amount": 0.0, | |
| 384 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 385 | + "status": "Completed_Sold", | |
| 386 | + "title": "2001 Pokemon Neo Discovery Factory-Sealed 2-Pack Blister - Possible Rare Holo Umbreon, Espeon, Tyranitar Cards" | |
| 387 | + }, | |
| 388 | + { | |
| 389 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 390 | + "auction_type": "Weekly", | |
| 391 | + "buyer_premium": 22.0, | |
| 392 | + "company_id": "", | |
| 393 | + "current_price": 8566, | |
| 394 | + "end_timestamp": "2026-09-07T03:13:42Z", | |
| 395 | + "lot_id": "202608-2614-4047-23bfc4b8-bdf4-4538-8ac3-cf6b89ff2485", | |
| 396 | + "lot_number": 1031, | |
| 397 | + "meta_slug": "2016-pokemon-xy-black-star-promo-snorlax-gx-box-xy179-snorlax-psa-gemy884l", | |
| 398 | + "min_bid_price": 10, | |
| 399 | + "number_of_bids": 62, | |
| 400 | + "primary_image_name": "a3ee0d2d-c09a-46fe-9b0a-1842d6b2cce2", | |
| 401 | + "reserve_amount": 0.0, | |
| 402 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 403 | + "status": "Completed_Sold", | |
| 404 | + "title": "2016 Pokemon XY Black Star Promo Snorlax GX Box #XY179 Snorlax - PSA GEM MT 10" | |
| 405 | + }, | |
| 406 | + { | |
| 407 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 408 | + "auction_type": "Weekly", | |
| 409 | + "buyer_premium": 22.0, | |
| 410 | + "company_id": "", | |
| 411 | + "current_price": 3500, | |
| 412 | + "end_timestamp": "2026-09-07T03:12:54Z", | |
| 413 | + "lot_id": "202608-2420-0056-d3133524-975b-4d13-9d9c-cea062efa715", | |
| 414 | + "lot_number": 1040, | |
| 415 | + "meta_slug": "2002-pokemon-expedition-color-proofing-test-card-101-clefairy-psa-custmvxw2", | |
| 416 | + "min_bid_price": 10, | |
| 417 | + "number_of_bids": 38, | |
| 418 | + "primary_image_name": "222d2922-587d-4a97-a81e-7a14d5e3a101", | |
| 419 | + "reserve_amount": 0.0, | |
| 420 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 421 | + "status": "Completed_Sold", | |
| 422 | + "title": "2002 Pokemon Expedition Color Proofing Test Card #101 Clefairy - PSA Custom Encapsulation" | |
| 423 | + }, | |
| 424 | + { | |
| 425 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 426 | + "auction_type": "Weekly", | |
| 427 | + "buyer_premium": 22.0, | |
| 428 | + "company_id": "", | |
| 429 | + "current_price": 190, | |
| 430 | + "end_timestamp": "2026-09-07T03:11:21Z", | |
| 431 | + "lot_id": "202607-2920-0510-7a66104c-7125-4d18-bf2b-f5773846825b", | |
| 432 | + "lot_number": 1105, | |
| 433 | + "meta_slug": "1999-pokemon-fossil-1st-edition-25-lapras-psa-mint-9f4tbj", | |
| 434 | + "min_bid_price": 10, | |
| 435 | + "number_of_bids": 31, | |
| 436 | + "primary_image_name": "f20c5391-abb1-4fe0-b8f6-2aacdacee9d6", | |
| 437 | + "reserve_amount": 0.0, | |
| 438 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 439 | + "status": "Completed_Sold", | |
| 440 | + "title": "1999 Pokemon Fossil 1st Edition #25 Lapras - PSA MINT 9" | |
| 441 | + }, | |
| 442 | + { | |
| 443 | + "auction_id": "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00", | |
| 444 | + "auction_type": "Weekly", | |
| 445 | + "buyer_premium": 22.0, | |
| 446 | + "company_id": "", | |
| 447 | + "current_price": 364, | |
| 448 | + "end_timestamp": "2026-09-07T03:11:38Z", | |
| 449 | + "lot_id": "202608-1820-4745-8b1cb579-97f3-419a-b9a9-f71968d475db", | |
| 450 | + "lot_number": 1084, | |
| 451 | + "meta_slug": "aug-1999-wizard-special-edition-pokemon-pikachu-cover-newsstand-psa-65azmi", | |
| 452 | + "min_bid_price": 10, | |
| 453 | + "number_of_bids": 39, | |
| 454 | + "primary_image_name": "b18ae3df-a2a4-449c-82ff-ee83001eaed7", | |
| 455 | + "reserve_amount": 0.0, | |
| 456 | + "start_timestamp": "2026-08-26T21:00:00Z", | |
| 457 | + "status": "Completed_Sold", | |
| 458 | + "title": "Aug. 1999 Wizard Special Edition: Pokemon Pikachu Cover (Newsstand) - Pop 1, None Higher - PSA 6.0 - Lone Newsstand in PSA Census - Wizard #96 Insert" | |
| 459 | + } | |
| 460 | + ], | |
| 461 | + "auctions": { | |
| 462 | + "202607-0713-1008-64d1433b-af54-480e-b236-44fc99c61d00": { | |
| 463 | + "title": "TCG Weekly Auction Aug 26 - Sep 6", | |
| 464 | + "auction_type": "Weekly", | |
| 465 | + "end_timestamp": "2026-09-07T02:00:00Z", | |
| 466 | + "buyer_premium": 22, | |
| 467 | + "status": "Completed" | |
| 468 | + } | |
| 469 | + } | |
| 470 | + } | |
| 471 | + }, | |
| 472 | + "expect": { | |
| 473 | + "count": 24, | |
| 474 | + "kinds": [ | |
| 475 | + "sale" | |
| 476 | + ], | |
| 477 | + "requiredFields": [ | |
| 478 | + "saleDate", | |
| 479 | + "price", | |
| 480 | + "currency", | |
| 481 | + "rawTitle", | |
| 482 | + "attributes.categorySlug", | |
| 483 | + "sourceUrl", | |
| 484 | + "externalId" | |
| 485 | + ] | |
| 486 | + }, | |
| 487 | + "note": "Captured live from the Goldin Sold Items grid (lots_v2 XHR during Scrapfly rendering). Prices include buyer premium." | |
| 488 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/goldin/sports-cards-sold-page.json
+491 −0
@@ -0,0 +1,491 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://goldin.co/buy/c/Sports_Cards?page=1&number_of_lots=24&show_only=Sold%20Items&sort=Most_Recent_Bids", | |
| 4 | + "externalId": "/buy/c/Sports_Cards#1", | |
| 5 | + "kind": "sale", | |
| 6 | + "engine": "scrapfly", | |
| 7 | + "fetchedAt": "2026-09-07T04:34:00.186432+00:00", | |
| 8 | + "payload": { | |
| 9 | + "kind": "sold_page", | |
| 10 | + "seed": { | |
| 11 | + "path": "/buy/c/Sports_Cards", | |
| 12 | + "categorySlug": "other_sports_cards" | |
| 13 | + }, | |
| 14 | + "page": 1, | |
| 15 | + "pageUrl": "https://goldin.co/buy/c/Sports_Cards?page=1&number_of_lots=24&show_only=Sold%20Items&sort=Most_Recent_Bids", | |
| 16 | + "request": { | |
| 17 | + "queryType": "Most_Recent_Bids", | |
| 18 | + "category": [ | |
| 19 | + "Sport" | |
| 20 | + ], | |
| 21 | + "item_type": [ | |
| 22 | + "Single Cards" | |
| 23 | + ], | |
| 24 | + "size": 240, | |
| 25 | + "from": 240, | |
| 26 | + "show_only": "Sold", | |
| 27 | + "hasAnalyticsConsent": false | |
| 28 | + }, | |
| 29 | + "total": 307200, | |
| 30 | + "lots": [ | |
| 31 | + { | |
| 32 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 33 | + "auction_type": "Weekly", | |
| 34 | + "buyer_premium": 22.0, | |
| 35 | + "company_id": "", | |
| 36 | + "current_price": 320, | |
| 37 | + "end_timestamp": "2026-09-04T02:38:19Z", | |
| 38 | + "lot_id": "202608-1817-5254-3e8e2d7a-cbe2-472a-b615-cf39ea96caf6", | |
| 39 | + "lot_number": 1423, | |
| 40 | + "meta_slug": "2018-19-panini-select-silver-prizm-7-shai-gilgeous-alexander-rookie-ca68cud", | |
| 41 | + "min_bid_price": 10, | |
| 42 | + "number_of_bids": 22, | |
| 43 | + "primary_image_name": "a44729ab-1579-438d-a3a9-a24dee98a3b8", | |
| 44 | + "reserve_amount": 0.0, | |
| 45 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 46 | + "status": "Completed_Sold", | |
| 47 | + "title": "2018-19 Panini Select Silver Prizm #7 Shai Gilgeous-Alexander Rookie Card - PSA GEM MT 10" | |
| 48 | + }, | |
| 49 | + { | |
| 50 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 51 | + "auction_type": "Weekly", | |
| 52 | + "buyer_premium": 22.0, | |
| 53 | + "company_id": "", | |
| 54 | + "current_price": 377, | |
| 55 | + "end_timestamp": "2026-09-04T02:37:57Z", | |
| 56 | + "lot_id": "202608-1914-3147-ccb6b7f7-f59e-4ae6-bec7-960df19bd15b", | |
| 57 | + "lot_number": 1320, | |
| 58 | + "meta_slug": "2024-topps-finest-f1-finest-autograph-red-refractor-fac-zho-zhou-guanym0z5z", | |
| 59 | + "min_bid_price": 10, | |
| 60 | + "number_of_bids": 40, | |
| 61 | + "primary_image_name": "abfd3d69-84e4-4931-8357-e87a27fb1e6d", | |
| 62 | + "reserve_amount": 0.0, | |
| 63 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 64 | + "status": "Completed_Sold", | |
| 65 | + "title": "2024 Topps Finest F1 Finest Autograph Red Refractor #FAC-ZHO Zhou Guanyu Signed Card (#4/5) - PSA GEM MT 10" | |
| 66 | + }, | |
| 67 | + { | |
| 68 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 69 | + "auction_type": "Weekly", | |
| 70 | + "buyer_premium": 22.0, | |
| 71 | + "company_id": "", | |
| 72 | + "current_price": 1300, | |
| 73 | + "end_timestamp": "2026-09-04T02:37:42Z", | |
| 74 | + "lot_id": "202604-2718-2921-bc9b8b2e-38e4-4af3-976e-8b8f49a230cc", | |
| 75 | + "lot_number": 1060, | |
| 76 | + "meta_slug": "2024-25-panini-mosaic-black-mosaic-38-shai-gilgeous-alexander-1-1een6t", | |
| 77 | + "min_bid_price": 10, | |
| 78 | + "number_of_bids": 44, | |
| 79 | + "primary_image_name": "55c7d257-3c0b-4830-87d8-29308849d970", | |
| 80 | + "reserve_amount": 0.0, | |
| 81 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 82 | + "status": "Completed_Sold", | |
| 83 | + "title": "2024-25 Panini Mosaic International Black #38 Shai Gilgeous-Alexander (#1/1) - PSA NM 7" | |
| 84 | + }, | |
| 85 | + { | |
| 86 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 87 | + "auction_type": "Weekly", | |
| 88 | + "buyer_premium": 22.0, | |
| 89 | + "company_id": "", | |
| 90 | + "current_price": 405, | |
| 91 | + "end_timestamp": "2026-09-04T02:37:37Z", | |
| 92 | + "lot_id": "202608-1318-4848-80efaa2c-5c00-41c3-9b3d-eeb7aa7f9bac", | |
| 93 | + "lot_number": 1482, | |
| 94 | + "meta_slug": "1998-topps-power-brokers-refractor-pb3-ken-griffey-jr-psa-mint-9d5jui", | |
| 95 | + "min_bid_price": 10, | |
| 96 | + "number_of_bids": 17, | |
| 97 | + "primary_image_name": "85e01252-92d0-44ad-baf0-5122d627b45c", | |
| 98 | + "reserve_amount": 0.0, | |
| 99 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 100 | + "status": "Completed_Sold", | |
| 101 | + "title": "1998 Topps Power Brokers Refractor #PB3 Ken Griffey Jr. - PSA MINT 9" | |
| 102 | + }, | |
| 103 | + { | |
| 104 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 105 | + "auction_type": "Weekly", | |
| 106 | + "buyer_premium": 22.0, | |
| 107 | + "company_id": "", | |
| 108 | + "current_price": 230, | |
| 109 | + "end_timestamp": "2026-09-04T02:37:14Z", | |
| 110 | + "lot_id": "202608-1720-5236-401f95aa-7797-4793-af45-f03a1e7b50d0", | |
| 111 | + "lot_number": 1307, | |
| 112 | + "meta_slug": "2024-25-panini-one-one-fourth-dimension-fd-gia-giannis-antetokounmpo-0v77pu", | |
| 113 | + "min_bid_price": 10, | |
| 114 | + "number_of_bids": 31, | |
| 115 | + "primary_image_name": "b76d7ded-9611-4ce8-abb1-24b2ab2f2c3f", | |
| 116 | + "reserve_amount": 0.0, | |
| 117 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 118 | + "status": "Completed_Sold", | |
| 119 | + "title": "2024-25 Panini One & One Fourth Dimension #FD-GIA Giannis Antetokounmpo (#05/10) - Panini Encased" | |
| 120 | + }, | |
| 121 | + { | |
| 122 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 123 | + "auction_type": "Weekly", | |
| 124 | + "buyer_premium": 22.0, | |
| 125 | + "company_id": "", | |
| 126 | + "current_price": 140, | |
| 127 | + "end_timestamp": "2026-09-04T02:37:08Z", | |
| 128 | + "lot_id": "202608-1318-4846-940a66b0-ae40-4e23-861f-2da90dad8053", | |
| 129 | + "lot_number": 1547, | |
| 130 | + "meta_slug": "1970-topps-90-o-j-simpson-rookie-card-psa-ex-mt-6c8phh", | |
| 131 | + "min_bid_price": 10, | |
| 132 | + "number_of_bids": 13, | |
| 133 | + "primary_image_name": "6f7373cb-60f2-4ad3-a96f-b02b37ddd28f", | |
| 134 | + "reserve_amount": 0.0, | |
| 135 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 136 | + "status": "Completed_Sold", | |
| 137 | + "title": "1970 Topps #90 O.J. Simpson Rookie Card - PSA EX-MT 6" | |
| 138 | + }, | |
| 139 | + { | |
| 140 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 141 | + "auction_type": "Weekly", | |
| 142 | + "buyer_premium": 22.0, | |
| 143 | + "company_id": "", | |
| 144 | + "current_price": 375, | |
| 145 | + "end_timestamp": "2026-09-04T02:36:59Z", | |
| 146 | + "lot_id": "202608-1915-2040-39affd62-0834-4141-9e12-8768f68b5770", | |
| 147 | + "lot_number": 1197, | |
| 148 | + "meta_slug": "2026-topps-finest-gustographs-ga-bh-bryce-harper-signed-card-unused-retaksj", | |
| 149 | + "min_bid_price": 10, | |
| 150 | + "number_of_bids": 44, | |
| 151 | + "primary_image_name": "52700420-c8f0-4574-bf98-0d6a58b56569", | |
| 152 | + "reserve_amount": 0.0, | |
| 153 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 154 | + "status": "Completed_Sold", | |
| 155 | + "title": "2026 Topps Finest Gustographs #GA-BH Bryce Harper Signed Card - Unused Redemption Card" | |
| 156 | + }, | |
| 157 | + { | |
| 158 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 159 | + "auction_type": "Weekly", | |
| 160 | + "buyer_premium": 22.0, | |
| 161 | + "company_id": "", | |
| 162 | + "current_price": 193, | |
| 163 | + "end_timestamp": "2026-09-04T02:36:17Z", | |
| 164 | + "lot_id": "202608-1715-3548-af987d11-c0f5-4834-876e-71d1efed6d91", | |
| 165 | + "lot_number": 1240, | |
| 166 | + "meta_slug": "2025-topps-dynasty-autograph-patch-dap-cb3-carlos-beltran-signed-gameyi6hw", | |
| 167 | + "min_bid_price": 10, | |
| 168 | + "number_of_bids": 18, | |
| 169 | + "primary_image_name": "033f59d7-675d-46ce-bba1-bc339c22e959", | |
| 170 | + "reserve_amount": 0.0, | |
| 171 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 172 | + "status": "Completed_Sold", | |
| 173 | + "title": "2025 Topps Dynasty Autograph Patch #DAP-CB3 Carlos Beltran Signed Game-Used Patch Card (#06/10) - Topps Encased" | |
| 174 | + }, | |
| 175 | + { | |
| 176 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 177 | + "auction_type": "Weekly", | |
| 178 | + "buyer_premium": 22.0, | |
| 179 | + "company_id": "", | |
| 180 | + "current_price": 2501, | |
| 181 | + "end_timestamp": "2026-09-04T02:36:12Z", | |
| 182 | + "lot_id": "202608-1317-5031-b2213510-1353-41b1-939d-43dac4c7a2c2", | |
| 183 | + "lot_number": 1324, | |
| 184 | + "meta_slug": "2024-panini-select-wnba-future-gold-flash-prizm-4-caitlin-clark-rookieky491", | |
| 185 | + "min_bid_price": 10, | |
| 186 | + "number_of_bids": 45, | |
| 187 | + "primary_image_name": "8ddbe960-7e47-4e99-a49c-25a365f7b2e3", | |
| 188 | + "reserve_amount": 0.0, | |
| 189 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 190 | + "status": "Completed_Sold", | |
| 191 | + "title": "2024 Panini Select WNBA Future Gold Flash Prizm #4 Caitlin Clark Rookie Card (#03/10) - PSA GEM MT 10" | |
| 192 | + }, | |
| 193 | + { | |
| 194 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 195 | + "auction_type": "Weekly", | |
| 196 | + "buyer_premium": 22.0, | |
| 197 | + "company_id": "", | |
| 198 | + "current_price": 270, | |
| 199 | + "end_timestamp": "2026-09-04T02:36:11Z", | |
| 200 | + "lot_id": "202608-2513-1323-c992ff53-4256-45e1-ac96-c086e77607da", | |
| 201 | + "lot_number": 1267, | |
| 202 | + "meta_slug": "2025-topps-chrome-f1-refractor-8-kimi-antonelli-rookie-card-psa-mint-957lid", | |
| 203 | + "min_bid_price": 10, | |
| 204 | + "number_of_bids": 6, | |
| 205 | + "primary_image_name": "6822d905-6d8d-4327-afe5-78e472dd70d1", | |
| 206 | + "reserve_amount": 0.0, | |
| 207 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 208 | + "status": "Completed_Sold", | |
| 209 | + "title": "2025 Topps Chrome F1 Refractor #8 Kimi Antonelli Rookie Card - PSA MINT 9" | |
| 210 | + }, | |
| 211 | + { | |
| 212 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 213 | + "auction_type": "Weekly", | |
| 214 | + "buyer_premium": 22.0, | |
| 215 | + "company_id": "", | |
| 216 | + "current_price": 675, | |
| 217 | + "end_timestamp": "2026-09-04T02:36:09Z", | |
| 218 | + "lot_id": "202608-2114-1915-eef7996c-de07-40bf-9b5b-c3c5bfda6b67", | |
| 219 | + "lot_number": 1194, | |
| 220 | + "meta_slug": "2026-topps-tribute-autograph-i-purple-ta-mmu-munetaka-murakami-signedjagng", | |
| 221 | + "min_bid_price": 10, | |
| 222 | + "number_of_bids": 21, | |
| 223 | + "primary_image_name": "f2416b42-6cfb-4e80-95be-372606f18b05", | |
| 224 | + "reserve_amount": 0.0, | |
| 225 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 226 | + "status": "Completed_Sold", | |
| 227 | + "title": "2026 Topps Tribute Autograph I Purple #TA-MMU Munetaka Murakami Signed Card (#/75) - Unused Redemption Card" | |
| 228 | + }, | |
| 229 | + { | |
| 230 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 231 | + "auction_type": "Weekly", | |
| 232 | + "buyer_premium": 22.0, | |
| 233 | + "company_id": "", | |
| 234 | + "current_price": 33, | |
| 235 | + "end_timestamp": "2026-09-04T02:35:36Z", | |
| 236 | + "lot_id": "202606-3021-2029-8f4487d5-e9bf-443c-9e29-aa5ef2460e5b", | |
| 237 | + "lot_number": 1426, | |
| 238 | + "meta_slug": "2018-19-panini-prizm-184-shai-gilgeous-alexander-rookie-card-psa-mintpygrj", | |
| 239 | + "min_bid_price": 10, | |
| 240 | + "number_of_bids": 11, | |
| 241 | + "primary_image_name": "d0d179fe-bb24-4f70-a45c-e56d62f2459e", | |
| 242 | + "reserve_amount": 0.0, | |
| 243 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 244 | + "status": "Completed_Sold", | |
| 245 | + "title": "2018-19 Panini Prizm #184 Shai Gilgeous-Alexander Rookie Card - PSA MINT 9" | |
| 246 | + }, | |
| 247 | + { | |
| 248 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 249 | + "auction_type": "Weekly", | |
| 250 | + "buyer_premium": 22.0, | |
| 251 | + "company_id": "", | |
| 252 | + "current_price": 34, | |
| 253 | + "end_timestamp": "2026-09-04T02:35:06Z", | |
| 254 | + "lot_id": "202607-2220-5235-9a610040-ed1a-45cb-b03a-34ee38927214", | |
| 255 | + "lot_number": 1205, | |
| 256 | + "meta_slug": "2025-26-topps-201-cooper-flagg-rookie-card-psa-mint-95s9fx", | |
| 257 | + "min_bid_price": 10, | |
| 258 | + "number_of_bids": 12, | |
| 259 | + "primary_image_name": "218ee629-2a49-4459-a2f6-06af399a8a80", | |
| 260 | + "reserve_amount": 0.0, | |
| 261 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 262 | + "status": "Completed_Sold", | |
| 263 | + "title": "2025-26 Topps #201 Cooper Flagg Rookie Card - PSA MINT 9" | |
| 264 | + }, | |
| 265 | + { | |
| 266 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 267 | + "auction_type": "Weekly", | |
| 268 | + "buyer_premium": 22.0, | |
| 269 | + "company_id": "", | |
| 270 | + "current_price": 1981, | |
| 271 | + "end_timestamp": "2026-09-04T02:34:39Z", | |
| 272 | + "lot_id": "202608-1220-1310-57bd4fff-1c11-46cd-9d5f-a203a5de51cc", | |
| 273 | + "lot_number": 1123, | |
| 274 | + "meta_slug": "1982-topps-610-rickey-henderson-psa-gem-mt-10df2z3", | |
| 275 | + "min_bid_price": 10, | |
| 276 | + "number_of_bids": 16, | |
| 277 | + "primary_image_name": "cd4b97d8-f6f2-48a0-9faf-1b7cdb0a599c", | |
| 278 | + "reserve_amount": 0.0, | |
| 279 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 280 | + "status": "Completed_Sold", | |
| 281 | + "title": "1982 Topps #610 Rickey Henderson - PSA GEM MT 10" | |
| 282 | + }, | |
| 283 | + { | |
| 284 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 285 | + "auction_type": "Weekly", | |
| 286 | + "buyer_premium": 22.0, | |
| 287 | + "company_id": "", | |
| 288 | + "current_price": 1000, | |
| 289 | + "end_timestamp": "2026-09-04T02:34:29Z", | |
| 290 | + "lot_id": "202608-1317-5031-c7cae1d5-4784-436a-989c-58320aea2a2f", | |
| 291 | + "lot_number": 1325, | |
| 292 | + "meta_slug": "2024-panini-select-turbocharged-tie-dye-prizm-24-drake-maye-rookie-caryf54l", | |
| 293 | + "min_bid_price": 10, | |
| 294 | + "number_of_bids": 39, | |
| 295 | + "primary_image_name": "befe0455-e515-4a50-930a-2fea938db2c0", | |
| 296 | + "reserve_amount": 0.0, | |
| 297 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 298 | + "status": "Completed_Sold", | |
| 299 | + "title": "2024 Panini Select Turbocharged Tie-Dye Prizm #24 Drake Maye Rookie Card (#15/25) - PSA GEM MT 10" | |
| 300 | + }, | |
| 301 | + { | |
| 302 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 303 | + "auction_type": "Weekly", | |
| 304 | + "buyer_premium": 22.0, | |
| 305 | + "company_id": "", | |
| 306 | + "current_price": 286, | |
| 307 | + "end_timestamp": "2026-09-04T02:34:22Z", | |
| 308 | + "lot_id": "202608-2416-2842-7ebb6a1c-aa7c-4d63-a612-b4b6d45e4c98", | |
| 309 | + "lot_number": 1412, | |
| 310 | + "meta_slug": "2020-topps-chrome-f1-sapphire-edition-aqua-177-charles-leclerc-83-99-pqjryx", | |
| 311 | + "min_bid_price": 10, | |
| 312 | + "number_of_bids": 30, | |
| 313 | + "primary_image_name": "a13651de-e422-48d2-a02a-80169706eae2", | |
| 314 | + "reserve_amount": 0.0, | |
| 315 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 316 | + "status": "Completed_Sold", | |
| 317 | + "title": "2020 Topps Chrome F1 Sapphire Edition Aqua #177 Charles Leclerc (#83/99) - PSA GEM MT 10" | |
| 318 | + }, | |
| 319 | + { | |
| 320 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 321 | + "auction_type": "Weekly", | |
| 322 | + "buyer_premium": 22.0, | |
| 323 | + "company_id": "", | |
| 324 | + "current_price": 315, | |
| 325 | + "end_timestamp": "2026-09-04T02:33:25Z", | |
| 326 | + "lot_id": "202608-1714-4422-cfad9beb-5a28-4e43-b518-22455683fd4b", | |
| 327 | + "lot_number": 1247, | |
| 328 | + "meta_slug": "2025-topps-dynasty-autograph-patch-dapb-rj1-reggie-jackson-signed-game1rgr7", | |
| 329 | + "min_bid_price": 10, | |
| 330 | + "number_of_bids": 20, | |
| 331 | + "primary_image_name": "abf0e6a3-a3f5-45cf-9800-83e6f44c290a", | |
| 332 | + "reserve_amount": 0.0, | |
| 333 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 334 | + "status": "Completed_Sold", | |
| 335 | + "title": "2025 Topps Dynasty Autograph Patch #DAPB-RJ1 Reggie Jackson Signed Game-Used Patch Card (#08/10) - Topps Encased" | |
| 336 | + }, | |
| 337 | + { | |
| 338 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 339 | + "auction_type": "Weekly", | |
| 340 | + "buyer_premium": 22.0, | |
| 341 | + "company_id": "", | |
| 342 | + "current_price": 1202, | |
| 343 | + "end_timestamp": "2026-09-04T02:32:59Z", | |
| 344 | + "lot_id": "202607-2413-2730-3af9b927-41a7-4140-9330-10f354a4e1f0", | |
| 345 | + "lot_number": 1441, | |
| 346 | + "meta_slug": "2016-topps-dynasty-autograph-patch-ap-nr8-nolan-ryan-signed-patch-cardy26vo", | |
| 347 | + "min_bid_price": 10, | |
| 348 | + "number_of_bids": 55, | |
| 349 | + "primary_image_name": "eb19f5bb-a7ba-4c83-96f7-86f2f77aa099", | |
| 350 | + "reserve_amount": 0.0, | |
| 351 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 352 | + "status": "Completed_Sold", | |
| 353 | + "title": "2016 Topps Dynasty Autograph Patch #AP-NR8 Nolan Ryan Signed Patch Card (#07/10) - Topps Encased" | |
| 354 | + }, | |
| 355 | + { | |
| 356 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 357 | + "auction_type": "Weekly", | |
| 358 | + "buyer_premium": 22.0, | |
| 359 | + "company_id": "", | |
| 360 | + "current_price": 20, | |
| 361 | + "end_timestamp": "2026-09-04T02:32:58Z", | |
| 362 | + "lot_id": "202608-1315-3430-570b0f75-0723-4b2b-8ddc-af887d929ed3", | |
| 363 | + "lot_number": 1319, | |
| 364 | + "meta_slug": "2024-topps-now-11-jayden-daniels-rookie-card-sgc-gm-10hhsxp", | |
| 365 | + "min_bid_price": 10, | |
| 366 | + "number_of_bids": 6, | |
| 367 | + "primary_image_name": "b0aae2f5-af5b-4a1a-a001-146175bc0d04", | |
| 368 | + "reserve_amount": 0.0, | |
| 369 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 370 | + "status": "Completed_Sold", | |
| 371 | + "title": "2024 Topps Now #11 Jayden Daniels Rookie Card - SGC GM 10" | |
| 372 | + }, | |
| 373 | + { | |
| 374 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 375 | + "auction_type": "Weekly", | |
| 376 | + "buyer_premium": 22.0, | |
| 377 | + "company_id": "", | |
| 378 | + "current_price": 507, | |
| 379 | + "end_timestamp": "2026-09-04T02:32:43Z", | |
| 380 | + "lot_id": "202608-1420-5827-4b89544e-3ce7-4f18-a9b0-ddbd1fe5ed42", | |
| 381 | + "lot_number": 1245, | |
| 382 | + "meta_slug": "2025-topps-dynasty-autograph-patch-design-b-gold-dapb-oh1-orel-hershis0mxhq", | |
| 383 | + "min_bid_price": 10, | |
| 384 | + "number_of_bids": 38, | |
| 385 | + "primary_image_name": "b3ddc6ac-b5de-45e1-bd36-1a48a9d78196", | |
| 386 | + "reserve_amount": 0.0, | |
| 387 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 388 | + "status": "Completed_Sold", | |
| 389 | + "title": "2025 Topps Dynasty Autograph Patch Design B Gold #DAPB-OH1 Orel Hershiser Signed Game-Used Patch Card (#1/1) - Topps Encased" | |
| 390 | + }, | |
| 391 | + { | |
| 392 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 393 | + "auction_type": "Weekly", | |
| 394 | + "buyer_premium": 22.0, | |
| 395 | + "company_id": "", | |
| 396 | + "current_price": 135, | |
| 397 | + "end_timestamp": "2026-09-04T02:32:42Z", | |
| 398 | + "lot_id": "202608-1420-5826-f700b614-22b1-40f3-82dd-5809d54a28e1", | |
| 399 | + "lot_number": 1256, | |
| 400 | + "meta_slug": "2025-topps-dynasty-autograph-patch-design-b-dapb-cse2-cory-seager-signy17m9", | |
| 401 | + "min_bid_price": 10, | |
| 402 | + "number_of_bids": 28, | |
| 403 | + "primary_image_name": "bd47aef3-8b14-44e4-ad9a-9c1e91d166a4", | |
| 404 | + "reserve_amount": 0.0, | |
| 405 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 406 | + "status": "Completed_Sold", | |
| 407 | + "title": "2025 Topps Dynasty Autograph Patch Design B #DAPB-CSE2 Cory Seager Signed Game-Used Patch Card (#09/10) - Topps Encased" | |
| 408 | + }, | |
| 409 | + { | |
| 410 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 411 | + "auction_type": "Weekly", | |
| 412 | + "buyer_premium": 22.0, | |
| 413 | + "company_id": "", | |
| 414 | + "current_price": 661, | |
| 415 | + "end_timestamp": "2026-09-04T02:32:29Z", | |
| 416 | + "lot_id": "202608-1317-5029-56273f16-c136-406c-91e4-fe79e5a8c6dd", | |
| 417 | + "lot_number": 1510, | |
| 418 | + "meta_slug": "1989-90-fleer-sticker-3-michael-jordan-psa-mint-9az7ry", | |
| 419 | + "min_bid_price": 10, | |
| 420 | + "number_of_bids": 6, | |
| 421 | + "primary_image_name": "f89b62cf-4ac0-43fc-ab6e-19a0441b0243", | |
| 422 | + "reserve_amount": 0.0, | |
| 423 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 424 | + "status": "Completed_Sold", | |
| 425 | + "title": "1989-90 Fleer Sticker #3 Michael Jordan - PSA MINT 9" | |
| 426 | + }, | |
| 427 | + { | |
| 428 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 429 | + "auction_type": "Weekly", | |
| 430 | + "buyer_premium": 22.0, | |
| 431 | + "company_id": "", | |
| 432 | + "current_price": 240, | |
| 433 | + "end_timestamp": "2026-09-04T02:32:24Z", | |
| 434 | + "lot_id": "202608-2102-2436-8483e290-8970-4f1b-a0a0-b2a9e6af0593", | |
| 435 | + "lot_number": 1103, | |
| 436 | + "meta_slug": "2015-16-immaculate-collection-signatures-blue-sca-carmelo-anthony-signq3ekh", | |
| 437 | + "min_bid_price": 10, | |
| 438 | + "number_of_bids": 27, | |
| 439 | + "primary_image_name": "ce7ba138-7562-4ea4-a9b4-605c005f396d", | |
| 440 | + "reserve_amount": 0.0, | |
| 441 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 442 | + "status": "Completed_Sold", | |
| 443 | + "title": "2015-16 Immaculate Collection Signatures Blue #SCA Carmelo Anthony Signed Card (#04/10) - BGS NM-MT+ 8.5" | |
| 444 | + }, | |
| 445 | + { | |
| 446 | + "auction_id": "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806", | |
| 447 | + "auction_type": "Weekly", | |
| 448 | + "buyer_premium": 22.0, | |
| 449 | + "company_id": "", | |
| 450 | + "current_price": 175, | |
| 451 | + "end_timestamp": "2026-09-04T02:32:11Z", | |
| 452 | + "lot_id": "202608-2102-2432-7bd61896-09cc-4c1c-899b-904efb2204e8", | |
| 453 | + "lot_number": 1470, | |
| 454 | + "meta_slug": "2003-04-campioni-di-futuro-sky-54-roger-federer-psa-gem-mt-10edu3c", | |
| 455 | + "min_bid_price": 10, | |
| 456 | + "number_of_bids": 22, | |
| 457 | + "primary_image_name": "ccfeb1d8-49ea-48c3-b984-ef97f10d383b", | |
| 458 | + "reserve_amount": 0.0, | |
| 459 | + "start_timestamp": "2026-08-25T21:00:00Z", | |
| 460 | + "status": "Completed_Sold", | |
| 461 | + "title": "2003-04 Campioni Di Futuro Sky #54 Roger Federer - PSA GEM MT 10" | |
| 462 | + } | |
| 463 | + ], | |
| 464 | + "auctions": { | |
| 465 | + "202603-0419-0721-c5607146-069a-47ef-8151-7ae9a6ad3806": { | |
| 466 | + "title": "2026 Weekly Auction Aug 25 - Sep 3", | |
| 467 | + "auction_type": "Weekly", | |
| 468 | + "end_timestamp": "2026-09-04T02:00:00Z", | |
| 469 | + "buyer_premium": 22, | |
| 470 | + "status": "Completed" | |
| 471 | + } | |
| 472 | + } | |
| 473 | + } | |
| 474 | + }, | |
| 475 | + "expect": { | |
| 476 | + "count": 24, | |
| 477 | + "kinds": [ | |
| 478 | + "sale" | |
| 479 | + ], | |
| 480 | + "requiredFields": [ | |
| 481 | + "saleDate", | |
| 482 | + "price", | |
| 483 | + "currency", | |
| 484 | + "rawTitle", | |
| 485 | + "attributes.categorySlug", | |
| 486 | + "sourceUrl", | |
| 487 | + "externalId" | |
| 488 | + ] | |
| 489 | + }, | |
| 490 | + "note": "Captured live from the Goldin Sold Items grid (lots_v2 XHR during Scrapfly rendering). Prices include buyer premium." | |
| 491 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/phillips-watches/CH080226.json
+29 −0
@@ -0,0 +1,29 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.phillips.com/auction/CH080226", | |
| 4 | + "externalId": "CH080226", | |
| 5 | + "kind": "sale", | |
| 6 | + "engine": "firecrawl", | |
| 7 | + "fetchedAt": "2026-09-07T04:42:56.067Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "auction_results", | |
| 10 | + "url": "https://www.phillips.com/auction/CH080226", | |
| 11 | + "saleNumber": "CH080226", | |
| 12 | + "title": "The Geneva Watch Auction: XXIII", | |
| 13 | + "location": "GENEVA", | |
| 14 | + "startDate": "2026-05-09T14:00:00+02:00", | |
| 15 | + "endDate": "2026-05-10T18:00:00+02:00", | |
| 16 | + "lotCount": 225, | |
| 17 | + "markdown": "## Search\n\nSearch\n\nAuctions\n\n- [Calendar](https://www.phillips.com/calendar/upcoming)\n\nDepartments\n\n- [Exhibitions](https://www.phillips.com/exhibitions)\n- [Perpetual](https://perpetual.phillips.com/)\n- [Dropshop](https://dropshop.phillips.com/)\n- [Editorial](https://www.phillips.com/editorial)\n\nClose\n\nLive Auction\n\n# The Geneva Watch Auction: XXIII\n\nGeneva\n\nConcludedMay 10 2026\n\nBrowse Upcoming Sales[View Calendar](https://www.phillips.com/calendar)\n\n\n\nOverviewBrowse lots\n\nFilters\n\nLot Navigation\n\nShow Lot123456789101112131415161718192021222324252627282930313233343536373940414243444546474849505152535455565758596061626364656667687071727374757677787980818283848586878890919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229\n\n## 225 Lots\n\n[\\\\\n\\\\\n1\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nÉlégante 48\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF82,550](https://www.phillips.com/detail/f.p.-journe/231278)\n\n[\\\\\nNo Reserve\\\\\n2\\\\\n\\\\\nKrayon\\\\\n\\\\\nAnywhere Métiers d’Art Azur\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF209,550](https://www.phillips.com/detail/krayon/227857)\n\n[\\\\\n\\\\\n3\\\\\n\\\\\nDaniel Roth\\\\\nRef. DBB001\\\\\nExtra Plat\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF57,150](https://www.phillips.com/detail/daniel-roth/231344)\n\n[\\\\\n\\\\\n4\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Lune \"38mm Brass Movement\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF533,400](https://www.phillips.com/detail/f.p.-journe/227654)\n\n[\\\\\n\\\\\n5\\\\\n\\\\\nDaniel Roth\\\\\nRef. C187\\\\\nTourbillon Regulateur Double Face \"White Gold\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF241,300](https://www.phillips.com/detail/daniel-roth/230434)\n\n[\\\\\n\\\\\n6\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronomètre à Résonance \"Souscription No. 18\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF450,000–900,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF4,875,500](https://www.phillips.com/detail/f.p.-journe/229223)\n\n[\\\\\n\\\\\n7\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5055G\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF10,000–20,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF21,590](https://www.phillips.com/detail/patek-philippe/191565)\n\n[\\\\\n\\\\\n8\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5000J\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF6,000–12,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF11,430](https://www.phillips.com/detail/patek-philippe/191562)\n\n[\\\\\n\\\\\n9\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5004P\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF180,000–360,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF457,200](https://www.phillips.com/detail/patek-philippe/191622)\n\n[\\\\\n\\\\\n10\\\\\n\\\\\nPatek Philippe\\\\\nRef. 130\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF44,450](https://www.phillips.com/detail/patek-philippe/191639)\n\n[\\\\\n\\\\\n11\\\\\n\\\\\nCharles Frodsham\\\\\n\\\\\n\"Minute Repeating Split Seconds Chronograph \"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF10,000–20,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF40,640](https://www.phillips.com/detail/charles-frodsham/232880)\n\n[\\\\\n\\\\\n12\\\\\n\\\\\nJ. W. Benson\\\\\n\\\\\n\"Double Dial Two Time-Zones\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF177,800](https://www.phillips.com/detail/j.-w.-benson/232869)\n\n[\\\\\n\\\\\n13\\\\\n\\\\\nCharles Frodsham\\\\\n\\\\\n\"Split Seconds Chronograph Tourbillon\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF152,400](https://www.phillips.com/detail/charles-frodsham/232876)\n\n[\\\\\n\\\\\n14\\\\\n\\\\\nKarl Geitz\\\\\n\\\\\n\"Flying Tourbillon with Spring Detent Escapement\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF355,600](https://www.phillips.com/detail/karl-geitz/232866)\n\n[\\\\\n\\\\\n15\\\\\n\\\\\nRolex\\\\\nRef. 116515LN\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF30,480](https://www.phillips.com/detail/rolex/191633)\n\n[\\\\\n\\\\\n16\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3700\\\\\nNautilus \"Jumbo\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF273,050](https://www.phillips.com/detail/patek-philippe/232557)\n\n[\\\\\n\\\\\n17\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 5402\\\\\nRoyal Oak \"A Series\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF120,650](https://www.phillips.com/detail/audemars-piguet/229799)\n\n[\\\\\n\\\\\n18\\\\\n\\\\\nRolex\\\\\nRef. 4768\\\\\nAnti-Magnetique\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF90,000–180,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF292,100](https://www.phillips.com/detail/rolex/231911)\n\n[\\\\\n\\\\\n19\\\\\n\\\\\nRolex\\\\\nRef. 6234\\\\\nOyster Chronograph “Pre-Daytona”\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF203,200](https://www.phillips.com/detail/rolex/231677)\n\n[\\\\\n\\\\\n20\\\\\n\\\\\nRolex\\\\\nRef. 6200\\\\\nSubmariner \"Big Crown\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF139,700](https://www.phillips.com/detail/rolex/230933)\n\n[\\\\\n\\\\\n21\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5070G-014\\\\\n\"Saatchi Gallery\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF250,000–500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF711,200](https://www.phillips.com/detail/patek-philippe/229751)\n\n[\\\\\n\\\\\n22\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3998J-013\\\\\nUnique \"HALMUT NAUTUN\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF444,500](https://www.phillips.com/detail/patek-philippe/226544)\n\n[\\\\\n\\\\\n23\\\\\n\\\\\nZenith\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF88,900](https://www.phillips.com/detail/zenith/232746)\n\n[\\\\\n\\\\\n24\\\\\n\\\\\nAgassiz Watch Co.\\\\\n\\\\\n\"Victory Watch - Charles de Gaulle\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF1,460,500](https://www.phillips.com/detail/agassiz-watch-co./231681)\n\n[\\\\\n\\\\\n25\\\\\n\\\\\nPatek Philippe\\\\\n\\\\\n\"Minute Repeating Perpetual Calendar Chronograph\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF190,500](https://www.phillips.com/detail/patek-philippe/223003)\n\n[\\\\\n\\\\\n26\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 5503\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF1,092,200](https://www.phillips.com/detail/audemars-piguet/229851)\n\n[\\\\\n\\\\\n27\\\\\n\\\\\nPatek Philippe\\\\\nRef. 2523\\\\\n\"Polychrome Two-crown World-time\", \"Doppia Corona Policromo\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nIn excess of CHF5,000,000 / €5,490,000 / $6,340,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF7,961,000](https://www.phillips.com/detail/patek-philippe/231940)\n\n[\\\\\n\\\\\n28\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5231J-001\\\\\nWorld Time\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF120,650](https://www.phillips.com/detail/patek-philippe/231912)\n\n[\\\\\n\\\\\n29\\\\\n\\\\\nPatek Philippe\\\\\nRef. 788\\\\\nRicochet\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF63,500](https://www.phillips.com/detail/patek-philippe/229325)\n\n[\\\\\n\\\\\n30\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3619\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF368,300](https://www.phillips.com/detail/patek-philippe/232259)\n\n[\\\\\n\\\\\n31\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5168G-001\\\\\nAquanaut\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF95,250](https://www.phillips.com/detail/patek-philippe/231276)\n\n[\\\\\n\\\\\n32\\\\\n\\\\\nRolex\\\\\nRef. 126506\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF114,300](https://www.phillips.com/detail/rolex/231277)\n\n[\\\\\n\\\\\n33\\\\\n\\\\\nUrwerk\\\\\nRef. UR-103.02\\\\\nUR103\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF27,940](https://www.phillips.com/detail/urwerk/230804)\n\n[\\\\\n\\\\\n34\\\\\n\\\\\nUrban Jürgensen\\\\\n\\\\\nReference 6\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF152,400](https://www.phillips.com/detail/urban-j%C3%BCrgensen/231711)\n\n[\\\\\n\\\\\n35\\\\\n\\\\\nDe Bethune\\\\\nRef. DBK2V1\\\\\nDB Kind of Two Jumping GMT\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF177,800](https://www.phillips.com/detail/de-bethune/227678)\n\n[\\\\\n\\\\\n36\\\\\n\\\\\nAkrivia\\\\\n\\\\\nAK-06\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF350,000–700,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF3,000,000](https://www.phillips.com/detail/akrivia/226172)\n\n[\\\\\nNo Reserve\\\\\n37\\\\\n\\\\\nHautlence\\\\\nRef. HLS 02\\\\\nHLS 02\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF8,000–16,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF15,240](https://www.phillips.com/detail/hautlence/232269)\n\n[\\\\\n\\\\\n39\\\\\n\\\\\nPiaget\\\\\nRef. 9731C210\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF35,560](https://www.phillips.com/detail/piaget/229538)\n\n[\\\\\n\\\\\n40\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 6346\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF10,000–20,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF16,510](https://www.phillips.com/detail/vacheron-constantin/229329)\n\n[\\\\\n\\\\\n41\\\\\n\\\\\nPatek Philippe\\\\\nRef. 4397/1\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF165,100](https://www.phillips.com/detail/patek-philippe/232264)\n\n[\\\\\n\\\\\n42\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3589/1\\\\\nGrand Ellipse\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF12,000–24,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF33,020](https://www.phillips.com/detail/patek-philippe/231523)\n\n[\\\\\n\\\\\n43\\\\\n\\\\\nChaumet\\\\\nRef. 10A\\\\\nPléiade\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF5,000–10,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF72,390](https://www.phillips.com/detail/chaumet/230433)\n\n[\\\\\n\\\\\n44\\\\\n\\\\\nPatek Philippe\\\\\nRef. 4232/1\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF279,400](https://www.phillips.com/detail/patek-philippe/230427)\n\n[\\\\\n\\\\\n45\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3940J-028\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF342,900](https://www.phillips.com/detail/patek-philippe/230320)\n\n[\\\\\n\\\\\n46\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 15305ST\\\\\nRoyal Oak\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF114,300](https://www.phillips.com/detail/audemars-piguet/226593)\n\n[\\\\\n\\\\\n47\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5970P\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF140,000–280,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF355,600](https://www.phillips.com/detail/patek-philippe/225455)\n\n[\\\\\n\\\\\n48\\\\\n\\\\\nCredor\\\\\nRef. GBAQ958\\\\\nCaliber 6870 25th Anniversary\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF6,000–12,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF19,050](https://www.phillips.com/detail/credor/230435)\n\n[\\\\\n\\\\\n49\\\\\n\\\\\nGrand Seiko\\\\\nRef. 6145-8030\\\\\n61GS\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF5,000–10,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF38,100](https://www.phillips.com/detail/grand-seiko/232802)\n\n[\\\\\n\\\\\n50\\\\\n\\\\\nGrand Seiko\\\\\nRef. J14070\\\\\nGrand Seiko \"The First\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF7,000–14,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF19,050](https://www.phillips.com/detail/grand-seiko/232803)\n\n[\\\\\n\\\\\n51\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5070R-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF35,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF82,550](https://www.phillips.com/detail/patek-philippe/226591)\n\n[\\\\\n\\\\\n52\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5261R-001\\\\\nAquanaut\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF215,900](https://www.phillips.com/detail/patek-philippe/230777)\n\n[\\\\\n\\\\\n53\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5711/1A-014\\\\\nNautilus \"Green Dial\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF190,500](https://www.phillips.com/detail/patek-philippe/230485)\n\n[\\\\\n\\\\\n54\\\\\n\\\\\nRichard Mille\\\\\nRef. RM027-RN\\\\\nRM27 \"Nadal\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF500,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF952,500](https://www.phillips.com/detail/richard-mille/230330)\n\n[\\\\\n\\\\\n55\\\\\n\\\\\nRichard Mille\\\\\nRef. RM65-01\\\\\nRM65-01\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF241,300](https://www.phillips.com/detail/richard-mille/231348)\n\n[\\\\\n\\\\\n56\\\\\n\\\\\nRolex\\\\\nRef. 1803\\\\\nDay-Date\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF18,000–36,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF33,020](https://www.phillips.com/detail/rolex/231522)\n\n[\\\\\n\\\\\n57\\\\\n\\\\\nRolex\\\\\nRef. 16238\\\\\nDatejust \"Lapis Lazuli\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF44,450](https://www.phillips.com/detail/rolex/231281)\n\n[\\\\\n\\\\\n58\\\\\n\\\\\nRolex\\\\\nRef. 16600\\\\\nSea-Dweller\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF5,000–10,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF10,160](https://www.phillips.com/detail/rolex/226541)\n\n[\\\\\n\\\\\n59\\\\\n\\\\\nRolex\\\\\nRef. 126660\\\\\nSea-Dweller, Deepsea “James Cameron”\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF5,000–10,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF19,050](https://www.phillips.com/detail/rolex/226540)\n\n[\\\\\n\\\\\n60\\\\\n\\\\\nRolex\\\\\nRef. 16528, caseback stamped 16500 to the inside\\\\\nCosmograph Daytona \"Floating\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF40,640](https://www.phillips.com/detail/rolex/229239)\n\n[\\\\\n\\\\\n61\\\\\n\\\\\nAndersen Geneve\\\\\n\\\\\nWorld Time \"Columbus\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF5,000–10,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF24,130](https://www.phillips.com/detail/andersen-geneve/230798)\n\n[\\\\\n\\\\\n62\\\\\n\\\\\nUrban Jürgensen\\\\\nRef. 1140\\\\\n\"Unique\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF88,900](https://www.phillips.com/detail/urban-j%C3%BCrgensen/230755)\n\n[\\\\\n\\\\\n63\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nTourbillon Souverain \"Ruthenium\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF825,500](https://www.phillips.com/detail/f.p.-journe/227497)\n\n[\\\\\n\\\\\n64\\\\\n\\\\\nDe Bethune\\\\\nRef. DB27\\\\\nTitan Hawk V2\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF95,250](https://www.phillips.com/detail/de-bethune/230657)\n\n[\\\\\n\\\\\n65\\\\\n\\\\\nGreubel Forsey X Philippe Dufour X Michel Boulanger\\\\\n\\\\\nNaissance d'Une Montre 1 (N°1/11)\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF1,651,000](https://www.phillips.com/detail/greubel-forsey-x-philippe-dufour-x-michel-boulanger/231703)\n\n[\\\\\n\\\\\n66\\\\\n\\\\\nRolex\\\\\nRef. 6536/1\\\\\nSubmariner \"Red Depth\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF19,050](https://www.phillips.com/detail/rolex/221608)\n\n[\\\\\n\\\\\n67\\\\\n\\\\\nRolex\\\\\nRef. 1675\\\\\nGMT-Master\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF24,130](https://www.phillips.com/detail/rolex/213790)\n\n[\\\\\n\\\\\n68\\\\\n\\\\\nRolex\\\\\nRef. 6239\\\\\nCosmograph Daytona \"Jumbo Logo\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF63,500](https://www.phillips.com/detail/rolex/227996)\n\n[\\\\\n\\\\\n70\\\\\n\\\\\nRolex\\\\\nRef. 5510\\\\\nSubmariner \"Big Crown\", \"Coroncione\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF127,000](https://www.phillips.com/detail/rolex/231114)\n\n[\\\\\n\\\\\n71\\\\\n\\\\\nSwiss\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF5,000–10,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF17,780](https://www.phillips.com/detail/swiss/232881)\n\n[\\\\\n\\\\\n72\\\\\n\\\\\nSwiss\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF5,000–10,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF13,970](https://www.phillips.com/detail/swiss/232882)\n\n[\\\\\n\\\\\n73\\\\\n\\\\\nIlbery\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF35,560](https://www.phillips.com/detail/ilbery/232745)\n\n[\\\\\n\\\\\n74\\\\\n\\\\\nCharles Gretton\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF71,120](https://www.phillips.com/detail/charles-gretton/232750)\n\n[\\\\\n\\\\\n75\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 25712BA\\\\\nGrande Complication\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF152,400](https://www.phillips.com/detail/audemars-piguet/232239)\n\n[\\\\\n\\\\\n76\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 25913PT\\\\\nJules Audemars Star Wheel Two Faces\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF114,300](https://www.phillips.com/detail/audemars-piguet/232240)\n\n[\\\\\n\\\\\n77\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 25947OR\\\\\nEdward Piguet N°1\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF88,900](https://www.phillips.com/detail/audemars-piguet/231005)\n\n[\\\\\n\\\\\n78\\\\\n\\\\\nRolex\\\\\nRef. 116509\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF57,150](https://www.phillips.com/detail/rolex/229296)\n\n[\\\\\n\\\\\n79\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5711/1R-001\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF90,000–180,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF165,100](https://www.phillips.com/detail/patek-philippe/229225)\n\n[\\\\\n\\\\\n80\\\\\n\\\\\nRolex\\\\\n\\\\\nDay-Date\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF203,200](https://www.phillips.com/detail/rolex/229297)\n\n[\\\\\n\\\\\n81\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3940G-013\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF88,900](https://www.phillips.com/detail/patek-philippe/225447)\n\n[\\\\\n\\\\\n82\\\\\n\\\\\nRolex\\\\\nRef. 116659SABR\\\\\nSubmariner\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF120,650](https://www.phillips.com/detail/rolex/226595)\n\n[\\\\\n\\\\\n83\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 136.829\\\\\nLange 1 Zeitzone\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF127,000](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/230110)\n\n[\\\\\n\\\\\n84\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5071G\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF220,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF381,000](https://www.phillips.com/detail/patek-philippe/232558)\n\n[\\\\\n\\\\\n85\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5270G-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF107,950](https://www.phillips.com/detail/patek-philippe/232273)\n\n[\\\\\n\\\\\n86\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5738/50G-019\\\\\nGolden Ellipse Rare Handcraft \"Callithrix\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF228,600](https://www.phillips.com/detail/patek-philippe/225462)\n\n[\\\\\n\\\\\n87\\\\\n\\\\\nRolex\\\\\nRef. 1804\\\\\nDay-Date \"Octopussy\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF215,900](https://www.phillips.com/detail/rolex/227556)\n\n[\\\\\n\\\\\n88\\\\\n\\\\\nRolex\\\\\nRef. 6062\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF500,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF533,400](https://www.phillips.com/detail/rolex/229796)\n\n[\\\\\n\\\\\n90\\\\\n\\\\\nBreguet\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF82,550](https://www.phillips.com/detail/breguet/230750)\n\n[\\\\\n\\\\\n91\\\\\n\\\\\nBreguet\\\\\n\\\\\n\"One Minute Tourbillon - James Pellaton\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF139,700](https://www.phillips.com/detail/breguet/232748)\n\n[\\\\\n\\\\\n92\\\\\n\\\\\nPatek Philippe\\\\\nRef. 550\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF4,000–8,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF33,020](https://www.phillips.com/detail/patek-philippe/191702)\n\n[\\\\\n\\\\\n93\\\\\n\\\\\nPatek Philippe\\\\\nRef. 2455\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF8,000–16,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF22,860](https://www.phillips.com/detail/patek-philippe/191680)\n\n[\\\\\n\\\\\n94\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5110P\\\\\nWorldtime\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF33,020](https://www.phillips.com/detail/patek-philippe/191580)\n\n[\\\\\n\\\\\n95\\\\\n\\\\\nPatek Philippe\\\\\nRef. 448/2\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF4,000–8,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF7,620](https://www.phillips.com/detail/patek-philippe/191706)\n\n[\\\\\n\\\\\n96\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3970E\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF190,500](https://www.phillips.com/detail/patek-philippe/191674)\n\n[\\\\\n\\\\\n97\\\\\n\\\\\nPatek Philippe\\\\\nRef. 1526\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF152,400](https://www.phillips.com/detail/patek-philippe/191577)\n\n[\\\\\n\\\\\n98\\\\\n\\\\\nAndersen Geneve\\\\\nRef. 10853\\\\\nEros XL \"Venezia Con Amore\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF10,000–20,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF38,100](https://www.phillips.com/detail/andersen-geneve/232270)\n\n[\\\\\n\\\\\n99\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Calendrier \"38mm Brass Movement\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF635,000](https://www.phillips.com/detail/f.p.-journe/227653)\n\n[\\\\\n\\\\\n100\\\\\n\\\\\nLederer\\\\\n\\\\\nInverto \"Prototype 00\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF342,900](https://www.phillips.com/detail/lederer/232127)\n\n[\\\\\n\\\\\n101\\\\\n\\\\\nAUFFRET PARIS\\\\\n\\\\\nGiverny \"Prototype\" Blue Train\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF571,500](https://www.phillips.com/detail/auffret-paris/231274)\n\n[\\\\\n\\\\\n102\\\\\n\\\\\nGrönefeld\\\\\n\\\\\n1941 Grönograaf\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF190,500](https://www.phillips.com/detail/gr%C3%B6nefeld/227679)\n\n[\\\\\nNo Reserve\\\\\n103\\\\\n\\\\\nLudovic Ballouard X Atelier Blandenier\\\\\n\\\\\nUpside Down \"Quel Homard Est Il?\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF152,400](https://www.phillips.com/detail/ludovic-ballouard-x-atelier-blandenier/231758)\n\n[\\\\\n\\\\\n104\\\\\n\\\\\nL. Leroy\\\\\n\\\\\nMinute Repeater\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF12,000–24,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF40,640](https://www.phillips.com/detail/l.-leroy/232255)\n\n[\\\\\n\\\\\n105\\\\\n\\\\\nLongines\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF3,000–6,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF7,620](https://www.phillips.com/detail/longines/232257)\n\n[\\\\\n\\\\\n106\\\\\n\\\\\nFridlander\\\\\n\\\\\n\"Grande & Petite Sonnerie Minute Repeating Perpetual Calendar Chronograph\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF95,250](https://www.phillips.com/detail/fridlander/232878)\n\n[\\\\\n\\\\\n107\\\\\n\\\\\nGolay Fils & Stahl\\\\\n\\\\\n\"Minute Repeating with Sunrise, Sunset and Equation of Time made for the Maharaja of Patiala\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF647,700](https://www.phillips.com/detail/golay-fils-&-stahl/232877)\n\n[\\\\\n\\\\\n108\\\\\n\\\\\nLouis Richard\\\\\n\\\\\n\"Triple Detent Constant Force One Minute Tourbillon Chronometer\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF3,968,000](https://www.phillips.com/detail/louis-richard/232871)\n\n[\\\\\n\\\\\n109\\\\\n\\\\\nRolex\\\\\nRef. 18098\\\\\nDay-Date\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF114,300](https://www.phillips.com/detail/rolex/227559)\n\n[\\\\\n\\\\\n110\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 25654SA\\\\\nRoyal Oak Quantième Perpétuel\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF76,200](https://www.phillips.com/detail/audemars-piguet/228514)\n\n[\\\\\n\\\\\n111\\\\\n\\\\\nRolex\\\\\nRef. 16519\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF50,800](https://www.phillips.com/detail/rolex/191632)\n\n[\\\\\n\\\\\n112\\\\\n\\\\\nOmega\\\\\nRef. 311.32.42.30.04.001\\\\\nSpeedmaster Alaska Project\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF5,000–10,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF27,940](https://www.phillips.com/detail/omega/191586)\n\n[\\\\\n\\\\\n113\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 14802ST\\\\\nRoyal Oak Jubilee\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF48,260](https://www.phillips.com/detail/audemars-piguet/227412)\n\n[\\\\\n\\\\\n114\\\\\n\\\\\nRolex\\\\\nRef. 16520, caseback stamped 16500\\\\\nCosmograph Daytona \"prototype dial\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF180,000–360,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF203,200](https://www.phillips.com/detail/rolex/230329)\n\n[\\\\\n\\\\\n115\\\\\n\\\\\nRolex\\\\\nRef. 18039, inside caseback stamped 18000\\\\\nDay-Date\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF18,000–36,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF30,480](https://www.phillips.com/detail/rolex/231521)\n\n[\\\\\n\\\\\n116\\\\\n\\\\\nRolex\\\\\nRef. 3525\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF40,640](https://www.phillips.com/detail/rolex/227790)\n\n[\\\\\n\\\\\n117\\\\\n\\\\\nRolex\\\\\nRef. 6262\\\\\nCosmograph Daytona “Paul Newman”\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF304,800](https://www.phillips.com/detail/rolex/229604)\n\n[\\\\\n\\\\\n118\\\\\n\\\\\nRolex\\\\\nRef. 6036\\\\\n\"Datocompax Killy\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF500,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF685,800](https://www.phillips.com/detail/rolex/230932)\n\n[\\\\\n\\\\\n119\\\\\n\\\\\nRolex\\\\\nRef. 6085\\\\\n\"The Dragon\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF500,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF571,500](https://www.phillips.com/detail/rolex/229921)\n\n[\\\\\n\\\\\n120\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5711/1A-010\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF88,900](https://www.phillips.com/detail/patek-philippe/229224)\n\n[\\\\\n\\\\\n121\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5726/1A-001\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF82,550](https://www.phillips.com/detail/patek-philippe/229226)\n\n[\\\\\n\\\\\n122\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3970EG-016\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF190,500](https://www.phillips.com/detail/patek-philippe/232083)\n\n[\\\\\n\\\\\n123\\\\\n\\\\\nPierre Kunz\\\\\nRef. PKA 701 T JDR\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF27,940](https://www.phillips.com/detail/pierre-kunz/227499)\n\n[\\\\\n\\\\\n124\\\\\n\\\\\nLang & Heyne\\\\\n\\\\\nFriedrich II Remontoir The Lavish Attic Edition\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF50,800](https://www.phillips.com/detail/lang-&-heyne/230800)\n\n[\\\\\n\\\\\n125\\\\\n\\\\\nDaniel Roth\\\\\nRef. DAAD01\\\\\nTourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF120,650](https://www.phillips.com/detail/daniel-roth/231466)\n\n[\\\\\n\\\\\n126\\\\\n\\\\\nRoger Smith\\\\\n\\\\\nSeries 3\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF711,200](https://www.phillips.com/detail/roger-smith/231469)\n\n[\\\\\n\\\\\n127\\\\\n\\\\\nDe Bethune\\\\\nRef. DB8W S1\\\\\nDB8 \"Prototype N° 0\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF292,100](https://www.phillips.com/detail/de-bethune/229237)\n\n[\\\\\n\\\\\n128\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Chronographe \"Straight Côtes de Genève\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF1,714,500](https://www.phillips.com/detail/f.p.-journe/227409)\n\n[\\\\\n\\\\\n129\\\\\n\\\\\nLouis Richard\\\\\n\\\\\n\"Triple Bridge Tourbillon\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF304,800](https://www.phillips.com/detail/louis-richard/232874)\n\n[\\\\\n\\\\\n130\\\\\n\\\\\nVictor Kullberg\\\\\n\\\\\n\"One Minute Tourbillon Chronometer with Earnshaw Spring Detent Escapement\\*\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF266,700](https://www.phillips.com/detail/victor-kullberg/232747)\n\n[\\\\\n\\\\\n131\\\\\n\\\\\nRobert Pennington & Richard Pendleton\\\\\n\\\\\n\"One Day Marine Chronometer in the form of a Mudge Constant Force Timekeeper\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF203,200](https://www.phillips.com/detail/robert-pennington-&-richard-pendleton/232873)\n\n[\\\\\n\\\\\n132\\\\\n\\\\\nPiaget\\\\\nRef. 612406\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF10,000–20,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF82,550](https://www.phillips.com/detail/piaget/232245)\n\n[\\\\\n\\\\\n133\\\\\n\\\\\nPiaget\\\\\nRef. 14661 C701\\\\\nPolo Automatique\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF152,400](https://www.phillips.com/detail/piaget/228796)\n\n[\\\\\n\\\\\n134\\\\\n\\\\\nBreguet\\\\\nRef. 3357\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF44,450](https://www.phillips.com/detail/breguet/230005)\n\n[\\\\\n\\\\\n135\\\\\n\\\\\nBlancpain\\\\\nRef. 5335\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF69,850](https://www.phillips.com/detail/blancpain/210818)\n\n[\\\\\n\\\\\n136\\\\\n\\\\\nCharles Frodsham\\\\\n\\\\\n\"Minute Repeating Split-Seconds Chronograph with One-Minute Tourbillon\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF406,400](https://www.phillips.com/detail/charles-frodsham/232749)\n\n[\\\\\n\\\\\n137\\\\\n\\\\\nLouis Audemars & Co\\\\\n\\\\\nLa Royale \"Super Complication\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF2,516,000](https://www.phillips.com/detail/louis-audemars-&-co/232865)\n\n[\\\\\n\\\\\n138\\\\\n\\\\\nPaul Ditisheim\\\\\n\\\\\n\"Minute Detent Escapement Tourbillon\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF1,270,000](https://www.phillips.com/detail/paul-ditisheim/232872)\n\n[\\\\\n\\\\\n139\\\\\n\\\\\nIWC\\\\\nRef. 3770-25\\\\\nGrande Complication\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF88,900](https://www.phillips.com/detail/iwc/231175)\n\n[\\\\\n\\\\\n140\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5160/500G\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF120,650](https://www.phillips.com/detail/patek-philippe/233015)\n\n[\\\\\n\\\\\n141\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5740/1G-001\\\\\nNautilus Perpetual Calendar\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF177,800](https://www.phillips.com/detail/patek-philippe/231337)\n\n[\\\\\n\\\\\n142\\\\\n\\\\\nPatek Philippe\\\\\nRef. 6102P-001\\\\\nCelestial\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF215,900](https://www.phillips.com/detail/patek-philippe/227464)\n\n[\\\\\n\\\\\n143\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5070P-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF165,100](https://www.phillips.com/detail/patek-philippe/231960)\n\n[\\\\\n\\\\\n144\\\\\n\\\\\nPatek Philippe\\\\\nRef. 6002G-010\\\\\nSky Moon Tourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF2,000,000–4,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF3,242,000](https://www.phillips.com/detail/patek-philippe/231959)\n\n[\\\\\n\\\\\n145\\\\\n\\\\\nDaniel Roth\\\\\nRef. C137/2137\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF76,200](https://www.phillips.com/detail/daniel-roth/227272)\n\n[\\\\\n\\\\\n146\\\\\n\\\\\nUrban Jürgensen\\\\\n\\\\\nReference 2 \"Prototype\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF508,000](https://www.phillips.com/detail/urban-j%C3%BCrgensen/231710)\n\n[\\\\\n\\\\\n147\\\\\n\\\\\nUrban Jürgensen\\\\\nRef. 1140PT\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF60,960](https://www.phillips.com/detail/urban-j%C3%BCrgensen/229854)\n\n[\\\\\n\\\\\n148\\\\\n\\\\\nVianney Halter\\\\\n\\\\\nLiberty\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF57,150](https://www.phillips.com/detail/vianney-halter/230801)\n\n[\\\\\n\\\\\n149\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronomètre à Résonance \"Pisa\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF450,000–900,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF2,334,500](https://www.phillips.com/detail/f.p.-journe/229536)\n\n[\\\\\n\\\\\n150\\\\\n\\\\\nDe Bethune\\\\\nRef. DB25VGTIS3\\\\\nDB25 GMT Starry Varius\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF95,250](https://www.phillips.com/detail/de-bethune/232272)\n\n[\\\\\n\\\\\n151\\\\\n\\\\\nPiaget\\\\\nRef. 91104\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF8,000–16,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF48,260](https://www.phillips.com/detail/piaget/232266)\n\n[\\\\\n\\\\\n152\\\\\n\\\\\nCartier\\\\\nRef. 2514\\\\\nBaignoire Allongée\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF10,000–20,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF30,480](https://www.phillips.com/detail/cartier/232246)\n\n[\\\\\n\\\\\n153\\\\\n\\\\\nRolex\\\\\nRef. 3393\\\\\nCellini \"Maha\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF228,600](https://www.phillips.com/detail/rolex/232886)\n\n[\\\\\n\\\\\n154\\\\\n\\\\\nCartier\\\\\n\\\\\nCrash \"Paris\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF431,800](https://www.phillips.com/detail/cartier/232800)\n\n[\\\\\n\\\\\n155\\\\\n\\\\\nCartier\\\\\nRef. 78096\\\\\nCristallor\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF62,230](https://www.phillips.com/detail/cartier/231676)\n\n[\\\\\n\\\\\n156\\\\\n\\\\\nBulgari\\\\\nRef. 55 - 7471\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF2,000–4,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF21,590](https://www.phillips.com/detail/bulgari/191589)\n\n[\\\\\n\\\\\n157\\\\\n\\\\\nPatek Philippe\\\\\nRef. 4121/1\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF55,880](https://www.phillips.com/detail/patek-philippe/232261)\n\n[\\\\\n\\\\\n158\\\\\n\\\\\nCartier\\\\\nRef. 78102\\\\\nCoussin Bamboo \"Jumbo\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF88,900](https://www.phillips.com/detail/cartier/229035)\n\n[\\\\\n\\\\\n159\\\\\n\\\\\nBreguet\\\\\nRef. 3441BA/82/A95DDDD\\\\\nMarine\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF90,000–180,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF190,500](https://www.phillips.com/detail/breguet/232244)\n\n[\\\\\n\\\\\n160\\\\\n\\\\\nRolex\\\\\nRef. 18366, caseback stamped 18200 to the inside\\\\\nDay-Date\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF133,350](https://www.phillips.com/detail/rolex/227134)\n\n[\\\\\n\\\\\n161\\\\\n\\\\\nRolex\\\\\nRef. 6239 inside caseback stamped 6238\\\\\nCosmograph \"Double Swiss Underline\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF190,500](https://www.phillips.com/detail/rolex/229798)\n\n[\\\\\n\\\\\n162\\\\\n\\\\\nRolex\\\\\nRef. 6098\\\\\nOyster Perpetual Ovettone Stelline\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF90,000–180,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF139,700](https://www.phillips.com/detail/rolex/230795)\n\n[\\\\\n\\\\\n163\\\\\n\\\\\nRolex\\\\\nRef. 6241\\\\\nPaul Newman \"Champagne\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF350,000–700,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF825,500](https://www.phillips.com/detail/rolex/228883)\n\n[\\\\\n\\\\\n164\\\\\n\\\\\nRolex\\\\\nRef. 16520 inside caseback stamped 16500\\\\\nCosmograph Daytona \"Patrizzi Dial\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF45,720](https://www.phillips.com/detail/rolex/226539)\n\n[\\\\\n\\\\\n165\\\\\n\\\\\nRolex\\\\\nRef. 16520\\\\\nCosmograph Daytona \"Porcelain\" Dial\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF139,700](https://www.phillips.com/detail/rolex/226538)\n\n[\\\\\n\\\\\n166\\\\\n\\\\\nRolex\\\\\nRef. 16520, inside caseback stamped 16500\\\\\nCosmograph Daytona \"4-liner\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF38,100](https://www.phillips.com/detail/rolex/226536)\n\n[\\\\\n\\\\\n167\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5004P-021\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF381,000](https://www.phillips.com/detail/patek-philippe/229141)\n\n[\\\\\n\\\\\n168\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5370P-011\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF177,800](https://www.phillips.com/detail/patek-philippe/229326)\n\n[\\\\\n\\\\\n169\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5711/1P-010\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF393,700](https://www.phillips.com/detail/patek-philippe/231944)\n\n[\\\\\n\\\\\n170\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 15202IP\\\\\nRoyal Oak\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF101,600](https://www.phillips.com/detail/audemars-piguet/229381)\n\n[\\\\\n\\\\\n171\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26615TI\\\\\nRoyal Oak\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF146,050](https://www.phillips.com/detail/audemars-piguet/227789)\n\n[\\\\\n\\\\\n172\\\\\n\\\\\nRolex\\\\\nRef. 6265\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF57,150](https://www.phillips.com/detail/rolex/178808)\n\n[\\\\\n\\\\\n173\\\\\n\\\\\nRolex\\\\\nRef. 5513/5517\\\\\nSubmariner \"Milsub\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF100,000–200,000](https://www.phillips.com/detail/rolex/227495)\n\n[\\\\\n\\\\\n174\\\\\n\\\\\nCartier\\\\\nRef. HP101529\\\\\nCrash Tigrée\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF330,200](https://www.phillips.com/detail/cartier/232084)\n\n[\\\\\n\\\\\n175\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 47650\\\\\nHistoriques Toledo 1952\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF134,620](https://www.phillips.com/detail/vacheron-constantin/231173)\n\n[\\\\\n\\\\\n176\\\\\n\\\\\nRolex\\\\\nRef. 18206\\\\\nDay-Date\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF44,450](https://www.phillips.com/detail/rolex/229853)\n\n[\\\\\n\\\\\n177\\\\\n\\\\\nRolex\\\\\nRef. 18338\\\\\nDay-Date\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF76,200](https://www.phillips.com/detail/rolex/229935)\n\n[\\\\\n\\\\\n179\\\\\n\\\\\nCredor\\\\\nRef. 6L75-00C0\\\\\nGCCD983\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF3,000–6,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF9,525](https://www.phillips.com/detail/credor/232801)\n\n[\\\\\n\\\\\n180\\\\\n\\\\\nMB&F\\\\\nRef. MB-90\\\\\nHorological Machine 9 \"Flow Titanium Air\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF152,400](https://www.phillips.com/detail/mb&f/222303)\n\n[\\\\\n\\\\\n181\\\\\n\\\\\nMoritz Grossmann\\\\\n\\\\\nTefnut Silver-Plated by Friction - Philippe & Elisabeth Dufour Foundation\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF25,000–45,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF53,340](https://www.phillips.com/detail/moritz-grossmann/231739)\n\n[\\\\\n\\\\\n182\\\\\n\\\\\nDino & Roberto Falcone\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF889,000](https://www.phillips.com/detail/dino-&-roberto-falcone/232250)\n\n[\\\\\n\\\\\n183\\\\\n\\\\\nDe Bethune\\\\\nRef. DB10R\\\\\nDB10 \"N° 001\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF81,280](https://www.phillips.com/detail/de-bethune/228797)\n\n[\\\\\n\\\\\n184\\\\\n\\\\\nGreubel Forsey\\\\\n\\\\\nTourbillon 24 Secondes Edition Historique\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF254,000](https://www.phillips.com/detail/greubel-forsey/232253)\n\n[\\\\\n\\\\\n185\\\\\n\\\\\nGutkaes, Dresden\\\\\n\\\\\n\"Chronometer with Detent Escapement\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF10,000–20,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF33,020](https://www.phillips.com/detail/gutkaes,-dresden/232870)\n\n[\\\\\n\\\\\n186\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 101.002\\\\\nLange 1\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF35,560](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/225902)\n\n[\\\\\n\\\\\n187\\\\\n\\\\\nA. Lange & Söhne\\\\\n\\\\\n\"Minute Repeating Perpetual Calendar made for Prince Friedrich II of Solms-Baruth\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF215,900](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/232875)\n\n[\\\\\n\\\\\n188\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 403.035\\\\\nDatograph\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF82,550](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/225464)\n\n[\\\\\n\\\\\n189\\\\\n\\\\\nRolex\\\\\nRef. 16520\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF35,560](https://www.phillips.com/detail/rolex/226535)\n\n[\\\\\n\\\\\n190\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5270/1R-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF139,700](https://www.phillips.com/detail/patek-philippe/229752)\n\n[\\\\\n\\\\\n191\\\\\n\\\\\nRolex\\\\\nRef. 16520\\\\\nCosmograph Daytona \"High Serif\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF46,990](https://www.phillips.com/detail/rolex/226537)\n\n[\\\\\n\\\\\n192\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3800/1\\\\\nNautilus \"Pink Gold\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF304,800](https://www.phillips.com/detail/patek-philippe/227785)\n\n[\\\\\n\\\\\n193\\\\\n\\\\\nRolex\\\\\nRef. 6265\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF63,500](https://www.phillips.com/detail/rolex/227410)\n\n[\\\\\n\\\\\n194\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3800/1\\\\\nNautilus \"Tiffany & Co\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF24,000–48,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF120,650](https://www.phillips.com/detail/patek-philippe/227411)\n\n[\\\\\n\\\\\n195\\\\\n\\\\\nRolex\\\\\nRef. 6238\\\\\n\"Pre-Daytona\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF50,800](https://www.phillips.com/detail/rolex/178759)\n\n[\\\\\n\\\\\n196\\\\\n\\\\\nPatek Philippe\\\\\nRef. 2526\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF115,570](https://www.phillips.com/detail/patek-philippe/226592)\n\n[\\\\\n\\\\\n197\\\\\n\\\\\nRolex\\\\\nRef. 6264\\\\\nCosmograph Daytona \"Paul Newman\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF317,500](https://www.phillips.com/detail/rolex/229646)\n\n[\\\\\n\\\\\n198\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5074R-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF250,000–500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF508,000](https://www.phillips.com/detail/patek-philippe/232384)\n\n[\\\\\n\\\\\n199\\\\\n\\\\\nBreguet\\\\\nRef. 3477\\\\\nClassique “Grande Complication”\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF12,000–24,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF76,200](https://www.phillips.com/detail/breguet/230008)\n\n[\\\\\n\\\\\n200\\\\\n\\\\\nBreguet\\\\\nRef. 3310\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF50,800](https://www.phillips.com/detail/breguet/228072)\n\n[\\\\\n\\\\\n201\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5990/1A-001\\\\\nNautilus Travel Time Chronograph\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF101,600](https://www.phillips.com/detail/patek-philippe/232271)\n\n[\\\\\n\\\\\n202\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 191.066\\\\\nLange 1 \"25th Anniversary\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF54,610](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/230111)\n\n[\\\\\n\\\\\n203\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 252.029\\\\\nRichard Lange Jumping Seconds\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF63,500](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/228481)\n\n[\\\\\n\\\\\n204\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 25980AI.OO.D003SU.01\\\\\nRoyal Oak Concept Watch (CW1)\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF203,200](https://www.phillips.com/detail/audemars-piguet/231174)\n\n[\\\\\n\\\\\n205\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Réserve de Marche \"Souscription\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF508,000](https://www.phillips.com/detail/f.p.-journe/227125)\n\n[\\\\\nNo Reserve\\\\\n206\\\\\n\\\\\nHaldimann\\\\\nRef. H1\\\\\nH1 Central Tourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF482,600](https://www.phillips.com/detail/haldimann/227856)\n\n[\\\\\n\\\\\n207\\\\\n\\\\\nFranck Muller\\\\\n\\\\\nJanus\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF190,500](https://www.phillips.com/detail/franck-muller/228527)\n\n[\\\\\n\\\\\n208\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nTourbillon Souverain à Remontoir d'Egalité\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF350,000–700,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF1,524,000](https://www.phillips.com/detail/f.p.-journe/227498)\n\n[\\\\\n\\\\\n209\\\\\n\\\\\nBlancpain\\\\\n\\\\\nVilleret\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF101,600](https://www.phillips.com/detail/blancpain/232243)\n\n[\\\\\n\\\\\n210\\\\\n\\\\\nPatek Philippe\\\\\nRef. 2461\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF38,100](https://www.phillips.com/detail/patek-philippe/221605)\n\n[\\\\\n\\\\\n211\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3541\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF10,000–20,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF48,260](https://www.phillips.com/detail/patek-philippe/231923)\n\n[\\\\\n\\\\\n212\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26299OR.OO.D001GA.01\\\\\nRoyal Oak Offshore \"Marcus Edition\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF49,530](https://www.phillips.com/detail/audemars-piguet/232242)\n\n[\\\\\n\\\\\n213\\\\\n\\\\\nRolex\\\\\nRef. 16528\\\\\nCosmograph Daytona \"Tiffany & Co.\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF107,950](https://www.phillips.com/detail/rolex/230006)\n\n[\\\\\n\\\\\n214\\\\\n\\\\\nRolex\\\\\nRef. 6265\\\\\nCosmograph Daytona \"Big Red\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF88,900](https://www.phillips.com/detail/rolex/178741)\n\n[\\\\\n\\\\\n215\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 14802ST\\\\\nRoyal Oak Jubilee\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF114,300](https://www.phillips.com/detail/audemars-piguet/232556)\n\n[\\\\\n\\\\\n216\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3800/1\\\\\nNautilus \"Platinum\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF133,350](https://www.phillips.com/detail/patek-philippe/229327)\n\n[\\\\\n\\\\\n217\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5007P\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF114,300](https://www.phillips.com/detail/patek-philippe/232263)\n\n[\\\\\n\\\\\n218\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3700/11\\\\\nNautilus \"Jumbo\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF146,050](https://www.phillips.com/detail/patek-philippe/229801)\n\n[\\\\\n\\\\\n219\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5070P-013\\\\\n\"Saatchi Gallery\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF406,400](https://www.phillips.com/detail/patek-philippe/232559)\n\n[\\\\\n\\\\\n220\\\\\n\\\\\nPatek Philippe\\\\\nRef. 2499/100\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF350,000–650,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF889,000](https://www.phillips.com/detail/patek-philippe/231335)\n\n[\\\\\n\\\\\n221\\\\\n\\\\\nPatek Philippe\\\\\nRef. 4359/1\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF330,200](https://www.phillips.com/detail/patek-philippe/232265)\n\n[\\\\\n\\\\\n222\\\\\n\\\\\nVacheron Constantin\\\\\n\\\\\n\"Marine Chronometer with Detent Escapement\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF190,500](https://www.phillips.com/detail/vacheron-constantin/232868)\n\n[\\\\\n\\\\\n223\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 4591\\\\\n\"The Hour Glass\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF38,100](https://www.phillips.com/detail/vacheron-constantin/221609)\n\n[\\\\\n\\\\\n224\\\\\n\\\\\nVacheron Constantin\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF82,550](https://www.phillips.com/detail/vacheron-constantin/221602)\n\n[\\\\\n\\\\\n225\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 4764\\\\\n\"Cioccolatone\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF250,000–500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF635,000](https://www.phillips.com/detail/vacheron-constantin/232267)\n\n[\\\\\n\\\\\n226\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 4639\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF101,600](https://www.phillips.com/detail/vacheron-constantin/227991)\n\n[\\\\\n\\\\\n227\\\\\n\\\\\nCartier\\\\\n\\\\\n\"Tank Basculante\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF76,200](https://www.phillips.com/detail/cartier/221606)\n\n[\\\\\n\\\\\n228\\\\\n\\\\\nCartier\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF48,260](https://www.phillips.com/detail/cartier/232879)\n\n[\\\\\n\\\\\n229\\\\\n\\\\\nCartier\\\\\n\\\\\nMystery clock\\\\\n\\\\\nEstimate\\\\\n\\\\\nCHF600,000–1,200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nCHF1,219,200](https://www.phillips.com/detail/cartier/232744)\n\n### About us\n\n- [Our history](https://www.phillips.com/about)\n- [Our team](https://www.phillips.com/team)\n- [Locations](https://www.phillips.com/location)\n- [Press](https://www.phillips.com/press)\n- [Careers](https://www.phillips.com/careers)\n- [Site map](https://www.phillips.com/sitemap)\n\n### Our services\n\n- [How to buy](https://www.phillips.com/buysell/buy)\n- [How to sell](https://www.phillips.com/buysell/sell)\n- [Private services](https://www.phillips.com/buysell/private)\n- [Professional & advisor services](https://www.phillips.com/professional-advisor-services)\n- [Fiduciary services](https://www.phillips.com/fiduciaryservices)\n\n### Policies\n\n- [Privacy policy](https://www.phillips.com/about/privacy)\n- [Cookie policy](https://www.phillips.com/about/cookiepolicy)\n- [Modern slavery policy](https://www.phillips.com/about/modernslaverypolicy)\n\nAbout us\n\nOur services\n\nPolicies\n\n### Never miss a moment\n\nSubscribe to our newsletter\n\n- [insta](https://www.instagram.com/phillipsauction/ \"insta\")\n- [linkedin](https://www.linkedin.com/company/phillips/ \"linkedin\")\n- [wechat](https://weixin.qq.com/r/qDuLk0-EKhJVrQvw9266 \"wechat\")\n- [red](https://www.xiaohongshu.com/user/profile/611e10a8000000000101ddf7 \"red\")\n- [facebook](https://www.facebook.com/phillipsauction/ \"facebook\")\n\n[logoLink](https://www.phillips.com/) © 2026 Phillips Auctioneers, LLC" | |
| 18 | + } | |
| 19 | + }, | |
| 20 | + "expect": { | |
| 21 | + "minCount": 10, | |
| 22 | + "kinds": [ | |
| 23 | + "sale", | |
| 24 | + "auction_lot" | |
| 25 | + ] | |
| 26 | + }, | |
| 27 | + "note": "captured live from https://www.phillips.com/auction/CH080226", | |
| 28 | + "capturedAt": "2026-09-07T04:42:56.076Z" | |
| 29 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/phillips-watches/HK080226.json
+29 −0
@@ -0,0 +1,29 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.phillips.com/auction/HK080226", | |
| 4 | + "externalId": "HK080226", | |
| 5 | + "kind": "sale", | |
| 6 | + "engine": "firecrawl", | |
| 7 | + "fetchedAt": "2026-09-07T04:43:24.804Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "auction_results", | |
| 10 | + "url": "https://www.phillips.com/auction/HK080226", | |
| 11 | + "saleNumber": "HK080226", | |
| 12 | + "title": "https://www.phillips.com/auction/HK080226", | |
| 13 | + "location": "Hong Kong", | |
| 14 | + "startDate": null, | |
| 15 | + "endDate": "2026-05-31T00:00:00.000Z", | |
| 16 | + "lotCount": 294, | |
| 17 | + "markdown": "## Search\n\nSearch\n\nAuctions\n\n- [Calendar](https://www.phillips.com/calendar/upcoming)\n\nDepartments\n\n- [Exhibitions](https://www.phillips.com/exhibitions)\n- [Perpetual](https://perpetual.phillips.com/)\n- [Dropshop](https://dropshop.phillips.com/)\n- [Editorial](https://www.phillips.com/editorial)\n\nClose\n\nLive Auction\n\n# The Hong Kong Watch Auction: XXII\n\nHong Kong\n\nConcludedMay 31 2026\n\nBrowse Upcoming Sales[View Calendar](https://www.phillips.com/calendar)\n\n\n\nOverviewBrowse lots\n\nFilters\n\nLot Navigation\n\nShow Lot8018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109129139149159179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097\n\n## 294 Lots\n\n[\\\\\nNo Reserve\\\\\n801\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nPendulette Réveil Souveraine\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$120,650](https://www.phillips.com/detail/f.p.-journe/233843)\n\n[\\\\\n\\\\\n802\\\\\n\\\\\nF.P. Journe\\\\\nRef. ELT\\\\\nÉlégante 40mm Titalyt®\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$825,500](https://www.phillips.com/detail/f.p.-journe/230477)\n\n[\\\\\n\\\\\n803\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Automatique Réserve, Boutique Edition\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$320,000–630,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$2,095,500](https://www.phillips.com/detail/f.p.-journe/225091)\n\n[\\\\\n\\\\\n804\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Calendrier\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$480,000–960,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$2,222,500](https://www.phillips.com/detail/f.p.-journe/233628)\n\n[\\\\\nNo Reserve\\\\\n805\\\\\n\\\\\nRolex\\\\\nRef. 16570\\\\\nExplorer II\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$88,900](https://www.phillips.com/detail/rolex/233555)\n\n[\\\\\nNo Reserve\\\\\n806\\\\\n\\\\\nRolex\\\\\nRef. 124270\\\\\nExplorer\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$53,340](https://www.phillips.com/detail/rolex/233554)\n\n[\\\\\n\\\\\n807\\\\\n\\\\\nRolex\\\\\nRef. 336934\\\\\nSky-Dweller\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$190,500](https://www.phillips.com/detail/rolex/233162)\n\n[\\\\\n\\\\\n808\\\\\n\\\\\nRolex\\\\\nRef. 116519LN\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$406,400](https://www.phillips.com/detail/rolex/232317)\n\n[\\\\\n\\\\\n809\\\\\n\\\\\nRolex\\\\\nRef. 118399BR\\\\\nDay-Date\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$444,500](https://www.phillips.com/detail/rolex/231790)\n\n[\\\\\n\\\\\n810\\\\\n\\\\\nRolex\\\\\nRef. 116759SANR\\\\\nGMT-Master II\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$698,500](https://www.phillips.com/detail/rolex/234094)\n\n[\\\\\n\\\\\n811\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 25970ST.OO.1010ST.01\\\\\nRoyal Oak Offshore Dual Time Hong Kong Edition\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$140,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$304,800](https://www.phillips.com/detail/audemars-piguet/229616)\n\n[\\\\\n\\\\\n812\\\\\n\\\\\nBreguet\\\\\nRef. 3999BA/15/286\\\\\nClassique Hong Kong Handover\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$177,800](https://www.phillips.com/detail/breguet/233940)\n\n[\\\\\n\\\\\n813\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 43050-000J-17\\\\\nMercator, Europa-Asia\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$240,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$952,500](https://www.phillips.com/detail/vacheron-constantin/230108)\n\n[\\\\\n\\\\\n814\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 43050/000J-8806\\\\\nMercator 2000 Germany\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$240,000–480,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$609,600](https://www.phillips.com/detail/vacheron-constantin/230211)\n\n[\\\\\n\\\\\n815\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5077/100R-056\\\\\nCalatrava, Kimonos with Floral Patterns\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–960,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$635,000](https://www.phillips.com/detail/patek-philippe/233853)\n\n[\\\\\n\\\\\n816\\\\\n\\\\\nPatek Philippe\\\\\nRef. 1459\\\\\nColibris à raquette by Anita Porchet\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$700,000–1,400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,270,000](https://www.phillips.com/detail/patek-philippe/234028)\n\n[\\\\\n\\\\\n817\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 48250\\\\\nEvasion World Time\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$241,300](https://www.phillips.com/detail/vacheron-constantin/234157)\n\n[\\\\\n\\\\\n818\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 48250\\\\\nEvasion World Time\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$330,200](https://www.phillips.com/detail/vacheron-constantin/234229)\n\n[\\\\\n\\\\\n819\\\\\n\\\\\nJaeger-LeCoultre\\\\\nRef. 270.2.68\\\\\nReverso Tourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–260,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$406,400](https://www.phillips.com/detail/jaeger-lecoultre/233553)\n\n[\\\\\n\\\\\n820\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5109R-001\\\\\nGondolo\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$165,100](https://www.phillips.com/detail/patek-philippe/233150)\n\n[\\\\\n\\\\\n821\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3940, Third Series\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$571,500](https://www.phillips.com/detail/patek-philippe/229599)\n\n[\\\\\n\\\\\n822\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5140J-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$355,600](https://www.phillips.com/detail/patek-philippe/232979)\n\n[\\\\\n\\\\\n823\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 310.021\\\\\nLangematik Perpetual\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–450,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$406,400](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/229745)\n\n[\\\\\n\\\\\n824\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5070R-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$444,500](https://www.phillips.com/detail/patek-philippe/232321)\n\n[\\\\\n\\\\\n825\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5070G-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$350,000–650,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$482,600](https://www.phillips.com/detail/patek-philippe/233252)\n\n[\\\\\n\\\\\n826\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5740/1G-001\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$1,200,000–2,400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,905,000](https://www.phillips.com/detail/patek-philippe/232329)\n\n[\\\\\n\\\\\n827\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5066A-010\\\\\nAquanaut “Japan”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$220,000–350,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$482,600](https://www.phillips.com/detail/patek-philippe/232768)\n\n[\\\\\n\\\\\n828\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5066A-001\\\\\nAquanaut\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$533,400](https://www.phillips.com/detail/patek-philippe/233151)\n\n[\\\\\n\\\\\n829\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 77350CE.OO.1266CE.02.A\\\\\nRoyal Oak, Carolina Bucci\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$240,000–480,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$609,600](https://www.phillips.com/detail/audemars-piguet/233184)\n\n[\\\\\n\\\\\n830\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 15407ST.OO.1220ST.01\\\\\nRoyal Oak Double Balance wheel Openworked\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$500,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,016,000](https://www.phillips.com/detail/audemars-piguet/233185)\n\n[\\\\\n\\\\\n831\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 56303PT.OO.0789PT.01\\\\\nRoyal Oak\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$170,000–270,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$228,600](https://www.phillips.com/detail/audemars-piguet/232333)\n\n[\\\\\n\\\\\n832\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 56175TT.OO.0789TT.01\\\\\nRoyal Oak Championship\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$215,900](https://www.phillips.com/detail/audemars-piguet/233163)\n\n[\\\\\n\\\\\n833\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 14506BA\\\\\nBamboo\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$406,400](https://www.phillips.com/detail/audemars-piguet/232678)\n\n[\\\\\n\\\\\n834\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3503/5\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$40,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$82,550](https://www.phillips.com/detail/patek-philippe/233371)\n\n[\\\\\n\\\\\n835\\\\\n\\\\\nPatek Philippe\\\\\nRef. 4119/1\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$304,800](https://www.phillips.com/detail/patek-philippe/230420)\n\n[\\\\\n\\\\\n836\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3800/4G-001\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–640,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$990,600](https://www.phillips.com/detail/patek-philippe/229292)\n\n[\\\\\n\\\\\n837\\\\\n\\\\\nCartier\\\\\nRef. WGTA0235\\\\\nTank à Guichets Privé\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$762,000](https://www.phillips.com/detail/cartier/234219)\n\n[\\\\\n\\\\\n838\\\\\n\\\\\nCartier\\\\\nRef. 2390\\\\\nTank Basculante, Australian Federation 100th Anniversary\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$215,900](https://www.phillips.com/detail/cartier/234013)\n\n[\\\\\n\\\\\n839\\\\\n\\\\\nCartier\\\\\nRef. WGTA0074\\\\\nTank Chinoise\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$241,300](https://www.phillips.com/detail/cartier/233842)\n\n[\\\\\n\\\\\n840\\\\\n\\\\\nCartier\\\\\nRef. 1601 1\\\\\nTank Louis Cartier\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–250,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$177,800](https://www.phillips.com/detail/cartier/233653)\n\n[\\\\\n\\\\\n841\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 703.032F\\\\\nCabaret Tourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$825,500](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/233158)\n\n[\\\\\n\\\\\n842\\\\\n\\\\\nF.P. Journe\\\\\nRef. T\\\\\nTourbillon Souverain\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$2,400,000–4,800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$11,239,500](https://www.phillips.com/detail/f.p.-journe/233933)\n\n[\\\\\n\\\\\n843\\\\\n\\\\\nYosuke Sekiguchi\\\\\nRef. 39RG-BKWH\\\\\nPrimevère 2023\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$500,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,143,000](https://www.phillips.com/detail/yosuke-sekiguchi/232337)\n\n[\\\\\n\\\\\n844\\\\\n\\\\\nHaldimann\\\\\nRef. H11/12\\\\\nCentral Balance\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,968,500](https://www.phillips.com/detail/haldimann/232336)\n\n[\\\\\n\\\\\n845\\\\\n\\\\\nUrban Jürgensen\\\\\nRef. 11C\\\\\nPrototype Detent Escapement\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$450,000–900,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,397,000](https://www.phillips.com/detail/urban-j%C3%BCrgensen/231547)\n\n[\\\\\n\\\\\n846\\\\\n\\\\\nChopard\\\\\nRef. 168604-3001\\\\\nL.U.C. Full Strike\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,270,000](https://www.phillips.com/detail/chopard/231661)\n\n[\\\\\n\\\\\n847\\\\\n\\\\\nKonstantin Chaykin\\\\\nRef. Joker Sandmann OW\\\\\nJoker Sandmann Only Watch 2024\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$320,000–640,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$952,500](https://www.phillips.com/detail/konstantin-chaykin/232346)\n\n[\\\\\n\\\\\n848\\\\\n\\\\\nRESERVOIR\\\\\nRef. RSV01.KN/733\\\\\nKanister Palladium, Only Watch 2021\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$130,000–260,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$152,400](https://www.phillips.com/detail/reservoir/233160)\n\n[\\\\\n\\\\\n849\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 25829TR.OO.0944TR.01\\\\\nRoyal Oak Quantième Perpetuel Automatique\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$750,000–1,500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,968,500](https://www.phillips.com/detail/audemars-piguet/230209)\n\n[\\\\\n\\\\\n850\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 25563OR.PP.A002XX.01\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$698,500](https://www.phillips.com/detail/audemars-piguet/229217)\n\n[\\\\\n\\\\\n851\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 5183BA\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$40,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$203,200](https://www.phillips.com/detail/audemars-piguet/233370)\n\n[\\\\\n\\\\\n852\\\\\n\\\\\nJaeger-LeCoultre\\\\\nRef. Q5063540, 186.3.26.S\\\\\nMaster Grande Tradition à Quantième Perpétuel 8 Jours SQ\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–640,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$533,400](https://www.phillips.com/detail/jaeger-lecoultre/230478)\n\n[\\\\\n\\\\\n853\\\\\n\\\\\nCartier\\\\\nRef. CRHPI01088\\\\\nCrash Squelette No. 1\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$1,000,000–2,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$9,207,500](https://www.phillips.com/detail/cartier/228510)\n\n[\\\\\n\\\\\n854\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5726/1A-010\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$914,400](https://www.phillips.com/detail/patek-philippe/230901)\n\n[\\\\\n\\\\\n855\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5960/1A-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$310,000–470,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$355,600](https://www.phillips.com/detail/patek-philippe/233662)\n\n[\\\\\n\\\\\n856\\\\\n\\\\\nRolex\\\\\nRef. 116509-0044\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$355,600](https://www.phillips.com/detail/rolex/232325)\n\n[\\\\\n\\\\\n857\\\\\n\\\\\nRolex\\\\\nRef. 218399BR\\\\\nDay-Date II\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$381,000](https://www.phillips.com/detail/rolex/232318)\n\n[\\\\\n\\\\\n858\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5110J-001\\\\\nWorld Time\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–250,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$254,000](https://www.phillips.com/detail/patek-philippe/231907)\n\n[\\\\\n\\\\\n859\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5146J-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–250,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$254,000](https://www.phillips.com/detail/patek-philippe/233563)\n\n[\\\\\n\\\\\n860\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3970EJ, Second Series\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$1,000,000–2,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$2,159,000](https://www.phillips.com/detail/patek-philippe/230605)\n\n[\\\\\n\\\\\n861\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3919J-016\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$60,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$139,700](https://www.phillips.com/detail/patek-philippe/233938)\n\n[\\\\\n\\\\\n862\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5196P-001\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$355,600](https://www.phillips.com/detail/patek-philippe/229741)\n\n[\\\\\n\\\\\n863\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5396G-001\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$279,400](https://www.phillips.com/detail/patek-philippe/229740)\n\n[\\\\\n\\\\\n864\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5296G-001\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$241,300](https://www.phillips.com/detail/patek-philippe/229739)\n\n[\\\\\n\\\\\n865\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5033P-012\\\\\nGondolo\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$1,800,000–2,800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$3,048,000](https://www.phillips.com/detail/patek-philippe/230923)\n\n[\\\\\n\\\\\n866\\\\\n\\\\\nRolex\\\\\nRef. 971\\\\\nPrince Brancard, White gold\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$381,000](https://www.phillips.com/detail/rolex/232665)\n\n[\\\\\n\\\\\n867\\\\\n\\\\\nPatek Philippe\\\\\nRef. 2591/2\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$152,400](https://www.phillips.com/detail/patek-philippe/233364)\n\n[\\\\\n\\\\\n868\\\\\n\\\\\nPatek Philippe\\\\\nRef. 2570/1\\\\\n\"Amagnetic\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$750,000–1,500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,778,000](https://www.phillips.com/detail/patek-philippe/232185)\n\n[\\\\\n\\\\\n869\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 4072\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$240,000–380,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$711,200](https://www.phillips.com/detail/vacheron-constantin/230208)\n\n[\\\\\n\\\\\n870\\\\\n\\\\\nRolex\\\\\nRef. 1601\\\\\nDatejust, Red Jasper in pink gold\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$508,000](https://www.phillips.com/detail/rolex/234020)\n\n[\\\\\n\\\\\n871\\\\\n\\\\\nRolex\\\\\nRef. 18038\\\\\nDay-Date, “Golden Walnut”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$80,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$381,000](https://www.phillips.com/detail/rolex/230894)\n\n[\\\\\n\\\\\n872\\\\\n\\\\\nRolex\\\\\nRef. 16018\\\\\nDatejust Electric Blue\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$698,500](https://www.phillips.com/detail/rolex/232332)\n\n[\\\\\n\\\\\n873\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3700/3\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$750,000–1,500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,397,000](https://www.phillips.com/detail/patek-philippe/231906)\n\n[\\\\\n\\\\\n874\\\\\n\\\\\nRolex\\\\\nRef. 6263\\\\\nCosmograph Daytona “Big Red”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$685,800](https://www.phillips.com/detail/rolex/232853)\n\n[\\\\\n\\\\\n875\\\\\n\\\\\nRolex\\\\\nRef. 116568BR\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$500,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,143,000](https://www.phillips.com/detail/rolex/233257)\n\n[\\\\\n\\\\\n876\\\\\n\\\\\nRolex\\\\\nRef. 128235\\\\\nDay-Date “Rainbow”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$533,400](https://www.phillips.com/detail/rolex/230417)\n\n[\\\\\n\\\\\n877\\\\\n\\\\\nPhilippe Dufour\\\\\n\\\\\nSimplicity in steel\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$2,800,000–5,600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$9,461,500](https://www.phillips.com/detail/philippe-dufour/232982)\n\n[\\\\\n\\\\\n878\\\\\n\\\\\nOscillon\\\\\n\\\\\nL’instant de Vérité\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$800,000–1,600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$4,953,000](https://www.phillips.com/detail/oscillon/232981)\n\n[\\\\\n\\\\\n879\\\\\n\\\\\nJ.N. Shapiro\\\\\n\\\\\nInfinity\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$266,700](https://www.phillips.com/detail/j.n.-shapiro/232561)\n\n[\\\\\n\\\\\n880\\\\\n\\\\\nH. Moser & Cie\\\\\nRef. 341.501\\\\\nMoser Perpetual 1\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$203,200](https://www.phillips.com/detail/h.-moser-&-cie/233247)\n\n[\\\\\n\\\\\n881\\\\\n\\\\\nH. Moser & Cie\\\\\nRef. 3811-1200\\\\\nPioneer Cylindrical Tourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$320,000–480,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$355,600](https://www.phillips.com/detail/h.-moser-&-cie/233667)\n\n[\\\\\n\\\\\n882\\\\\n\\\\\nDe Bethune\\\\\nRef. DB28TIS5C6BS\\\\\nDB28\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$300,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$698,500](https://www.phillips.com/detail/de-bethune/232846)\n\n[\\\\\n\\\\\n883\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronographe Monopoussoir Rattrapante\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$1,400,000–2,400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$2,413,000](https://www.phillips.com/detail/f.p.-journe/234087)\n\n[\\\\\n\\\\\n884\\\\\n\\\\\nRolex\\\\\nRef. 126529LN\\\\\nCosmograph Daytona “Le Mans”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$800,000–1,600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,714,500](https://www.phillips.com/detail/rolex/231240)\n\n[\\\\\n\\\\\n885\\\\\n\\\\\nRolex\\\\\nRef. 116519LN\\\\\nCosmograph Daytona Meteorite Dial\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$320,000–640,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$596,900](https://www.phillips.com/detail/rolex/233551)\n\n[\\\\\n\\\\\n886\\\\\n\\\\\nRolex\\\\\nRef. 118239\\\\\nDay-Date Meteorite Dial\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$482,600](https://www.phillips.com/detail/rolex/230039)\n\n[\\\\\n\\\\\n887\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 15206PT.OO.1240PT.01\\\\\nRoyal Oak Jumbo Extra-thin “Yoshida”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$800,000–1,600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,079,500](https://www.phillips.com/detail/audemars-piguet/232554)\n\n[\\\\\n\\\\\n888\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26574ST.OO.1220ST.01\\\\\nRoyal Oak Perpetual Calendar\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$500,000–700,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$698,500](https://www.phillips.com/detail/audemars-piguet/232641)\n\n[\\\\\n\\\\\n889\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26395BC.OO.D002KB.01\\\\\nCODE 11.59 Minute Repeater Supersonnerie\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$750,000–1,500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,778,000](https://www.phillips.com/detail/audemars-piguet/230603)\n\n[\\\\\n\\\\\n890\\\\\n\\\\\nCredor\\\\\nRef. GCLP989\\\\\nSakura Fubuki Raden Edition\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$88,900](https://www.phillips.com/detail/credor/233248)\n\n[\\\\\n\\\\\n891\\\\\n\\\\\nCredor\\\\\nRef. GBBD968\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$55,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$120,650](https://www.phillips.com/detail/credor/232494)\n\n[\\\\\n\\\\\n892\\\\\n\\\\\nCasio\\\\\nRef. G-D5000-9JR\\\\\nG-Shock Dream Project “Pure Gold”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$635,000](https://www.phillips.com/detail/casio/230210)\n\n[\\\\\nNo Reserve\\\\\n893\\\\\n\\\\\nIWC\\\\\nRef. IW379201\\\\\nIngenieur Perpetual Calendar Digital Date-Month\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$48,000–96,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$127,000](https://www.phillips.com/detail/iwc/233630)\n\n[\\\\\n\\\\\n894\\\\\n\\\\\nGirard-Perregaux\\\\\nRef. 99270-21-000-BA6E\\\\\nNeo Tourbillon with Three Bridges\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$240,000–480,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$304,800](https://www.phillips.com/detail/girard-perregaux/232740)\n\n[\\\\\n\\\\\n895\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nTourbillon Souverain, “Chine 2010 38”\\\\\n\\\\\nEstimate\\\\\n\\\\\nIn Excess of HKD7,800,000/ USD 1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$32,965,000](https://www.phillips.com/detail/f.p.-journe/232174)\n\n[\\\\\n\\\\\n896\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5230P-010\\\\\nWorld Time, Shanghai 10th Anniversary Edition\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$800,000–1,400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,524,000](https://www.phillips.com/detail/patek-philippe/231341)\n\n[\\\\\n\\\\\n897\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5160/500G-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$600,000–1,200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,524,000](https://www.phillips.com/detail/patek-philippe/232344)\n\n[\\\\\n\\\\\n898\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 110.029\\\\\nLange 1 Soirée MOP\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$250,000–500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$762,000](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/232675)\n\n[\\\\\n\\\\\n899\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 205.086\\\\\nSaxonia Thin, Copper-blue gold flux dial\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$190,500](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/233155)\n\n[\\\\\n\\\\\n900\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 15210BC.OO.A021CR.01\\\\\nCODE 11.59 “Sodalite”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$230,000–360,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$304,800](https://www.phillips.com/detail/audemars-piguet/232437)\n\n[\\\\\n\\\\\n901\\\\\n\\\\\nJaeger-LeCoultre\\\\\nRef. Q5023580, 187.3.46.S\\\\\nMaster Grande Tradition Grande Complication\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$320,000–640,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$952,500](https://www.phillips.com/detail/jaeger-lecoultre/233854)\n\n[\\\\\n\\\\\n902\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 47712/1\\\\\nMalte Perpetual Calendar Chronograph\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$250,000–500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$381,000](https://www.phillips.com/detail/vacheron-constantin/231549)\n\n[\\\\\n\\\\\n903\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 47247/000P-9022\\\\\nPatrimony Retrograde\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$140,000–220,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$355,600](https://www.phillips.com/detail/vacheron-constantin/233936)\n\n[\\\\\n\\\\\n904\\\\\n\\\\\nHarry Winston\\\\\n\\\\\n“Wall Street” by Antoine Preziuzo No,001, Unique\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,524,000](https://www.phillips.com/detail/harry-winston/229216)\n\n[\\\\\nNo Reserve\\\\\n905\\\\\n\\\\\nJean-Pierre Hagmann\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$158,750](https://www.phillips.com/detail/jean-pierre-hagmann/234224)\n\n[\\\\\n\\\\\n906\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronomètre à Résonance\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$2,000,000–4,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$4,191,000](https://www.phillips.com/detail/f.p.-journe/233935)\n\n[\\\\\n\\\\\n907\\\\\n\\\\\nCartier\\\\\n\\\\\nTank Obus \"Rectangulaire à Pattes Vis Armurier\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$444,500](https://www.phillips.com/detail/cartier/230986)\n\n[\\\\\n\\\\\n908\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5028G-001\\\\\nGolden Ellipse\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$304,800](https://www.phillips.com/detail/patek-philippe/233937)\n\n[\\\\\n\\\\\n909\\\\\n\\\\\nPiaget\\\\\nRef. G0A47543\\\\\nBlack Tie, Unique Edition\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$500,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$952,500](https://www.phillips.com/detail/piaget/231413)\n\n[\\\\\n\\\\\n910\\\\\n\\\\\nBreguet\\\\\nRef. 5839BB/6D/9ZU DD0D\\\\\nHorloger De La Marine Chronograph Tourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$600,000–1,200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$889,000](https://www.phillips.com/detail/breguet/232676)\n\n[\\\\\n\\\\\n912\\\\\n\\\\\nOmega\\\\\nRef. CK 2998\\\\\nSpeedmaster 2998-6\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$95,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$139,700](https://www.phillips.com/detail/omega/226230)\n\n[\\\\\n\\\\\n913\\\\\n\\\\\nRolex\\\\\nRef. 1016\\\\\nExplorer\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$88,900](https://www.phillips.com/detail/rolex/234227)\n\n[\\\\\n\\\\\n914\\\\\n\\\\\nRolex\\\\\nRef. 1675\\\\\nGMT-Master \"Tropical MK III\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$195,000–350,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$698,500](https://www.phillips.com/detail/rolex/232191)\n\n[\\\\\n\\\\\n915\\\\\n\\\\\nRolex\\\\\nRef. 5512\\\\\nSubmariner “Pointed Crown Guards”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$250,000–450,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$444,500](https://www.phillips.com/detail/rolex/229975)\n\n[\\\\\n\\\\\n917\\\\\n\\\\\nRolex\\\\\nRef. 5513\\\\\nSubmariner “MilSub”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$970,000–1,940,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,397,000](https://www.phillips.com/detail/rolex/224820)\n\n[\\\\\n\\\\\n918\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3700/11\\\\\nNautilus “Jumbo”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$550,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$952,500](https://www.phillips.com/detail/patek-philippe/233256)\n\n[\\\\\n\\\\\n919\\\\\n\\\\\nCartier\\\\\nRef. W1507451\\\\\nBaignoire Allongée “Maxi Oval”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$762,000](https://www.phillips.com/detail/cartier/230784)\n\n[\\\\\n\\\\\n920\\\\\n\\\\\nCartier\\\\\n\\\\\nTonneau\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$120,650](https://www.phillips.com/detail/cartier/232671)\n\n[\\\\\n\\\\\n921\\\\\n\\\\\nDe Bethune\\\\\nRef. DB25LRS1V1\\\\\nDB25L\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$444,500](https://www.phillips.com/detail/de-bethune/232741)\n\n[\\\\\n\\\\\n922\\\\\n\\\\\nDe Bethune\\\\\nRef. DB25RS1\\\\\nDB25 Power Reserve\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$330,200](https://www.phillips.com/detail/de-bethune/233627)\n\n[\\\\\n\\\\\n923\\\\\n\\\\\nDaniel Roth\\\\\nRef. 2137/C137\\\\\nChronograph Mono-pusher\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$952,500](https://www.phillips.com/detail/daniel-roth/233844)\n\n[\\\\\n\\\\\n924\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5970P-018\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$3,500,000–7,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$10,414,000](https://www.phillips.com/detail/patek-philippe/234086)\n\n[\\\\\n\\\\\n925\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5711/111P-001\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$2,400,000–4,800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$6,731,000](https://www.phillips.com/detail/patek-philippe/234084)\n\n[\\\\\n\\\\\n926\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 414.028\\\\\n1815 Chronograph\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$240,000–480,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$444,500](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/225391)\n\n[\\\\\n\\\\\n927\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 236.049\\\\\n1815 Anniversary F.A. Lange\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$55,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$165,100](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/225392)\n\n[\\\\\n\\\\\n928\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 297.026\\\\\n1815 “Homage to Walter Lange”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–360,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$381,000](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/232980)\n\n[\\\\\n\\\\\n929\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5970G-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$850,000–1,700,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,714,500](https://www.phillips.com/detail/patek-philippe/225393)\n\n[\\\\\n\\\\\n930\\\\\n\\\\\nCartier New York\\\\\n\\\\\nModel A\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$2,400,000–4,800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$3,937,000](https://www.phillips.com/detail/cartier-new-york/232761)\n\n[\\\\\n\\\\\n931\\\\\n\\\\\nCartier\\\\\n\\\\\n“Brûlé Parfum Jade de Nankin”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$2,286,000](https://www.phillips.com/detail/cartier/232762)\n\n[\\\\\n\\\\\n932\\\\\n\\\\\nCartier\\\\\n\\\\\nBarometer\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$800,000–1,600,000](https://www.phillips.com/detail/cartier/229163)\n\n[\\\\\n\\\\\n933\\\\\n\\\\\nBovet\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$640,000–1,280,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$762,000](https://www.phillips.com/detail/bovet/232760)\n\n[\\\\\n\\\\\n934\\\\\n\\\\\nJuvet\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$304,800](https://www.phillips.com/detail/juvet/232763)\n\n[\\\\\n\\\\\n935\\\\\n\\\\\nBarraud\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$355,600](https://www.phillips.com/detail/barraud/232756)\n\n[\\\\\n\\\\\n936\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3878J\\\\\nSquelette\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$230,000–420,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$508,000](https://www.phillips.com/detail/patek-philippe/233659)\n\n[\\\\\n\\\\\n937\\\\\n\\\\\nPiaget\\\\\nRef. 900 H\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$45,000–75,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$88,900](https://www.phillips.com/detail/piaget/233658)\n\n[\\\\\nNo Reserve\\\\\n938\\\\\n\\\\\nVacheron Constantin\\\\\n\\\\\nChronomètre Royal\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$30,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$76,200](https://www.phillips.com/detail/vacheron-constantin/231241)\n\n[\\\\\n\\\\\n939\\\\\n\\\\\nPatek Philippe\\\\\n\\\\\nMinute repeater\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$254,000](https://www.phillips.com/detail/patek-philippe/233858)\n\n[\\\\\n\\\\\n940\\\\\n\\\\\nPatek Philippe\\\\\n\\\\\nNo. 97183\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$240,000–480,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,079,500](https://www.phillips.com/detail/patek-philippe/232759)\n\n[\\\\\n\\\\\n941\\\\\n\\\\\nPatek Philippe\\\\\nRef. 2499 “The Pink First Series”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$24,000,000–48,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$80,370,000](https://www.phillips.com/detail/patek-philippe/234083)\n\n[\\\\\n\\\\\n942\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nÉlégante 48\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$240,000–480,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$825,500](https://www.phillips.com/detail/f.p.-journe/233343)\n\n[\\\\\n\\\\\n943\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Sport Indy 500\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$2,159,000](https://www.phillips.com/detail/f.p.-journe/229987)\n\n[\\\\\n\\\\\n944\\\\\n\\\\\nTiffany & Co.\\\\\nRef. 72917049\\\\\nTime for Speed Race Car Clock\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$381,000](https://www.phillips.com/detail/tiffany-&-co./229321)\n\n[\\\\\nNo Reserve\\\\\n945\\\\\n\\\\\nRolex\\\\\nRef. 124300\\\\\nOyster Perpetual 41\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$82,550](https://www.phillips.com/detail/rolex/232493)\n\n[\\\\\n\\\\\n946\\\\\n\\\\\nRolex\\\\\nRef. 116610LN\\\\\nSubmariner “GIGN”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$90,000–180,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$355,600](https://www.phillips.com/detail/rolex/232849)\n\n[\\\\\n\\\\\n947\\\\\n\\\\\nRolex\\\\\nRef. 116520\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$177,800](https://www.phillips.com/detail/rolex/232316)\n\n[\\\\\n\\\\\n948\\\\\n\\\\\nRolex\\\\\nRef. 16610LV\\\\\nSubmariner, “Kermit, Flat 4 MK I\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$165,100](https://www.phillips.com/detail/rolex/232324)\n\n[\\\\\nNo Reserve\\\\\n949\\\\\n\\\\\nRolex\\\\\nRef. 16710\\\\\nGMT-Master II\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$60,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$139,700](https://www.phillips.com/detail/rolex/230149)\n\n[\\\\\n\\\\\n950\\\\\n\\\\\nRolex\\\\\nRef. 14270\\\\\nExplorer\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$75,000–150,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$152,400](https://www.phillips.com/detail/rolex/232334)\n\n[\\\\\n\\\\\n951\\\\\n\\\\\nRolex\\\\\nRef. 116520\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$279,400](https://www.phillips.com/detail/rolex/233254)\n\n[\\\\\n\\\\\n952\\\\\n\\\\\nRolex\\\\\nRef. 116509-0064\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$381,000](https://www.phillips.com/detail/rolex/232327)\n\n[\\\\\n\\\\\n953\\\\\n\\\\\nRolex\\\\\nRef. 126679SABR\\\\\nYacht-Master 40, “Cotton Candy”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–780,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,295,400](https://www.phillips.com/detail/rolex/232330)\n\n[\\\\\n\\\\\n954\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5711/1A-010\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$952,500](https://www.phillips.com/detail/patek-philippe/232322)\n\n[\\\\\n\\\\\n955\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5821/1A-001\\\\\nCubitus\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$774,700](https://www.phillips.com/detail/patek-philippe/231403)\n\n[\\\\\n\\\\\n956\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5968G-001\\\\\nAquanaut Chronograph\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$450,000–950,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,016,000](https://www.phillips.com/detail/patek-philippe/233622)\n\n[\\\\\n\\\\\n957\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5712R-001\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$280,000–560,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$762,000](https://www.phillips.com/detail/patek-philippe/232178)\n\n[\\\\\n\\\\\n958\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5270G-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$480,000–960,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$889,000](https://www.phillips.com/detail/patek-philippe/232176)\n\n[\\\\\n\\\\\n959\\\\\n\\\\\nBlancpain\\\\\nRef. 5008 11B30 NABA\\\\\nFifty Fathoms Mil-Spec Hodinkee\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$107,950](https://www.phillips.com/detail/blancpain/233835)\n\n[\\\\\n\\\\\n960\\\\\n\\\\\nPanerai\\\\\nRef. PAM00671\\\\\nLuminor Submersible 1950 3 Days Automatic Bronzo\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$88,900](https://www.phillips.com/detail/panerai/233633)\n\n[\\\\\nNo Reserve\\\\\n961\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26007BA.OO.D088CR.01\\\\\nRoyal Oak Offshore Chronograph “Arnold Schwarzenegger”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–180,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$165,100](https://www.phillips.com/detail/audemars-piguet/233624)\n\n[\\\\\nNo Reserve\\\\\n962\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 25808BA.OO.D009XX.01\\\\\nRoyal Oak Offshore Complete Calendar\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$64,000–128,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$114,300](https://www.phillips.com/detail/audemars-piguet/233626)\n\n[\\\\\n\\\\\n963\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 25636BA.OO.0944BA.01\\\\\nRoyal Oak Perpetual Calendar Openworked\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$500,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,651,000](https://www.phillips.com/detail/audemars-piguet/232633)\n\n[\\\\\n\\\\\n964\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 30066-67/1\\\\\nMalte Tourbillon Openworked\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$450,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$685,800](https://www.phillips.com/detail/vacheron-constantin/232845)\n\n[\\\\\n\\\\\n965\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5330G-010\\\\\nWorld Time Date, Limited Edition Tokyo 2023\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$480,000–900,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$825,500](https://www.phillips.com/detail/patek-philippe/230212)\n\n[\\\\\n\\\\\n966\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5230G-010\\\\\nWorld Time, New York Edition\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$250,000–500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$571,500](https://www.phillips.com/detail/patek-philippe/232319)\n\n[\\\\\n\\\\\n967\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5230R-001\\\\\nWorld Time\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$279,400](https://www.phillips.com/detail/patek-philippe/233062)\n\n[\\\\\n\\\\\n968\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 43050/000J\\\\\nMercator\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$635,000](https://www.phillips.com/detail/vacheron-constantin/229293)\n\n[\\\\\n\\\\\n969\\\\\n\\\\\nPiaget\\\\\nRef. G0A39151\\\\\nAltiplano Scrimshaw\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$254,000](https://www.phillips.com/detail/piaget/230040)\n\n[\\\\\n\\\\\n970\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5034J-001\\\\\nTravel Time\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$50,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$114,300](https://www.phillips.com/detail/patek-philippe/233939)\n\n[\\\\\n\\\\\n971\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3919J-001\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$40,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$107,950](https://www.phillips.com/detail/patek-philippe/232342)\n\n[\\\\\n\\\\\n972\\\\\n\\\\\nRoger Dubuis\\\\\nRef. S34 575\\\\\nSympathie\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$48,000–96,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$254,000](https://www.phillips.com/detail/roger-dubuis/233637)\n\n[\\\\\n\\\\\n973\\\\\n\\\\\nRoger Dubuis\\\\\nRef. H46 56 5\\\\\nHommage\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–250,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$190,500](https://www.phillips.com/detail/roger-dubuis/233859)\n\n[\\\\\n\\\\\n974\\\\\n\\\\\nParmigiani Fleurier\\\\\n\\\\\nToric Tourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$250,000–500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$762,000](https://www.phillips.com/detail/parmigiani-fleurier/234091)\n\n[\\\\\nNo Reserve\\\\\n975\\\\\n\\\\\nVacheron Constantin\\\\\nRef. V42215/00R-9225\\\\\nPatrimony Grand Date\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$24,000–48,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$69,850](https://www.phillips.com/detail/vacheron-constantin/233638)\n\n[\\\\\n\\\\\n976\\\\\n\\\\\nBreguet\\\\\nRef. 1747BA/11/286\\\\\nClassique Regulator 1747, 250th anniversary of Breguet\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$40,000–64,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$95,250](https://www.phillips.com/detail/breguet/233369)\n\n[\\\\\n\\\\\n977\\\\\n\\\\\nBreguet\\\\\nRef. 5353BR/9B/9V6\\\\\nClassique Tourbillon, The Hour Glass Edition, No. 8/25\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$250,000–500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$609,600](https://www.phillips.com/detail/breguet/232674)\n\n[\\\\\n\\\\\n978\\\\\n\\\\\nJaeger-LeCoultre\\\\\nRef. 270.8.62\\\\\nReverso Grande Taille “Batman Forever”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$63,000–95,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$355,600](https://www.phillips.com/detail/jaeger-lecoultre/232331)\n\n[\\\\\n\\\\\n979\\\\\n\\\\\nJaeger-LeCoultre\\\\\nRef. 215.8.D4, Q3988482\\\\\nReverso Tribute Duoface small seconds\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$50,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$88,900](https://www.phillips.com/detail/jaeger-lecoultre/233159)\n\n[\\\\\n\\\\\n980\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 91003/000B-8397\\\\\nLes Historiques “Jalousie”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–250,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$317,500](https://www.phillips.com/detail/vacheron-constantin/233365)\n\n[\\\\\n\\\\\n981\\\\\n\\\\\nCorum\\\\\nRef. 113.770.55/0001 GN01\\\\\nGolden Bridge Black Baton\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$76,200](https://www.phillips.com/detail/corum/232670)\n\n[\\\\\n\\\\\n982\\\\\n\\\\\nCartier\\\\\nRef. 2396\\\\\nTortue Monopoussoir CPCP\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$180,000–360,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$635,000](https://www.phillips.com/detail/cartier/229572)\n\n[\\\\\n\\\\\n983\\\\\n\\\\\nGirard-Perregaux\\\\\n\\\\\nFerrari 250 GTO 64\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$127,000](https://www.phillips.com/detail/girard-perregaux/233837)\n\n[\\\\\n\\\\\n984\\\\\n\\\\\nRichard Mille\\\\\nRef. RM010 AI RG\\\\\nRM 010\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$863,600](https://www.phillips.com/detail/richard-mille/233636)\n\n[\\\\\n\\\\\n985\\\\\n\\\\\nOtsuka Lotec\\\\\n\\\\\nModel No. 7.5\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$53,340](https://www.phillips.com/detail/otsuka-lotec/230996)\n\n[\\\\\n\\\\\n986\\\\\n\\\\\nMING\\\\\nRef. 20.09\\\\\n20.09 Tourbillon, Special Projects Cave\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$280,000–500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$444,500](https://www.phillips.com/detail/ming/233154)\n\n[\\\\\n\\\\\n987\\\\\n\\\\\nMB&F\\\\\n\\\\\nLMX\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$812,800](https://www.phillips.com/detail/mb&f/233161)\n\n[\\\\\n\\\\\n988\\\\\n\\\\\nMoritz Grossmann\\\\\nRef. Wristwatch: MG-002071\\\\\nWristwatch: ATUM 37 Hommage, unique set\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$508,000](https://www.phillips.com/detail/moritz-grossmann/233623)\n\n[\\\\\nNo Reserve\\\\\n989\\\\\n\\\\\nArnold & Son\\\\\nRef. 1ARAP.W01A.C120P\\\\\nTBR\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$88,900](https://www.phillips.com/detail/arnold-&-son/233625)\n\n[\\\\\nNo Reserve\\\\\n990\\\\\n\\\\\nMIH\\\\\n\\\\\nMIH - Musee International d'horlogerie\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$16,000–32,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$69,850](https://www.phillips.com/detail/mih/233632)\n\n[\\\\\n\\\\\n991\\\\\n\\\\\nCartier\\\\\nRef. 30026\\\\\nPasha Perpetual Calendar\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$75,000–150,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$254,000](https://www.phillips.com/detail/cartier/234017)\n\n[\\\\\nNo Reserve\\\\\n992\\\\\n\\\\\nGérald Genta\\\\\nRef. G2989.7\\\\\nGefica Regatta Chronograph\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$86,360](https://www.phillips.com/detail/g%C3%A9rald-genta/231404)\n\n[\\\\\n\\\\\n993\\\\\n\\\\\nPaul Gerber\\\\\nRef. 157\\\\\nRetro Twin\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$56,000–112,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$241,300](https://www.phillips.com/detail/paul-gerber/233635)\n\n[\\\\\n\\\\\n994\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 304.049\\\\\nGrosse Langematik Gangreserve, No.100/100\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$444,500](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/233157)\n\n[\\\\\n\\\\\n995\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 232.025\\\\\nRichard Lange\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$215,900](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/233631)\n\n[\\\\\n\\\\\n996\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 148.038\\\\\nZeitwerk Date\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$609,600](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/233246)\n\n[\\\\\n\\\\\n997\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5016P-010\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$3,500,000–6,500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$6,731,000](https://www.phillips.com/detail/patek-philippe/234082)\n\n[\\\\\n\\\\\n998\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3970E, Fourth Series\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$960,000–1,760,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,587,500](https://www.phillips.com/detail/patek-philippe/229165)\n\n[\\\\\n\\\\\n999\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5038G\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$368,300](https://www.phillips.com/detail/patek-philippe/231459)\n\n[\\\\\n\\\\\n1000\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Réserve de Marche, No. 34\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$780,000–1,560,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$3,302,000](https://www.phillips.com/detail/f.p.-journe/232772)\n\n[\\\\\n\\\\\n1001\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronomètre Souverain\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,524,000](https://www.phillips.com/detail/f.p.-journe/232669)\n\n[\\\\\n\\\\\n1002\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5500J\\\\\nPagoda\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$70,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$152,400](https://www.phillips.com/detail/patek-philippe/233368)\n\n[\\\\\n\\\\\n1003\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5124G-001\\\\\nGondolo\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$254,000](https://www.phillips.com/detail/patek-philippe/229738)\n\n[\\\\\n\\\\\n1004\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5200G-001\\\\\nGondolo, Error dial\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$457,200](https://www.phillips.com/detail/patek-philippe/233363)\n\n[\\\\\n\\\\\n1005\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3998P\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$78,000–155,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$304,800](https://www.phillips.com/detail/patek-philippe/229574)\n\n[\\\\\n\\\\\n1006\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5055G-010\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$190,500](https://www.phillips.com/detail/patek-philippe/233651)\n\n[\\\\\n\\\\\n1007\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3970E, Third Series\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$750,000–1,500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,524,000](https://www.phillips.com/detail/patek-philippe/233560)\n\n[\\\\\n\\\\\n1008\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5102PR-001\\\\\nCelestial\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$800,000–1,600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,905,000](https://www.phillips.com/detail/patek-philippe/232175)\n\n[\\\\\n\\\\\n1009\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5131G-001\\\\\nWorld Time\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$500,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$825,500](https://www.phillips.com/detail/patek-philippe/232320)\n\n[\\\\\n\\\\\n1010\\\\\n\\\\\nJaquet Droz\\\\\nRef. J032634270\\\\\nMagic Lotus Automaton\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$350,000–650,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$596,900](https://www.phillips.com/detail/jaquet-droz/232978)\n\n[\\\\\n\\\\\n1011\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5077P-033\\\\\nCalatrava, Canards Mandarins\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–700,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$635,000](https://www.phillips.com/detail/patek-philippe/234078)\n\n[\\\\\n\\\\\n1012\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5077P-036\\\\\nCalatrava, Canards Mandarins\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–700,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$698,500](https://www.phillips.com/detail/patek-philippe/234081)\n\n[\\\\\n\\\\\n1013\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5077P-035\\\\\nCalatrava, Canards Mandarins\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–700,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$990,600](https://www.phillips.com/detail/patek-philippe/234080)\n\n[\\\\\n\\\\\n1014\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5077P-034\\\\\nCalatrava, Canards Mandarins\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–700,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,092,200](https://www.phillips.com/detail/patek-philippe/234079)\n\n[\\\\\n\\\\\n1015\\\\\n\\\\\nPatek Philippe\\\\\nRef. 4239/1\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$698,500](https://www.phillips.com/detail/patek-philippe/230421)\n\n[\\\\\n\\\\\n1016\\\\\n\\\\\nPatek Philippe\\\\\nRef. 4283/5J-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$457,200](https://www.phillips.com/detail/patek-philippe/229575)\n\n[\\\\\n\\\\\n1017\\\\\n\\\\\nOmega\\\\\n\\\\\nLouis Brandt perpetual calendar\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$75,000–150,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$165,100](https://www.phillips.com/detail/omega/230213)\n\n[\\\\\n\\\\\n1018\\\\\n\\\\\nCartier\\\\\nRef. WGMB0003\\\\\nClash \\[Un\\]limited\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–250,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$215,900](https://www.phillips.com/detail/cartier/233654)\n\n[\\\\\n\\\\\n1019\\\\\n\\\\\nCartier\\\\\nRef. 2672\\\\\nBaignoire Allongée\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$330,200](https://www.phillips.com/detail/cartier/229573)\n\n[\\\\\n\\\\\n1020\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3700/1\\\\\nNautilus “Jumbo”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$800,000–1,600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,778,000](https://www.phillips.com/detail/patek-philippe/233191)\n\n[\\\\\n\\\\\n1021\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3700/11\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$500,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$762,000](https://www.phillips.com/detail/patek-philippe/232323)\n\n[\\\\\n\\\\\n1022\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 5402ST\\\\\nRoyal Oak “A Series”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$280,000–550,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$584,200](https://www.phillips.com/detail/audemars-piguet/230419)\n\n[\\\\\n\\\\\n1023\\\\\n\\\\\nIWC\\\\\nRef. 1832\\\\\nIngenieur SL “Jumbo”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$203,200](https://www.phillips.com/detail/iwc/233192)\n\n[\\\\\n\\\\\n1024\\\\\n\\\\\nIWC\\\\\nRef. 9225\\\\\nIngenieur, Royal Khanjar\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–220,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$431,800](https://www.phillips.com/detail/iwc/234089)\n\n[\\\\\n\\\\\n1025\\\\\n\\\\\nUniversal Genève\\\\\nRef. 885.107\\\\\nCompax “Exotic Nina”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$342,900](https://www.phillips.com/detail/universal-gen%C3%A8ve/234021)\n\n[\\\\\nNo Reserve\\\\\n1026\\\\\n\\\\\nBlancpain\\\\\n\\\\\nFifty Fathoms \"No Radiations\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$330,200](https://www.phillips.com/detail/blancpain/234019)\n\n[\\\\\n\\\\\n1028\\\\\n\\\\\nRolex\\\\\nRef. 1665\\\\\nSea-Dweller, “Double Red Tropical MK II”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$320,000–640,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$546,100](https://www.phillips.com/detail/rolex/232854)\n\n[\\\\\n\\\\\n1029\\\\\n\\\\\nRolex\\\\\nRef. 6262\\\\\nCosmograph Daytona “Paul Newman”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$750,000–1,500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,905,000](https://www.phillips.com/detail/rolex/233341)\n\n[\\\\\n\\\\\n1030\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronomètre à Résonance, \"Parking Meter\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$1,200,000–2,400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$6,096,000](https://www.phillips.com/detail/f.p.-journe/229236)\n\n[\\\\\n\\\\\n1031\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5970R-017\\\\\nUnique dial\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$4,000,000–8,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$12,827,000](https://www.phillips.com/detail/patek-philippe/232553)\n\n[\\\\\n\\\\\n1032\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5160J-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,651,000](https://www.phillips.com/detail/patek-philippe/232177)\n\n[\\\\\n\\\\\n1033\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5050R\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$406,400](https://www.phillips.com/detail/patek-philippe/233552)\n\n[\\\\\n\\\\\n1034\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5059J-015\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$254,000](https://www.phillips.com/detail/patek-philippe/233634)\n\n[\\\\\nNo Reserve\\\\\n1035\\\\\n\\\\\nOmega\\\\\nRef. 310.55.42.50.99.002\\\\\nSpeedmaster Professional Moonwatch Rainbow\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$800,000–1,600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$825,500](https://www.phillips.com/detail/omega/233340)\n\n[\\\\\n\\\\\n1036\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5522A-001\\\\\nCalatrava Pilot, New York 2017\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$355,600](https://www.phillips.com/detail/patek-philippe/234220)\n\n[\\\\\n\\\\\n1037\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5520P-001\\\\\nAlarm Travel Time\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$750,000–1,500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$952,500](https://www.phillips.com/detail/patek-philippe/233661)\n\n[\\\\\n\\\\\n1038\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Sport Aluminium\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$2,032,000](https://www.phillips.com/detail/f.p.-journe/233629)\n\n[\\\\\n\\\\\n1039\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26589IO.OO.D002CA.01\\\\\nRoyal Oak Concept Flying Tourbillon GMT\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$600,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$762,000](https://www.phillips.com/detail/audemars-piguet/229517)\n\n[\\\\\n\\\\\n1040\\\\\n\\\\\nRichard Mille\\\\\nRef. RM014 CA-FQ\\\\\nRM 014 \"Perini Navi” Japanese Edition, No. 00/07\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$2,200,000–4,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$3,429,000](https://www.phillips.com/detail/richard-mille/233255)\n\n[\\\\\n\\\\\n1041\\\\\n\\\\\nParmigiani Fleurier\\\\\nRef. PFH282-1002400-HA4041\\\\\nTonda Chronor Anniversaire\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$355,600](https://www.phillips.com/detail/parmigiani-fleurier/232983)\n\n[\\\\\n\\\\\n1042\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 401.032\\\\\n1815 Chronograph, First Generation\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$406,400](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/233152)\n\n[\\\\\n\\\\\n1043\\\\\n\\\\\nJaeger-LeCoultre\\\\\nRef. 151.6.67.S\\\\\nMaster Minute Repeater\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$140,000–280,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$444,500](https://www.phillips.com/detail/jaeger-lecoultre/229791)\n\n[\\\\\n\\\\\n1044\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 49005/000P-8\\\\\nLes Complications\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–180,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$406,400](https://www.phillips.com/detail/vacheron-constantin/229790)\n\n[\\\\\n\\\\\n1045\\\\\n\\\\\nGirard-Perregaux\\\\\nRef. 99535OR\\\\\n1966 Tourbillon Gold Bridge\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$165,100](https://www.phillips.com/detail/girard-perregaux/232847)\n\n[\\\\\n\\\\\n1046\\\\\n\\\\\nZenith\\\\\nRef. 18.2210.4810/01.C713\\\\\nAcademy Force Constante, Georges Favre-Jacot\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–250,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$279,400](https://www.phillips.com/detail/zenith/233856)\n\n[\\\\\n\\\\\n1047\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 260.028\\\\\nRichard Lange “Pour le Mérite”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$300,000–500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$635,000](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/233156)\n\n[\\\\\n\\\\\n1048\\\\\n\\\\\nArmin Strom\\\\\n\\\\\nMirrored Force Resonance Ruby, Unique Piece\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$889,000](https://www.phillips.com/detail/armin-strom/232338)\n\n[\\\\\n\\\\\n1049\\\\\n\\\\\nGreubel Forsey\\\\\n\\\\\nDouble Tourbillon 30˚ Technique\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$960,000–1,600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,397,000](https://www.phillips.com/detail/greubel-forsey/232739)\n\n[\\\\\n\\\\\n1050\\\\\n\\\\\nBulgari\\\\\nRef. 102794\\\\\nOcto Finissimo Minute Repeater Carbon\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$320,000–640,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$609,600](https://www.phillips.com/detail/bulgari/230604)\n\n[\\\\\n\\\\\n1051\\\\\n\\\\\nHublot\\\\\nRef. 507.CX.9012.RX.TAK23\\\\\nClassic Fusion Takashi Murakami Black Ceramic Yellow & Orange Sapphires\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$350,000–650,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$825,500](https://www.phillips.com/detail/hublot/228704)\n\n[\\\\\n\\\\\n1052\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5650G-001\\\\\nAdvanced Research Aquanaut Travel Time\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$2,000,000–4,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$5,842,000](https://www.phillips.com/detail/patek-philippe/234085)\n\n[\\\\\n\\\\\n1053\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5066A-010\\\\\nAquanaut “Japan”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$450,000–620,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$939,800](https://www.phillips.com/detail/patek-philippe/233660)\n\n[\\\\\n\\\\\n1054\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3711/1\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$600,000–1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$2,032,000](https://www.phillips.com/detail/patek-philippe/230418)\n\n[\\\\\n\\\\\n1055\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 15202IP.OO.1240IP.01\\\\\nRoyal Oak “Jumbo Extra-thin”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$600,000–1,200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$889,000](https://www.phillips.com/detail/audemars-piguet/232555)\n\n[\\\\\n\\\\\n1056\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26730ST.OO.1320ST.01\\\\\nRoyal Oak Selfwinding Flying Tourbillon “50th Anniversary”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$650,000–1,300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,079,500](https://www.phillips.com/detail/audemars-piguet/233186)\n\n[\\\\\n\\\\\n1057\\\\\n\\\\\nCartier\\\\\nRef. WJLI0018\\\\\nLibre Baignoire Allongée\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,206,500](https://www.phillips.com/detail/cartier/229568)\n\n[\\\\\n\\\\\n1058\\\\\n\\\\\nPatek Philippe\\\\\nRef. 4897/300G-001\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$165,100](https://www.phillips.com/detail/patek-philippe/233372)\n\n[\\\\\n\\\\\n1059\\\\\n\\\\\nCartier\\\\\nRef. WGTN0005\\\\\nTonneau Privé\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–250,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$203,200](https://www.phillips.com/detail/cartier/233655)\n\n[\\\\\n\\\\\n1060\\\\\n\\\\\nCartier\\\\\nRef. 2295\\\\\nBaignoire, Bi-Plan Louis Cartier\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$30,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$127,000](https://www.phillips.com/detail/cartier/233649)\n\n[\\\\\n\\\\\n1061\\\\\n\\\\\nLaurent Ferrier\\\\\nRef. LCF025.AC.CW\\\\\nGalet Annual Calendar School Piece\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$170,000–310,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$241,300](https://www.phillips.com/detail/laurent-ferrier/233855)\n\n[\\\\\n\\\\\n1062\\\\\n\\\\\nFranck Muller\\\\\nRef. 7002T\\\\\nImperial Tourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–220,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$279,400](https://www.phillips.com/detail/franck-muller/233432)\n\n[\\\\\n\\\\\n1063\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26561BC.OO.D002CR.01\\\\\nJules Audemars Tourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$280,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$457,200](https://www.phillips.com/detail/audemars-piguet/233860)\n\n[\\\\\n\\\\\n1064\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronomètre à Résonance\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$1,950,000–3,500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$5,715,000](https://www.phillips.com/detail/f.p.-journe/229988)\n\n[\\\\\n\\\\\n1065\\\\\n\\\\\nGirard-Perregaux\\\\\nRef. 49534-52-R22-BB60\\\\\nThe Chamber of Wonders, Center of the Universe Sun\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$228,600](https://www.phillips.com/detail/girard-perregaux/233834)\n\n[\\\\\n\\\\\n1066\\\\\n\\\\\nMoritz Grossmann\\\\\nRef. MG-001950\\\\\nCorner Stone\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$165,100](https://www.phillips.com/detail/moritz-grossmann/233836)\n\n[\\\\\n\\\\\n1067\\\\\n\\\\\nCartier\\\\\nRef. WGTA0121\\\\\nTank Louis Cartier “Europe Edition”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–350,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$304,800](https://www.phillips.com/detail/cartier/233435)\n\n[\\\\\n\\\\\n1068\\\\\n\\\\\nCartier\\\\\nRef. WGTA0058\\\\\nTank Louis Cartier\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–350,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$254,000](https://www.phillips.com/detail/cartier/233436)\n\n[\\\\\n\\\\\n1069\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5204G-001\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$1,000,000–2,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,397,000](https://www.phillips.com/detail/patek-philippe/234088)\n\n[\\\\\n\\\\\n1070\\\\\n\\\\\nRolex\\\\\nRef. 16618\\\\\nSubmariner “Sultan” dial\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$203,200](https://www.phillips.com/detail/rolex/234090)\n\n[\\\\\n\\\\\n1071\\\\\n\\\\\nRolex\\\\\nRef. 16758\\\\\nGMT-Master\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$95,000–150,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$177,800](https://www.phillips.com/detail/rolex/234228)\n\n[\\\\\nNo Reserve\\\\\n1072\\\\\n\\\\\nRolex\\\\\nRef. 116500LN\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–250,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$241,300](https://www.phillips.com/detail/rolex/233264)\n\n[\\\\\n\\\\\n1073\\\\\n\\\\\nRolex\\\\\nRef. 116520\\\\\nCosmograph Daytona, \"Panna Dial\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$406,400](https://www.phillips.com/detail/rolex/234092)\n\n[\\\\\n\\\\\n1074\\\\\n\\\\\nRolex\\\\\nRef. 116589RBR\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$250,000–500,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$304,800](https://www.phillips.com/detail/rolex/232328)\n\n[\\\\\n\\\\\n1075\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 25820SP.OO.0944SP.01\\\\\nRoyal Oak Quantième Perpétuel Automatique\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$450,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$698,500](https://www.phillips.com/detail/audemars-piguet/232844)\n\n[\\\\\n\\\\\n1076\\\\\n\\\\\nPatek Philippe\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$65,000–130,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$139,700](https://www.phillips.com/detail/patek-philippe/232666)\n\n[\\\\\n\\\\\n1077\\\\\n\\\\\nPatek Philippe\\\\\nRef. 1491\\\\\n\"Ricciolo\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$787,400](https://www.phillips.com/detail/patek-philippe/233153)\n\n[\\\\\n\\\\\n1078\\\\\n\\\\\nPatek Philippe\\\\\nRef. 1518, First series MK III\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$1,600,000–3,200,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$4,699,000](https://www.phillips.com/detail/patek-philippe/229166)\n\n[\\\\\nNo Reserve\\\\\n1079\\\\\n\\\\\nRolex\\\\\nRef. 4127\\\\\nAthlete\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$32,000–48,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$95,250](https://www.phillips.com/detail/rolex/232668)\n\n[\\\\\n\\\\\n1080\\\\\n\\\\\nUlysse Nardin\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$75,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$127,000](https://www.phillips.com/detail/ulysse-nardin/232667)\n\n[\\\\\n\\\\\n1081\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 4218\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$40,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$304,800](https://www.phillips.com/detail/vacheron-constantin/233559)\n\n[\\\\\n\\\\\n1082\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 4178\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$406,400](https://www.phillips.com/detail/vacheron-constantin/234124)\n\n[\\\\\nNo Reserve\\\\\n1083\\\\\n\\\\\nRolex\\\\\nRef. 6036\\\\\nOyster \"Dato-Compax\"\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$450,000–750,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$508,000](https://www.phillips.com/detail/rolex/232664)\n\n[\\\\\n\\\\\n1084\\\\\n\\\\\nOmega\\\\\nRef. 145.012-67 SP\\\\\nSpeedmaster “Racing” Dial\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$230,000–470,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$762,000](https://www.phillips.com/detail/omega/233656)\n\n[\\\\\n\\\\\n1085\\\\\n\\\\\nNicole Nielsen & Co for W. Lister & Sons\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$698,500](https://www.phillips.com/detail/nicole-nielsen-&-co-for-w.-lister-&-sons/232753)\n\n[\\\\\n\\\\\n1086\\\\\n\\\\\nCartier Paris\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$495,300](https://www.phillips.com/detail/cartier-paris/232755)\n\n[\\\\\n\\\\\n1087\\\\\n\\\\\nCartier\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$64,000–128,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$139,700](https://www.phillips.com/detail/cartier/232764)\n\n[\\\\\n\\\\\n1088\\\\\n\\\\\nCartier\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$64,000–128,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$304,800](https://www.phillips.com/detail/cartier/232765)\n\n[\\\\\n\\\\\n1089\\\\\n\\\\\nAttributed to Piguet Meylan\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,066,800](https://www.phillips.com/detail/attributed-to-piguet-meylan/232758)\n\n[\\\\\n\\\\\n1090\\\\\n\\\\\nWest End Watch Co.\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$228,600](https://www.phillips.com/detail/west-end-watch-co./232754)\n\n[\\\\\n\\\\\n1091\\\\\n\\\\\nIlbery\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$444,500](https://www.phillips.com/detail/ilbery/232757)\n\n[\\\\\n\\\\\n1092\\\\\n\\\\\nSwiss\\\\\n\\\\\n“Bouquets de Chine”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$82,550](https://www.phillips.com/detail/swiss/232767)\n\n[\\\\\n\\\\\n1093\\\\\n\\\\\nSwiss\\\\\n\\\\\n“Bouquets de Chine”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$88,900](https://www.phillips.com/detail/swiss/232766)\n\n[\\\\\n\\\\\n1094\\\\\n\\\\\nJaeger-LeCoultre\\\\\n\\\\\nAtmos Marqueterie “Gustav Klimt”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$780,000–1,560,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$1,003,300](https://www.phillips.com/detail/jaeger-lecoultre/220043)\n\n[\\\\\n\\\\\n1095\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3417\\\\\nAmagnetic\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$235,000–390,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$444,500](https://www.phillips.com/detail/patek-philippe/232743)\n\n[\\\\\n\\\\\n1096\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3445\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$90,000–150,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$190,500](https://www.phillips.com/detail/patek-philippe/233857)\n\n[\\\\\n\\\\\n1097\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3448\\\\\nPadellone “Tokyo White”\\\\\n\\\\\nEstimate\\\\\n\\\\\nHK$6,000,000–12,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\nHK$13,716,000](https://www.phillips.com/detail/patek-philippe/233663)\n\n### About us\n\n- [Our history](https://www.phillips.com/about)\n- [Our team](https://www.phillips.com/team)\n- [Locations](https://www.phillips.com/location)\n- [Press](https://www.phillips.com/press)\n- [Careers](https://www.phillips.com/careers)\n- [Site map](https://www.phillips.com/sitemap)\n\n### Our services\n\n- [How to buy](https://www.phillips.com/buysell/buy)\n- [How to sell](https://www.phillips.com/buysell/sell)\n- [Private services](https://www.phillips.com/buysell/private)\n- [Professional & advisor services](https://www.phillips.com/professional-advisor-services)\n- [Fiduciary services](https://www.phillips.com/fiduciaryservices)\n\n### Policies\n\n- [Privacy policy](https://www.phillips.com/about/privacy)\n- [Cookie policy](https://www.phillips.com/about/cookiepolicy)\n- [Modern slavery policy](https://www.phillips.com/about/modernslaverypolicy)\n\nAbout us\n\nOur services\n\nPolicies\n\n### Never miss a moment\n\nSubscribe to our newsletter\n\n- [insta](https://www.instagram.com/phillipsauction/ \"insta\")\n- [linkedin](https://www.linkedin.com/company/phillips/ \"linkedin\")\n- [wechat](https://weixin.qq.com/r/qDuLk0-EKhJVrQvw9266 \"wechat\")\n- [red](https://www.xiaohongshu.com/user/profile/611e10a8000000000101ddf7 \"red\")\n- [facebook](https://www.facebook.com/phillipsauction/ \"facebook\")\n\n[logoLink](https://www.phillips.com/) © 2026 Phillips Auctioneers, LLC" | |
| 18 | + } | |
| 19 | + }, | |
| 20 | + "expect": { | |
| 21 | + "minCount": 10, | |
| 22 | + "kinds": [ | |
| 23 | + "sale", | |
| 24 | + "auction_lot" | |
| 25 | + ] | |
| 26 | + }, | |
| 27 | + "note": "captured live from https://www.phillips.com/auction/HK080226", | |
| 28 | + "capturedAt": "2026-09-07T04:43:24.810Z" | |
| 29 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/phillips-watches/NY080126.json
+29 −0
@@ -0,0 +1,29 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.phillips.com/auction/NY080126", | |
| 4 | + "externalId": "NY080126", | |
| 5 | + "kind": "sale", | |
| 6 | + "engine": "firecrawl", | |
| 7 | + "fetchedAt": "2026-09-07T04:42:17.754Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "auction_results", | |
| 10 | + "url": "https://www.phillips.com/auction/NY080126", | |
| 11 | + "saleNumber": "NY080126", | |
| 12 | + "title": "The New York Watch Auction: XIV", | |
| 13 | + "location": "NEW YORK", | |
| 14 | + "startDate": "2026-06-13T10:00:00-04:00", | |
| 15 | + "endDate": "2026-06-14T12:00:00-04:00", | |
| 16 | + "lotCount": 156, | |
| 17 | + "markdown": "## Search\n\nSearch\n\nAuctions\n\n- [Calendar](https://www.phillips.com/calendar/upcoming)\n\nDepartments\n\n- [Exhibitions](https://www.phillips.com/exhibitions)\n- [Perpetual](https://perpetual.phillips.com/)\n- [Dropshop](https://dropshop.phillips.com/)\n- [Editorial](https://www.phillips.com/editorial)\n\nClose\n\nLive Auction\n\n# The New York Watch Auction: XIV\n\nNew York\n\nConcludedJun 14 2026\n\nBrowse Upcoming Sales[View Calendar](https://www.phillips.com/calendar)\n\n\n\nOverviewBrowse lots\n\nFilters\n\nLot Navigation\n\nShow Lot123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102104105106107108109110111112113114115116117118119120121122124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158\n\n## 156 Lots\n\n[\\\\\n\\\\\n1\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronomètre Souverain “Nacre”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$508,000](https://www.phillips.com/detail/f.p.-journe/231119)\n\n[\\\\\n\\\\\n2\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 117.040\\\\\nGrande Lange 1 Limited Edition for Dubail Paris\\\\\n\\\\\nEstimate\\\\\n\\\\\n$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$279,400](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/232038)\n\n[\\\\\n\\\\\n3\\\\\n\\\\\nKrayon\\\\\n\\\\\nAnywhere Aurora Limited Edition\\\\\n\\\\\nEstimate\\\\\n\\\\\n$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$241,300](https://www.phillips.com/detail/krayon/229047)\n\n[\\\\\n\\\\\n4\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5168G-010\\\\\nAquanaut \"Tiffany & Co.\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$203,200](https://www.phillips.com/detail/patek-philippe/234115)\n\n[\\\\\n\\\\\n5\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5960/1A-001\\\\\n\"Tiffany & Co.\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$127,000](https://www.phillips.com/detail/patek-philippe/234114)\n\n[\\\\\n\\\\\n6\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5740/1G-001\\\\\nNautilus Perpetual Calendar “Tiffany & Co.”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$469,900](https://www.phillips.com/detail/patek-philippe/234116)\n\n[\\\\\n\\\\\n7\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5004P-022\\\\\n\\\\\nEstimate\\\\\n\\\\\n$180,000–360,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$571,500](https://www.phillips.com/detail/patek-philippe/233328)\n\n[\\\\\n\\\\\n8\\\\\n\\\\\nRichard Mille\\\\\nRef. RM035 AL ALMG\\\\\nRM035 \"Baby Nadal\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$190,500](https://www.phillips.com/detail/richard-mille/234006)\n\n[\\\\\n\\\\\n9\\\\\n\\\\\nVoutilainen\\\\\n\\\\\nVingt-8 Inversé\\\\\n\\\\\nEstimate\\\\\n\\\\\n$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$1,155,700](https://www.phillips.com/detail/voutilainen/230868)\n\n[\\\\\n\\\\\n10\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronomètre à Résonance “Souscription, No. 007”\\\\\n\\\\\nEstimate\\\\\n\\\\\nIn excess of $1,000,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$13,922,000](https://www.phillips.com/detail/f.p.-journe/230170)\n\n[\\\\\n\\\\\n11\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronomètre Souverain “008”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$177,800](https://www.phillips.com/detail/f.p.-journe/232130)\n\n[\\\\\n\\\\\n12\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5035G-043\\\\\nAnnual Calendar \"Sincere Fine Watches\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$50,800](https://www.phillips.com/detail/patek-philippe/234138)\n\n[\\\\\n\\\\\n13\\\\\n\\\\\nCartier\\\\\nRef. 2843\\\\\nTank Cintrée CPCP\\\\\n\\\\\nEstimate\\\\\n\\\\\n$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$88,900](https://www.phillips.com/detail/cartier/234418)\n\n[\\\\\n\\\\\n14\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5970R-019\\\\\nPerpetual Calendar Chronograph “Special Order\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$825,500](https://www.phillips.com/detail/patek-philippe/233452)\n\n[\\\\\n\\\\\n15\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 15212NB.00.A002KB.01\\\\\nCode 11.59, Star Wheel\\\\\n\\\\\nEstimate\\\\\n\\\\\n$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$69,850](https://www.phillips.com/detail/audemars-piguet/233471)\n\n[\\\\\n\\\\\n16\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 25902OR.OO.1110OR.01\\\\\nRoyal Oak Tourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\n$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$317,500](https://www.phillips.com/detail/audemars-piguet/232708)\n\n[\\\\\n\\\\\n17\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 3200T/001P-B578\\\\\nTraditionnelle Twin-Beat Perpetual Calendar\\\\\n\\\\\nEstimate\\\\\n\\\\\n$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$260,350](https://www.phillips.com/detail/vacheron-constantin/226757)\n\n[\\\\\n\\\\\n18\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26574BC\\\\\nRoyal Oak Perpetual Calendar “Qatar Edition”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$254,000](https://www.phillips.com/detail/audemars-piguet/229670)\n\n[\\\\\n\\\\\n19\\\\\n\\\\\nDe Bethune\\\\\nRef. DB15WT\\\\\nDB15 \"Number 001\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$406,400](https://www.phillips.com/detail/de-bethune/230709)\n\n[\\\\\n\\\\\n20\\\\\n\\\\\nUrban Jürgensen\\\\\nRef. Proto of 3pcs\\\\\nTourbillon Minute Repeater “Unique Piece, Prototype”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$1,041,400](https://www.phillips.com/detail/urban-j%C3%BCrgensen/228973)\n\n[\\\\\n\\\\\n21\\\\\n\\\\\nUniversal Genève\\\\\nRef. 22522\\\\\nFilm-Compax\\\\\n\\\\\nEstimate\\\\\n\\\\\n$12,000–24,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$101,600](https://www.phillips.com/detail/universal-gen%C3%A8ve/228010)\n\n[\\\\\n\\\\\n22\\\\\n\\\\\nOmega\\\\\nRef. 2998-5\\\\\nSpeedmaster\\\\\n\\\\\nEstimate\\\\\n\\\\\n$12,000–24,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$22,860](https://www.phillips.com/detail/omega/229882)\n\n[\\\\\n\\\\\n23\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3417\\\\\nAmagnetic\\\\\n\\\\\nEstimate\\\\\n\\\\\n$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$190,500](https://www.phillips.com/detail/patek-philippe/233993)\n\n[\\\\\n\\\\\n24\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3205/43\\\\\n\\\\\nEstimate\\\\\n\\\\\n$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$215,900](https://www.phillips.com/detail/patek-philippe/230236)\n\n[\\\\\n\\\\\n25\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3940\\\\\nPerpetual Calendar \"First Series, Beyer\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$965,200](https://www.phillips.com/detail/patek-philippe/233455)\n\n[\\\\\n\\\\\n26\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3700/11\\\\\nNautilus “Jumbo” Tiffany & Co.\\\\\n\\\\\nEstimate\\\\\n\\\\\n$300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$355,600](https://www.phillips.com/detail/patek-philippe/233442)\n\n[\\\\\n\\\\\n27\\\\\n\\\\\nPatek Philippe\\\\\n\\\\\n\"Tiffany & Co., Paul Starrett\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$292,100](https://www.phillips.com/detail/patek-philippe/231350)\n\n[\\\\\n\\\\\n28\\\\\n\\\\\nRolex\\\\\nRef. 1680\\\\\nSubmariner, \"Meters First\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$120,650](https://www.phillips.com/detail/rolex/234075)\n\n[\\\\\n\\\\\n29\\\\\n\\\\\nRolex\\\\\nRef. 6098\\\\\nOyster Perpetual Ovettone \"Stelline\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$114,300](https://www.phillips.com/detail/rolex/234450)\n\n[\\\\\n\\\\\n30\\\\\n\\\\\nRolex\\\\\nRef. 6263\\\\\nCosmograph Daytona “Paul Newman Panda”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$825,500](https://www.phillips.com/detail/rolex/233992)\n\n[\\\\\n\\\\\n31\\\\\n\\\\\nRolex\\\\\nRef. 6241\\\\\nCosmograph Daytona “John Player Special”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$700,000–1,400,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$1,803,400](https://www.phillips.com/detail/rolex/233229)\n\n[\\\\\n\\\\\n32\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 223.026\\\\\n1815 Up/Down Homage to Walter Lange\\\\\n\\\\\nEstimate\\\\\n\\\\\n$18,000–36,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$44,450](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/230878)\n\n[\\\\\n\\\\\n33\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 223.032\\\\\n1815 Up/Down Homage to Walter Lange\\\\\n\\\\\nEstimate\\\\\n\\\\\n$18,000–36,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$52,070](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/230877)\n\n[\\\\\n\\\\\n34\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5230G-010\\\\\nWorld-Time, “New York Edition”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$78,740](https://www.phillips.com/detail/patek-philippe/233473)\n\n[\\\\\n\\\\\n35\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5236P-010\\\\\nIn-Line Perpetual Calendar “Salmon”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$114,300](https://www.phillips.com/detail/patek-philippe/231516)\n\n[\\\\\n\\\\\n36\\\\\n\\\\\nPatek Philippe\\\\\nRef. 7140G-001\\\\\nLadies' Perpetual Calendar\\\\\n\\\\\nEstimate\\\\\n\\\\\n$30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$63,500](https://www.phillips.com/detail/patek-philippe/231515)\n\n[\\\\\n\\\\\n37\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5822P-001\\\\\nCubitus\\\\\n\\\\\nEstimate\\\\\n\\\\\n$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$177,800](https://www.phillips.com/detail/patek-philippe/231517)\n\n[\\\\\n\\\\\n38\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5711/1A-014\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\n$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$266,700](https://www.phillips.com/detail/patek-philippe/231655)\n\n[\\\\\n\\\\\n39\\\\\n\\\\\nPatek Philippe\\\\\nRef. 7968/300R-001\\\\\nAquanaut Luce \"Rainbow\" Chronograph\\\\\n\\\\\nEstimate\\\\\n\\\\\n$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$444,500](https://www.phillips.com/detail/patek-philippe/231519)\n\n[\\\\\n\\\\\n40\\\\\n\\\\\nOmega\\\\\nRef. 310.55.42.50.99.002\\\\\nSpeedmaster Professional Moonwatch “Rainbow, Moonshine Gold”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$107,950](https://www.phillips.com/detail/omega/233461)\n\n[\\\\\n\\\\\n41\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 345.056\\\\\nLange 1 Perpetual Calendar\\\\\n\\\\\nEstimate\\\\\n\\\\\n$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$158,750](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/233469)\n\n[\\\\\n\\\\\n42\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5070G-014\\\\\n\"Saatchi Gallery\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$350,000–700,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$889,000](https://www.phillips.com/detail/patek-philippe/233454)\n\n[\\\\\n\\\\\n43\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5373P-001\\\\\n\\\\\nEstimate\\\\\n\\\\\n$350,000–700,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$558,800](https://www.phillips.com/detail/patek-philippe/233453)\n\n[\\\\\n\\\\\n44\\\\\n\\\\\nPatek Philippe\\\\\n\\\\\n“Observatory Chronometer”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$8,000–16,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$33,020](https://www.phillips.com/detail/patek-philippe/233577)\n\n[\\\\\n\\\\\n45\\\\\n\\\\\nPatek Philippe\\\\\nRef. 1569\\\\\n\\\\\nEstimate\\\\\n\\\\\n$6,000–12,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$44,450](https://www.phillips.com/detail/patek-philippe/234034)\n\n[\\\\\n\\\\\n46\\\\\n\\\\\nRolex\\\\\nRef. 6262\\\\\nCosmograph Daytona \"Baby Blue\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$57,150](https://www.phillips.com/detail/rolex/233240)\n\n[\\\\\n\\\\\n47\\\\\n\\\\\nPatek Philippe\\\\\nRef. 2526\\\\\n\\\\\nEstimate\\\\\n\\\\\n$25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$95,250](https://www.phillips.com/detail/patek-philippe/233475)\n\n[\\\\\n\\\\\n48\\\\\n\\\\\nRolex\\\\\nRef. 1802\\\\\nDay-Date \"Platinum, Large Diamond Indices\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$44,450](https://www.phillips.com/detail/rolex/229373)\n\n[\\\\\n\\\\\n49\\\\\n\\\\\nPatek Philippe\\\\\nRef. 570\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\n$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$57,150](https://www.phillips.com/detail/patek-philippe/233481)\n\n[\\\\\n\\\\\n50\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3711/1G-001\\\\\nNautilus “Jumbo”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$196,850](https://www.phillips.com/detail/patek-philippe/233462)\n\n[\\\\\n\\\\\n51\\\\\n\\\\\nRolex\\\\\nRef. 128396TBR\\\\\nDay-Date\\\\\n\\\\\nEstimate\\\\\n\\\\\n$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$95,250](https://www.phillips.com/detail/rolex/233266)\n\n[\\\\\n\\\\\n52\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26730ST.00.1320ST.02\\\\\nRoyal Oak Flying Tourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\n$70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$165,100](https://www.phillips.com/detail/audemars-piguet/229671)\n\n[\\\\\n\\\\\n53\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26589IO.OO.D002CA.01\\\\\nRoyal Oak Concept Flying Tourbillon GMT\\\\\n\\\\\nEstimate\\\\\n\\\\\n$70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$101,600](https://www.phillips.com/detail/audemars-piguet/229660)\n\n[\\\\\n\\\\\n54\\\\\n\\\\\nRichard Mille\\\\\nRef. RM011\\\\\nRM011 AO RG-CA R. Grosjean\\\\\n\\\\\nEstimate\\\\\n\\\\\n$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$254,000](https://www.phillips.com/detail/richard-mille/231511)\n\n[\\\\\nNo Reserve\\\\\n55\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 110.030\\\\\nLange 1 “Soirée”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$127,000](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/234139)\n\n[\\\\\n\\\\\n56\\\\\n\\\\\nCartier\\\\\nRef. WGTA0175\\\\\nTank Louis Cartier\\\\\n\\\\\nEstimate\\\\\n\\\\\n$18,000–36,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$85,090](https://www.phillips.com/detail/cartier/234141)\n\n[\\\\\n\\\\\n57\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 77350CE.OO.1266CE.03\\\\\nRoyal Oak\\\\\n\\\\\nEstimate\\\\\n\\\\\n$25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$69,850](https://www.phillips.com/detail/audemars-piguet/233477)\n\n[\\\\\n\\\\\n58\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 182.886\\\\\nLittle Lange 1 Moon Phase “Gold Flux”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$69,850](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/233474)\n\n[\\\\\n\\\\\n59\\\\\n\\\\\nRolex\\\\\nRef. 126518LN-0014\\\\\nCosmograph Daytona “Alcaraz”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$107,950](https://www.phillips.com/detail/rolex/233259)\n\n[\\\\\n\\\\\n60\\\\\n\\\\\nRolex\\\\\nRef. 126679SABR\\\\\nYacht-Master 40 “Cotton Candy”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$196,850](https://www.phillips.com/detail/rolex/234099)\n\n[\\\\\n\\\\\n61\\\\\n\\\\\nRolex\\\\\nRef. 126506\\\\\nCosmograph Daytona “Platona”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$165,100](https://www.phillips.com/detail/rolex/233466)\n\n[\\\\\n\\\\\n62\\\\\n\\\\\nRolex\\\\\nRef. 18238\\\\\nDay-Date “Malachite”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$203,200](https://www.phillips.com/detail/rolex/231963)\n\n[\\\\\n\\\\\n63\\\\\n\\\\\nCartier\\\\\n\\\\\nCrash \"Platinum\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$571,500](https://www.phillips.com/detail/cartier/232709)\n\n[\\\\\n\\\\\n64\\\\\n\\\\\nPatek Philippe\\\\\nRef. 982/116J-001\\\\\nRare Handcrafts Pocket Watch “Swan”, Pièce Unique\\\\\n\\\\\nEstimate\\\\\n\\\\\n$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$393,700](https://www.phillips.com/detail/patek-philippe/233458)\n\n[\\\\\n\\\\\n65\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5970P-001\\\\\n“Factory Double-Sealed”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$381,000](https://www.phillips.com/detail/patek-philippe/234113)\n\n[\\\\\n\\\\\n66\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5271/11P-010\\\\\nPerpetual Calendar Chronograph “Sapphire-Set”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$160,000–320,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$508,000](https://www.phillips.com/detail/patek-philippe/231518)\n\n[\\\\\n\\\\\n67\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nÉlégante 40 \"Platinum\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$355,600](https://www.phillips.com/detail/f.p.-journe/232088)\n\n[\\\\\n\\\\\n68\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronomètre Souverain “Black Label”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$317,500](https://www.phillips.com/detail/f.p.-journe/232691)\n\n[\\\\\n\\\\\n69\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Chronographe “38MM”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$711,200](https://www.phillips.com/detail/f.p.-journe/231118)\n\n[\\\\\n\\\\\n70\\\\\n\\\\\nCredor\\\\\nRef. GBLT998\\\\\nEichi II\\\\\n\\\\\nEstimate\\\\\n\\\\\n$18,000–36,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$38,100](https://www.phillips.com/detail/credor/233320)\n\n[\\\\\n\\\\\n71\\\\\n\\\\\nDe Bethune\\\\\nRef. DB28XSZM\\\\\nDB28 “Aérolite”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$177,800](https://www.phillips.com/detail/de-bethune/229586)\n\n[\\\\\n\\\\\n72\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 4300V/220R-B509\\\\\nOverseas Perpetual Calendar Ultra-Thin\\\\\n\\\\\nEstimate\\\\\n\\\\\n$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$95,250](https://www.phillips.com/detail/vacheron-constantin/229666)\n\n[\\\\\n\\\\\n73\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26240CE.OO.1225CE.02\\\\\nRoyal Oak Chronograph “Black Ceramic”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$95,250](https://www.phillips.com/detail/audemars-piguet/229668)\n\n[\\\\\n\\\\\n74\\\\\n\\\\\nGreubel Forsey\\\\\n\\\\\nBalancier Contemporain\\\\\n\\\\\nEstimate\\\\\n\\\\\n$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$254,000](https://www.phillips.com/detail/greubel-forsey/233464)\n\n[\\\\\n\\\\\n75\\\\\n\\\\\nRichard Mille\\\\\nRef. RM67-02 FQ-CA TPT GR2\\\\\nRM67-02 “Alexander Zverev”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$150,000–300,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$381,000](https://www.phillips.com/detail/richard-mille/234005)\n\n[\\\\\n\\\\\n76\\\\\n\\\\\nUrban Jürgensen\\\\\n\\\\\nReference 3\\\\\n\\\\\nEstimate\\\\\n\\\\\n$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$279,400](https://www.phillips.com/detail/urban-j%C3%BCrgensen/228974)\n\n[\\\\\n\\\\\n77\\\\\n\\\\\nRoger Smith\\\\\nRef. Series 3\\\\\nSeries 3 “Unique Piece”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$300,000–600,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$1,219,200](https://www.phillips.com/detail/roger-smith/234677)\n\n[\\\\\n\\\\\n78\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Divine “36MM, Brass Movement”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$533,400](https://www.phillips.com/detail/f.p.-journe/230865)\n\n[\\\\\n\\\\\n79\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nTourbillon Anniversaire Historique “T30”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$600,000–1,200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$2,032,000](https://www.phillips.com/detail/f.p.-journe/233231)\n\n[\\\\\n\\\\\n80\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Automatique Lune “Nacre”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$482,600](https://www.phillips.com/detail/f.p.-journe/230864)\n\n[\\\\\n\\\\\n81\\\\\n\\\\\nDe Bethune\\\\\nRef. DB25VUS\\\\\nDB25 Starry Varius “Number 1 of 5”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$120,650](https://www.phillips.com/detail/de-bethune/230710)\n\n[\\\\\n\\\\\n82\\\\\n\\\\\nVoutilainen\\\\\n\\\\\nObservatoire\\\\\n\\\\\nEstimate\\\\\n\\\\\n$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$1,041,400](https://www.phillips.com/detail/voutilainen/230872)\n\n[\\\\\n\\\\\n83\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Chronographe “Swiss FineTiming”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$2,032,000](https://www.phillips.com/detail/f.p.-journe/234489)\n\n[\\\\\n\\\\\n84\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronomètre Souverain “Swiss FineTiming”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$1,968,500](https://www.phillips.com/detail/f.p.-journe/234490)\n\n[\\\\\n\\\\\n85\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nTourbillon Souverain Anniversaire “Hong Kong”, \"Number 1 of 5”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$600,000–1,200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$4,355,000](https://www.phillips.com/detail/f.p.-journe/231660)\n\n[\\\\\n\\\\\n86\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5711/1A-010\\\\\nNautilus “Eric Clapton\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$266,700](https://www.phillips.com/detail/patek-philippe/233465)\n\n[\\\\\n\\\\\n87\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3940G-029\\\\\n\"Saatchi Edition\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$419,100](https://www.phillips.com/detail/patek-philippe/233459)\n\n[\\\\\n\\\\\n88\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5004G-020\\\\\n“Eric Clapton”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$700,000–1,400,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$5,202,000](https://www.phillips.com/detail/patek-philippe/233451)\n\n[\\\\\n\\\\\n89\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 302.025\\\\\nLangematik Anniversary Jubilee\\\\\n\\\\\nEstimate\\\\\n\\\\\n$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$48,260](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/230875)\n\n[\\\\\n\\\\\n90\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 101.035\\\\\nLange 1 “Darth”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$57,150](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/230882)\n\n[\\\\\n\\\\\n91\\\\\n\\\\\nA. Lange & Söhne\\\\\nRef. 701.021\\\\\nPour Le Mérite Tourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\n$120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$469,900](https://www.phillips.com/detail/a.-lange-&-s%C3%B6hne/230867)\n\n[\\\\\n\\\\\n92\\\\\n\\\\\nRolex\\\\\nRef. 9630\\\\\nKing Midas \"Buddy Bray\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$82,550](https://www.phillips.com/detail/rolex/229776)\n\n[\\\\\n\\\\\n93\\\\\n\\\\\nRolex\\\\\nRef. 1400\\\\\nCocktail\\\\\n\\\\\nEstimate\\\\\n\\\\\n$4,000–8,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$15,240](https://www.phillips.com/detail/rolex/229777)\n\n[\\\\\n\\\\\n94\\\\\n\\\\\nPatek Philippe\\\\\nRef. 974/24J\\\\\n“Blue-headed Macaw” by Anita Porchet\\\\\n\\\\\nEstimate\\\\\n\\\\\n$70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$127,000](https://www.phillips.com/detail/patek-philippe/234679)\n\n[\\\\\n\\\\\n95\\\\\n\\\\\nPatek Philippe\\\\\nRef. 974/21\\\\\n“Gazelle” by Anita Porchet\\\\\n\\\\\nEstimate\\\\\n\\\\\n$70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$107,950](https://www.phillips.com/detail/patek-philippe/234678)\n\n[\\\\\n\\\\\n96\\\\\n\\\\\nCartier\\\\\n\\\\\nLouis Cartier Tank\\\\\n\\\\\nEstimate\\\\\n\\\\\n$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$44,450](https://www.phillips.com/detail/cartier/231716)\n\n[\\\\\n\\\\\n97\\\\\n\\\\\nPatek Philippe\\\\\nRef. 6196P-001\\\\\nCalatrava\\\\\n\\\\\nEstimate\\\\\n\\\\\n$25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$63,500](https://www.phillips.com/detail/patek-philippe/233476)\n\n[\\\\\n\\\\\n98\\\\\n\\\\\nPatek Philippe\\\\\nRef. 2550\\\\\n\"Lindo Turtle\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$254,000](https://www.phillips.com/detail/patek-philippe/232899)\n\n[\\\\\n\\\\\n99\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3700/11\\\\\nNautilus “Jumbo”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$228,600](https://www.phillips.com/detail/patek-philippe/232963)\n\n[\\\\\n\\\\\n100\\\\\n\\\\\nPatek Philippe\\\\\nRef. 3970\\\\\n“First Series”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$838,200](https://www.phillips.com/detail/patek-philippe/233457)\n\n[\\\\\n\\\\\n101\\\\\n\\\\\nPatek Philippe\\\\\nRef. 1518\\\\\n\\\\\nEstimate\\\\\n\\\\\n$1,200,000–2,400,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$3,992,000](https://www.phillips.com/detail/patek-philippe/233450)\n\n[\\\\\n\\\\\n102\\\\\n\\\\\nRolex\\\\\nRef. 6305\\\\\nDatejust Ovettone “Serpico & Laino”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$82,550](https://www.phillips.com/detail/rolex/234033)\n\n[\\\\\n\\\\\n104\\\\\n\\\\\nRolex\\\\\nRef. 6239\\\\\nCosmograph Daytona “Paul Newman”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$600,000–1,200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$1,079,500](https://www.phillips.com/detail/rolex/233230)\n\n[\\\\\n\\\\\n105\\\\\n\\\\\nVoutilainen\\\\\n\\\\\nMasterpiece Chronograph II “Number 1 of 10”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$1,841,500](https://www.phillips.com/detail/voutilainen/230873)\n\n[\\\\\n\\\\\n106\\\\\n\\\\\nRichard Mille\\\\\nRef. RM61-01 CA-TZP\\\\\nYohan Blake “The Beast 2”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$130,000–260,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$177,800](https://www.phillips.com/detail/richard-mille/234007)\n\n[\\\\\n\\\\\n107\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 15412BA.YG.1224BA.01-B\\\\\nRoyal Oak Frosted Gold Double Balance Wheel Openworked “Rainbow”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$406,400](https://www.phillips.com/detail/audemars-piguet/229667)\n\n[\\\\\n\\\\\n108\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26530Ti.00.1220Ti.01\\\\\nRoyal Oak “Flying Tourbillon”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$127,000](https://www.phillips.com/detail/audemars-piguet/231513)\n\n[\\\\\n\\\\\n109\\\\\n\\\\\nRichard Mille\\\\\nRef. RM52-01 AN RG-TZP\\\\\nRM52-01 Tourbillon “Skull, Piece Unique”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$400,000–800,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$1,397,000](https://www.phillips.com/detail/richard-mille/231302)\n\n[\\\\\n\\\\\n110\\\\\n\\\\\nBreguet\\\\\nRef. 7727\\\\\nClassique La Chronométrie “10Hz”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$12,000–24,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$53,340](https://www.phillips.com/detail/breguet/229662)\n\n[\\\\\nNo Reserve\\\\\n111\\\\\n\\\\\nBreguet\\\\\nRef. 7057BR\\\\\nLa Tradition\\\\\n\\\\\nEstimate\\\\\n\\\\\n$10,000–20,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$44,450](https://www.phillips.com/detail/breguet/219947)\n\n[\\\\\n\\\\\n112\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5037/1G-001\\\\\nAnnual Calendar\\\\\n\\\\\nEstimate\\\\\n\\\\\n$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$27,940](https://www.phillips.com/detail/patek-philippe/231514)\n\n[\\\\\n\\\\\n113\\\\\n\\\\\nRolex\\\\\nRef. 80285\\\\\nPearlmaster Lady-Datejust\\\\\n\\\\\nEstimate\\\\\n\\\\\n$15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$38,100](https://www.phillips.com/detail/rolex/230682)\n\n[\\\\\n\\\\\n114\\\\\n\\\\\nRolex\\\\\nRef. 228348RBR\\\\\nDay-Date 40 “Green Ombré”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$76,200](https://www.phillips.com/detail/rolex/233268)\n\n[\\\\\n\\\\\n115\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5980/60G-001\\\\\nNautilus\\\\\n\\\\\nEstimate\\\\\n\\\\\n$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$177,800](https://www.phillips.com/detail/patek-philippe/233463)\n\n[\\\\\n\\\\\n116\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 16202BC.OO.1240BC.02\\\\\nRoyal Oak “Jumbo” Extra-Thin\\\\\n\\\\\nEstimate\\\\\n\\\\\n$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$127,000](https://www.phillips.com/detail/audemars-piguet/233468)\n\n[\\\\\n\\\\\n117\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5711/1P-001\\\\\nNautilus \"40th Anniversary, Factory Double-Sealed\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$250,000–500,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$546,100](https://www.phillips.com/detail/patek-philippe/233456)\n\n[\\\\\n\\\\\n118\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5950A-001\\\\\n\\\\\nEstimate\\\\\n\\\\\n$250,000–500,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$520,700](https://www.phillips.com/detail/patek-philippe/233326)\n\n[\\\\\n\\\\\n119\\\\\n\\\\\nCartier\\\\\nRef. WGSA0036\\\\\nSantos Dumont XL “La Demoiselle”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$40,640](https://www.phillips.com/detail/cartier/233478)\n\n[\\\\\n\\\\\n120\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 47101/2\\\\\nChronographe Historique\\\\\n\\\\\nEstimate\\\\\n\\\\\n$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$74,930](https://www.phillips.com/detail/vacheron-constantin/234331)\n\n[\\\\\n\\\\\n121\\\\\n\\\\\nGirard Perregaux\\\\\n\\\\\nFerrari F50 Owner\\\\\n\\\\\nEstimate\\\\\n\\\\\n$8,000–16,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$22,860](https://www.phillips.com/detail/girard-perregaux/232372)\n\n[\\\\\n\\\\\n122\\\\\n\\\\\nJaeger-LeCoultre\\\\\nRef. 216.2.S0, LE50 Q389256J\\\\\nReverso Tribute Chronograph\\\\\n\\\\\nEstimate\\\\\n\\\\\n$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$48,260](https://www.phillips.com/detail/jaeger-lecoultre/233479)\n\n[\\\\\n\\\\\n124\\\\\n\\\\\nGrand Seiko\\\\\nRef. SBGZ007\\\\\nSpring Drive Masterpiece Collection, Boutique Limited Edition\\\\\n\\\\\nEstimate\\\\\n\\\\\n$30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$78,740](https://www.phillips.com/detail/grand-seiko/229663)\n\n[\\\\\n\\\\\n125\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 47070/000J-9085\\\\\nPatrimony Tribute to the Great Explorers, Christopher Columbus\\\\\n\\\\\nEstimate\\\\\n\\\\\n$25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$87,630](https://www.phillips.com/detail/vacheron-constantin/230711)\n\n[\\\\\n\\\\\n126\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 5300S\\\\\nHarmony Chronograph 260th Anniversary\\\\\n\\\\\nEstimate\\\\\n\\\\\n$30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$60,960](https://www.phillips.com/detail/vacheron-constantin/229661)\n\n[\\\\\n\\\\\n127\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26238CE.OO.1300CE.02\\\\\nRoyal Oak Offshore “Black Ceramic”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$76,200](https://www.phillips.com/detail/audemars-piguet/233472)\n\n[\\\\\n\\\\\n128\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 6000V/110R-B733\\\\\nOverseas Tourbillon\\\\\n\\\\\nEstimate\\\\\n\\\\\n$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$133,350](https://www.phillips.com/detail/vacheron-constantin/229665)\n\n[\\\\\n\\\\\n129\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5980/1A-014\\\\\nNautilus Chronograph\\\\\n\\\\\nEstimate\\\\\n\\\\\n$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$101,600](https://www.phillips.com/detail/patek-philippe/231654)\n\n[\\\\\n\\\\\n130\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5170P-010\\\\\n\\\\\nEstimate\\\\\n\\\\\n$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$127,000](https://www.phillips.com/detail/patek-philippe/233467)\n\n[\\\\\n\\\\\n131\\\\\n\\\\\nPatek Philippe\\\\\nRef. 5970R-001\\\\\n\\\\\nEstimate\\\\\n\\\\\n$120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$241,300](https://www.phillips.com/detail/patek-philippe/233318)\n\n[\\\\\n\\\\\n132\\\\\n\\\\\nRichard Mille\\\\\nRef. MON-01784\\\\\nRM11-05 Automatic Flyback Chronograph GMT\\\\\n\\\\\nEstimate\\\\\n\\\\\n$180,000–360,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$330,200](https://www.phillips.com/detail/richard-mille/231512)\n\n[\\\\\n\\\\\n133\\\\\n\\\\\nCartier\\\\\nRef. 78092\\\\\nTank Normale\\\\\n\\\\\nEstimate\\\\\n\\\\\n$6,000–12,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$17,780](https://www.phillips.com/detail/cartier/234419)\n\n[\\\\\n\\\\\n134\\\\\n\\\\\nCartier\\\\\nRef. 2671\\\\\nTank Louis Cartier Squelette\\\\\n\\\\\nEstimate\\\\\n\\\\\n$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$33,020](https://www.phillips.com/detail/cartier/230680)\n\n[\\\\\n\\\\\n135\\\\\n\\\\\nBulgari\\\\\nRef. 103527\\\\\nOcto Finissimo Skeleton\\\\\n\\\\\nEstimate\\\\\n\\\\\n$10,000–20,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$17,780](https://www.phillips.com/detail/bulgari/219945)\n\n[\\\\\n\\\\\n136\\\\\n\\\\\nVacheron Constantin\\\\\nRef. 4500V/110A-B128\\\\\nOverseas\\\\\n\\\\\nEstimate\\\\\n\\\\\n$12,000–24,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$33,020](https://www.phillips.com/detail/vacheron-constantin/229664)\n\n[\\\\\n\\\\\n137\\\\\n\\\\\nBreguet\\\\\nRef. 3617\\\\\nPerpetual Calendar Chronograph, Classique\\\\\n\\\\\nEstimate\\\\\n\\\\\n$25,000–50,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$85,090](https://www.phillips.com/detail/breguet/233299)\n\n[\\\\\n\\\\\n138\\\\\n\\\\\nDe Bethune\\\\\nRef. DB8RETIS1\\\\\nDB Eight\\\\\n\\\\\nEstimate\\\\\n\\\\\n$30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$107,950](https://www.phillips.com/detail/de-bethune/234681)\n\n[\\\\\n\\\\\n139\\\\\n\\\\\nRomain Gauthier\\\\\n\\\\\nC by Romain Gauthier, Titanium Edition\\\\\n\\\\\nEstimate\\\\\n\\\\\n$20,000–40,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$44,450](https://www.phillips.com/detail/romain-gauthier/229302)\n\n[\\\\\n\\\\\n140\\\\\n\\\\\nVoutilainen\\\\\n\\\\\nVingt-8 ISO\\\\\n\\\\\nEstimate\\\\\n\\\\\n$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$1,206,500](https://www.phillips.com/detail/voutilainen/228975)\n\n[\\\\\n\\\\\n141\\\\\n\\\\\nGreubel Forsey\\\\\n\\\\\nBalancier Convexe GMT Brazalete\\\\\n\\\\\nEstimate\\\\\n\\\\\n$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$355,600](https://www.phillips.com/detail/greubel-forsey/233460)\n\n[\\\\\n\\\\\n142\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Automatique Lune \"Number 016”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$70,000–140,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$203,200](https://www.phillips.com/detail/f.p.-journe/234680)\n\n[\\\\\n\\\\\n143\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 15510BC.OO.1320BC.04\\\\\nRoyal Oak Selfwinding\\\\\n\\\\\nEstimate\\\\\n\\\\\n$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$95,250](https://www.phillips.com/detail/audemars-piguet/233470)\n\n[\\\\\n\\\\\n144\\\\\n\\\\\nAudemars Piguet\\\\\nRef. 26331BA.OO.1220BA.02\\\\\nRoyal Oak Chronograph 41MM “Limited Edition of 125”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$177,800](https://www.phillips.com/detail/audemars-piguet/233269)\n\n[\\\\\n\\\\\n145\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronographe Rattrapante\\\\\n\\\\\nEstimate\\\\\n\\\\\n$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$304,800](https://www.phillips.com/detail/f.p.-journe/229046)\n\n[\\\\\n\\\\\n146\\\\\n\\\\\nRichard Mille\\\\\nRef. MON-02072\\\\\nRM33-03 Automatic\\\\\n\\\\\nEstimate\\\\\n\\\\\n$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$190,500](https://www.phillips.com/detail/richard-mille/232692)\n\n[\\\\\n\\\\\n147\\\\\n\\\\\nRolex\\\\\nRef. 116520\\\\\nCosmograph Daytona\\\\\n\\\\\nEstimate\\\\\n\\\\\n$12,000–24,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$25,400](https://www.phillips.com/detail/rolex/231653)\n\n[\\\\\n\\\\\n148\\\\\n\\\\\nRolex\\\\\nRef. 16520\\\\\nCosmograph Daytona \"New-Old-Stock\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$18,000–36,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$60,960](https://www.phillips.com/detail/rolex/233480)\n\n[\\\\\n\\\\\n149\\\\\n\\\\\nRolex\\\\\nRef. 1019\\\\\nMilgauss \"From the Collection of Isaac Slade\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$15,000–30,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$33,020](https://www.phillips.com/detail/rolex/233309)\n\n[\\\\\n\\\\\n150\\\\\n\\\\\nRolex\\\\\nRef. 6239\\\\\nCosmograph Daytona “Jumbo Logo”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$30,000–60,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$57,150](https://www.phillips.com/detail/rolex/232835)\n\n[\\\\\nNo Reserve\\\\\n151\\\\\n\\\\\nRolex\\\\\nRef. 6036\\\\\n“Dato-Compax Killy”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$50,000–100,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$152,400](https://www.phillips.com/detail/rolex/231369)\n\n[\\\\\n\\\\\n152\\\\\n\\\\\nRolex\\\\\nRef. 6265\\\\\nCosmograph Daytona \"Big Red\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$40,000–80,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$114,300](https://www.phillips.com/detail/rolex/232037)\n\n[\\\\\n\\\\\n153\\\\\n\\\\\nRolex\\\\\nRef. 128238\\\\\nDay-Date \"Eastern Arabic\"\\\\\n\\\\\nEstimate\\\\\n\\\\\n$35,000–70,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$76,200](https://www.phillips.com/detail/rolex/233267)\n\n[\\\\\n\\\\\n154\\\\\n\\\\\nRolex\\\\\nRef. 116598RBOW\\\\\nCosmograph Daytona “Rainbow”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$200,000–400,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$330,200](https://www.phillips.com/detail/rolex/231520)\n\n[\\\\\n\\\\\n155\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nOcta Réserve de Marche\\\\\n\\\\\nEstimate\\\\\n\\\\\n$60,000–120,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$406,400](https://www.phillips.com/detail/f.p.-journe/231208)\n\n[\\\\\n\\\\\n156\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nCentigraphe Souverain\\\\\n\\\\\nEstimate\\\\\n\\\\\n$80,000–160,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$482,600](https://www.phillips.com/detail/f.p.-journe/233239)\n\n[\\\\\n\\\\\n157\\\\\n\\\\\nF.P. Journe\\\\\n\\\\\nChronomètre à Résonance “RQ 40MM”\\\\\n\\\\\nEstimate\\\\\n\\\\\n$120,000–240,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$609,600](https://www.phillips.com/detail/f.p.-journe/231120)\n\n[\\\\\n\\\\\n158\\\\\n\\\\\nVianney Halter\\\\\n\\\\\nAntiqua\\\\\n\\\\\nEstimate\\\\\n\\\\\n$100,000–200,000\\\\\n\\\\\nSold For\\\\\n\\\\\n$584,200](https://www.phillips.com/detail/vianney-halter/230869)\n\n### About us\n\n- [Our history](https://www.phillips.com/about)\n- [Our team](https://www.phillips.com/team)\n- [Locations](https://www.phillips.com/location)\n- [Press](https://www.phillips.com/press)\n- [Careers](https://www.phillips.com/careers)\n- [Site map](https://www.phillips.com/sitemap)\n\n### Our services\n\n- [How to buy](https://www.phillips.com/buysell/buy)\n- [How to sell](https://www.phillips.com/buysell/sell)\n- [Private services](https://www.phillips.com/buysell/private)\n- [Professional & advisor services](https://www.phillips.com/professional-advisor-services)\n- [Fiduciary services](https://www.phillips.com/fiduciaryservices)\n\n### Policies\n\n- [Privacy policy](https://www.phillips.com/about/privacy)\n- [Cookie policy](https://www.phillips.com/about/cookiepolicy)\n- [Modern slavery policy](https://www.phillips.com/about/modernslaverypolicy)\n\nAbout us\n\nOur services\n\nPolicies\n\n### Never miss a moment\n\nSubscribe to our newsletter\n\n- [insta](https://www.instagram.com/phillipsauction/ \"insta\")\n- [linkedin](https://www.linkedin.com/company/phillips/ \"linkedin\")\n- [wechat](https://weixin.qq.com/r/qDuLk0-EKhJVrQvw9266 \"wechat\")\n- [red](https://www.xiaohongshu.com/user/profile/611e10a8000000000101ddf7 \"red\")\n- [facebook](https://www.facebook.com/phillipsauction/ \"facebook\")\n\n[logoLink](https://www.phillips.com/) © 2026 Phillips Auctioneers, LLC" | |
| 18 | + } | |
| 19 | + }, | |
| 20 | + "expect": { | |
| 21 | + "minCount": 10, | |
| 22 | + "kinds": [ | |
| 23 | + "sale", | |
| 24 | + "auction_lot" | |
| 25 | + ] | |
| 26 | + }, | |
| 27 | + "note": "captured live from https://www.phillips.com/auction/NY080126", | |
| 28 | + "capturedAt": "2026-09-07T04:42:17.762Z" | |
| 29 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/pokemontcg/base1-1.json
+98 −0
@@ -0,0 +1,98 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://api.pokemontcg.io/v2/cards/base1-1", | |
| 4 | + "externalId": "base1-1", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:27:44.899Z", | |
| 8 | + "payload": { | |
| 9 | + "card": { | |
| 10 | + "id": "base1-1", | |
| 11 | + "name": "Alakazam", | |
| 12 | + "supertype": "Pokémon", | |
| 13 | + "subtypes": [ | |
| 14 | + "Stage 2" | |
| 15 | + ], | |
| 16 | + "hp": "80", | |
| 17 | + "types": [ | |
| 18 | + "Psychic" | |
| 19 | + ], | |
| 20 | + "number": "1", | |
| 21 | + "artist": "Ken Sugimori", | |
| 22 | + "rarity": "Rare Holo", | |
| 23 | + "flavorText": "Its brain can outperform a supercomputer. Its intelligence quotient is said to be 5000.", | |
| 24 | + "nationalPokedexNumbers": [ | |
| 25 | + 65 | |
| 26 | + ], | |
| 27 | + "images": { | |
| 28 | + "small": "https://images.pokemontcg.io/base1/1.png", | |
| 29 | + "large": "https://images.pokemontcg.io/base1/1_hires.png" | |
| 30 | + }, | |
| 31 | + "set": { | |
| 32 | + "id": "base1", | |
| 33 | + "name": "Base", | |
| 34 | + "series": "Base", | |
| 35 | + "printedTotal": 102, | |
| 36 | + "total": 102, | |
| 37 | + "ptcgoCode": "BS", | |
| 38 | + "releaseDate": "1999/01/09", | |
| 39 | + "updatedAt": "2022/10/10 15:12:00", | |
| 40 | + "images": { | |
| 41 | + "symbol": "https://images.pokemontcg.io/base1/symbol.png", | |
| 42 | + "logo": "https://images.pokemontcg.io/base1/logo.png" | |
| 43 | + } | |
| 44 | + }, | |
| 45 | + "tcgplayer": { | |
| 46 | + "url": "https://prices.pokemontcg.io/tcgplayer/base1-1", | |
| 47 | + "updatedAt": "2026/09/06", | |
| 48 | + "prices": { | |
| 49 | + "holofoil": { | |
| 50 | + "low": 43.99, | |
| 51 | + "mid": 59.99, | |
| 52 | + "high": 9999, | |
| 53 | + "market": 69.34, | |
| 54 | + "directLow": 385 | |
| 55 | + } | |
| 56 | + } | |
| 57 | + }, | |
| 58 | + "cardmarket": { | |
| 59 | + "url": "https://prices.pokemontcg.io/cardmarket/base1-1", | |
| 60 | + "updatedAt": "2026/07/01", | |
| 61 | + "prices": { | |
| 62 | + "averageSellPrice": 125, | |
| 63 | + "lowPrice": 69.94, | |
| 64 | + "trendPrice": 268.62, | |
| 65 | + "germanProLow": 0, | |
| 66 | + "suggestedPrice": 0, | |
| 67 | + "reverseHoloSell": 0, | |
| 68 | + "reverseHoloLow": 0, | |
| 69 | + "reverseHoloTrend": 0, | |
| 70 | + "lowPriceExPlus": 250, | |
| 71 | + "avg1": 125, | |
| 72 | + "avg7": 282.13, | |
| 73 | + "avg30": 188.1, | |
| 74 | + "reverseHoloAvg1": 0, | |
| 75 | + "reverseHoloAvg7": 0, | |
| 76 | + "reverseHoloAvg30": 0 | |
| 77 | + } | |
| 78 | + } | |
| 79 | + }, | |
| 80 | + "source": "api" | |
| 81 | + } | |
| 82 | + }, | |
| 83 | + "expect": { | |
| 84 | + "minCount": 1, | |
| 85 | + "kinds": [ | |
| 86 | + "catalog_item", | |
| 87 | + "price_observation" | |
| 88 | + ], | |
| 89 | + "requiredFields": [ | |
| 90 | + "attributes.identifiers.pokemontcg_id", | |
| 91 | + "attributes.set", | |
| 92 | + "attributes.number", | |
| 93 | + "attributes.year" | |
| 94 | + ] | |
| 95 | + }, | |
| 96 | + "note": "Live capture of https://api.pokemontcg.io/v2/cards?q=set.id:base1 (trimmed).", | |
| 97 | + "capturedAt": "2026-09-07T04:27:53.271Z" | |
| 98 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/pokemontcg/base1-102.json
+89 −0
@@ -0,0 +1,89 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://api.pokemontcg.io/v2/cards/base1-102", | |
| 4 | + "externalId": "base1-102", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:27:44.899Z", | |
| 8 | + "payload": { | |
| 9 | + "card": { | |
| 10 | + "id": "base1-102", | |
| 11 | + "name": "Water Energy", | |
| 12 | + "supertype": "Energy", | |
| 13 | + "subtypes": [ | |
| 14 | + "Basic" | |
| 15 | + ], | |
| 16 | + "number": "102", | |
| 17 | + "artist": "Keiji Kinebuchi", | |
| 18 | + "images": { | |
| 19 | + "small": "https://images.pokemontcg.io/base1/102.png", | |
| 20 | + "large": "https://images.pokemontcg.io/base1/102_hires.png" | |
| 21 | + }, | |
| 22 | + "set": { | |
| 23 | + "id": "base1", | |
| 24 | + "name": "Base", | |
| 25 | + "series": "Base", | |
| 26 | + "printedTotal": 102, | |
| 27 | + "total": 102, | |
| 28 | + "ptcgoCode": "BS", | |
| 29 | + "releaseDate": "1999/01/09", | |
| 30 | + "updatedAt": "2022/10/10 15:12:00", | |
| 31 | + "images": { | |
| 32 | + "symbol": "https://images.pokemontcg.io/base1/symbol.png", | |
| 33 | + "logo": "https://images.pokemontcg.io/base1/logo.png" | |
| 34 | + } | |
| 35 | + }, | |
| 36 | + "tcgplayer": { | |
| 37 | + "url": "https://prices.pokemontcg.io/tcgplayer/base1-102", | |
| 38 | + "updatedAt": "2026/09/06", | |
| 39 | + "prices": { | |
| 40 | + "normal": { | |
| 41 | + "low": 0.03, | |
| 42 | + "mid": 0.39, | |
| 43 | + "high": 9.99, | |
| 44 | + "market": 0.54, | |
| 45 | + "directLow": 0.1 | |
| 46 | + } | |
| 47 | + } | |
| 48 | + }, | |
| 49 | + "cardmarket": { | |
| 50 | + "url": "https://prices.pokemontcg.io/cardmarket/base1-102", | |
| 51 | + "updatedAt": "2026/01/16", | |
| 52 | + "prices": { | |
| 53 | + "averageSellPrice": 0.24, | |
| 54 | + "lowPrice": 0.02, | |
| 55 | + "trendPrice": 0.35, | |
| 56 | + "germanProLow": 0, | |
| 57 | + "suggestedPrice": 0, | |
| 58 | + "reverseHoloSell": 0, | |
| 59 | + "reverseHoloLow": 0, | |
| 60 | + "reverseHoloTrend": 1.66, | |
| 61 | + "lowPriceExPlus": 0.02, | |
| 62 | + "avg1": 0.2, | |
| 63 | + "avg7": 0.29, | |
| 64 | + "avg30": 0.23, | |
| 65 | + "reverseHoloAvg1": 4, | |
| 66 | + "reverseHoloAvg7": 0.83, | |
| 67 | + "reverseHoloAvg30": 0.92 | |
| 68 | + } | |
| 69 | + } | |
| 70 | + }, | |
| 71 | + "source": "api" | |
| 72 | + } | |
| 73 | + }, | |
| 74 | + "expect": { | |
| 75 | + "minCount": 1, | |
| 76 | + "kinds": [ | |
| 77 | + "catalog_item", | |
| 78 | + "price_observation" | |
| 79 | + ], | |
| 80 | + "requiredFields": [ | |
| 81 | + "attributes.identifiers.pokemontcg_id", | |
| 82 | + "attributes.set", | |
| 83 | + "attributes.number", | |
| 84 | + "attributes.year" | |
| 85 | + ] | |
| 86 | + }, | |
| 87 | + "note": "Live capture of https://api.pokemontcg.io/v2/cards?q=set.id:base1 (trimmed).", | |
| 88 | + "capturedAt": "2026-09-07T04:27:53.272Z" | |
| 89 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/pokemontcg/base1-4-mirror.json
+60 −0
@@ -0,0 +1,60 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://api.pokemontcg.io/v2/cards/base1-4", | |
| 4 | + "externalId": "base1-4", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "feed", | |
| 7 | + "fetchedAt": "2026-09-07T04:27:44.899Z", | |
| 8 | + "payload": { | |
| 9 | + "card": { | |
| 10 | + "id": "base1-4", | |
| 11 | + "name": "Charizard", | |
| 12 | + "supertype": "Pokémon", | |
| 13 | + "subtypes": [ | |
| 14 | + "Stage 2" | |
| 15 | + ], | |
| 16 | + "hp": "120", | |
| 17 | + "types": [ | |
| 18 | + "Fire" | |
| 19 | + ], | |
| 20 | + "number": "4", | |
| 21 | + "artist": "Mitsuhiro Arita", | |
| 22 | + "rarity": "Rare Holo", | |
| 23 | + "flavorText": "Spits fire that is hot enough to melt boulders. Known to unintentionally cause forest fires.", | |
| 24 | + "nationalPokedexNumbers": [ | |
| 25 | + 6 | |
| 26 | + ], | |
| 27 | + "images": { | |
| 28 | + "small": "https://images.pokemontcg.io/base1/4.png", | |
| 29 | + "large": "https://images.pokemontcg.io/base1/4_hires.png" | |
| 30 | + }, | |
| 31 | + "set": { | |
| 32 | + "id": "base1", | |
| 33 | + "name": "Base", | |
| 34 | + "series": "Base", | |
| 35 | + "printedTotal": 102, | |
| 36 | + "total": 102, | |
| 37 | + "ptcgoCode": "BS", | |
| 38 | + "releaseDate": "1999/01/09", | |
| 39 | + "updatedAt": "2022/10/10 15:12:00", | |
| 40 | + "images": { | |
| 41 | + "symbol": "https://images.pokemontcg.io/base1/symbol.png", | |
| 42 | + "logo": "https://images.pokemontcg.io/base1/logo.png" | |
| 43 | + } | |
| 44 | + } | |
| 45 | + }, | |
| 46 | + "source": "github-mirror" | |
| 47 | + } | |
| 48 | + }, | |
| 49 | + "expect": { | |
| 50 | + "count": 1, | |
| 51 | + "kinds": [ | |
| 52 | + "catalog_item" | |
| 53 | + ], | |
| 54 | + "first": { | |
| 55 | + "attributes.variant": null | |
| 56 | + } | |
| 57 | + }, | |
| 58 | + "note": "GitHub mirror fallback (PokemonTCG/pokemon-tcg-data): catalog only, no prices.", | |
| 59 | + "capturedAt": "2026-09-07T04:27:53.682Z" | |
| 60 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/pokemontcg/base1-4.json
+98 −0
@@ -0,0 +1,98 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://api.pokemontcg.io/v2/cards/base1-4", | |
| 4 | + "externalId": "base1-4", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:27:44.899Z", | |
| 8 | + "payload": { | |
| 9 | + "card": { | |
| 10 | + "id": "base1-4", | |
| 11 | + "name": "Charizard", | |
| 12 | + "supertype": "Pokémon", | |
| 13 | + "subtypes": [ | |
| 14 | + "Stage 2" | |
| 15 | + ], | |
| 16 | + "hp": "120", | |
| 17 | + "types": [ | |
| 18 | + "Fire" | |
| 19 | + ], | |
| 20 | + "number": "4", | |
| 21 | + "artist": "Mitsuhiro Arita", | |
| 22 | + "rarity": "Rare Holo", | |
| 23 | + "flavorText": "Spits fire that is hot enough to melt boulders. Known to unintentionally cause forest fires.", | |
| 24 | + "nationalPokedexNumbers": [ | |
| 25 | + 6 | |
| 26 | + ], | |
| 27 | + "images": { | |
| 28 | + "small": "https://images.pokemontcg.io/base1/4.png", | |
| 29 | + "large": "https://images.pokemontcg.io/base1/4_hires.png" | |
| 30 | + }, | |
| 31 | + "set": { | |
| 32 | + "id": "base1", | |
| 33 | + "name": "Base", | |
| 34 | + "series": "Base", | |
| 35 | + "printedTotal": 102, | |
| 36 | + "total": 102, | |
| 37 | + "ptcgoCode": "BS", | |
| 38 | + "releaseDate": "1999/01/09", | |
| 39 | + "updatedAt": "2022/10/10 15:12:00", | |
| 40 | + "images": { | |
| 41 | + "symbol": "https://images.pokemontcg.io/base1/symbol.png", | |
| 42 | + "logo": "https://images.pokemontcg.io/base1/logo.png" | |
| 43 | + } | |
| 44 | + }, | |
| 45 | + "tcgplayer": { | |
| 46 | + "url": "https://prices.pokemontcg.io/tcgplayer/base1-4", | |
| 47 | + "updatedAt": "2026/09/06", | |
| 48 | + "prices": { | |
| 49 | + "holofoil": { | |
| 50 | + "low": 449.99, | |
| 51 | + "mid": 999, | |
| 52 | + "high": 4761.9, | |
| 53 | + "market": 897.19, | |
| 54 | + "directLow": null | |
| 55 | + } | |
| 56 | + } | |
| 57 | + }, | |
| 58 | + "cardmarket": { | |
| 59 | + "url": "https://prices.pokemontcg.io/cardmarket/base1-4", | |
| 60 | + "updatedAt": "2026/07/01", | |
| 61 | + "prices": { | |
| 62 | + "averageSellPrice": 1531, | |
| 63 | + "lowPrice": 799, | |
| 64 | + "trendPrice": 4184.6, | |
| 65 | + "germanProLow": 0, | |
| 66 | + "suggestedPrice": 0, | |
| 67 | + "reverseHoloSell": 0, | |
| 68 | + "reverseHoloLow": 0, | |
| 69 | + "reverseHoloTrend": 0, | |
| 70 | + "lowPriceExPlus": 1750, | |
| 71 | + "avg1": 14950, | |
| 72 | + "avg7": 3939.88, | |
| 73 | + "avg30": 2427.79, | |
| 74 | + "reverseHoloAvg1": 0, | |
| 75 | + "reverseHoloAvg7": 0, | |
| 76 | + "reverseHoloAvg30": 0 | |
| 77 | + } | |
| 78 | + } | |
| 79 | + }, | |
| 80 | + "source": "api" | |
| 81 | + } | |
| 82 | + }, | |
| 83 | + "expect": { | |
| 84 | + "minCount": 1, | |
| 85 | + "kinds": [ | |
| 86 | + "catalog_item", | |
| 87 | + "price_observation" | |
| 88 | + ], | |
| 89 | + "requiredFields": [ | |
| 90 | + "attributes.identifiers.pokemontcg_id", | |
| 91 | + "attributes.set", | |
| 92 | + "attributes.number", | |
| 93 | + "attributes.year" | |
| 94 | + ] | |
| 95 | + }, | |
| 96 | + "note": "Live capture of https://api.pokemontcg.io/v2/cards?q=set.id:base1 (trimmed).", | |
| 97 | + "capturedAt": "2026-09-07T04:27:53.271Z" | |
| 98 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/pokemontcg/base1-58.json
+98 −0
@@ -0,0 +1,98 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://api.pokemontcg.io/v2/cards/base1-58", | |
| 4 | + "externalId": "base1-58", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:27:44.899Z", | |
| 8 | + "payload": { | |
| 9 | + "card": { | |
| 10 | + "id": "base1-58", | |
| 11 | + "name": "Pikachu", | |
| 12 | + "supertype": "Pokémon", | |
| 13 | + "subtypes": [ | |
| 14 | + "Basic" | |
| 15 | + ], | |
| 16 | + "hp": "40", | |
| 17 | + "types": [ | |
| 18 | + "Lightning" | |
| 19 | + ], | |
| 20 | + "number": "58", | |
| 21 | + "artist": "Mitsuhiro Arita", | |
| 22 | + "rarity": "Common", | |
| 23 | + "flavorText": "When several of these Pokémon gather, their electricity can cause lightning storms.", | |
| 24 | + "nationalPokedexNumbers": [ | |
| 25 | + 25 | |
| 26 | + ], | |
| 27 | + "images": { | |
| 28 | + "small": "https://images.pokemontcg.io/base1/58.png", | |
| 29 | + "large": "https://images.pokemontcg.io/base1/58_hires.png" | |
| 30 | + }, | |
| 31 | + "set": { | |
| 32 | + "id": "base1", | |
| 33 | + "name": "Base", | |
| 34 | + "series": "Base", | |
| 35 | + "printedTotal": 102, | |
| 36 | + "total": 102, | |
| 37 | + "ptcgoCode": "BS", | |
| 38 | + "releaseDate": "1999/01/09", | |
| 39 | + "updatedAt": "2022/10/10 15:12:00", | |
| 40 | + "images": { | |
| 41 | + "symbol": "https://images.pokemontcg.io/base1/symbol.png", | |
| 42 | + "logo": "https://images.pokemontcg.io/base1/logo.png" | |
| 43 | + } | |
| 44 | + }, | |
| 45 | + "tcgplayer": { | |
| 46 | + "url": "https://prices.pokemontcg.io/tcgplayer/base1-58", | |
| 47 | + "updatedAt": "2026/09/06", | |
| 48 | + "prices": { | |
| 49 | + "normal": { | |
| 50 | + "low": 4.78, | |
| 51 | + "mid": 13.41, | |
| 52 | + "high": 1000, | |
| 53 | + "market": 16.1, | |
| 54 | + "directLow": 7.07 | |
| 55 | + } | |
| 56 | + } | |
| 57 | + }, | |
| 58 | + "cardmarket": { | |
| 59 | + "url": "https://prices.pokemontcg.io/cardmarket/base1-58", | |
| 60 | + "updatedAt": "2026/06/21", | |
| 61 | + "prices": { | |
| 62 | + "averageSellPrice": 23.99, | |
| 63 | + "lowPrice": 7.49, | |
| 64 | + "trendPrice": 14.44, | |
| 65 | + "germanProLow": 0, | |
| 66 | + "suggestedPrice": 0, | |
| 67 | + "reverseHoloSell": 0, | |
| 68 | + "reverseHoloLow": 0, | |
| 69 | + "reverseHoloTrend": 0, | |
| 70 | + "lowPriceExPlus": 7.49, | |
| 71 | + "avg1": 28, | |
| 72 | + "avg7": 19.5, | |
| 73 | + "avg30": 12.24, | |
| 74 | + "reverseHoloAvg1": 0, | |
| 75 | + "reverseHoloAvg7": 0, | |
| 76 | + "reverseHoloAvg30": 0 | |
| 77 | + } | |
| 78 | + } | |
| 79 | + }, | |
| 80 | + "source": "api" | |
| 81 | + } | |
| 82 | + }, | |
| 83 | + "expect": { | |
| 84 | + "minCount": 1, | |
| 85 | + "kinds": [ | |
| 86 | + "catalog_item", | |
| 87 | + "price_observation" | |
| 88 | + ], | |
| 89 | + "requiredFields": [ | |
| 90 | + "attributes.identifiers.pokemontcg_id", | |
| 91 | + "attributes.set", | |
| 92 | + "attributes.number", | |
| 93 | + "attributes.year" | |
| 94 | + ] | |
| 95 | + }, | |
| 96 | + "note": "Live capture of https://api.pokemontcg.io/v2/cards?q=set.id:base1 (trimmed).", | |
| 97 | + "capturedAt": "2026-09-07T04:27:53.272Z" | |
| 98 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/pricecharting/comic-books-amazing-spider-man__amazing-spider-man-300-1988.json
+2789 −0
@@ -0,0 +1,2789 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.pricecharting.com/game/comic-books-amazing-spider-man/amazing-spider-man-300-1988", | |
| 4 | + "externalId": "2315040", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:33:37.977Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "product", | |
| 10 | + "url": "https://www.pricecharting.com/game/comic-books-amazing-spider-man/amazing-spider-man-300-1988", | |
| 11 | + "productId": "2315040", | |
| 12 | + "consoleUri": "comic-books-amazing-spider-man", | |
| 13 | + "consoleName": "Amazing Spider-Man", | |
| 14 | + "title": "Amazing Spider-Man #300 (1988)", | |
| 15 | + "flags": { | |
| 16 | + "isComic": true, | |
| 17 | + "isLegoSet": false, | |
| 18 | + "isFunkoPop": false, | |
| 19 | + "isCard": false, | |
| 20 | + "isCoin": false, | |
| 21 | + "isSystem": false | |
| 22 | + }, | |
| 23 | + "columnLabels": [ | |
| 24 | + "Ungraded", | |
| 25 | + "4.0 / VG", | |
| 26 | + "6.0 / Fine", | |
| 27 | + "8.0 / VF", | |
| 28 | + "9.2 / NM-", | |
| 29 | + "9.8", | |
| 30 | + "8.0 / VF", | |
| 31 | + "9.2 / NM-", | |
| 32 | + "9.8" | |
| 33 | + ], | |
| 34 | + "prices": [ | |
| 35 | + { | |
| 36 | + "key": "used_price", | |
| 37 | + "value": 377, | |
| 38 | + "raw": "$377.00" | |
| 39 | + }, | |
| 40 | + { | |
| 41 | + "key": "complete_price", | |
| 42 | + "value": 307.1, | |
| 43 | + "raw": "$307.10" | |
| 44 | + }, | |
| 45 | + { | |
| 46 | + "key": "new_price", | |
| 47 | + "value": 358.79, | |
| 48 | + "raw": "$358.79" | |
| 49 | + }, | |
| 50 | + { | |
| 51 | + "key": "graded_price", | |
| 52 | + "value": 451.03, | |
| 53 | + "raw": "$451.03" | |
| 54 | + }, | |
| 55 | + { | |
| 56 | + "key": "box_only_price", | |
| 57 | + "value": 587.44, | |
| 58 | + "raw": "$587.44" | |
| 59 | + }, | |
| 60 | + { | |
| 61 | + "key": "manual_only_price", | |
| 62 | + "value": 2930.82, | |
| 63 | + "raw": "$2,930.82" | |
| 64 | + } | |
| 65 | + ], | |
| 66 | + "sales": [ | |
| 67 | + { | |
| 68 | + "tab": "used", | |
| 69 | + "date": "2026-09-03", | |
| 70 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) 1988", | |
| 71 | + "price": 240, | |
| 72 | + "ebayId": "178456781993", | |
| 73 | + "listedPrice": 300 | |
| 74 | + }, | |
| 75 | + { | |
| 76 | + "tab": "used", | |
| 77 | + "date": "2026-09-03", | |
| 78 | + "title": "Amazing Spider-Man #300 May 1988 First Venom 1988", | |
| 79 | + "price": 365, | |
| 80 | + "ebayId": "188846672724", | |
| 81 | + "listedPrice": null | |
| 82 | + }, | |
| 83 | + { | |
| 84 | + "tab": "used", | |
| 85 | + "date": "2026-09-02", | |
| 86 | + "title": "Amazing Spider-Man #300 1st Full Venom Todd McFarlane Marvel 1988 Direct Edition 1988", | |
| 87 | + "price": 400, | |
| 88 | + "ebayId": "398351859717", | |
| 89 | + "listedPrice": null | |
| 90 | + }, | |
| 91 | + { | |
| 92 | + "tab": "used", | |
| 93 | + "date": "2026-09-02", | |
| 94 | + "title": "1988 The Amazing Spider-Man #300 25th Anniversary Venom McFarlane Cover 1988", | |
| 95 | + "price": 355, | |
| 96 | + "ebayId": "137661937446", | |
| 97 | + "listedPrice": null | |
| 98 | + }, | |
| 99 | + { | |
| 100 | + "tab": "used", | |
| 101 | + "date": "2026-09-01", | |
| 102 | + "title": "AMAZING SPIDER-MAN #300 1988 1st Full Venom Todd McFarlane Direct Edition 1988", | |
| 103 | + "price": 360, | |
| 104 | + "ebayId": "307149793642", | |
| 105 | + "listedPrice": 424.99 | |
| 106 | + }, | |
| 107 | + { | |
| 108 | + "tab": "used", | |
| 109 | + "date": "2026-08-29", | |
| 110 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) 1988", | |
| 111 | + "price": 700, | |
| 112 | + "ebayId": "257710800291", | |
| 113 | + "listedPrice": 750 | |
| 114 | + }, | |
| 115 | + { | |
| 116 | + "tab": "used", | |
| 117 | + "date": "2026-08-28", | |
| 118 | + "title": "The Amazing Spider-Man #300 Todd McFarlane Marvel Comics NM+ 1988", | |
| 119 | + "price": 350, | |
| 120 | + "ebayId": "117381868179", | |
| 121 | + "listedPrice": null | |
| 122 | + }, | |
| 123 | + { | |
| 124 | + "tab": "used", | |
| 125 | + "date": "2026-08-24", | |
| 126 | + "title": "** 1988 THE AMAZING SPIDER-MAN #300 MARVEL COMICS GOOD+ 1988", | |
| 127 | + "price": 220, | |
| 128 | + "ebayId": "278307905372", | |
| 129 | + "listedPrice": 249.99 | |
| 130 | + }, | |
| 131 | + { | |
| 132 | + "tab": "used", | |
| 133 | + "date": "2026-08-24", | |
| 134 | + "title": "1988 AMAZING SPIDER-MAN COMIC BOOK..VOL.1..NO.300..MARVEL..1ST FULL VENOM..KEY!! 1988 #300", | |
| 135 | + "price": 425, | |
| 136 | + "ebayId": "198580303139", | |
| 137 | + "listedPrice": null | |
| 138 | + }, | |
| 139 | + { | |
| 140 | + "tab": "used", | |
| 141 | + "date": "2026-08-22", | |
| 142 | + "title": "Amazing Spider-Man #300 1st Full Venom App Todd McFarlane Raw Key Marvel 1988 1988", | |
| 143 | + "price": 877, | |
| 144 | + "ebayId": "128027258808", | |
| 145 | + "listedPrice": null | |
| 146 | + }, | |
| 147 | + { | |
| 148 | + "tab": "used", | |
| 149 | + "date": "2026-08-20", | |
| 150 | + "title": "AMAZING SPIDER-MAN # 300 - (NM+) -MCFARLANE-ORIGIN/1ST APP OF VENOM-WHTE PAGES", | |
| 151 | + "price": 990, | |
| 152 | + "ebayId": "298582930857", | |
| 153 | + "listedPrice": null | |
| 154 | + }, | |
| 155 | + { | |
| 156 | + "tab": "used", | |
| 157 | + "date": "2026-08-18", | |
| 158 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) 1988", | |
| 159 | + "price": 380, | |
| 160 | + "ebayId": "287519592277", | |
| 161 | + "listedPrice": null | |
| 162 | + }, | |
| 163 | + { | |
| 164 | + "tab": "used", | |
| 165 | + "date": "2026-08-17", | |
| 166 | + "title": "Amazing Spider-Man #300 1988 1st Full App Venom McFarlane Never Pressed Cleaned 1988", | |
| 167 | + "price": 500, | |
| 168 | + "ebayId": "327305831471", | |
| 169 | + "listedPrice": null | |
| 170 | + }, | |
| 171 | + { | |
| 172 | + "tab": "used", | |
| 173 | + "date": "2026-08-16", | |
| 174 | + "title": "Amazing Spider-Man #300 F/VF, 1st full Venom. Todd McFarlane, Marvel Comics 1988", | |
| 175 | + "price": 378, | |
| 176 | + "ebayId": "800479851979", | |
| 177 | + "listedPrice": null | |
| 178 | + }, | |
| 179 | + { | |
| 180 | + "tab": "used", | |
| 181 | + "date": "2026-08-16", | |
| 182 | + "title": "Amazing Spider-Man 300 (1988) Origin and 1st full app of Venom. Todd Mc Farlane 1988", | |
| 183 | + "price": 372.3, | |
| 184 | + "ebayId": "407086955238", | |
| 185 | + "listedPrice": null | |
| 186 | + }, | |
| 187 | + { | |
| 188 | + "tab": "used", | |
| 189 | + "date": "2026-08-16", | |
| 190 | + "title": "AMAZING SPIDER-MAN #300 MCFARLANE CLASSIC FIRST APP VENOM 1988 VF+ 1988", | |
| 191 | + "price": 405, | |
| 192 | + "ebayId": "206479190367", | |
| 193 | + "listedPrice": null | |
| 194 | + }, | |
| 195 | + { | |
| 196 | + "tab": "used", | |
| 197 | + "date": "2026-08-15", | |
| 198 | + "title": "The Amazing Spider-Man #300 - Venom 1st Appearance (Marvel 1988) VF/VF+ 1988", | |
| 199 | + "price": 530, | |
| 200 | + "ebayId": "126571859276", | |
| 201 | + "listedPrice": 574.99 | |
| 202 | + }, | |
| 203 | + { | |
| 204 | + "tab": "used", | |
| 205 | + "date": "2026-08-14", | |
| 206 | + "title": "Amazing Spider-Man #300 Marvel Comics 1st Venom appearance Todd McFarlane 1988", | |
| 207 | + "price": 430, | |
| 208 | + "ebayId": "117344559036", | |
| 209 | + "listedPrice": null | |
| 210 | + }, | |
| 211 | + { | |
| 212 | + "tab": "used", | |
| 213 | + "date": "2026-08-13", | |
| 214 | + "title": "10 Consecutive Amazing Spider-Man Comics 295-304 1st Venom, McFarlane 1987-1988 1988 #300", | |
| 215 | + "price": 765, | |
| 216 | + "ebayId": "257666239389", | |
| 217 | + "listedPrice": null | |
| 218 | + }, | |
| 219 | + { | |
| 220 | + "tab": "used", | |
| 221 | + "date": "2026-08-13", | |
| 222 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) 1988", | |
| 223 | + "price": 400, | |
| 224 | + "ebayId": "188788255535", | |
| 225 | + "listedPrice": null | |
| 226 | + }, | |
| 227 | + { | |
| 228 | + "tab": "used", | |
| 229 | + "date": "2026-08-13", | |
| 230 | + "title": "Marvel The Amazing Spider-Man #300 1988 Variant Cover Michelinie McFarlane 1988", | |
| 231 | + "price": 19.5, | |
| 232 | + "ebayId": "800483238012", | |
| 233 | + "listedPrice": null | |
| 234 | + }, | |
| 235 | + { | |
| 236 | + "tab": "used", | |
| 237 | + "date": "2026-08-13", | |
| 238 | + "title": "The Amazing Spider-Man #300 (1988) NM- Condition! 1st Full App of Venom! 1988", | |
| 239 | + "price": 464, | |
| 240 | + "ebayId": "147487355768", | |
| 241 | + "listedPrice": null | |
| 242 | + }, | |
| 243 | + { | |
| 244 | + "tab": "used", | |
| 245 | + "date": "2026-08-11", | |
| 246 | + "title": "Marvel The Amazing Spider-Man #300 (1988) David Michelinie Todd McFarlane 1988", | |
| 247 | + "price": 500, | |
| 248 | + "ebayId": "128018237333", | |
| 249 | + "listedPrice": null | |
| 250 | + }, | |
| 251 | + { | |
| 252 | + "tab": "used", | |
| 253 | + "date": "2026-08-10", | |
| 254 | + "title": "The Amazing Spider-Man #300 & Marvel Super Heroes Secret Wars #8 1984 and 1988", | |
| 255 | + "price": 415, | |
| 256 | + "ebayId": "287499908309", | |
| 257 | + "listedPrice": null | |
| 258 | + }, | |
| 259 | + { | |
| 260 | + "tab": "used", | |
| 261 | + "date": "2026-08-10", | |
| 262 | + "title": "Amazing Spider-Man #300 1st Appearance of Venom Todd McFarlane Raw Key (TF) F1", | |
| 263 | + "price": 759.27, | |
| 264 | + "ebayId": "327281620971", | |
| 265 | + "listedPrice": null | |
| 266 | + }, | |
| 267 | + { | |
| 268 | + "tab": "used", | |
| 269 | + "date": "2026-08-08", | |
| 270 | + "title": "AMAZING SPIDER-MAN #300- 1st FULL VENOM APPEARANCE Bright Colors VF/NM Range 1988", | |
| 271 | + "price": 485, | |
| 272 | + "ebayId": "278237822019", | |
| 273 | + "listedPrice": null | |
| 274 | + }, | |
| 275 | + { | |
| 276 | + "tab": "used", | |
| 277 | + "date": "2026-08-08", | |
| 278 | + "title": "Marvel Comics The Amazing Spider-Man #300 25th Anniv Michelinie/McFarlane Direct 1988", | |
| 279 | + "price": 229.5, | |
| 280 | + "ebayId": "358876231735", | |
| 281 | + "listedPrice": null | |
| 282 | + }, | |
| 283 | + { | |
| 284 | + "tab": "used", | |
| 285 | + "date": "2026-08-07", | |
| 286 | + "title": "Marvel The Amazing Spider-Man #300 (1988) Spider-Man & Venom David Michelinie 1988", | |
| 287 | + "price": 220, | |
| 288 | + "ebayId": "398255391858", | |
| 289 | + "listedPrice": 300 | |
| 290 | + }, | |
| 291 | + { | |
| 292 | + "tab": "used", | |
| 293 | + "date": "2026-08-06", | |
| 294 | + "title": "The Amazing Spider-Man #300 9.8 NM-M. 1st FULL VENOM. Marvel Comics May 1988) 1988", | |
| 295 | + "price": 2000, | |
| 296 | + "ebayId": "357061567620", | |
| 297 | + "listedPrice": 2800 | |
| 298 | + }, | |
| 299 | + { | |
| 300 | + "tab": "used", | |
| 301 | + "date": "2026-08-06", | |
| 302 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) 1988", | |
| 303 | + "price": 300, | |
| 304 | + "ebayId": "388604431793", | |
| 305 | + "listedPrice": 500 | |
| 306 | + }, | |
| 307 | + { | |
| 308 | + "tab": "cib", | |
| 309 | + "date": "2026-08-09", | |
| 310 | + "title": "Amazing Spider-Man #300 CGC 4 1st Marvel 1988", | |
| 311 | + "price": 340, | |
| 312 | + "ebayId": "206443835894", | |
| 313 | + "listedPrice": 365 | |
| 314 | + }, | |
| 315 | + { | |
| 316 | + "tab": "cib", | |
| 317 | + "date": "2025-06-09", | |
| 318 | + "title": "The Amazing Spider-Man #300 CGC 4.5 Comic Book! 1st Full Venom Appearance! 1988", | |
| 319 | + "price": 275, | |
| 320 | + "ebayId": "326613848166", | |
| 321 | + "listedPrice": null | |
| 322 | + }, | |
| 323 | + { | |
| 324 | + "tab": "cib", | |
| 325 | + "date": "2025-01-26", | |
| 326 | + "title": "Amazing Spider-Man #300 CGC 4.0 Marvel Comics 1988 1st App Venom 1988", | |
| 327 | + "price": 275, | |
| 328 | + "ebayId": "335773165358", | |
| 329 | + "listedPrice": null | |
| 330 | + }, | |
| 331 | + { | |
| 332 | + "tab": "cib", | |
| 333 | + "date": "2024-11-23", | |
| 334 | + "title": "The Amazing Spider-Man #300 CGC 4.5 Comic Book! 1st Full Venom Appearance! 1988", | |
| 335 | + "price": 300, | |
| 336 | + "ebayId": "326341682140", | |
| 337 | + "listedPrice": null | |
| 338 | + }, | |
| 339 | + { | |
| 340 | + "tab": "cib", | |
| 341 | + "date": "2024-06-27", | |
| 342 | + "title": "Amazing Spider-Man (1963) #300 Todd McFarlane CGC 4.5 1st Full Venom OW/WH Pages 1988", | |
| 343 | + "price": 280, | |
| 344 | + "ebayId": "166842449098", | |
| 345 | + "listedPrice": null | |
| 346 | + }, | |
| 347 | + { | |
| 348 | + "tab": "cib", | |
| 349 | + "date": "2024-05-31", | |
| 350 | + "title": "Amazing Spider-Man #300 CGC 4.5 1st App of Venom Eddie Brock (1988) 4406505005 1988", | |
| 351 | + "price": 255, | |
| 352 | + "ebayId": "256524488027", | |
| 353 | + "listedPrice": null | |
| 354 | + }, | |
| 355 | + { | |
| 356 | + "tab": "cib", | |
| 357 | + "date": "2023-10-10", | |
| 358 | + "title": "Amazing Spider-Man #300 - Marvel Comics 1988 CGC 4.0 Origin + 1st full appearanc 1988", | |
| 359 | + "price": 279, | |
| 360 | + "ebayId": "235240336849", | |
| 361 | + "listedPrice": null | |
| 362 | + }, | |
| 363 | + { | |
| 364 | + "tab": "cib", | |
| 365 | + "date": "2023-05-04", | |
| 366 | + "title": "The Amazing Spider-Man #300 CGC 4.0 (Marvel, May 1988) NEVER CLEANED OR PRESSED 1988", | |
| 367 | + "price": 315, | |
| 368 | + "ebayId": "404259601252", | |
| 369 | + "listedPrice": null | |
| 370 | + }, | |
| 371 | + { | |
| 372 | + "tab": "cib", | |
| 373 | + "date": "2022-12-22", | |
| 374 | + "title": "Amazing Spider-Man #300 (Marvel 1988) Origin & 1st appearance of Venom - CGC 4.5 1988 #300", | |
| 375 | + "price": 375, | |
| 376 | + "ebayId": "295068124202", | |
| 377 | + "listedPrice": null | |
| 378 | + }, | |
| 379 | + { | |
| 380 | + "tab": "cib", | |
| 381 | + "date": "2022-12-17", | |
| 382 | + "title": "AMAZING SPIDERMAN 300 CGC 4.0 White pages 1st Venom 1988 #300", | |
| 383 | + "price": 250, | |
| 384 | + "ebayId": "364075049710", | |
| 385 | + "listedPrice": null | |
| 386 | + }, | |
| 387 | + { | |
| 388 | + "tab": "cib", | |
| 389 | + "date": "2022-11-18", | |
| 390 | + "title": "Amazing Spider-Man #300 1st Full Venom Marvel Comics 1988 CBCS 4.0 VG Key Marvel 1988 #300", | |
| 391 | + "price": 349.99, | |
| 392 | + "ebayId": "195395291175", | |
| 393 | + "listedPrice": null | |
| 394 | + }, | |
| 395 | + { | |
| 396 | + "tab": "cib", | |
| 397 | + "date": "2022-11-07", | |
| 398 | + "title": "AMAZING SPIDER-MAN #300 CGC 4.0 1ST FULL VENOM APPEARANCE TODD McFARLANE 1988 1988 #300", | |
| 399 | + "price": 232.5, | |
| 400 | + "ebayId": "364035584433", | |
| 401 | + "listedPrice": null | |
| 402 | + }, | |
| 403 | + { | |
| 404 | + "tab": "cib", | |
| 405 | + "date": "2022-10-10", | |
| 406 | + "title": "CBCS 4.0 VG RESTORED THE AMAZING SPIDER-MAN (MARVEL,1988) #300 1ST VENOM ~ 1988 #300", | |
| 407 | + "price": 280, | |
| 408 | + "ebayId": "165714808299", | |
| 409 | + "listedPrice": null | |
| 410 | + }, | |
| 411 | + { | |
| 412 | + "tab": "cib", | |
| 413 | + "date": "2022-09-26", | |
| 414 | + "title": "AMAZING SPIDERMAN 300 CGC 4.0 White pages 1st Venom 1988 #300", | |
| 415 | + "price": 300, | |
| 416 | + "ebayId": "304635412024", | |
| 417 | + "listedPrice": null | |
| 418 | + }, | |
| 419 | + { | |
| 420 | + "tab": "cib", | |
| 421 | + "date": "2022-08-29", | |
| 422 | + "title": "Amazing Spider-Man #300 CGC 4.5 1st Appearance Of Venom Key. Ready to Ship! WP 1988", | |
| 423 | + "price": 285, | |
| 424 | + "ebayId": "255686068982", | |
| 425 | + "listedPrice": null | |
| 426 | + }, | |
| 427 | + { | |
| 428 | + "tab": "cib", | |
| 429 | + "date": "2022-08-01", | |
| 430 | + "title": "CGC 4.0 Amazing Spider-man 300 1st APP Venom ASM Purple Label McFarlane HTF 1988 #300", | |
| 431 | + "price": 350, | |
| 432 | + "ebayId": "394183006169", | |
| 433 | + "listedPrice": null | |
| 434 | + }, | |
| 435 | + { | |
| 436 | + "tab": "cib", | |
| 437 | + "date": "2022-05-20", | |
| 438 | + "title": "Amazing Spider-Man #300 CGC 4.5 1st Appearance Of Venom🔑 Key. Ready to Ship! 1988", | |
| 439 | + "price": 327.5, | |
| 440 | + "ebayId": "265690982408", | |
| 441 | + "listedPrice": null | |
| 442 | + }, | |
| 443 | + { | |
| 444 | + "tab": "cib", | |
| 445 | + "date": "2022-05-16", | |
| 446 | + "title": "Marvel AMAZING SPIDER-MAN (1988) #300 CGC 4.0 VG Key 1st VENOM App McFARLANE 1988 #300", | |
| 447 | + "price": 300, | |
| 448 | + "ebayId": "354061581261", | |
| 449 | + "listedPrice": null | |
| 450 | + }, | |
| 451 | + { | |
| 452 | + "tab": "cib", | |
| 453 | + "date": "2022-04-04", | |
| 454 | + "title": "AMAZING SPIDER-MAN #300 CGC 4.0 (5/88) ORIGIN 1ST APP VENOM 💥 WHITE PAGES 💥 1988 #300", | |
| 455 | + "price": 459.87, | |
| 456 | + "ebayId": "294671659859", | |
| 457 | + "listedPrice": null | |
| 458 | + }, | |
| 459 | + { | |
| 460 | + "tab": "cib", | |
| 461 | + "date": "2022-01-21", | |
| 462 | + "title": "Amazing Spider-Man #300 CGC 4.5 1st Venom Appearance/Todd McFarlane/Comic Book 1988", | |
| 463 | + "price": 395, | |
| 464 | + "ebayId": "125106639212", | |
| 465 | + "listedPrice": null | |
| 466 | + }, | |
| 467 | + { | |
| 468 | + "tab": "cib", | |
| 469 | + "date": "2021-12-05", | |
| 470 | + "title": "The Amazing Spider-Man #300 CGC 4.5 White Pages 1st Full Venom Appearance 1988 #300", | |
| 471 | + "price": 465, | |
| 472 | + "ebayId": "294607847246", | |
| 473 | + "listedPrice": null | |
| 474 | + }, | |
| 475 | + { | |
| 476 | + "tab": "cib", | |
| 477 | + "date": "2021-12-05", | |
| 478 | + "title": "The Amazing Spider-Man #300 CGC 4.5 White Pages 1st Full Venom Appearance 1988 #300", | |
| 479 | + "price": 400, | |
| 480 | + "ebayId": "294599823709", | |
| 481 | + "listedPrice": null | |
| 482 | + }, | |
| 483 | + { | |
| 484 | + "tab": "cib", | |
| 485 | + "date": "2021-10-06", | |
| 486 | + "title": "Amazing Spider-Man #300 CGC 4.5 1st App of Venom and Origin - HOT BOOK 🔥 1988 #300", | |
| 487 | + "price": 395, | |
| 488 | + "ebayId": "274975302292", | |
| 489 | + "listedPrice": null | |
| 490 | + }, | |
| 491 | + { | |
| 492 | + "tab": "new", | |
| 493 | + "date": "2026-08-13", | |
| 494 | + "title": "Amazing Spider-Man # 300 1988 Marvel Comics CGC 6.5 White Pages! 1st Venom! 1988", | |
| 495 | + "price": 374.95, | |
| 496 | + "ebayId": "206480595111", | |
| 497 | + "listedPrice": null | |
| 498 | + }, | |
| 499 | + { | |
| 500 | + "tab": "new", | |
| 501 | + "date": "2026-08-08", | |
| 502 | + "title": "Amazing Spider-Man 300 (1988) CGC 6.5-Origin & First Full Appearance of Venom🔑 1988 #300", | |
| 503 | + "price": 400, | |
| 504 | + "ebayId": "147458605403", | |
| 505 | + "listedPrice": null | |
| 506 | + }, | |
| 507 | + { | |
| 508 | + "tab": "new", | |
| 509 | + "date": "2026-07-10", | |
| 510 | + "title": "Marvel AMAZING SPIDER-MAN 1988 #300 Key 1st VENOM Todd McFARLANE PSA CGC FN+ 6.5 1988", | |
| 511 | + "price": 404.99, | |
| 512 | + "ebayId": "358243724130", | |
| 513 | + "listedPrice": null | |
| 514 | + }, | |
| 515 | + { | |
| 516 | + "tab": "new", | |
| 517 | + "date": "2026-07-07", | |
| 518 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) CGC 6.5 1988", | |
| 519 | + "price": 350, | |
| 520 | + "ebayId": "147384404995", | |
| 521 | + "listedPrice": null | |
| 522 | + }, | |
| 523 | + { | |
| 524 | + "tab": "new", | |
| 525 | + "date": "2026-06-26", | |
| 526 | + "title": "Amazing Spider-Man 300 CGC 6.0 Origin & 1st App of Venom 1988 1988 #300", | |
| 527 | + "price": 329.99, | |
| 528 | + "ebayId": "147391685751", | |
| 529 | + "listedPrice": null | |
| 530 | + }, | |
| 531 | + { | |
| 532 | + "tab": "new", | |
| 533 | + "date": "2026-06-08", | |
| 534 | + "title": "The Amazing Spider-Man #300 CGC 6.5 WHITE PAGES! First Appearance Of Venom! 1988", | |
| 535 | + "price": 310, | |
| 536 | + "ebayId": "336614317016", | |
| 537 | + "listedPrice": 334 | |
| 538 | + }, | |
| 539 | + { | |
| 540 | + "tab": "new", | |
| 541 | + "date": "2026-05-25", | |
| 542 | + "title": "AMAZING SPIDER-MAN #300 CGC 6.5 white 1988 McFarlane 1st appearance VENOM 1988", | |
| 543 | + "price": 330, | |
| 544 | + "ebayId": "227355972774", | |
| 545 | + "listedPrice": 345 | |
| 546 | + }, | |
| 547 | + { | |
| 548 | + "tab": "new", | |
| 549 | + "date": "2026-05-21", | |
| 550 | + "title": "The Amazing Spider-Man #300 CGC 6.5 WHITE PAGES! (Marvel Comics May 1988) 1988", | |
| 551 | + "price": 325, | |
| 552 | + "ebayId": "178090567833", | |
| 553 | + "listedPrice": null | |
| 554 | + }, | |
| 555 | + { | |
| 556 | + "tab": "new", | |
| 557 | + "date": "2026-05-07", | |
| 558 | + "title": "AMAZING SPIDER-MAN #300 CGC 6.5 (1988) First FULL appearance VENOM (Marvel)", | |
| 559 | + "price": 319.08, | |
| 560 | + "ebayId": "146821254997", | |
| 561 | + "listedPrice": null | |
| 562 | + }, | |
| 563 | + { | |
| 564 | + "tab": "new", | |
| 565 | + "date": "2026-05-03", | |
| 566 | + "title": "Amazing Spider-Man #300 CGC 6.5 1st Venom Todd McFarlane Marvel Comics", | |
| 567 | + "price": 399.99, | |
| 568 | + "ebayId": "198319050328", | |
| 569 | + "listedPrice": null | |
| 570 | + }, | |
| 571 | + { | |
| 572 | + "tab": "new", | |
| 573 | + "date": "2026-04-19", | |
| 574 | + "title": "AMAZING SPIDER-MAN # 300 Marvel CGC 6.0 White Pages 1988 Origin & 1st Full Venom 1988", | |
| 575 | + "price": 375, | |
| 576 | + "ebayId": "198282188124", | |
| 577 | + "listedPrice": null | |
| 578 | + }, | |
| 579 | + { | |
| 580 | + "tab": "new", | |
| 581 | + "date": "2026-04-05", | |
| 582 | + "title": "Amazing Spider-Man #300 CGC 6.0 1st Full Appearance Venom! 1988", | |
| 583 | + "price": 330.29, | |
| 584 | + "ebayId": "168274161526", | |
| 585 | + "listedPrice": null | |
| 586 | + }, | |
| 587 | + { | |
| 588 | + "tab": "new", | |
| 589 | + "date": "2026-03-23", | |
| 590 | + "title": "Amazing Spider-Man #300 CGC 6.5 White pages 1988", | |
| 591 | + "price": 280, | |
| 592 | + "ebayId": "198216160103", | |
| 593 | + "listedPrice": 345 | |
| 594 | + }, | |
| 595 | + { | |
| 596 | + "tab": "new", | |
| 597 | + "date": "2026-03-13", | |
| 598 | + "title": "1988 The Amazing Spider-Man #300 25th Anniversary CGC 6.5 Marvel Comics Graded 1988", | |
| 599 | + "price": 399, | |
| 600 | + "ebayId": "157733064089", | |
| 601 | + "listedPrice": null | |
| 602 | + }, | |
| 603 | + { | |
| 604 | + "tab": "new", | |
| 605 | + "date": "2026-03-13", | |
| 606 | + "title": "The Amazing Spider-Man #300 May 1988 - 1st Appearance of Venom - CGC Graded 6.5 1988", | |
| 607 | + "price": 300, | |
| 608 | + "ebayId": "336426961157", | |
| 609 | + "listedPrice": 320 | |
| 610 | + }, | |
| 611 | + { | |
| 612 | + "tab": "new", | |
| 613 | + "date": "2026-03-03", | |
| 614 | + "title": "Amazing Spider-Man #300 CGC 6.5 ORIGIN 1ST FULL VENON APPEARANCE #4649635004", | |
| 615 | + "price": 385, | |
| 616 | + "ebayId": "317599609558", | |
| 617 | + "listedPrice": 399 | |
| 618 | + }, | |
| 619 | + { | |
| 620 | + "tab": "new", | |
| 621 | + "date": "2026-02-21", | |
| 622 | + "title": "Amazing Spider-Man 300 Direct First Venom CGC 6.0 White Pages McFarlane 1988", | |
| 623 | + "price": 340, | |
| 624 | + "ebayId": "376753884663", | |
| 625 | + "listedPrice": 370 | |
| 626 | + }, | |
| 627 | + { | |
| 628 | + "tab": "new", | |
| 629 | + "date": "2025-12-13", | |
| 630 | + "title": "Amazing Spider-Man #300 CGC 6.5 1988", | |
| 631 | + "price": 290, | |
| 632 | + "ebayId": "177570277005", | |
| 633 | + "listedPrice": 345 | |
| 634 | + }, | |
| 635 | + { | |
| 636 | + "tab": "new", | |
| 637 | + "date": "2025-11-10", | |
| 638 | + "title": "The Amazing Spider-Man #300 CGC 6.0 1988", | |
| 639 | + "price": 305, | |
| 640 | + "ebayId": "317046808895", | |
| 641 | + "listedPrice": 350 | |
| 642 | + }, | |
| 643 | + { | |
| 644 | + "tab": "new", | |
| 645 | + "date": "2025-11-08", | |
| 646 | + "title": "Amazing Spider-Man #300 CGC 6.0 OW/W 1st Venom Custom label Direct edition 1988", | |
| 647 | + "price": 274.75, | |
| 648 | + "ebayId": "336273002825", | |
| 649 | + "listedPrice": null | |
| 650 | + }, | |
| 651 | + { | |
| 652 | + "tab": "new", | |
| 653 | + "date": "2025-09-08", | |
| 654 | + "title": "AMAZING SPIDER-MAN # 300 Marvel CGC 6.0 White Pages 1988 Origin & 1st Full Venom 1988", | |
| 655 | + "price": 299.99, | |
| 656 | + "ebayId": "267390373935", | |
| 657 | + "listedPrice": null | |
| 658 | + }, | |
| 659 | + { | |
| 660 | + "tab": "new", | |
| 661 | + "date": "2025-09-06", | |
| 662 | + "title": "1988 Amazing Spider-Man 300 CGC 6.5 1st Venom 1988 #300", | |
| 663 | + "price": 350, | |
| 664 | + "ebayId": "334036044434", | |
| 665 | + "listedPrice": null | |
| 666 | + }, | |
| 667 | + { | |
| 668 | + "tab": "new", | |
| 669 | + "date": "2025-09-05", | |
| 670 | + "title": "1988 Amazing Spider-Man #300 CGC 6.5 Venom! 1st App. 25th Anniversary Comic 1988", | |
| 671 | + "price": 325, | |
| 672 | + "ebayId": "397006551029", | |
| 673 | + "listedPrice": null | |
| 674 | + }, | |
| 675 | + { | |
| 676 | + "tab": "new", | |
| 677 | + "date": "2025-09-04", | |
| 678 | + "title": "Amazing Spider-Man #300 CGC 6.0 1988 1988", | |
| 679 | + "price": 276, | |
| 680 | + "ebayId": "187460308680", | |
| 681 | + "listedPrice": null | |
| 682 | + }, | |
| 683 | + { | |
| 684 | + "tab": "new", | |
| 685 | + "date": "2025-08-10", | |
| 686 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) cgc 6.5 ASM graded 1988", | |
| 687 | + "price": 335, | |
| 688 | + "ebayId": "388800451739", | |
| 689 | + "listedPrice": null | |
| 690 | + }, | |
| 691 | + { | |
| 692 | + "tab": "new", | |
| 693 | + "date": "2025-07-30", | |
| 694 | + "title": "Amazing Spider-Man #300 CGC 6.0 1988 1988", | |
| 695 | + "price": 300, | |
| 696 | + "ebayId": "187393053238", | |
| 697 | + "listedPrice": null | |
| 698 | + }, | |
| 699 | + { | |
| 700 | + "tab": "new", | |
| 701 | + "date": "2025-07-30", | |
| 702 | + "title": "Amazing Spider-Man #300 CGC 6.0 Great Looking Book! 1st App of Venom", | |
| 703 | + "price": 265.09, | |
| 704 | + "ebayId": "365723070794", | |
| 705 | + "listedPrice": null | |
| 706 | + }, | |
| 707 | + { | |
| 708 | + "tab": "new", | |
| 709 | + "date": "2025-07-14", | |
| 710 | + "title": "AMAZING SPIDER-MAN # 300 Marvel CGC 6.0 White Pages 1988 Origin & 1st Full Venom 1988", | |
| 711 | + "price": 300, | |
| 712 | + "ebayId": "396818817282", | |
| 713 | + "listedPrice": null | |
| 714 | + }, | |
| 715 | + { | |
| 716 | + "tab": "new", | |
| 717 | + "date": "2025-06-29", | |
| 718 | + "title": "AMAZING SPIDER-MAN # 300 Marvel CGC 6.0 White Pages 1988 Origin & 1st Full Venom 1988", | |
| 719 | + "price": 283, | |
| 720 | + "ebayId": "396764992146", | |
| 721 | + "listedPrice": null | |
| 722 | + }, | |
| 723 | + { | |
| 724 | + "tab": "new", | |
| 725 | + "date": "2025-06-24", | |
| 726 | + "title": "Amazing Spider-Man #300 Marvel 1988 Origin 1st Appearance Venom CGC 6.0", | |
| 727 | + "price": 242.5, | |
| 728 | + "ebayId": "365675879354", | |
| 729 | + "listedPrice": null | |
| 730 | + }, | |
| 731 | + { | |
| 732 | + "tab": "graded", | |
| 733 | + "date": "2026-09-05", | |
| 734 | + "title": "Amazing Spider-Man #300 1988 Direct CGC 8.5 1st App Venom Black Suit Key 🔑 1988", | |
| 735 | + "price": 540, | |
| 736 | + "ebayId": "307151724085", | |
| 737 | + "listedPrice": null | |
| 738 | + }, | |
| 739 | + { | |
| 740 | + "tab": "graded", | |
| 741 | + "date": "2026-09-04", | |
| 742 | + "title": "The Amazing Spider-Man #300 (Marvel, 1988) CGC VF+ 8.5 White pages....", | |
| 743 | + "price": 427, | |
| 744 | + "ebayId": null, | |
| 745 | + "listedPrice": null | |
| 746 | + }, | |
| 747 | + { | |
| 748 | + "tab": "graded", | |
| 749 | + "date": "2026-09-03", | |
| 750 | + "title": "Amazing Spider-Man #300 (1988) CGC 8.0 White Page, 1st Venom , Key Comic 1988", | |
| 751 | + "price": 404.58, | |
| 752 | + "ebayId": "257710301149", | |
| 753 | + "listedPrice": 539.44 | |
| 754 | + }, | |
| 755 | + { | |
| 756 | + "tab": "graded", | |
| 757 | + "date": "2026-09-02", | |
| 758 | + "title": "The Amazing Spider-Man #300 CGC 8.5 White 1st appearance of Venom 1988", | |
| 759 | + "price": 539.99, | |
| 760 | + "ebayId": "366622804026", | |
| 761 | + "listedPrice": null | |
| 762 | + }, | |
| 763 | + { | |
| 764 | + "tab": "graded", | |
| 765 | + "date": "2026-08-31", | |
| 766 | + "title": "Amazing Spider-Man #300 CGC 8.5 – Origin & 1st Full Appearance of Venom 1988", | |
| 767 | + "price": 431.49, | |
| 768 | + "ebayId": "800531856949", | |
| 769 | + "listedPrice": null | |
| 770 | + }, | |
| 771 | + { | |
| 772 | + "tab": "graded", | |
| 773 | + "date": "2026-08-31", | |
| 774 | + "title": "Marvel Comics Amazing Spider-Man #300 (1988) CGC 8.5 Key Issue 1988", | |
| 775 | + "price": 406.51, | |
| 776 | + "ebayId": "137653598791", | |
| 777 | + "listedPrice": null | |
| 778 | + }, | |
| 779 | + { | |
| 780 | + "tab": "graded", | |
| 781 | + "date": "2026-08-30", | |
| 782 | + "title": "Amazing Spider-Man #300, CGC 8.5, WHITE, 1st APPEARANCE VENOM/Eddie Brock, 1988 1988", | |
| 783 | + "price": 449.99, | |
| 784 | + "ebayId": "117382822672", | |
| 785 | + "listedPrice": null | |
| 786 | + }, | |
| 787 | + { | |
| 788 | + "tab": "graded", | |
| 789 | + "date": "2026-08-25", | |
| 790 | + "title": "Amazing Spider-Man #300 CGC 8.5 – Origin & 1st Full Appearance of Venom 1988", | |
| 791 | + "price": 447.82, | |
| 792 | + "ebayId": "168623371281", | |
| 793 | + "listedPrice": null | |
| 794 | + }, | |
| 795 | + { | |
| 796 | + "tab": "graded", | |
| 797 | + "date": "2026-08-22", | |
| 798 | + "title": "Amazing Spider-Man #300 Direct CGC 8.5 1988 - 1st full app. Venom 1988", | |
| 799 | + "price": 442.77, | |
| 800 | + "ebayId": "198573814411", | |
| 801 | + "listedPrice": null | |
| 802 | + }, | |
| 803 | + { | |
| 804 | + "tab": "graded", | |
| 805 | + "date": "2026-08-16", | |
| 806 | + "title": "Amazing Spider-Man #300 CGC 8.5 – Origin & 1st Full Appearance of Venom 1988", | |
| 807 | + "price": 468.47, | |
| 808 | + "ebayId": "236971959196", | |
| 809 | + "listedPrice": null | |
| 810 | + }, | |
| 811 | + { | |
| 812 | + "tab": "graded", | |
| 813 | + "date": "2026-08-15", | |
| 814 | + "title": "Amazing Spider-Man #300 CGC 8.5 1988", | |
| 815 | + "price": 495, | |
| 816 | + "ebayId": "377389924472", | |
| 817 | + "listedPrice": null | |
| 818 | + }, | |
| 819 | + { | |
| 820 | + "tab": "graded", | |
| 821 | + "date": "2026-08-12", | |
| 822 | + "title": "custom label Amazing Spider-Man 300 CGC 8.0 . Origin & 1st full app of Venom 1988", | |
| 823 | + "price": 452.07, | |
| 824 | + "ebayId": "407086863847", | |
| 825 | + "listedPrice": null | |
| 826 | + }, | |
| 827 | + { | |
| 828 | + "tab": "graded", | |
| 829 | + "date": "2026-08-11", | |
| 830 | + "title": "Amazing Spider-Man #300 Direct CGC 8.5 1988 - 1st full app. Venom 1988", | |
| 831 | + "price": 430, | |
| 832 | + "ebayId": "227462207300", | |
| 833 | + "listedPrice": null | |
| 834 | + }, | |
| 835 | + { | |
| 836 | + "tab": "graded", | |
| 837 | + "date": "2026-08-09", | |
| 838 | + "title": "Amazing Spider-Man 300 (1988) CGC 8.0 . Origin & 1st full app of Venom 1988", | |
| 839 | + "price": 445.19, | |
| 840 | + "ebayId": "407068194624", | |
| 841 | + "listedPrice": null | |
| 842 | + }, | |
| 843 | + { | |
| 844 | + "tab": "graded", | |
| 845 | + "date": "2026-08-09", | |
| 846 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) CBCS 8.5 1988", | |
| 847 | + "price": 400, | |
| 848 | + "ebayId": "227463928956", | |
| 849 | + "listedPrice": null | |
| 850 | + }, | |
| 851 | + { | |
| 852 | + "tab": "graded", | |
| 853 | + "date": "2026-08-06", | |
| 854 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) CGC 8.5 1988", | |
| 855 | + "price": 523.99, | |
| 856 | + "ebayId": "227279544158", | |
| 857 | + "listedPrice": null | |
| 858 | + }, | |
| 859 | + { | |
| 860 | + "tab": "graded", | |
| 861 | + "date": "2026-08-06", | |
| 862 | + "title": "Marvel Amazing Spider-Man #300 (1988) CGC 8.0 Todd McFarlane 1st Print 1988", | |
| 863 | + "price": 400, | |
| 864 | + "ebayId": "800468467267", | |
| 865 | + "listedPrice": 420 | |
| 866 | + }, | |
| 867 | + { | |
| 868 | + "tab": "graded", | |
| 869 | + "date": "2026-08-02", | |
| 870 | + "title": "*Amazing Spider-Man 300 CGC 8.0 White (1st app Venom)- #001 Custom Label +magnet 1988", | |
| 871 | + "price": 525.01, | |
| 872 | + "ebayId": "256907837525", | |
| 873 | + "listedPrice": null | |
| 874 | + }, | |
| 875 | + { | |
| 876 | + "tab": "graded", | |
| 877 | + "date": "2026-08-01", | |
| 878 | + "title": "AMAZING SPIDER-MAN #300 1ST FULL VENOM! MARVEL COMICS, 1988 CGC 8.5 OW/W PAGES! 1988", | |
| 879 | + "price": 510, | |
| 880 | + "ebayId": "157973893819", | |
| 881 | + "listedPrice": null | |
| 882 | + }, | |
| 883 | + { | |
| 884 | + "tab": "graded", | |
| 885 | + "date": "2026-07-27", | |
| 886 | + "title": "CGC 8.5 Amazing Spider-Man #300 Spider-Man Venom Marvel 1988 1988", | |
| 887 | + "price": 349.99, | |
| 888 | + "ebayId": "318639477604", | |
| 889 | + "listedPrice": null | |
| 890 | + }, | |
| 891 | + { | |
| 892 | + "tab": "graded", | |
| 893 | + "date": "2026-07-26", | |
| 894 | + "title": "Marvel Comics Amazing Spider-Man #300 (1988) CGC 8.5 Venom McFarlane 1988", | |
| 895 | + "price": 475, | |
| 896 | + "ebayId": "127912890216", | |
| 897 | + "listedPrice": null | |
| 898 | + }, | |
| 899 | + { | |
| 900 | + "tab": "graded", | |
| 901 | + "date": "2026-07-22", | |
| 902 | + "title": "MARVEL Amazing Spider-Man 300 CGC 8.5 05/1988 1st Appearance Venom 1988", | |
| 903 | + "price": 458.8, | |
| 904 | + "ebayId": "236912045182", | |
| 905 | + "listedPrice": null | |
| 906 | + }, | |
| 907 | + { | |
| 908 | + "tab": "graded", | |
| 909 | + "date": "2026-07-20", | |
| 910 | + "title": "Amazing Spider-Man #300 (1988) Marvel CGC 8.0, 1st App of Venom, Todd McFarlane 1988", | |
| 911 | + "price": 499.99, | |
| 912 | + "ebayId": "389467300508", | |
| 913 | + "listedPrice": null | |
| 914 | + }, | |
| 915 | + { | |
| 916 | + "tab": "graded", | |
| 917 | + "date": "2026-07-09", | |
| 918 | + "title": "Marvel Comics CGC 8.5 Amazing Spider-Man #300 1988 First Venom Eddie Brock 1988", | |
| 919 | + "price": 505, | |
| 920 | + "ebayId": "800172637859", | |
| 921 | + "listedPrice": 525 | |
| 922 | + }, | |
| 923 | + { | |
| 924 | + "tab": "graded", | |
| 925 | + "date": "2026-07-06", | |
| 926 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) CGC 8.5 1988", | |
| 927 | + "price": 475, | |
| 928 | + "ebayId": "287442409840", | |
| 929 | + "listedPrice": 500 | |
| 930 | + }, | |
| 931 | + { | |
| 932 | + "tab": "graded", | |
| 933 | + "date": "2026-07-04", | |
| 934 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) - CGC 8.5 1988", | |
| 935 | + "price": 399.99, | |
| 936 | + "ebayId": "127955823169", | |
| 937 | + "listedPrice": null | |
| 938 | + }, | |
| 939 | + { | |
| 940 | + "tab": "graded", | |
| 941 | + "date": "2026-07-04", | |
| 942 | + "title": "amazing spiderman 300 cgc 8.5 1st Full Venom", | |
| 943 | + "price": 430, | |
| 944 | + "ebayId": "168504290829", | |
| 945 | + "listedPrice": null | |
| 946 | + }, | |
| 947 | + { | |
| 948 | + "tab": "graded", | |
| 949 | + "date": "2026-06-28", | |
| 950 | + "title": "Amazing Spider-Man #300 CGC 8.5 1st Venom Appearance 1988 1988", | |
| 951 | + "price": 462, | |
| 952 | + "ebayId": "388193344579", | |
| 953 | + "listedPrice": null | |
| 954 | + }, | |
| 955 | + { | |
| 956 | + "tab": "graded", | |
| 957 | + "date": "2026-06-20", | |
| 958 | + "title": "Amazing Spider-Man 300 Cgc 8.0 White Pages 1988 #300", | |
| 959 | + "price": 380, | |
| 960 | + "ebayId": "267698221250", | |
| 961 | + "listedPrice": null | |
| 962 | + }, | |
| 963 | + { | |
| 964 | + "tab": "graded", | |
| 965 | + "date": "2026-06-16", | |
| 966 | + "title": "1988 Amazing Spider Man #300 cgc8.5 1988", | |
| 967 | + "price": 464, | |
| 968 | + "ebayId": "127911446161", | |
| 969 | + "listedPrice": null | |
| 970 | + }, | |
| 971 | + { | |
| 972 | + "tab": "box-only", | |
| 973 | + "date": "2026-09-04", | |
| 974 | + "title": "The Amazing Spider-Man #300 (Marvel, 1988) CGC NM- 9.2 White pages....", | |
| 975 | + "price": 561, | |
| 976 | + "ebayId": null, | |
| 977 | + "listedPrice": null | |
| 978 | + }, | |
| 979 | + { | |
| 980 | + "tab": "box-only", | |
| 981 | + "date": "2026-09-04", | |
| 982 | + "title": "Amazing Spider Man #300 CGC 9.2 1st App Venom & Origin Key App. See Description 1988", | |
| 983 | + "price": 625, | |
| 984 | + "ebayId": "137695108438", | |
| 985 | + "listedPrice": null | |
| 986 | + }, | |
| 987 | + { | |
| 988 | + "tab": "box-only", | |
| 989 | + "date": "2026-08-24", | |
| 990 | + "title": "AMAZING SPIDER-MAN #300 CGC 9.2 WHITE PAGES 1ST VENOM TODD MCFARLANE 1988 KEY 1988", | |
| 991 | + "price": 602, | |
| 992 | + "ebayId": "206490958226", | |
| 993 | + "listedPrice": null | |
| 994 | + }, | |
| 995 | + { | |
| 996 | + "tab": "box-only", | |
| 997 | + "date": "2026-08-13", | |
| 998 | + "title": "Amazing Spider-Man #300 CGC 9.2 NM- 1st Venom Todd McFarlane 1988 Marvel 1988", | |
| 999 | + "price": 585, | |
| 1000 | + "ebayId": "206486730729", | |
| 1001 | + "listedPrice": null | |
| 1002 | + }, | |
| 1003 | + { | |
| 1004 | + "tab": "box-only", | |
| 1005 | + "date": "2026-08-12", | |
| 1006 | + "title": "AMAZING SPIDER-MAN #300 CGC 9.2 1ST FULL VENOM APPEARANCE TODD MCFARLANE ART 1988", | |
| 1007 | + "price": 615, | |
| 1008 | + "ebayId": "145740697929", | |
| 1009 | + "listedPrice": null | |
| 1010 | + }, | |
| 1011 | + { | |
| 1012 | + "tab": "box-only", | |
| 1013 | + "date": "2026-08-11", | |
| 1014 | + "title": "Amazing Spider-Man 300 CGC 9.2 NM- WP 1st Venom McFarlane Marvel 1988 1988 #300", | |
| 1015 | + "price": 625, | |
| 1016 | + "ebayId": "257673652415", | |
| 1017 | + "listedPrice": null | |
| 1018 | + }, | |
| 1019 | + { | |
| 1020 | + "tab": "box-only", | |
| 1021 | + "date": "2026-08-08", | |
| 1022 | + "title": "Amazing Spider-Man #300 CGC 9.2 1988 White Pages Todd McFarlane Venom Brock 1988", | |
| 1023 | + "price": 599, | |
| 1024 | + "ebayId": "318499670031", | |
| 1025 | + "listedPrice": null | |
| 1026 | + }, | |
| 1027 | + { | |
| 1028 | + "tab": "box-only", | |
| 1029 | + "date": "2026-08-02", | |
| 1030 | + "title": "AMAZING SPIDER-MAN # 300 Marvel CGC 9.2 White Pages 1988 Origin & 1st Full Venom 1988", | |
| 1031 | + "price": 589.89, | |
| 1032 | + "ebayId": "327291034290", | |
| 1033 | + "listedPrice": null | |
| 1034 | + }, | |
| 1035 | + { | |
| 1036 | + "tab": "box-only", | |
| 1037 | + "date": "2026-08-01", | |
| 1038 | + "title": "AMAZING SPIDER-MAN #300 CGC 9.2 - 1st FULL VENOM APPEARANCE - White Pages 1988 1988", | |
| 1039 | + "price": 584.95, | |
| 1040 | + "ebayId": "227456561167", | |
| 1041 | + "listedPrice": null | |
| 1042 | + }, | |
| 1043 | + { | |
| 1044 | + "tab": "box-only", | |
| 1045 | + "date": "2026-07-29", | |
| 1046 | + "title": "AMAZING SPIDER-MAN #300 CGC 9.2 **FREE SHIPPING** 1st FULL VENOM APPEARANCE 1988 1988", | |
| 1047 | + "price": 624.95, | |
| 1048 | + "ebayId": "358850097649", | |
| 1049 | + "listedPrice": null | |
| 1050 | + }, | |
| 1051 | + { | |
| 1052 | + "tab": "box-only", | |
| 1053 | + "date": "2026-07-29", | |
| 1054 | + "title": "The Amazing Spider-Man # 300 CGC 9.2 Marvel 1988 1st App Of Venom [CR] 1988", | |
| 1055 | + "price": 584.81, | |
| 1056 | + "ebayId": "236955911222", | |
| 1057 | + "listedPrice": null | |
| 1058 | + }, | |
| 1059 | + { | |
| 1060 | + "tab": "box-only", | |
| 1061 | + "date": "2026-07-27", | |
| 1062 | + "title": "Amazing Spider-Man #300 CGC 9.2 (1988) Origin & 1st App. of Venom! L@@K! 1988", | |
| 1063 | + "price": 570, | |
| 1064 | + "ebayId": "227432737463", | |
| 1065 | + "listedPrice": null | |
| 1066 | + }, | |
| 1067 | + { | |
| 1068 | + "tab": "box-only", | |
| 1069 | + "date": "2026-07-18", | |
| 1070 | + "title": "Amazing Spider-Man #300 CGC 9.2 White Pages 1st Full Venom. Todd McFarlane. 1988", | |
| 1071 | + "price": 565, | |
| 1072 | + "ebayId": "278182742147", | |
| 1073 | + "listedPrice": 599 | |
| 1074 | + }, | |
| 1075 | + { | |
| 1076 | + "tab": "box-only", | |
| 1077 | + "date": "2026-07-12", | |
| 1078 | + "title": "Amazing Spiderman 300. Cgc 9.2 Newstand Edition WP. 1st Venom.", | |
| 1079 | + "price": 640, | |
| 1080 | + "ebayId": "198493668955", | |
| 1081 | + "listedPrice": 675 | |
| 1082 | + }, | |
| 1083 | + { | |
| 1084 | + "tab": "box-only", | |
| 1085 | + "date": "2026-06-27", | |
| 1086 | + "title": "Amazing Spider-Man #300 CGC 9.2 1st Full App. of Venom Todd McFarlane 1988 1988", | |
| 1087 | + "price": 640, | |
| 1088 | + "ebayId": "407029840259", | |
| 1089 | + "listedPrice": null | |
| 1090 | + }, | |
| 1091 | + { | |
| 1092 | + "tab": "box-only", | |
| 1093 | + "date": "2026-06-24", | |
| 1094 | + "title": "AMAZING SPIDER-MAN #300 CGC 9.2 White Origin & 1st Full Appearance of Venom", | |
| 1095 | + "price": 520, | |
| 1096 | + "ebayId": "318465931125", | |
| 1097 | + "listedPrice": null | |
| 1098 | + }, | |
| 1099 | + { | |
| 1100 | + "tab": "box-only", | |
| 1101 | + "date": "2026-06-22", | |
| 1102 | + "title": "Amazing Spider-Man #300 CGC 9.2 White Pages 1st Full Venom. Todd McFarlane. 1988", | |
| 1103 | + "price": 580, | |
| 1104 | + "ebayId": "127929722972", | |
| 1105 | + "listedPrice": 625 | |
| 1106 | + }, | |
| 1107 | + { | |
| 1108 | + "tab": "box-only", | |
| 1109 | + "date": "2026-06-21", | |
| 1110 | + "title": "Amazing Spider-Man #300 CGC 9.2 White Pages 1st Full Venom Appearance 1st Print 1988", | |
| 1111 | + "price": 580, | |
| 1112 | + "ebayId": "188529078061", | |
| 1113 | + "listedPrice": null | |
| 1114 | + }, | |
| 1115 | + { | |
| 1116 | + "tab": "box-only", | |
| 1117 | + "date": "2026-06-21", | |
| 1118 | + "title": "Amazing Spider-Man 300 CGC 9.2 ~ 1st Full Venom ~ Marvel Comics 1988 1988 #300", | |
| 1119 | + "price": 599, | |
| 1120 | + "ebayId": "198377461554", | |
| 1121 | + "listedPrice": null | |
| 1122 | + }, | |
| 1123 | + { | |
| 1124 | + "tab": "box-only", | |
| 1125 | + "date": "2026-06-17", | |
| 1126 | + "title": "Amazing Spider-Man #300 CGC 9.2 Incredible Looking Book! 1st App of Venom 1988 1988", | |
| 1127 | + "price": 535, | |
| 1128 | + "ebayId": "366425247544", | |
| 1129 | + "listedPrice": null | |
| 1130 | + }, | |
| 1131 | + { | |
| 1132 | + "tab": "box-only", | |
| 1133 | + "date": "2026-06-14", | |
| 1134 | + "title": "Amazing Spider-Man #300 CGC 9.2 White Pages 1st Full Venom Appearance", | |
| 1135 | + "price": 600, | |
| 1136 | + "ebayId": "147367092031", | |
| 1137 | + "listedPrice": null | |
| 1138 | + }, | |
| 1139 | + { | |
| 1140 | + "tab": "box-only", | |
| 1141 | + "date": "2026-06-12", | |
| 1142 | + "title": "Amazing Spider-Man #300 CGC 9.2 (W) Origin & 1st Appearance of Venom 1988", | |
| 1143 | + "price": 600, | |
| 1144 | + "ebayId": "397939662890", | |
| 1145 | + "listedPrice": 641.95 | |
| 1146 | + }, | |
| 1147 | + { | |
| 1148 | + "tab": "box-only", | |
| 1149 | + "date": "2026-06-10", | |
| 1150 | + "title": "Amazing Spider-Man #300 CGC 9.2 Incredible Looking Book! 1st App of Venom 1988 1988", | |
| 1151 | + "price": 534, | |
| 1152 | + "ebayId": "366424835180", | |
| 1153 | + "listedPrice": null | |
| 1154 | + }, | |
| 1155 | + { | |
| 1156 | + "tab": "box-only", | |
| 1157 | + "date": "2026-06-03", | |
| 1158 | + "title": "Amazing Spider-Man #300 1988 Marvel CGC 9.2 1st Full App Venom Direct 1988", | |
| 1159 | + "price": 599.99, | |
| 1160 | + "ebayId": "336606282490", | |
| 1161 | + "listedPrice": null | |
| 1162 | + }, | |
| 1163 | + { | |
| 1164 | + "tab": "box-only", | |
| 1165 | + "date": "2026-05-31", | |
| 1166 | + "title": "Amazing Spider-Man #300 CGC 9.2 1st Full App Venom 1988 Secret Wars Symbiote 1988", | |
| 1167 | + "price": 600, | |
| 1168 | + "ebayId": "226887268947", | |
| 1169 | + "listedPrice": null | |
| 1170 | + }, | |
| 1171 | + { | |
| 1172 | + "tab": "box-only", | |
| 1173 | + "date": "2026-05-30", | |
| 1174 | + "title": "MEGA KEY VENOM ISSUE AMAZING SPIDER-MAN #300 CGC 9.2 1ST FULL VENOM 1988", | |
| 1175 | + "price": 568, | |
| 1176 | + "ebayId": "406947018240", | |
| 1177 | + "listedPrice": null | |
| 1178 | + }, | |
| 1179 | + { | |
| 1180 | + "tab": "box-only", | |
| 1181 | + "date": "2026-05-27", | |
| 1182 | + "title": "Marvel the Amazing Spider-Man #300 Comic Book (May 1988) CGC 9.2 1988", | |
| 1183 | + "price": 550, | |
| 1184 | + "ebayId": "178162531759", | |
| 1185 | + "listedPrice": null | |
| 1186 | + }, | |
| 1187 | + { | |
| 1188 | + "tab": "box-only", | |
| 1189 | + "date": "2026-05-27", | |
| 1190 | + "title": "Amazing Spider-Man #300 Direct CGC 9.2 1988 3933529001 1st full app. Venom 1988", | |
| 1191 | + "price": 675, | |
| 1192 | + "ebayId": "366372039424", | |
| 1193 | + "listedPrice": 940 | |
| 1194 | + }, | |
| 1195 | + { | |
| 1196 | + "tab": "box-only", | |
| 1197 | + "date": "2026-05-25", | |
| 1198 | + "title": "The Amazing Spider-Man # 300 CGC 9.2 1st App Of Venom 1988", | |
| 1199 | + "price": 560, | |
| 1200 | + "ebayId": "306953656919", | |
| 1201 | + "listedPrice": null | |
| 1202 | + }, | |
| 1203 | + { | |
| 1204 | + "tab": "box-only", | |
| 1205 | + "date": "2026-05-20", | |
| 1206 | + "title": "S-832 1988 MARVEL COMICS AMAZING SPIDER-MAN #300 CGC 9.2 NEAR MINT- WHITE PAGES 1988", | |
| 1207 | + "price": 532, | |
| 1208 | + "ebayId": "327159303343", | |
| 1209 | + "listedPrice": null | |
| 1210 | + }, | |
| 1211 | + { | |
| 1212 | + "tab": "manual-only", | |
| 1213 | + "date": "2026-08-23", | |
| 1214 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) 1988", | |
| 1215 | + "price": 3150, | |
| 1216 | + "ebayId": "327312823518", | |
| 1217 | + "listedPrice": null | |
| 1218 | + }, | |
| 1219 | + { | |
| 1220 | + "tab": "manual-only", | |
| 1221 | + "date": "2026-08-22", | |
| 1222 | + "title": "Amazing Spider-Man #300 CGC 9.8 WP 1st Full Venom McFarlane (read description) 1988", | |
| 1223 | + "price": 2261.69, | |
| 1224 | + "ebayId": "178410747721", | |
| 1225 | + "listedPrice": null | |
| 1226 | + }, | |
| 1227 | + { | |
| 1228 | + "tab": "manual-only", | |
| 1229 | + "date": "2026-08-19", | |
| 1230 | + "title": "Amazing Spider-Man #300 CGC 9.8 Absolutely Stunning Book! 1st App of Venom 1988 1988", | |
| 1231 | + "price": 3175, | |
| 1232 | + "ebayId": "206453163614", | |
| 1233 | + "listedPrice": null | |
| 1234 | + }, | |
| 1235 | + { | |
| 1236 | + "tab": "manual-only", | |
| 1237 | + "date": "2026-08-18", | |
| 1238 | + "title": "Amazing Spider-Man #300 Origin & 1st App. Venom McFarlane Marvel 1988 CGC 9.8 1988", | |
| 1239 | + "price": 3058, | |
| 1240 | + "ebayId": "147496466188", | |
| 1241 | + "listedPrice": null | |
| 1242 | + }, | |
| 1243 | + { | |
| 1244 | + "tab": "manual-only", | |
| 1245 | + "date": "2026-08-15", | |
| 1246 | + "title": "The Amazing Spider-Man 300 Direct CGC 9.8 White Pages 1st Full Eddie Brock Venom 1988 #300", | |
| 1247 | + "price": 2950, | |
| 1248 | + "ebayId": "168370957311", | |
| 1249 | + "listedPrice": 3645 | |
| 1250 | + }, | |
| 1251 | + { | |
| 1252 | + "tab": "manual-only", | |
| 1253 | + "date": "2026-08-15", | |
| 1254 | + "title": "Amazing Spider-Man #300 Origin And 1st Appearance Of Venom CGC 9.8 Marvel 1988. 1988", | |
| 1255 | + "price": 3000, | |
| 1256 | + "ebayId": "168564466404", | |
| 1257 | + "listedPrice": 3899.99 | |
| 1258 | + }, | |
| 1259 | + { | |
| 1260 | + "tab": "manual-only", | |
| 1261 | + "date": "2026-08-13", | |
| 1262 | + "title": "Amazing Spider-Man #300 CGC 9.8 White Pages 1st Eddie Brock Venom! Combine Ship 1988", | |
| 1263 | + "price": 3000, | |
| 1264 | + "ebayId": "257667380802", | |
| 1265 | + "listedPrice": 3200 | |
| 1266 | + }, | |
| 1267 | + { | |
| 1268 | + "tab": "manual-only", | |
| 1269 | + "date": "2026-08-11", | |
| 1270 | + "title": "AMAZING SPIDER-MAN #300 CGC 9.8 White Pgs 1st Venom McFarlane 1988 1988", | |
| 1271 | + "price": 3199, | |
| 1272 | + "ebayId": "147495574968", | |
| 1273 | + "listedPrice": null | |
| 1274 | + }, | |
| 1275 | + { | |
| 1276 | + "tab": "manual-only", | |
| 1277 | + "date": "2026-08-08", | |
| 1278 | + "title": "Amazing Spider-Man #300 CGC 9.8 White Pages 1st Full Venom McFarlane KEY NR READ 1988", | |
| 1279 | + "price": 3100, | |
| 1280 | + "ebayId": "147476829944", | |
| 1281 | + "listedPrice": null | |
| 1282 | + }, | |
| 1283 | + { | |
| 1284 | + "tab": "manual-only", | |
| 1285 | + "date": "2026-08-08", | |
| 1286 | + "title": "AMAZING SPIDER-MAN #300 CGC 9.8 KEY 1ST VENOM APPEARANCE APP TODD McFARLANE W Pg 1988", | |
| 1287 | + "price": 3200, | |
| 1288 | + "ebayId": "305150250518", | |
| 1289 | + "listedPrice": null | |
| 1290 | + }, | |
| 1291 | + { | |
| 1292 | + "tab": "manual-only", | |
| 1293 | + "date": "2026-08-02", | |
| 1294 | + "title": "Amazing Spider-man #300 CGC 9.8 White Pages 1st Venom", | |
| 1295 | + "price": 2800, | |
| 1296 | + "ebayId": "117327212262", | |
| 1297 | + "listedPrice": 3200 | |
| 1298 | + }, | |
| 1299 | + { | |
| 1300 | + "tab": "manual-only", | |
| 1301 | + "date": "2026-07-23", | |
| 1302 | + "title": "Amazing Spider-Man #300 - Marvel Comics 1988 CGC 9.8 Origin + 1st full appearanc 1988", | |
| 1303 | + "price": 3413, | |
| 1304 | + "ebayId": "137486097512", | |
| 1305 | + "listedPrice": null | |
| 1306 | + }, | |
| 1307 | + { | |
| 1308 | + "tab": "manual-only", | |
| 1309 | + "date": "2026-07-17", | |
| 1310 | + "title": "the amazing spiderman #300 (CGC 9.8 ) WHITE PAGES , FIRST APP. OF VENOM. 1988", | |
| 1311 | + "price": 3000, | |
| 1312 | + "ebayId": "276950029016", | |
| 1313 | + "listedPrice": 3699.99 | |
| 1314 | + }, | |
| 1315 | + { | |
| 1316 | + "tab": "manual-only", | |
| 1317 | + "date": "2026-07-16", | |
| 1318 | + "title": "Amazing Spider-Man # 300 CGC 9.8 White Pages 1st full appearance Venom 1988", | |
| 1319 | + "price": 2950, | |
| 1320 | + "ebayId": "236939267459", | |
| 1321 | + "listedPrice": 3149 | |
| 1322 | + }, | |
| 1323 | + { | |
| 1324 | + "tab": "manual-only", | |
| 1325 | + "date": "2026-07-15", | |
| 1326 | + "title": "Amazing Spider-Man #300 (May 1988) CGC 9.8 1988", | |
| 1327 | + "price": 1499.95, | |
| 1328 | + "ebayId": "307013772775", | |
| 1329 | + "listedPrice": null | |
| 1330 | + }, | |
| 1331 | + { | |
| 1332 | + "tab": "manual-only", | |
| 1333 | + "date": "2026-07-10", | |
| 1334 | + "title": "Amazing Spider-Man #300 CGC 9.8 1988 1st App. Venom 1988", | |
| 1335 | + "price": 3200, | |
| 1336 | + "ebayId": "377217955136", | |
| 1337 | + "listedPrice": null | |
| 1338 | + }, | |
| 1339 | + { | |
| 1340 | + "tab": "manual-only", | |
| 1341 | + "date": "2026-07-09", | |
| 1342 | + "title": "Amazing Spider-Man #300 CGC 9.8 White Pages 1st Eddie Brock Venom! Combine Ship 1988", | |
| 1343 | + "price": 3100, | |
| 1344 | + "ebayId": "227417969436", | |
| 1345 | + "listedPrice": 3200 | |
| 1346 | + }, | |
| 1347 | + { | |
| 1348 | + "tab": "manual-only", | |
| 1349 | + "date": "2026-07-05", | |
| 1350 | + "title": "AMAZING SPIDER-MAN #300 CGC 9.8 WHITE PAGES MARVEL COMICS 1988 1988", | |
| 1351 | + "price": 2899, | |
| 1352 | + "ebayId": "257581436531", | |
| 1353 | + "listedPrice": null | |
| 1354 | + }, | |
| 1355 | + { | |
| 1356 | + "tab": "manual-only", | |
| 1357 | + "date": "2026-06-29", | |
| 1358 | + "title": "Amazing Spider-Man #300 - Marvel Comics 1988 CGC 9.8 Origin + 1st full appearanc 1988", | |
| 1359 | + "price": 840, | |
| 1360 | + "ebayId": "137465170214", | |
| 1361 | + "listedPrice": null | |
| 1362 | + }, | |
| 1363 | + { | |
| 1364 | + "tab": "manual-only", | |
| 1365 | + "date": "2026-06-29", | |
| 1366 | + "title": "The Amazing Spider-Man #300 CGC 9.8 - WoW CHROMIUM - 1st VENOM - Brand New Day 1988", | |
| 1367 | + "price": 160.5, | |
| 1368 | + "ebayId": "398092413192", | |
| 1369 | + "listedPrice": null | |
| 1370 | + }, | |
| 1371 | + { | |
| 1372 | + "tab": "manual-only", | |
| 1373 | + "date": "2026-06-27", | |
| 1374 | + "title": "Amazing Spider-Man #300 CGC NM/MT 9.8 White Pages 1st Full Appearance Venom! 1988", | |
| 1375 | + "price": 3195, | |
| 1376 | + "ebayId": "227404826600", | |
| 1377 | + "listedPrice": null | |
| 1378 | + }, | |
| 1379 | + { | |
| 1380 | + "tab": "manual-only", | |
| 1381 | + "date": "2026-06-26", | |
| 1382 | + "title": "amazing spider-man #300 marvel comics 1988 cgc 9.8 white pages 1988", | |
| 1383 | + "price": 2430, | |
| 1384 | + "ebayId": "158010728150", | |
| 1385 | + "listedPrice": null | |
| 1386 | + }, | |
| 1387 | + { | |
| 1388 | + "tab": "manual-only", | |
| 1389 | + "date": "2026-06-24", | |
| 1390 | + "title": "amazing spider-man 300 cgc 9.8", | |
| 1391 | + "price": 2911, | |
| 1392 | + "ebayId": "158007888589", | |
| 1393 | + "listedPrice": null | |
| 1394 | + }, | |
| 1395 | + { | |
| 1396 | + "tab": "manual-only", | |
| 1397 | + "date": "2026-06-20", | |
| 1398 | + "title": "Amazing Spider-Man #300 (May 1988) CGC 9.8 1988", | |
| 1399 | + "price": 1499.95, | |
| 1400 | + "ebayId": "306960419788", | |
| 1401 | + "listedPrice": null | |
| 1402 | + }, | |
| 1403 | + { | |
| 1404 | + "tab": "manual-only", | |
| 1405 | + "date": "2026-06-16", | |
| 1406 | + "title": "Marvel Amazing Spider-Man 300 Comic Book. CGC 9.8 White Pages. First Venom App 1988 #300", | |
| 1407 | + "price": 2708, | |
| 1408 | + "ebayId": "198413763700", | |
| 1409 | + "listedPrice": 2850 | |
| 1410 | + }, | |
| 1411 | + { | |
| 1412 | + "tab": "manual-only", | |
| 1413 | + "date": "2026-06-10", | |
| 1414 | + "title": "Amazing Spider-Man #300 CGC 9.8 (1988) Marvel Comics Venom McFarlane 1988", | |
| 1415 | + "price": 2750, | |
| 1416 | + "ebayId": "377201328476", | |
| 1417 | + "listedPrice": null | |
| 1418 | + }, | |
| 1419 | + { | |
| 1420 | + "tab": "manual-only", | |
| 1421 | + "date": "2026-05-26", | |
| 1422 | + "title": "AMAZING SPIDER-MAN #300 CGC 9.8 WHITE PAGES MARVEL COMICS 1988 1988", | |
| 1423 | + "price": 2900, | |
| 1424 | + "ebayId": "376916713163", | |
| 1425 | + "listedPrice": null | |
| 1426 | + }, | |
| 1427 | + { | |
| 1428 | + "tab": "manual-only", | |
| 1429 | + "date": "2026-05-23", | |
| 1430 | + "title": "Amazing Spider-Man #300 (CGC 9.8) 1988 White Pages, 1st Appearance of Venom 1988", | |
| 1431 | + "price": 2900, | |
| 1432 | + "ebayId": "257386980750", | |
| 1433 | + "listedPrice": null | |
| 1434 | + }, | |
| 1435 | + { | |
| 1436 | + "tab": "manual-only", | |
| 1437 | + "date": "2026-05-20", | |
| 1438 | + "title": "Amazing Spider-Man #300 CGC 9.8 (1988) Marvel Comics Venom McFarlane 1988", | |
| 1439 | + "price": 2500, | |
| 1440 | + "ebayId": "377193510279", | |
| 1441 | + "listedPrice": null | |
| 1442 | + }, | |
| 1443 | + { | |
| 1444 | + "tab": "manual-only", | |
| 1445 | + "date": "2026-05-14", | |
| 1446 | + "title": "The Amazing Spider-Man #300 (Marvel, 1988) CGC NM/MT 9.8 White pages....", | |
| 1447 | + "price": 2257, | |
| 1448 | + "ebayId": null, | |
| 1449 | + "listedPrice": null | |
| 1450 | + }, | |
| 1451 | + { | |
| 1452 | + "tab": "loose-and-manual", | |
| 1453 | + "date": "2023-12-31", | |
| 1454 | + "title": "Amazing Spider-Man #300 1988 . 1st App Of Venom Todd McFarlane CBCS 2.5 1988", | |
| 1455 | + "price": 209.99, | |
| 1456 | + "ebayId": "176128847439", | |
| 1457 | + "listedPrice": null | |
| 1458 | + }, | |
| 1459 | + { | |
| 1460 | + "tab": "loose-and-manual", | |
| 1461 | + "date": "2023-11-26", | |
| 1462 | + "title": "Amazing Spider-Man #300 1st Appearance Venom CGC 2.0 Custom Label 1988", | |
| 1463 | + "price": 275, | |
| 1464 | + "ebayId": "235296110124", | |
| 1465 | + "listedPrice": null | |
| 1466 | + }, | |
| 1467 | + { | |
| 1468 | + "tab": "loose-and-manual", | |
| 1469 | + "date": "2023-03-13", | |
| 1470 | + "title": "The Amazing Spider-Man #300 (Marvel, 1988) CBCS GD 2.0 Off-white pages....", | |
| 1471 | + "price": 159, | |
| 1472 | + "ebayId": null, | |
| 1473 | + "listedPrice": null | |
| 1474 | + }, | |
| 1475 | + { | |
| 1476 | + "tab": "loose-and-manual", | |
| 1477 | + "date": "2023-02-09", | |
| 1478 | + "title": "AMAZING SPIDER-MAN #300 CGC 2.5 1ST APPEARANCE OF VENOM 1988", | |
| 1479 | + "price": 220, | |
| 1480 | + "ebayId": "234887328594", | |
| 1481 | + "listedPrice": null | |
| 1482 | + }, | |
| 1483 | + { | |
| 1484 | + "tab": "loose-and-manual", | |
| 1485 | + "date": "2022-10-30", | |
| 1486 | + "title": "CBCS 2.0 GD THE AMAZING SPIDER-MAN COMIC (MARVEL,1988) #300 1ST VENOM COPPER AGE 1988 #300", | |
| 1487 | + "price": 280, | |
| 1488 | + "ebayId": "155198611027", | |
| 1489 | + "listedPrice": null | |
| 1490 | + }, | |
| 1491 | + { | |
| 1492 | + "tab": "loose-and-manual", | |
| 1493 | + "date": "2022-09-25", | |
| 1494 | + "title": "Amazing Spider-Man 300 CGC 2.5 Origin & 1st Appearance VENOM News Stand SWEET! 1988 #300", | |
| 1495 | + "price": 199, | |
| 1496 | + "ebayId": "175428054293", | |
| 1497 | + "listedPrice": null | |
| 1498 | + }, | |
| 1499 | + { | |
| 1500 | + "tab": "box-and-manual", | |
| 1501 | + "date": "2026-09-04", | |
| 1502 | + "title": "Amazing Spider-Man #300 CGC 9.6 WP NM+ Marvel Comics 1988 McFarlane 1st Venom 1988", | |
| 1503 | + "price": 999.99, | |
| 1504 | + "ebayId": "117394454230", | |
| 1505 | + "listedPrice": null | |
| 1506 | + }, | |
| 1507 | + { | |
| 1508 | + "tab": "box-and-manual", | |
| 1509 | + "date": "2026-09-04", | |
| 1510 | + "title": "The Amazing Spider-Man #300 Todd McFarlane White Pages CGC Graded 9.6/Near Mint 1988", | |
| 1511 | + "price": 925, | |
| 1512 | + "ebayId": "257717308643", | |
| 1513 | + "listedPrice": 979.99 | |
| 1514 | + }, | |
| 1515 | + { | |
| 1516 | + "tab": "box-and-manual", | |
| 1517 | + "date": "2026-09-04", | |
| 1518 | + "title": "Marvel The Amazing Spider-Man #300 (1988) CGC 9.6 McFarlane 25th Anniv!WOW!LOOK 1988", | |
| 1519 | + "price": 979, | |
| 1520 | + "ebayId": "407175153396", | |
| 1521 | + "listedPrice": null | |
| 1522 | + }, | |
| 1523 | + { | |
| 1524 | + "tab": "box-and-manual", | |
| 1525 | + "date": "2026-09-03", | |
| 1526 | + "title": "Amazing Spider-Man #300 CGC 9.6 Origin & 1st Full App of Venom Todd McFarlane 1988", | |
| 1527 | + "price": 950, | |
| 1528 | + "ebayId": "198608711337", | |
| 1529 | + "listedPrice": null | |
| 1530 | + }, | |
| 1531 | + { | |
| 1532 | + "tab": "box-and-manual", | |
| 1533 | + "date": "2026-09-02", | |
| 1534 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) CGC 9.6 1988", | |
| 1535 | + "price": 1025, | |
| 1536 | + "ebayId": "800563653756", | |
| 1537 | + "listedPrice": null | |
| 1538 | + }, | |
| 1539 | + { | |
| 1540 | + "tab": "box-and-manual", | |
| 1541 | + "date": "2026-09-01", | |
| 1542 | + "title": "Amazing Spider-Man #300 CGC 9.6 WP NM+ Marvel Comics 1988 McFarlane 1st Venom 1988", | |
| 1543 | + "price": 1150, | |
| 1544 | + "ebayId": "128042319838", | |
| 1545 | + "listedPrice": null | |
| 1546 | + }, | |
| 1547 | + { | |
| 1548 | + "tab": "box-and-manual", | |
| 1549 | + "date": "2026-08-25", | |
| 1550 | + "title": "Amazing Spider-Man #300 Origin & 1st App. Venom McFarlane Marvel 1988 CGC 9.6 1988", | |
| 1551 | + "price": 1175, | |
| 1552 | + "ebayId": "318731745317", | |
| 1553 | + "listedPrice": null | |
| 1554 | + }, | |
| 1555 | + { | |
| 1556 | + "tab": "box-and-manual", | |
| 1557 | + "date": "2026-08-17", | |
| 1558 | + "title": "THE AMAZING SPIDER-MAN #300 SPECIAL 25TH ANNIVERSARY ISSUE 9.6 CGC GRADE", | |
| 1559 | + "price": 1000, | |
| 1560 | + "ebayId": "168576065372", | |
| 1561 | + "listedPrice": 1100 | |
| 1562 | + }, | |
| 1563 | + { | |
| 1564 | + "tab": "box-and-manual", | |
| 1565 | + "date": "2026-08-13", | |
| 1566 | + "title": "Amazing Spider-Man #300 CGC 9.6 White Pages 1st Full Appearance Venom 1988Direct 1988", | |
| 1567 | + "price": 1250, | |
| 1568 | + "ebayId": "318647976575", | |
| 1569 | + "listedPrice": null | |
| 1570 | + }, | |
| 1571 | + { | |
| 1572 | + "tab": "box-and-manual", | |
| 1573 | + "date": "2026-08-12", | |
| 1574 | + "title": "Amazing Spider-Man #300 CGC 9.6 Marvel 5/88 FIRST 1st Venom McFarlane", | |
| 1575 | + "price": 940, | |
| 1576 | + "ebayId": "278266980569", | |
| 1577 | + "listedPrice": 990 | |
| 1578 | + }, | |
| 1579 | + { | |
| 1580 | + "tab": "box-and-manual", | |
| 1581 | + "date": "2026-08-08", | |
| 1582 | + "title": "Marvel The Amazing Spider-Man #300 (1988) CGC 9.6 McFarlane 25th Anniv 1988", | |
| 1583 | + "price": 950, | |
| 1584 | + "ebayId": "287495697325", | |
| 1585 | + "listedPrice": null | |
| 1586 | + }, | |
| 1587 | + { | |
| 1588 | + "tab": "box-and-manual", | |
| 1589 | + "date": "2026-08-07", | |
| 1590 | + "title": "Amazing Spiderman #300 CGC 9.6 Comic Book 1988 1st App. of Venom KEY 1988", | |
| 1591 | + "price": 1000, | |
| 1592 | + "ebayId": "407048182415", | |
| 1593 | + "listedPrice": 1100 | |
| 1594 | + }, | |
| 1595 | + { | |
| 1596 | + "tab": "box-and-manual", | |
| 1597 | + "date": "2026-08-01", | |
| 1598 | + "title": "AMAZING SPIDER-MAN #300 1ST FULL VENOM! MARVEL COMICS, 1988 CGC 9.6 WHITE PAGES! 1988", | |
| 1599 | + "price": 912.47, | |
| 1600 | + "ebayId": "117294274308", | |
| 1601 | + "listedPrice": 1403.8 | |
| 1602 | + }, | |
| 1603 | + { | |
| 1604 | + "tab": "box-and-manual", | |
| 1605 | + "date": "2026-07-19", | |
| 1606 | + "title": "Amazing Spider-Man 300 Cgc 9.6 1st Appearance of Venom 1988 1988 #300", | |
| 1607 | + "price": 1200, | |
| 1608 | + "ebayId": "188649294347", | |
| 1609 | + "listedPrice": null | |
| 1610 | + }, | |
| 1611 | + { | |
| 1612 | + "tab": "box-and-manual", | |
| 1613 | + "date": "2026-07-10", | |
| 1614 | + "title": "Amazing Spider-Man #300 CGC 9.6 (1988) 1st Full Venom Todd McFarlane 1988", | |
| 1615 | + "price": 997, | |
| 1616 | + "ebayId": "117289934792", | |
| 1617 | + "listedPrice": 1049.99 | |
| 1618 | + }, | |
| 1619 | + { | |
| 1620 | + "tab": "box-and-manual", | |
| 1621 | + "date": "2026-07-09", | |
| 1622 | + "title": "AMAZING SPIDER-MAN #300 1ST FULL VENOM! MARVEL COMICS, 1988 CGC 9.6 WHITE PAGES! 1988", | |
| 1623 | + "price": 848.93, | |
| 1624 | + "ebayId": "117292575444", | |
| 1625 | + "listedPrice": 1386 | |
| 1626 | + }, | |
| 1627 | + { | |
| 1628 | + "tab": "box-and-manual", | |
| 1629 | + "date": "2026-07-09", | |
| 1630 | + "title": "AMAZING SPIDER-MAN #300 1ST FULL VENOM! MARVEL COMICS, 1988 CGC 9.6 WHITE PAGES! 1988", | |
| 1631 | + "price": 866.25, | |
| 1632 | + "ebayId": "117251324456", | |
| 1633 | + "listedPrice": 1386 | |
| 1634 | + }, | |
| 1635 | + { | |
| 1636 | + "tab": "box-and-manual", | |
| 1637 | + "date": "2026-07-07", | |
| 1638 | + "title": "Amazing Spider-Man 300 Cgc 9.6 1st Appearance of Venom 1988 1988 #300", | |
| 1639 | + "price": 857.57, | |
| 1640 | + "ebayId": "168504514015", | |
| 1641 | + "listedPrice": null | |
| 1642 | + }, | |
| 1643 | + { | |
| 1644 | + "tab": "box-and-manual", | |
| 1645 | + "date": "2026-07-07", | |
| 1646 | + "title": "AMAZING SPIDER-MAN 300 CGC 9.6 FIRST FULL APPEARANCE OF VENOM!!!! TODD MCFARLANE 1988 #300", | |
| 1647 | + "price": 821.51, | |
| 1648 | + "ebayId": "227410251491", | |
| 1649 | + "listedPrice": null | |
| 1650 | + }, | |
| 1651 | + { | |
| 1652 | + "tab": "box-and-manual", | |
| 1653 | + "date": "2026-07-04", | |
| 1654 | + "title": "🕸️AMAZING SPIDERMAN #300 1ST APPEARANCE OF VENOM (CGC 9.6 WHITE PAGES)🕸️ 1988", | |
| 1655 | + "price": 1050, | |
| 1656 | + "ebayId": "398132571034", | |
| 1657 | + "listedPrice": null | |
| 1658 | + }, | |
| 1659 | + { | |
| 1660 | + "tab": "box-and-manual", | |
| 1661 | + "date": "2026-07-01", | |
| 1662 | + "title": "Amazing Spiderman #300 CGC 9.6 Origin & 1st Full App. Of Venom (Eddie Brock) 1988", | |
| 1663 | + "price": 1090.32, | |
| 1664 | + "ebayId": "358411516822", | |
| 1665 | + "listedPrice": 1244.37 | |
| 1666 | + }, | |
| 1667 | + { | |
| 1668 | + "tab": "box-and-manual", | |
| 1669 | + "date": "2026-06-21", | |
| 1670 | + "title": "Amazing Spider-Man #300 Direct CGC 9.6 1988 3765452005 1st full app. Venom 1988", | |
| 1671 | + "price": 1160, | |
| 1672 | + "ebayId": "318410399746", | |
| 1673 | + "listedPrice": null | |
| 1674 | + }, | |
| 1675 | + { | |
| 1676 | + "tab": "box-and-manual", | |
| 1677 | + "date": "2026-06-20", | |
| 1678 | + "title": "Amazing Spider-Man #300 1988 Direct CGC 9.6 White 1st Full Venom Marvel Comics 1988", | |
| 1679 | + "price": 1050, | |
| 1680 | + "ebayId": "168472193692", | |
| 1681 | + "listedPrice": 1160 | |
| 1682 | + }, | |
| 1683 | + { | |
| 1684 | + "tab": "box-and-manual", | |
| 1685 | + "date": "2026-06-17", | |
| 1686 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) 1988", | |
| 1687 | + "price": 999, | |
| 1688 | + "ebayId": "267664156831", | |
| 1689 | + "listedPrice": null | |
| 1690 | + }, | |
| 1691 | + { | |
| 1692 | + "tab": "box-and-manual", | |
| 1693 | + "date": "2026-06-15", | |
| 1694 | + "title": "The Amazing Spider-Man #300 CGC 9.6 Direct Variant FIRST VENOM APPEARENCE 1988", | |
| 1695 | + "price": 1000, | |
| 1696 | + "ebayId": "306989228150", | |
| 1697 | + "listedPrice": null | |
| 1698 | + }, | |
| 1699 | + { | |
| 1700 | + "tab": "box-and-manual", | |
| 1701 | + "date": "2026-06-04", | |
| 1702 | + "title": "Amazing Spider-Man #300 CGC 9.6 White Pages | Marvel 1988 | 1st Venom McFarlane 1988", | |
| 1703 | + "price": 960, | |
| 1704 | + "ebayId": "406906259713", | |
| 1705 | + "listedPrice": 1150 | |
| 1706 | + }, | |
| 1707 | + { | |
| 1708 | + "tab": "box-and-manual", | |
| 1709 | + "date": "2026-05-30", | |
| 1710 | + "title": "Amazing Spider-Man #300 CGC NM+ 9.6 White Pages 1st Full Appearance Venom! 1988", | |
| 1711 | + "price": 1139, | |
| 1712 | + "ebayId": "389990923456", | |
| 1713 | + "listedPrice": null | |
| 1714 | + }, | |
| 1715 | + { | |
| 1716 | + "tab": "box-and-manual", | |
| 1717 | + "date": "2026-05-27", | |
| 1718 | + "title": "AMAZING SPIDER-MAN #300 1st Full VENOM 1988 McFarlane CGC 9.6 (White Pages) 1988", | |
| 1719 | + "price": 860, | |
| 1720 | + "ebayId": "267672759028", | |
| 1721 | + "listedPrice": null | |
| 1722 | + }, | |
| 1723 | + { | |
| 1724 | + "tab": "box-and-manual", | |
| 1725 | + "date": "2026-05-27", | |
| 1726 | + "title": "Amazing Spider-Man #300 CGC 9.6 WP NM+ Marvel Comics 1988 McFarlane 1st Venom 1988", | |
| 1727 | + "price": 958, | |
| 1728 | + "ebayId": "127873653678", | |
| 1729 | + "listedPrice": null | |
| 1730 | + }, | |
| 1731 | + { | |
| 1732 | + "tab": "box-and-manual", | |
| 1733 | + "date": "2026-05-19", | |
| 1734 | + "title": "Amazing Spider-Man #300 CGC 9.6 Origin & 1st Full App of Venom Todd McFarlane 1988", | |
| 1735 | + "price": 990, | |
| 1736 | + "ebayId": "168366373336", | |
| 1737 | + "listedPrice": 1100 | |
| 1738 | + }, | |
| 1739 | + { | |
| 1740 | + "tab": "grade-three", | |
| 1741 | + "date": "2025-12-02", | |
| 1742 | + "title": "The Amazing Spider-Man #300 (Marvel, 1988) CGC VG- 3.5 White pages....", | |
| 1743 | + "price": 149, | |
| 1744 | + "ebayId": null, | |
| 1745 | + "listedPrice": null | |
| 1746 | + }, | |
| 1747 | + { | |
| 1748 | + "tab": "grade-three", | |
| 1749 | + "date": "2023-07-11", | |
| 1750 | + "title": "AMAZING SPIDER-MAN #300 - 1st Appearance VENOM CBCS 3.5 1988", | |
| 1751 | + "price": 320, | |
| 1752 | + "ebayId": "334920779350", | |
| 1753 | + "listedPrice": null | |
| 1754 | + }, | |
| 1755 | + { | |
| 1756 | + "tab": "grade-three", | |
| 1757 | + "date": "2023-06-17", | |
| 1758 | + "title": "AMAZING SPIDER-MAN #300 - 1st Appearance VENOM CBCS 3.5 1988", | |
| 1759 | + "price": 202.5, | |
| 1760 | + "ebayId": "225613129896", | |
| 1761 | + "listedPrice": null | |
| 1762 | + }, | |
| 1763 | + { | |
| 1764 | + "tab": "grade-three", | |
| 1765 | + "date": "2023-06-14", | |
| 1766 | + "title": "Amazing Spider-Man #300 (News) CBCS 3.5 McFarlane, 1st Full & Origin Venom 1988", | |
| 1767 | + "price": 299, | |
| 1768 | + "ebayId": "295758804612", | |
| 1769 | + "listedPrice": null | |
| 1770 | + }, | |
| 1771 | + { | |
| 1772 | + "tab": "grade-three", | |
| 1773 | + "date": "2023-06-13", | |
| 1774 | + "title": "Amazing Spider-Man #300 (News) CBCS 3.5 McFarlane, 1st Full & Origin Venom 1988", | |
| 1775 | + "price": 194.5, | |
| 1776 | + "ebayId": "304970561805", | |
| 1777 | + "listedPrice": null | |
| 1778 | + }, | |
| 1779 | + { | |
| 1780 | + "tab": "grade-three", | |
| 1781 | + "date": "2022-02-14", | |
| 1782 | + "title": "AMAZING SPIDER-MAN #300 CGC 3.5 VG- ORIGIN & 1ST APPEARANCE OF VENOM NEW LABEL 1988 #300", | |
| 1783 | + "price": 350, | |
| 1784 | + "ebayId": "384721294807", | |
| 1785 | + "listedPrice": null | |
| 1786 | + }, | |
| 1787 | + { | |
| 1788 | + "tab": "grade-three", | |
| 1789 | + "date": "2022-01-31", | |
| 1790 | + "title": "AMAZING SPIDER-MAN #300 CGC 3.5 VG- ORIGIN & 1ST APPEARANCE OF VENOM NEW LABEL 1988 #300", | |
| 1791 | + "price": 365, | |
| 1792 | + "ebayId": "384697484507", | |
| 1793 | + "listedPrice": null | |
| 1794 | + }, | |
| 1795 | + { | |
| 1796 | + "tab": "grade-three", | |
| 1797 | + "date": "2021-10-03", | |
| 1798 | + "title": "ASM AMAZING SPIDER-MAN 300 CGC 3.5 OW/ WHITE Pages FIRST VENOM not press/cleaned 1988 #300", | |
| 1799 | + "price": 425, | |
| 1800 | + "ebayId": "265334200848", | |
| 1801 | + "listedPrice": null | |
| 1802 | + }, | |
| 1803 | + { | |
| 1804 | + "tab": "grade-four", | |
| 1805 | + "date": "2026-07-09", | |
| 1806 | + "title": "Amazing Spider-Man #300 ( Marvel, 1988) CGC 5.5 1st Full App. & Origin Venom! 1988", | |
| 1807 | + "price": 274, | |
| 1808 | + "ebayId": "178282469532", | |
| 1809 | + "listedPrice": null | |
| 1810 | + }, | |
| 1811 | + { | |
| 1812 | + "tab": "grade-four", | |
| 1813 | + "date": "2026-05-19", | |
| 1814 | + "title": "Amazing Spider-Man #300 CGC 5.0 1988 1st Appearance Of Venom Marvel Comics 1988", | |
| 1815 | + "price": 250, | |
| 1816 | + "ebayId": "257509504433", | |
| 1817 | + "listedPrice": null | |
| 1818 | + }, | |
| 1819 | + { | |
| 1820 | + "tab": "grade-four", | |
| 1821 | + "date": "2026-04-23", | |
| 1822 | + "title": "AMAZING SPIDER-MAN 300 CGC 5.5 1ST FULL APPEARANCE VENOM. Custom CGC Banner! 1988 #300", | |
| 1823 | + "price": 270, | |
| 1824 | + "ebayId": "277916549653", | |
| 1825 | + "listedPrice": 325 | |
| 1826 | + }, | |
| 1827 | + { | |
| 1828 | + "tab": "grade-four", | |
| 1829 | + "date": "2026-02-26", | |
| 1830 | + "title": "Amazing Spider-Man #300 CGC 5.0 - Venom Custom Label 1988", | |
| 1831 | + "price": 445, | |
| 1832 | + "ebayId": "225797272597", | |
| 1833 | + "listedPrice": null | |
| 1834 | + }, | |
| 1835 | + { | |
| 1836 | + "tab": "grade-four", | |
| 1837 | + "date": "2025-12-02", | |
| 1838 | + "title": "The Amazing Spider-Man #300 (Marvel, 1988) CGC FN- 5.5 Off-white to white pages....", | |
| 1839 | + "price": 216, | |
| 1840 | + "ebayId": null, | |
| 1841 | + "listedPrice": null | |
| 1842 | + }, | |
| 1843 | + { | |
| 1844 | + "tab": "grade-four", | |
| 1845 | + "date": "2025-11-03", | |
| 1846 | + "title": "The Amazing Spider-man #300 1988 cgc 5.5 key issue. First appearance of Venom 1988", | |
| 1847 | + "price": 280, | |
| 1848 | + "ebayId": "356500727684", | |
| 1849 | + "listedPrice": null | |
| 1850 | + }, | |
| 1851 | + { | |
| 1852 | + "tab": "grade-four", | |
| 1853 | + "date": "2025-10-20", | |
| 1854 | + "title": "The Amazing Spider-Man #300 (1988) - Origin and 1st Full App. of Venom - CGC 5.0 1988", | |
| 1855 | + "price": 230, | |
| 1856 | + "ebayId": "236400906594", | |
| 1857 | + "listedPrice": null | |
| 1858 | + }, | |
| 1859 | + { | |
| 1860 | + "tab": "grade-four", | |
| 1861 | + "date": "2025-09-29", | |
| 1862 | + "title": "Amazing Spiderman #300 (1988) First Full Venom, McFarlane CGC 5.0 1988", | |
| 1863 | + "price": 300, | |
| 1864 | + "ebayId": "286740909178", | |
| 1865 | + "listedPrice": null | |
| 1866 | + }, | |
| 1867 | + { | |
| 1868 | + "tab": "grade-four", | |
| 1869 | + "date": "2025-08-22", | |
| 1870 | + "title": "Marvel Comics Amazing Spiderman #300 CGC 5.0 OWW Origin 1st appearance of Venom 1988", | |
| 1871 | + "price": 300, | |
| 1872 | + "ebayId": "205672122794", | |
| 1873 | + "listedPrice": null | |
| 1874 | + }, | |
| 1875 | + { | |
| 1876 | + "tab": "grade-four", | |
| 1877 | + "date": "2025-06-24", | |
| 1878 | + "title": "AMAZING SPIDER-MAN #300 CGC 5.5 FN- 1988 1ST APPEARANCE OF VENOM MARVEL COMICS 1988", | |
| 1879 | + "price": 319.97, | |
| 1880 | + "ebayId": "267178261533", | |
| 1881 | + "listedPrice": null | |
| 1882 | + }, | |
| 1883 | + { | |
| 1884 | + "tab": "grade-four", | |
| 1885 | + "date": "2025-02-26", | |
| 1886 | + "title": "Amazing Spider-Man #300 CGC 5.5 1st Full App of Venom Classic Cover 1988", | |
| 1887 | + "price": 303.36, | |
| 1888 | + "ebayId": "226595696529", | |
| 1889 | + "listedPrice": null | |
| 1890 | + }, | |
| 1891 | + { | |
| 1892 | + "tab": "grade-four", | |
| 1893 | + "date": "2025-02-20", | |
| 1894 | + "title": "Amazing Spider-Man #300 1988 CGC 5.0 (1st Full App of Venom) 1988", | |
| 1895 | + "price": 300, | |
| 1896 | + "ebayId": "197027104116", | |
| 1897 | + "listedPrice": null | |
| 1898 | + }, | |
| 1899 | + { | |
| 1900 | + "tab": "grade-four", | |
| 1901 | + "date": "2025-01-05", | |
| 1902 | + "title": "The Amazing Spider-Man #300 (Marvel Comics 1988) 1st Appearance Venom! CGC 5.5 1988", | |
| 1903 | + "price": 339.99, | |
| 1904 | + "ebayId": "156543839613", | |
| 1905 | + "listedPrice": null | |
| 1906 | + }, | |
| 1907 | + { | |
| 1908 | + "tab": "grade-four", | |
| 1909 | + "date": "2024-11-15", | |
| 1910 | + "title": "Amazing Spider-Man #300, CGC 5.5, Marvel May 1988, 1st Venom, Todd McFarlane 1988", | |
| 1911 | + "price": 324.99, | |
| 1912 | + "ebayId": "186561818320", | |
| 1913 | + "listedPrice": null | |
| 1914 | + }, | |
| 1915 | + { | |
| 1916 | + "tab": "grade-four", | |
| 1917 | + "date": "2024-04-13", | |
| 1918 | + "title": "Amazing Spider-Man #300 CGC 5.0 3877185003 Venom Label 1st Appearance Key Issue 1988", | |
| 1919 | + "price": 267.55, | |
| 1920 | + "ebayId": "204729559558", | |
| 1921 | + "listedPrice": null | |
| 1922 | + }, | |
| 1923 | + { | |
| 1924 | + "tab": "grade-four", | |
| 1925 | + "date": "2023-12-17", | |
| 1926 | + "title": "AMAZING SPIDER-MAN #300 CGC 5.5 1st Full App. Venom Marvel Comics 1988 McFarlane 1988", | |
| 1927 | + "price": 200, | |
| 1928 | + "ebayId": "196125256635", | |
| 1929 | + "listedPrice": null | |
| 1930 | + }, | |
| 1931 | + { | |
| 1932 | + "tab": "grade-four", | |
| 1933 | + "date": "2023-10-22", | |
| 1934 | + "title": "Amazing Spider-Man #300 CGC 5.0 - Origin and First Appearance of Venom! 1988", | |
| 1935 | + "price": 371.19, | |
| 1936 | + "ebayId": "386174405268", | |
| 1937 | + "listedPrice": null | |
| 1938 | + }, | |
| 1939 | + { | |
| 1940 | + "tab": "grade-four", | |
| 1941 | + "date": "2023-09-03", | |
| 1942 | + "title": "Amazing Spider-Man # 300, Marvel 5/1988, CGC 5.5, Venom’s 1st full appearance 1988", | |
| 1943 | + "price": 250.57, | |
| 1944 | + "ebayId": "204448698265", | |
| 1945 | + "listedPrice": null | |
| 1946 | + }, | |
| 1947 | + { | |
| 1948 | + "tab": "grade-four", | |
| 1949 | + "date": "2023-08-20", | |
| 1950 | + "title": "Amazing Spider-Man #300 Direct Variant CBCS 5.5 1988 1st Venom 1988", | |
| 1951 | + "price": 265, | |
| 1952 | + "ebayId": "404437228921", | |
| 1953 | + "listedPrice": null | |
| 1954 | + }, | |
| 1955 | + { | |
| 1956 | + "tab": "grade-four", | |
| 1957 | + "date": "2023-08-13", | |
| 1958 | + "title": "Amazing Spider-Man #300 Direct Variant CGC 5.0 1988 0292363009 1st Venom 1988", | |
| 1959 | + "price": 359, | |
| 1960 | + "ebayId": "204413101137", | |
| 1961 | + "listedPrice": null | |
| 1962 | + }, | |
| 1963 | + { | |
| 1964 | + "tab": "grade-four", | |
| 1965 | + "date": "2023-06-30", | |
| 1966 | + "title": "The Amazing Spider-Man #300 CGC 5.5 1988", | |
| 1967 | + "price": 380, | |
| 1968 | + "ebayId": "334922136759", | |
| 1969 | + "listedPrice": null | |
| 1970 | + }, | |
| 1971 | + { | |
| 1972 | + "tab": "grade-four", | |
| 1973 | + "date": "2023-06-30", | |
| 1974 | + "title": "1988 Amazing Spider-Man 300 CGC 5.0 1st Venom 1988 #300", | |
| 1975 | + "price": 350, | |
| 1976 | + "ebayId": "225541243580", | |
| 1977 | + "listedPrice": null | |
| 1978 | + }, | |
| 1979 | + { | |
| 1980 | + "tab": "grade-four", | |
| 1981 | + "date": "2023-05-28", | |
| 1982 | + "title": "Amazing Spider-Man #300 (1988) CGC 5.0 - KEY 1st Full Venom Appearance.. 1988", | |
| 1983 | + "price": 300, | |
| 1984 | + "ebayId": "325671871507", | |
| 1985 | + "listedPrice": null | |
| 1986 | + }, | |
| 1987 | + { | |
| 1988 | + "tab": "grade-four", | |
| 1989 | + "date": "2023-05-14", | |
| 1990 | + "title": "AMAZING SPIDER-MAN # 300 5.5 CGC (same as CBCS) Last Black Suit 1st Full Venom 1988", | |
| 1991 | + "price": 329.99, | |
| 1992 | + "ebayId": "235002501904", | |
| 1993 | + "listedPrice": null | |
| 1994 | + }, | |
| 1995 | + { | |
| 1996 | + "tab": "grade-four", | |
| 1997 | + "date": "2023-03-07", | |
| 1998 | + "title": "Amazing Spider-Man #300 CGC Grade 5.0 - Todd McFarlane Art, 1st appearance Venom 1988 #300", | |
| 1999 | + "price": 344.99, | |
| 2000 | + "ebayId": "325553385057", | |
| 2001 | + "listedPrice": null | |
| 2002 | + }, | |
| 2003 | + { | |
| 2004 | + "tab": "grade-four", | |
| 2005 | + "date": "2023-02-22", | |
| 2006 | + "title": "AMAZING SPIDER-MAN #300 - Origin/1st Full Appearance VENOM! CGC 5.5 1988 #300", | |
| 2007 | + "price": 375, | |
| 2008 | + "ebayId": "134046072348", | |
| 2009 | + "listedPrice": null | |
| 2010 | + }, | |
| 2011 | + { | |
| 2012 | + "tab": "grade-four", | |
| 2013 | + "date": "2023-02-19", | |
| 2014 | + "title": "Amazing Spider-Man 300 1988 Marvel Comics CGC 5.0 OFF-WHITE TO WHITE 2020 #300", | |
| 2015 | + "price": 419.95, | |
| 2016 | + "ebayId": "385040540943", | |
| 2017 | + "listedPrice": null | |
| 2018 | + }, | |
| 2019 | + { | |
| 2020 | + "tab": "grade-four", | |
| 2021 | + "date": "2023-02-12", | |
| 2022 | + "title": "AMAZING SPIDER-MAN #300 CGC 5.5 WHITE PAGES // ORIGIN + 1ST FULL APP VENOM 1988 1988", | |
| 2023 | + "price": 322.46, | |
| 2024 | + "ebayId": "394448080907", | |
| 2025 | + "listedPrice": null | |
| 2026 | + }, | |
| 2027 | + { | |
| 2028 | + "tab": "grade-four", | |
| 2029 | + "date": "2023-01-04", | |
| 2030 | + "title": "AMAZING SPIDER-MAN #300 CBCS 5.5 OW/W ORIGIN + 1ST FULL APP VENOM 1988 #300", | |
| 2031 | + "price": 425, | |
| 2032 | + "ebayId": "185505886153", | |
| 2033 | + "listedPrice": null | |
| 2034 | + }, | |
| 2035 | + { | |
| 2036 | + "tab": "grade-four", | |
| 2037 | + "date": "2022-12-24", | |
| 2038 | + "title": "Amazing Spider-Man Spiderman #300 CBCS Graded 5.0 First Appearance Venom 1988", | |
| 2039 | + "price": 290, | |
| 2040 | + "ebayId": "155236462398", | |
| 2041 | + "listedPrice": null | |
| 2042 | + }, | |
| 2043 | + { | |
| 2044 | + "tab": "grade-five", | |
| 2045 | + "date": "2026-09-03", | |
| 2046 | + "title": "Amazing Spider-Man #300 CGC 7.5 ~ FIRST APPEARANCE VENOM 🕷️ 1988", | |
| 2047 | + "price": 396, | |
| 2048 | + "ebayId": "147531834116", | |
| 2049 | + "listedPrice": null | |
| 2050 | + }, | |
| 2051 | + { | |
| 2052 | + "tab": "grade-five", | |
| 2053 | + "date": "2026-08-17", | |
| 2054 | + "title": "Marvel Comics The Amazing Spider-Man #300 CGC 7.0 25th Anniv Key 1st Venom 1988", | |
| 2055 | + "price": 400, | |
| 2056 | + "ebayId": "206217068305", | |
| 2057 | + "listedPrice": 420 | |
| 2058 | + }, | |
| 2059 | + { | |
| 2060 | + "tab": "grade-five", | |
| 2061 | + "date": "2026-08-17", | |
| 2062 | + "title": "Marvel Amazing Spider-Man #300 (1988) CGC 7.0 Key Issue 1st Venom 1988", | |
| 2063 | + "price": 400, | |
| 2064 | + "ebayId": "318725400217", | |
| 2065 | + "listedPrice": 460 | |
| 2066 | + }, | |
| 2067 | + { | |
| 2068 | + "tab": "grade-five", | |
| 2069 | + "date": "2026-08-05", | |
| 2070 | + "title": "The Amazing Spider-Man #300 Marvel Comics 1988 Bought N SeaId In The Uk CGC 7.0 1988", | |
| 2071 | + "price": 250, | |
| 2072 | + "ebayId": "128004862661", | |
| 2073 | + "listedPrice": null | |
| 2074 | + }, | |
| 2075 | + { | |
| 2076 | + "tab": "grade-five", | |
| 2077 | + "date": "2026-08-02", | |
| 2078 | + "title": "Amazing Spider-Man #300 (1988) WP CGC 7.5 Origin & First Full Appearance Venom! 1988", | |
| 2079 | + "price": 350, | |
| 2080 | + "ebayId": "206455958608", | |
| 2081 | + "listedPrice": 399 | |
| 2082 | + }, | |
| 2083 | + { | |
| 2084 | + "tab": "grade-five", | |
| 2085 | + "date": "2026-08-02", | |
| 2086 | + "title": "Amazing Spider-Man 300 CGC 7.0 FN/VF W/Pages 1988 #300", | |
| 2087 | + "price": 345, | |
| 2088 | + "ebayId": "257646348415", | |
| 2089 | + "listedPrice": null | |
| 2090 | + }, | |
| 2091 | + { | |
| 2092 | + "tab": "grade-five", | |
| 2093 | + "date": "2026-07-31", | |
| 2094 | + "title": "Marvel Amazing Spider-Man #300 CBCS 7.0 1st Full Appearance Venom Eddie Brock", | |
| 2095 | + "price": 380, | |
| 2096 | + "ebayId": "257640608539", | |
| 2097 | + "listedPrice": null | |
| 2098 | + }, | |
| 2099 | + { | |
| 2100 | + "tab": "grade-five", | |
| 2101 | + "date": "2026-06-29", | |
| 2102 | + "title": "Amazing Spider-Man 300 CGC 7.0 Origin & 1st App of Venom 1988 1988 #300", | |
| 2103 | + "price": 349.99, | |
| 2104 | + "ebayId": "407015921585", | |
| 2105 | + "listedPrice": null | |
| 2106 | + }, | |
| 2107 | + { | |
| 2108 | + "tab": "grade-five", | |
| 2109 | + "date": "2026-06-27", | |
| 2110 | + "title": "Amazing Spider-Man 300 CGC 7.0 Origin & 1st App of Venom 1988 1988 #300", | |
| 2111 | + "price": 349.99, | |
| 2112 | + "ebayId": "147386162180", | |
| 2113 | + "listedPrice": null | |
| 2114 | + }, | |
| 2115 | + { | |
| 2116 | + "tab": "grade-five", | |
| 2117 | + "date": "2026-06-12", | |
| 2118 | + "title": "Amazing Spider-Man #300 - Marvel Comics 1988 CGC 7.5 Origin + 1st full appearanc 1988", | |
| 2119 | + "price": 398, | |
| 2120 | + "ebayId": "358655623877", | |
| 2121 | + "listedPrice": null | |
| 2122 | + }, | |
| 2123 | + { | |
| 2124 | + "tab": "grade-five", | |
| 2125 | + "date": "2026-06-11", | |
| 2126 | + "title": "Amazing Spider-Man 300 CGC 7.5 1988 #300", | |
| 2127 | + "price": 400, | |
| 2128 | + "ebayId": "800135886056", | |
| 2129 | + "listedPrice": null | |
| 2130 | + }, | |
| 2131 | + { | |
| 2132 | + "tab": "grade-five", | |
| 2133 | + "date": "2026-05-31", | |
| 2134 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) CGC 7.5 1988", | |
| 2135 | + "price": 370, | |
| 2136 | + "ebayId": "277896606228", | |
| 2137 | + "listedPrice": 425 | |
| 2138 | + }, | |
| 2139 | + { | |
| 2140 | + "tab": "grade-five", | |
| 2141 | + "date": "2026-05-14", | |
| 2142 | + "title": "The Amazing Spider-Man #300 (Marvel, 1988) CGC VF- 7.5 White pages....", | |
| 2143 | + "price": 268, | |
| 2144 | + "ebayId": null, | |
| 2145 | + "listedPrice": null | |
| 2146 | + }, | |
| 2147 | + { | |
| 2148 | + "tab": "grade-five", | |
| 2149 | + "date": "2026-05-11", | |
| 2150 | + "title": "Amazing Spider-Man #300 CGC 7.5 1st Full Appearance Venom! 1988", | |
| 2151 | + "price": 360, | |
| 2152 | + "ebayId": "277976738662", | |
| 2153 | + "listedPrice": 399 | |
| 2154 | + }, | |
| 2155 | + { | |
| 2156 | + "tab": "grade-five", | |
| 2157 | + "date": "2026-05-10", | |
| 2158 | + "title": "Marvel Amazing Spider-Man #300 CBCS 7.0 Key Issue Venom Todd McFarlane Cover 1988", | |
| 2159 | + "price": 300, | |
| 2160 | + "ebayId": "389969871457", | |
| 2161 | + "listedPrice": null | |
| 2162 | + }, | |
| 2163 | + { | |
| 2164 | + "tab": "grade-five", | |
| 2165 | + "date": "2026-04-09", | |
| 2166 | + "title": "AMAZING SPIDERMAN 300 CGC 7.0 VENOM MCFARLANE 1988 MARVEL 1988 #300", | |
| 2167 | + "price": 325, | |
| 2168 | + "ebayId": "389867864488", | |
| 2169 | + "listedPrice": 350 | |
| 2170 | + }, | |
| 2171 | + { | |
| 2172 | + "tab": "grade-five", | |
| 2173 | + "date": "2026-03-17", | |
| 2174 | + "title": "Amazing Spider-Man #300 CGC VF- 7.5 White Pages 1st Full Appearance Venom! 1988", | |
| 2175 | + "price": 425, | |
| 2176 | + "ebayId": "257384297359", | |
| 2177 | + "listedPrice": null | |
| 2178 | + }, | |
| 2179 | + { | |
| 2180 | + "tab": "grade-five", | |
| 2181 | + "date": "2026-03-14", | |
| 2182 | + "title": "Amazing Spider-Man #300 / CGC 7.0 1st Venom Appearance! 1988", | |
| 2183 | + "price": 500, | |
| 2184 | + "ebayId": "287146357814", | |
| 2185 | + "listedPrice": null | |
| 2186 | + }, | |
| 2187 | + { | |
| 2188 | + "tab": "grade-five", | |
| 2189 | + "date": "2026-03-05", | |
| 2190 | + "title": "Amazing Spider-Man #300 CGC VF- 7.5 White Pages 1st Full Appearance Venom! 1988", | |
| 2191 | + "price": 350, | |
| 2192 | + "ebayId": "298086760015", | |
| 2193 | + "listedPrice": 395 | |
| 2194 | + }, | |
| 2195 | + { | |
| 2196 | + "tab": "grade-five", | |
| 2197 | + "date": "2026-02-18", | |
| 2198 | + "title": "The Amazing Spider-Man #300 1988 CGC 7.0 Key Issue First Appearance of Venom 1988", | |
| 2199 | + "price": 380, | |
| 2200 | + "ebayId": "397618348383", | |
| 2201 | + "listedPrice": 400 | |
| 2202 | + }, | |
| 2203 | + { | |
| 2204 | + "tab": "grade-five", | |
| 2205 | + "date": "2026-02-08", | |
| 2206 | + "title": "Amazing Spider-Man #300 / CGC 7.0 1st Venom Appearance! 1988", | |
| 2207 | + "price": 320, | |
| 2208 | + "ebayId": "317848936065", | |
| 2209 | + "listedPrice": 345 | |
| 2210 | + }, | |
| 2211 | + { | |
| 2212 | + "tab": "grade-five", | |
| 2213 | + "date": "2026-02-06", | |
| 2214 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) 1988", | |
| 2215 | + "price": 345, | |
| 2216 | + "ebayId": "336414889474", | |
| 2217 | + "listedPrice": null | |
| 2218 | + }, | |
| 2219 | + { | |
| 2220 | + "tab": "grade-five", | |
| 2221 | + "date": "2026-02-03", | |
| 2222 | + "title": "AMAZING SPIDER-MAN 300 CGC 7.0 F/VF ORIGIN AND 1ST VENOM MACFARLANE 1988 1988 #300", | |
| 2223 | + "price": 345, | |
| 2224 | + "ebayId": "227157269281", | |
| 2225 | + "listedPrice": 360 | |
| 2226 | + }, | |
| 2227 | + { | |
| 2228 | + "tab": "grade-five", | |
| 2229 | + "date": "2026-02-03", | |
| 2230 | + "title": "Amazing Spider-Man #300 CGC 7.5 Todd McFarlane 1st App Venom - White Pages 1988", | |
| 2231 | + "price": 375, | |
| 2232 | + "ebayId": "134324697510", | |
| 2233 | + "listedPrice": 399 | |
| 2234 | + }, | |
| 2235 | + { | |
| 2236 | + "tab": "grade-five", | |
| 2237 | + "date": "2026-02-01", | |
| 2238 | + "title": "Amazing Spider-Man 300 CGC 7.5 Venom Original, First Full Venom Appearance", | |
| 2239 | + "price": 375, | |
| 2240 | + "ebayId": "168072676855", | |
| 2241 | + "listedPrice": null | |
| 2242 | + }, | |
| 2243 | + { | |
| 2244 | + "tab": "grade-five", | |
| 2245 | + "date": "2026-01-28", | |
| 2246 | + "title": "Amazing Spider-Man #300 CGC VF- 7.5 White Pages 1st Full Appearance Venom! 1988", | |
| 2247 | + "price": 399, | |
| 2248 | + "ebayId": "389474683122", | |
| 2249 | + "listedPrice": null | |
| 2250 | + }, | |
| 2251 | + { | |
| 2252 | + "tab": "grade-five", | |
| 2253 | + "date": "2026-01-24", | |
| 2254 | + "title": "Amazing Spider-Man #300 CGC 7.5 OW/W Pages 1st Appearance Venom 1988", | |
| 2255 | + "price": 441.64, | |
| 2256 | + "ebayId": "168087650659", | |
| 2257 | + "listedPrice": null | |
| 2258 | + }, | |
| 2259 | + { | |
| 2260 | + "tab": "grade-five", | |
| 2261 | + "date": "2026-01-15", | |
| 2262 | + "title": "Amazing Spider-Man #300 CGC 7.5 Todd McFarlane First Venom 1988", | |
| 2263 | + "price": 330, | |
| 2264 | + "ebayId": "136912398104", | |
| 2265 | + "listedPrice": 400 | |
| 2266 | + }, | |
| 2267 | + { | |
| 2268 | + "tab": "grade-five", | |
| 2269 | + "date": "2026-01-08", | |
| 2270 | + "title": "Buy it Now for Ebay ID bonsi513 1988", | |
| 2271 | + "price": 628.85, | |
| 2272 | + "ebayId": "406568047908", | |
| 2273 | + "listedPrice": 632.47 | |
| 2274 | + }, | |
| 2275 | + { | |
| 2276 | + "tab": "grade-five", | |
| 2277 | + "date": "2026-01-07", | |
| 2278 | + "title": "Custom Label Amazing Spider-Man 300 CGC 7.5 . Origin & 1st full app of Venom 1988", | |
| 2279 | + "price": 404.84, | |
| 2280 | + "ebayId": "406556294704", | |
| 2281 | + "listedPrice": null | |
| 2282 | + }, | |
| 2283 | + { | |
| 2284 | + "tab": "grade-six", | |
| 2285 | + "date": "2026-08-31", | |
| 2286 | + "title": "Amazing Spider-Man #300 CGC 9.0 1st Full App Venom Marvel Comics Custom Label 1988", | |
| 2287 | + "price": 599.99, | |
| 2288 | + "ebayId": "188862972565", | |
| 2289 | + "listedPrice": null | |
| 2290 | + }, | |
| 2291 | + { | |
| 2292 | + "tab": "grade-six", | |
| 2293 | + "date": "2026-08-13", | |
| 2294 | + "title": "Amazing Spider-Man #300 CGC 9.0 Todd McFarlane - White Pages - 1st app Venom 1988", | |
| 2295 | + "price": 610, | |
| 2296 | + "ebayId": "307109961810", | |
| 2297 | + "listedPrice": null | |
| 2298 | + }, | |
| 2299 | + { | |
| 2300 | + "tab": "grade-six", | |
| 2301 | + "date": "2026-08-09", | |
| 2302 | + "title": "Amazing Spider-Man #300 Todd McFarlane 1988 CGC 9.0 1988", | |
| 2303 | + "price": 499, | |
| 2304 | + "ebayId": "398262333679", | |
| 2305 | + "listedPrice": null | |
| 2306 | + }, | |
| 2307 | + { | |
| 2308 | + "tab": "grade-six", | |
| 2309 | + "date": "2026-08-07", | |
| 2310 | + "title": "Amazing Spider-Man #300 CBCS 9.0 (Marvel 1988) 1st appearance of Venom 1988", | |
| 2311 | + "price": 502.48, | |
| 2312 | + "ebayId": "389267273576", | |
| 2313 | + "listedPrice": null | |
| 2314 | + }, | |
| 2315 | + { | |
| 2316 | + "tab": "grade-six", | |
| 2317 | + "date": "2026-08-05", | |
| 2318 | + "title": "Amazing Spider-Man #300 CGC 9.0 Todd McFarlane Cover- 1st app Of Venom 1988 1988", | |
| 2319 | + "price": 577, | |
| 2320 | + "ebayId": "318674841084", | |
| 2321 | + "listedPrice": null | |
| 2322 | + }, | |
| 2323 | + { | |
| 2324 | + "tab": "grade-six", | |
| 2325 | + "date": "2026-08-03", | |
| 2326 | + "title": "Amazing Spider-Man #300 Direct CGC 9.0 1988 4696982006 1st full app. Venom 1988", | |
| 2327 | + "price": 695, | |
| 2328 | + "ebayId": "366553569981", | |
| 2329 | + "listedPrice": null | |
| 2330 | + }, | |
| 2331 | + { | |
| 2332 | + "tab": "grade-six", | |
| 2333 | + "date": "2026-08-01", | |
| 2334 | + "title": "Marvel Amazing Spider-Man #300 (1988) CGC 9.0 Todd McFarlane Direct Ed 1988", | |
| 2335 | + "price": 210, | |
| 2336 | + "ebayId": "147474212687", | |
| 2337 | + "listedPrice": 318 | |
| 2338 | + }, | |
| 2339 | + { | |
| 2340 | + "tab": "grade-six", | |
| 2341 | + "date": "2026-07-28", | |
| 2342 | + "title": "Amazing Spider-Man #300 Direct Edition CGC 9.0 VF/NM ORIGIN + 1ST VENOM 26-392 1988", | |
| 2343 | + "price": 494.99, | |
| 2344 | + "ebayId": "137456988892", | |
| 2345 | + "listedPrice": null | |
| 2346 | + }, | |
| 2347 | + { | |
| 2348 | + "tab": "grade-six", | |
| 2349 | + "date": "2026-07-27", | |
| 2350 | + "title": "AMAZING SPIDER-MAN #300 CGC 9.0 VF/NM 1988 WHITE PAGES MARVEL MCFARLANE VENOM 1988", | |
| 2351 | + "price": 564.95, | |
| 2352 | + "ebayId": "227375968888", | |
| 2353 | + "listedPrice": null | |
| 2354 | + }, | |
| 2355 | + { | |
| 2356 | + "tab": "grade-six", | |
| 2357 | + "date": "2026-07-26", | |
| 2358 | + "title": "Amazing Spider-Man #300 CGC 9.0 (1988) Marvel Comics Venom McFarlane 1988", | |
| 2359 | + "price": 415, | |
| 2360 | + "ebayId": "358815926514", | |
| 2361 | + "listedPrice": null | |
| 2362 | + }, | |
| 2363 | + { | |
| 2364 | + "tab": "grade-six", | |
| 2365 | + "date": "2026-07-25", | |
| 2366 | + "title": "The Amazing Spider-Man #300 (CGC 9.0) 1988", | |
| 2367 | + "price": 550, | |
| 2368 | + "ebayId": "315550105000", | |
| 2369 | + "listedPrice": null | |
| 2370 | + }, | |
| 2371 | + { | |
| 2372 | + "tab": "grade-six", | |
| 2373 | + "date": "2026-07-25", | |
| 2374 | + "title": "Amazing Spider-Man 300 CGC 9.0 1st App of Venom Marvel Comics May 1988 1988 #300", | |
| 2375 | + "price": 499, | |
| 2376 | + "ebayId": "198521462736", | |
| 2377 | + "listedPrice": null | |
| 2378 | + }, | |
| 2379 | + { | |
| 2380 | + "tab": "grade-six", | |
| 2381 | + "date": "2026-07-20", | |
| 2382 | + "title": "AMAZING SPIDER-MAN #300 CGC 9.0 VF/NM 1988 WHITE PAGES MARVEL MCFARLANE VENOM 1988", | |
| 2383 | + "price": 425, | |
| 2384 | + "ebayId": "267732843175", | |
| 2385 | + "listedPrice": 465 | |
| 2386 | + }, | |
| 2387 | + { | |
| 2388 | + "tab": "grade-six", | |
| 2389 | + "date": "2026-07-20", | |
| 2390 | + "title": "AMAZING SPIDER-MAN # 300 Marvel CGC 9.0 WP 1988 Origin & 1st Full App Venom 1988", | |
| 2391 | + "price": 615, | |
| 2392 | + "ebayId": "398088698314", | |
| 2393 | + "listedPrice": null | |
| 2394 | + }, | |
| 2395 | + { | |
| 2396 | + "tab": "grade-six", | |
| 2397 | + "date": "2026-07-14", | |
| 2398 | + "title": "Amazing Spiderman #300 CGC 9.0 Origin 1st Appearance Venom", | |
| 2399 | + "price": 540, | |
| 2400 | + "ebayId": "286606572348", | |
| 2401 | + "listedPrice": 580 | |
| 2402 | + }, | |
| 2403 | + { | |
| 2404 | + "tab": "grade-six", | |
| 2405 | + "date": "2026-07-03", | |
| 2406 | + "title": "Amazing Spiderman 300 CGC 9.0", | |
| 2407 | + "price": 540, | |
| 2408 | + "ebayId": "377305687238", | |
| 2409 | + "listedPrice": null | |
| 2410 | + }, | |
| 2411 | + { | |
| 2412 | + "tab": "grade-six", | |
| 2413 | + "date": "2026-06-27", | |
| 2414 | + "title": "Amazing Spider-Man 300 CGC 9.0 1st App of Venom Marvel Comics May 1988 1988 #300", | |
| 2415 | + "price": 550, | |
| 2416 | + "ebayId": "407013897035", | |
| 2417 | + "listedPrice": null | |
| 2418 | + }, | |
| 2419 | + { | |
| 2420 | + "tab": "grade-six", | |
| 2421 | + "date": "2026-06-23", | |
| 2422 | + "title": "Amazing Spiderman 300 cgc 9.0 1988 #300", | |
| 2423 | + "price": 440, | |
| 2424 | + "ebayId": "287403064948", | |
| 2425 | + "listedPrice": null | |
| 2426 | + }, | |
| 2427 | + { | |
| 2428 | + "tab": "grade-six", | |
| 2429 | + "date": "2026-06-19", | |
| 2430 | + "title": "Amazing Spider-Man #300 CGC 9.0 1st Full App Venom Marvel Comics 1988 🔥 1988", | |
| 2431 | + "price": 539.99, | |
| 2432 | + "ebayId": "298425078333", | |
| 2433 | + "listedPrice": null | |
| 2434 | + }, | |
| 2435 | + { | |
| 2436 | + "tab": "grade-six", | |
| 2437 | + "date": "2026-06-15", | |
| 2438 | + "title": "The Amazing Spider-Man #300 (Marvel Comic May 1988)Origin 1st Full Venom CGC 9.0 1988", | |
| 2439 | + "price": 580, | |
| 2440 | + "ebayId": "286494567858", | |
| 2441 | + "listedPrice": null | |
| 2442 | + }, | |
| 2443 | + { | |
| 2444 | + "tab": "grade-six", | |
| 2445 | + "date": "2026-06-10", | |
| 2446 | + "title": "Amazing Spider-Man #300 CGC 9.0 1st Full App Venom Marvel Comics 1988 🔥 1988", | |
| 2447 | + "price": 525, | |
| 2448 | + "ebayId": "188468292789", | |
| 2449 | + "listedPrice": 600 | |
| 2450 | + }, | |
| 2451 | + { | |
| 2452 | + "tab": "grade-six", | |
| 2453 | + "date": "2026-06-08", | |
| 2454 | + "title": "Amazing Spider-Man 300 (1988 Marvel) CGC 9.0 1st Full Venom Appearance 1988 #300", | |
| 2455 | + "price": 549.99, | |
| 2456 | + "ebayId": "389886567867", | |
| 2457 | + "listedPrice": null | |
| 2458 | + }, | |
| 2459 | + { | |
| 2460 | + "tab": "grade-six", | |
| 2461 | + "date": "2026-06-07", | |
| 2462 | + "title": "Amazing Spider-Man # 300 Marvel Comics CGC 9.0 Key Issue Venom #300", | |
| 2463 | + "price": 575, | |
| 2464 | + "ebayId": "198389100733", | |
| 2465 | + "listedPrice": null | |
| 2466 | + }, | |
| 2467 | + { | |
| 2468 | + "tab": "grade-six", | |
| 2469 | + "date": "2026-06-05", | |
| 2470 | + "title": "🔥🔑Amazing Spider-Man #300 - CGC 9.0 - 1st Venom - Classic McFarlane Cover🔥🔑 1988", | |
| 2471 | + "price": 487.91, | |
| 2472 | + "ebayId": "127904152466", | |
| 2473 | + "listedPrice": null | |
| 2474 | + }, | |
| 2475 | + { | |
| 2476 | + "tab": "grade-six", | |
| 2477 | + "date": "2026-06-04", | |
| 2478 | + "title": "AMAZING SPIDER-MAN #300 CGC 9.0 VF/NM 1998 WHITE PAGES MARVEL MCFARLANE VENOM 1988", | |
| 2479 | + "price": 549.95, | |
| 2480 | + "ebayId": "227138631764", | |
| 2481 | + "listedPrice": null | |
| 2482 | + }, | |
| 2483 | + { | |
| 2484 | + "tab": "grade-six", | |
| 2485 | + "date": "2026-06-04", | |
| 2486 | + "title": "🔥🔑Amazing Spider-Man #300 - CGC 9.0 - 1st Venom - Classic McFarlane Cover🔥🔑 1988", | |
| 2487 | + "price": 507.3, | |
| 2488 | + "ebayId": "127890319274", | |
| 2489 | + "listedPrice": null | |
| 2490 | + }, | |
| 2491 | + { | |
| 2492 | + "tab": "grade-six", | |
| 2493 | + "date": "2026-06-01", | |
| 2494 | + "title": "🔥🔑Amazing Spider-Man #300 - CGC 9.0 - 1st Venom - Classic McFarlane Cover🔥🔑 1988", | |
| 2495 | + "price": 435, | |
| 2496 | + "ebayId": "318356191130", | |
| 2497 | + "listedPrice": null | |
| 2498 | + }, | |
| 2499 | + { | |
| 2500 | + "tab": "grade-six", | |
| 2501 | + "date": "2026-05-30", | |
| 2502 | + "title": "The Amazing Spider-Man #300 CGC 9.0 (Marvel Comics May 1988) 1988", | |
| 2503 | + "price": 485, | |
| 2504 | + "ebayId": "306957694715", | |
| 2505 | + "listedPrice": null | |
| 2506 | + }, | |
| 2507 | + { | |
| 2508 | + "tab": "grade-six", | |
| 2509 | + "date": "2026-05-29", | |
| 2510 | + "title": "Amazing Spider-Man #300 Marvel 1988 CGC 9.0 White Pages, 1st Appearance Venom! 1988", | |
| 2511 | + "price": 520, | |
| 2512 | + "ebayId": "287337804863", | |
| 2513 | + "listedPrice": 529.95 | |
| 2514 | + }, | |
| 2515 | + { | |
| 2516 | + "tab": "grade-six", | |
| 2517 | + "date": "2026-05-26", | |
| 2518 | + "title": "Marvel The Amazing Spider-Man #300 (1988) CGC 9.0 Spider-Man Venom 1988", | |
| 2519 | + "price": 500, | |
| 2520 | + "ebayId": "406946571361", | |
| 2521 | + "listedPrice": null | |
| 2522 | + }, | |
| 2523 | + { | |
| 2524 | + "tab": "grade-seventeen", | |
| 2525 | + "date": "2026-09-01", | |
| 2526 | + "title": "🔥1988 AMAZING SPIDER-MAN #300 COMIC BOOK GRADED CGC 9.4 GRAIL 🔥 1988", | |
| 2527 | + "price": 661.55, | |
| 2528 | + "ebayId": "278320308937", | |
| 2529 | + "listedPrice": null | |
| 2530 | + }, | |
| 2531 | + { | |
| 2532 | + "tab": "grade-seventeen", | |
| 2533 | + "date": "2026-08-29", | |
| 2534 | + "title": "Marvel Comics Amazing Spider-Man Issue #300 1988 1st Venom Appearance CGC 9.4 1988", | |
| 2535 | + "price": 725, | |
| 2536 | + "ebayId": "366620781459", | |
| 2537 | + "listedPrice": null | |
| 2538 | + }, | |
| 2539 | + { | |
| 2540 | + "tab": "grade-seventeen", | |
| 2541 | + "date": "2026-08-25", | |
| 2542 | + "title": "Amazing Spider-Man #300 CGC 9.4 WP NM Marvel Comics 1988 McFarlane 1st Venom 1988", | |
| 2543 | + "price": 639, | |
| 2544 | + "ebayId": "117365228097", | |
| 2545 | + "listedPrice": null | |
| 2546 | + }, | |
| 2547 | + { | |
| 2548 | + "tab": "grade-seventeen", | |
| 2549 | + "date": "2026-08-20", | |
| 2550 | + "title": "1988 AMAZING SPIDER-MAN #300 COMIC BOOK GRADED CGC 9.4 FANTASTIC", | |
| 2551 | + "price": 622, | |
| 2552 | + "ebayId": "227476502609", | |
| 2553 | + "listedPrice": null | |
| 2554 | + }, | |
| 2555 | + { | |
| 2556 | + "tab": "grade-seventeen", | |
| 2557 | + "date": "2026-08-17", | |
| 2558 | + "title": "Amazing Spider-Man #300 CGC 9.4 1st Full Venom McFarlane Direct 1988 1988", | |
| 2559 | + "price": 675, | |
| 2560 | + "ebayId": "137533846714", | |
| 2561 | + "listedPrice": 724.99 | |
| 2562 | + }, | |
| 2563 | + { | |
| 2564 | + "tab": "grade-seventeen", | |
| 2565 | + "date": "2026-08-14", | |
| 2566 | + "title": "Amazing Spider-Man #300 CGC 9.4 - 1st Full Appearance Venom (Eddie Brock) 1988", | |
| 2567 | + "price": 700, | |
| 2568 | + "ebayId": "147470888526", | |
| 2569 | + "listedPrice": null | |
| 2570 | + }, | |
| 2571 | + { | |
| 2572 | + "tab": "grade-seventeen", | |
| 2573 | + "date": "2026-08-13", | |
| 2574 | + "title": "Marvel Comics 1988 the Amazing Spider-Man #300 First Venom Appearance! CGC 9.4🔥 1988", | |
| 2575 | + "price": 675, | |
| 2576 | + "ebayId": "168609716215", | |
| 2577 | + "listedPrice": 690 | |
| 2578 | + }, | |
| 2579 | + { | |
| 2580 | + "tab": "grade-seventeen", | |
| 2581 | + "date": "2026-08-12", | |
| 2582 | + "title": "Amazing Spider-Man #300 CGC 9.4 Incredible Looking Book! 1st App of Venom 1988 1988", | |
| 2583 | + "price": 730, | |
| 2584 | + "ebayId": "206448823095", | |
| 2585 | + "listedPrice": null | |
| 2586 | + }, | |
| 2587 | + { | |
| 2588 | + "tab": "grade-seventeen", | |
| 2589 | + "date": "2026-08-08", | |
| 2590 | + "title": "AMAZING SPIDER-MAN #300 (Venom 1st full app) CGC 9.4 NM Marvel Comics 1988 1988", | |
| 2591 | + "price": 700, | |
| 2592 | + "ebayId": "178383211790", | |
| 2593 | + "listedPrice": 749.99 | |
| 2594 | + }, | |
| 2595 | + { | |
| 2596 | + "tab": "grade-seventeen", | |
| 2597 | + "date": "2026-08-08", | |
| 2598 | + "title": "The Amazing Spider-Man #300 (Marvel Comics May 1988) 9.4 CGC GRADE 1988", | |
| 2599 | + "price": 715, | |
| 2600 | + "ebayId": "366588777353", | |
| 2601 | + "listedPrice": null | |
| 2602 | + }, | |
| 2603 | + { | |
| 2604 | + "tab": "grade-seventeen", | |
| 2605 | + "date": "2026-08-07", | |
| 2606 | + "title": "AMAZING SPIDER-MAN #300 (Venom 1st full app) CGC 9.4 NM Marvel Comics 1988 1988", | |
| 2607 | + "price": 720, | |
| 2608 | + "ebayId": "366584196676", | |
| 2609 | + "listedPrice": 749.99 | |
| 2610 | + }, | |
| 2611 | + { | |
| 2612 | + "tab": "grade-seventeen", | |
| 2613 | + "date": "2026-08-05", | |
| 2614 | + "title": "The Amazing Spider-Man #300 CGC 9.4 1st Full Venom McFarlane Direct 1988 1988", | |
| 2615 | + "price": 621, | |
| 2616 | + "ebayId": "377378990260", | |
| 2617 | + "listedPrice": null | |
| 2618 | + }, | |
| 2619 | + { | |
| 2620 | + "tab": "grade-seventeen", | |
| 2621 | + "date": "2026-07-24", | |
| 2622 | + "title": "1988 Amazing Spider-Man # 300 CGC 9.4 (White Pages) First Full Venom Appearence 1988", | |
| 2623 | + "price": 709.41, | |
| 2624 | + "ebayId": "157913272078", | |
| 2625 | + "listedPrice": null | |
| 2626 | + }, | |
| 2627 | + { | |
| 2628 | + "tab": "grade-seventeen", | |
| 2629 | + "date": "2026-07-23", | |
| 2630 | + "title": "The Amazing Spider-Man #300 (Marvel, 1988) CGC NM 9.4 White pages....", | |
| 2631 | + "price": 610, | |
| 2632 | + "ebayId": null, | |
| 2633 | + "listedPrice": null | |
| 2634 | + }, | |
| 2635 | + { | |
| 2636 | + "tab": "grade-seventeen", | |
| 2637 | + "date": "2026-07-23", | |
| 2638 | + "title": "Amazing Spider-Man #300 CGC 9.4 1st Venom 1988, New Case With Custom Label, WP 1988", | |
| 2639 | + "price": 664, | |
| 2640 | + "ebayId": "407091956052", | |
| 2641 | + "listedPrice": 699 | |
| 2642 | + }, | |
| 2643 | + { | |
| 2644 | + "tab": "grade-seventeen", | |
| 2645 | + "date": "2026-07-22", | |
| 2646 | + "title": "Amazing Spider-Man 300 CGC Graded 9.4 NM 1st Venom Marvel Comics 1988 1988 #300", | |
| 2647 | + "price": 724.95, | |
| 2648 | + "ebayId": "188652267125", | |
| 2649 | + "listedPrice": null | |
| 2650 | + }, | |
| 2651 | + { | |
| 2652 | + "tab": "grade-seventeen", | |
| 2653 | + "date": "2026-07-19", | |
| 2654 | + "title": "Marvel Amazing Spider-Man #300 (1988) CGC 9.4 Todd McFarlane Cover - White Pages 1988", | |
| 2655 | + "price": 700, | |
| 2656 | + "ebayId": "257618016607", | |
| 2657 | + "listedPrice": null | |
| 2658 | + }, | |
| 2659 | + { | |
| 2660 | + "tab": "grade-seventeen", | |
| 2661 | + "date": "2026-07-10", | |
| 2662 | + "title": "Marvel Amazing Spider-Man #300, CGC 9.4, 1988, 1st Venom, McFarlane 1988", | |
| 2663 | + "price": 575, | |
| 2664 | + "ebayId": "198465838905", | |
| 2665 | + "listedPrice": null | |
| 2666 | + }, | |
| 2667 | + { | |
| 2668 | + "tab": "grade-seventeen", | |
| 2669 | + "date": "2026-07-10", | |
| 2670 | + "title": "AMAZING SPIDER-MAN #300 (1988) - CGC GRADE 9.4 - 1ST FULL APPEARANCE VENOM 1988", | |
| 2671 | + "price": 650, | |
| 2672 | + "ebayId": "307048286238", | |
| 2673 | + "listedPrice": null | |
| 2674 | + }, | |
| 2675 | + { | |
| 2676 | + "tab": "grade-seventeen", | |
| 2677 | + "date": "2026-07-07", | |
| 2678 | + "title": "AMAZING SPIDER-MAN #300 1ST FULL VENOM! MARVEL COMICS, 1988 CGC 9.4 WHITE PAGES! 1988", | |
| 2679 | + "price": 617, | |
| 2680 | + "ebayId": "227410246395", | |
| 2681 | + "listedPrice": null | |
| 2682 | + }, | |
| 2683 | + { | |
| 2684 | + "tab": "grade-seventeen", | |
| 2685 | + "date": "2026-07-06", | |
| 2686 | + "title": "Amazing Spider-Man 300 CGC 9.4 White Pages Marvel Comics 1988 Venom 1988 #300", | |
| 2687 | + "price": 609, | |
| 2688 | + "ebayId": "227407730110", | |
| 2689 | + "listedPrice": null | |
| 2690 | + }, | |
| 2691 | + { | |
| 2692 | + "tab": "grade-seventeen", | |
| 2693 | + "date": "2026-07-02", | |
| 2694 | + "title": "AMAZING SPIDER-MAN #300 1ST FULL VENOM! MARVEL COMICS, 1988 CGC 9.4 WHITE PAGES! 1988", | |
| 2695 | + "price": 625, | |
| 2696 | + "ebayId": "188567525559", | |
| 2697 | + "listedPrice": 665 | |
| 2698 | + }, | |
| 2699 | + { | |
| 2700 | + "tab": "grade-seventeen", | |
| 2701 | + "date": "2026-07-01", | |
| 2702 | + "title": "Amazing Spider-Man #300 CGC 9.4 White Pages NM 1st Venom Mega Key Marvel 1988 1988", | |
| 2703 | + "price": 640, | |
| 2704 | + "ebayId": "257581082054", | |
| 2705 | + "listedPrice": null | |
| 2706 | + }, | |
| 2707 | + { | |
| 2708 | + "tab": "grade-seventeen", | |
| 2709 | + "date": "2026-06-27", | |
| 2710 | + "title": "Amazing Spider-Man #300 CGC 9.4 White Pages Venom 1st Appearance Todd McFarlane 1988", | |
| 2711 | + "price": 717.95, | |
| 2712 | + "ebayId": "158020267516", | |
| 2713 | + "listedPrice": null | |
| 2714 | + }, | |
| 2715 | + { | |
| 2716 | + "tab": "grade-seventeen", | |
| 2717 | + "date": "2026-06-21", | |
| 2718 | + "title": "Amazing Spider-Man #300 CGC 9.4 Marvel 1988 Origin & 1st Full App of Venom 1988", | |
| 2719 | + "price": 725, | |
| 2720 | + "ebayId": "188499066635", | |
| 2721 | + "listedPrice": null | |
| 2722 | + }, | |
| 2723 | + { | |
| 2724 | + "tab": "grade-seventeen", | |
| 2725 | + "date": "2026-06-19", | |
| 2726 | + "title": "AMAZING SPIDER-MAN #300 1ST FULL VENOM! MARVEL COMICS, 1988 CGC 9.4 WHITE PAGES! 1988", | |
| 2727 | + "price": 729, | |
| 2728 | + "ebayId": "157973869362", | |
| 2729 | + "listedPrice": null | |
| 2730 | + }, | |
| 2731 | + { | |
| 2732 | + "tab": "grade-seventeen", | |
| 2733 | + "date": "2026-06-17", | |
| 2734 | + "title": "THE AMAZING SPIDER-MAN #300 MARVEL COMICS ORIGIN & 1ST VENOM GRADED CGC 9.4", | |
| 2735 | + "price": 668, | |
| 2736 | + "ebayId": "336620560416", | |
| 2737 | + "listedPrice": null | |
| 2738 | + }, | |
| 2739 | + { | |
| 2740 | + "tab": "grade-seventeen", | |
| 2741 | + "date": "2026-06-13", | |
| 2742 | + "title": "AMAZING SPIDER-MAN # 300 Marvel CGC 9.4 WP 1988 Origin & 1st Full App Venom 1988", | |
| 2743 | + "price": 819.18, | |
| 2744 | + "ebayId": "398009378363", | |
| 2745 | + "listedPrice": null | |
| 2746 | + }, | |
| 2747 | + { | |
| 2748 | + "tab": "grade-seventeen", | |
| 2749 | + "date": "2026-06-12", | |
| 2750 | + "title": "The Amazing Spider-Man #300 (1988) CGC 9.4 1988", | |
| 2751 | + "price": 650, | |
| 2752 | + "ebayId": "188498508468", | |
| 2753 | + "listedPrice": null | |
| 2754 | + }, | |
| 2755 | + { | |
| 2756 | + "tab": "grade-seventeen", | |
| 2757 | + "date": "2026-06-08", | |
| 2758 | + "title": "Amazing Spider-Man #300 CGC 9.4. 1st Venom Appearance Marvel (1988)", | |
| 2759 | + "price": 600.39, | |
| 2760 | + "ebayId": "178203477229", | |
| 2761 | + "listedPrice": null | |
| 2762 | + } | |
| 2763 | + ], | |
| 2764 | + "details": { | |
| 2765 | + "Is Key Issue": "Yes", | |
| 2766 | + "Release Date": "May 1, 1988", | |
| 2767 | + "Publisher": "Marvel", | |
| 2768 | + "Model Number": "#300", | |
| 2769 | + "UPC": "0-71486-02457-6-05", | |
| 2770 | + "Comic.org ID": "44451", | |
| 2771 | + "PriceCharting ID": "2315040" | |
| 2772 | + }, | |
| 2773 | + "images": [ | |
| 2774 | + "https://storage.googleapis.com/images.pricecharting.com/c31a9ef36b24b32be9d26b3a840cd24f1cbcf72f82a345d8f8c26492fb90a3fe/240.jpg", | |
| 2775 | + "https://storage.googleapis.com/images.pricecharting.com/c31a9ef36b24b32be9d26b3a840cd24f1cbcf72f82a345d8f8c26492fb90a3fe/1600.jpg" | |
| 2776 | + ] | |
| 2777 | + } | |
| 2778 | + }, | |
| 2779 | + "expect": { | |
| 2780 | + "minCount": 1, | |
| 2781 | + "kinds": [ | |
| 2782 | + "catalog_item", | |
| 2783 | + "price_observation", | |
| 2784 | + "sale" | |
| 2785 | + ] | |
| 2786 | + }, | |
| 2787 | + "note": "captured live from https://www.pricecharting.com/game/comic-books-amazing-spider-man/amazing-spider-man-300-1988", | |
| 2788 | + "capturedAt": "2026-09-07T04:33:38.091Z" | |
| 2789 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/pricecharting/funko-pop-marvel__spider-man-metallic-3.json
+126 −0
@@ -0,0 +1,126 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.pricecharting.com/game/funko-pop-marvel/spider-man-metallic-3", | |
| 4 | + "externalId": "7491172", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:33:33.815Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "product", | |
| 10 | + "url": "https://www.pricecharting.com/game/funko-pop-marvel/spider-man-metallic-3", | |
| 11 | + "productId": "7491172", | |
| 12 | + "consoleUri": "funko-pop-marvel", | |
| 13 | + "consoleName": "Funko POP Marvel", | |
| 14 | + "title": "Spider-Man [Metallic] #3", | |
| 15 | + "flags": { | |
| 16 | + "isComic": false, | |
| 17 | + "isLegoSet": false, | |
| 18 | + "isFunkoPop": true, | |
| 19 | + "isCard": false, | |
| 20 | + "isCoin": false, | |
| 21 | + "isSystem": false | |
| 22 | + }, | |
| 23 | + "columnLabels": [ | |
| 24 | + "Out of Box", | |
| 25 | + "In Dmg Box", | |
| 26 | + "New Price" | |
| 27 | + ], | |
| 28 | + "prices": [ | |
| 29 | + { | |
| 30 | + "key": "used_price", | |
| 31 | + "value": 1560, | |
| 32 | + "raw": "$1,560.00" | |
| 33 | + }, | |
| 34 | + { | |
| 35 | + "key": "complete_price", | |
| 36 | + "value": 2537.5, | |
| 37 | + "raw": "$2,537.50" | |
| 38 | + }, | |
| 39 | + { | |
| 40 | + "key": "new_price", | |
| 41 | + "value": 2600, | |
| 42 | + "raw": "$2,600.00" | |
| 43 | + } | |
| 44 | + ], | |
| 45 | + "sales": [ | |
| 46 | + { | |
| 47 | + "tab": "cib", | |
| 48 | + "date": "2026-07-31", | |
| 49 | + "title": "Funko Pop Marvel Spider-Man #03 Metallic SDCC 480pcs & Fugitive Toys Monochrome Marvel #03", | |
| 50 | + "price": 2800, | |
| 51 | + "ebayId": "198538497166", | |
| 52 | + "listedPrice": 3200 | |
| 53 | + }, | |
| 54 | + { | |
| 55 | + "tab": "cib", | |
| 56 | + "date": "2026-07-14", | |
| 57 | + "title": "Funko POP Metallic Spider-Man 03 2011 - LE 480 Pieces MARVEL Marvel #3", | |
| 58 | + "price": 2275, | |
| 59 | + "ebayId": "236834119900", | |
| 60 | + "listedPrice": null | |
| 61 | + }, | |
| 62 | + { | |
| 63 | + "tab": "cib", | |
| 64 | + "date": "2025-06-09", | |
| 65 | + "title": "Funko Pop! Metallic Marvel SDCC 2011 Spider-Man 03 LE 480 Pieces Marvel", | |
| 66 | + "price": 2500, | |
| 67 | + "ebayId": "297370332832", | |
| 68 | + "listedPrice": null | |
| 69 | + }, | |
| 70 | + { | |
| 71 | + "tab": "cib", | |
| 72 | + "date": "2025-05-19", | |
| 73 | + "title": "Metallic SDCC 2011 Spider-man 03 Funko Pop Vinyl 480PCS + Acrylic Case Marvel", | |
| 74 | + "price": 2306.16, | |
| 75 | + "ebayId": "127114823147", | |
| 76 | + "listedPrice": null | |
| 77 | + }, | |
| 78 | + { | |
| 79 | + "tab": "new", | |
| 80 | + "date": "2025-09-14", | |
| 81 | + "title": "Funko Pop! SPIDER-MAN 03 Metallic 2011 - Limited Edition 480 pieces Marvel #3", | |
| 82 | + "price": 2600, | |
| 83 | + "ebayId": "406162770949", | |
| 84 | + "listedPrice": null | |
| 85 | + }, | |
| 86 | + { | |
| 87 | + "tab": "new", | |
| 88 | + "date": "2025-09-01", | |
| 89 | + "title": "Funko Pop SPIDER-MAN 03 Marvel Metallic 2011 - LE 480 Pieces Marvel", | |
| 90 | + "price": 2500, | |
| 91 | + "ebayId": "306366766671", | |
| 92 | + "listedPrice": null | |
| 93 | + }, | |
| 94 | + { | |
| 95 | + "tab": "new", | |
| 96 | + "date": "2025-01-09", | |
| 97 | + "title": "2011 Spiderman #03 Metallic SDCC Exclusive *SPIDEY GRAIL* Funko Pop! Marvel", | |
| 98 | + "price": 2650, | |
| 99 | + "ebayId": "267099744374", | |
| 100 | + "listedPrice": null | |
| 101 | + } | |
| 102 | + ], | |
| 103 | + "details": { | |
| 104 | + "Series": "Marvel Universe: Series 1", | |
| 105 | + "Release Date": "January 1, 2011", | |
| 106 | + "Publisher": "Funko", | |
| 107 | + "Box Number": "#3", | |
| 108 | + "PriceCharting ID": "7491172" | |
| 109 | + }, | |
| 110 | + "images": [ | |
| 111 | + "https://storage.googleapis.com/images.pricecharting.com/osbjiilfl4xyblv3/240.jpg", | |
| 112 | + "https://storage.googleapis.com/images.pricecharting.com/osbjiilfl4xyblv3/1600.jpg" | |
| 113 | + ] | |
| 114 | + } | |
| 115 | + }, | |
| 116 | + "expect": { | |
| 117 | + "minCount": 1, | |
| 118 | + "kinds": [ | |
| 119 | + "catalog_item", | |
| 120 | + "price_observation", | |
| 121 | + "sale" | |
| 122 | + ] | |
| 123 | + }, | |
| 124 | + "note": "captured live from https://www.pricecharting.com/game/funko-pop-marvel/spider-man-metallic-3", | |
| 125 | + "capturedAt": "2026-09-07T04:33:33.841Z" | |
| 126 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/pricecharting/lego-star-wars__cloud-city-10123.json
+1077 −0
@@ -0,0 +1,1077 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.pricecharting.com/game/lego-star-wars/cloud-city-10123", | |
| 4 | + "externalId": "5863335", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:33:30.105Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "product", | |
| 10 | + "url": "https://www.pricecharting.com/game/lego-star-wars/cloud-city-10123", | |
| 11 | + "productId": "5863335", | |
| 12 | + "consoleUri": "lego-star-wars", | |
| 13 | + "consoleName": "LEGO Star Wars", | |
| 14 | + "title": "Cloud City #10123", | |
| 15 | + "flags": { | |
| 16 | + "isComic": false, | |
| 17 | + "isLegoSet": true, | |
| 18 | + "isFunkoPop": false, | |
| 19 | + "isCard": false, | |
| 20 | + "isCoin": false, | |
| 21 | + "isSystem": false | |
| 22 | + }, | |
| 23 | + "columnLabels": [ | |
| 24 | + "Pieces Only", | |
| 25 | + "Complete Price", | |
| 26 | + "New Price", | |
| 27 | + "Pieces & Manual", | |
| 28 | + "Box Only Price", | |
| 29 | + "Manual Only Price", | |
| 30 | + "Pieces & Manual", | |
| 31 | + "Box Only", | |
| 32 | + "Manual Only" | |
| 33 | + ], | |
| 34 | + "prices": [ | |
| 35 | + { | |
| 36 | + "key": "used_price", | |
| 37 | + "value": 352, | |
| 38 | + "raw": "$352.00" | |
| 39 | + }, | |
| 40 | + { | |
| 41 | + "key": "complete_price", | |
| 42 | + "value": 3658.56, | |
| 43 | + "raw": "$3,658.56" | |
| 44 | + }, | |
| 45 | + { | |
| 46 | + "key": "new_price", | |
| 47 | + "value": 5750, | |
| 48 | + "raw": "$5,750.00" | |
| 49 | + }, | |
| 50 | + { | |
| 51 | + "key": "graded_price", | |
| 52 | + "value": 602, | |
| 53 | + "raw": "$602.00" | |
| 54 | + }, | |
| 55 | + { | |
| 56 | + "key": "box_only_price", | |
| 57 | + "value": 1057.96, | |
| 58 | + "raw": "$1,057.96" | |
| 59 | + }, | |
| 60 | + { | |
| 61 | + "key": "manual_only_price", | |
| 62 | + "value": 249.99, | |
| 63 | + "raw": "$249.99" | |
| 64 | + } | |
| 65 | + ], | |
| 66 | + "sales": [ | |
| 67 | + { | |
| 68 | + "tab": "used", | |
| 69 | + "date": "2026-08-20", | |
| 70 | + "title": "LEGO Star Wars: Cloud City (10123). Read Description", | |
| 71 | + "price": 530, | |
| 72 | + "ebayId": "800499720317", | |
| 73 | + "listedPrice": null | |
| 74 | + }, | |
| 75 | + { | |
| 76 | + "tab": "used", | |
| 77 | + "date": "2026-08-06", | |
| 78 | + "title": "LEGO Star Wars Cloud City 10123 Replacement Parts - Authentic Retired 2003", | |
| 79 | + "price": 174, | |
| 80 | + "ebayId": "117334650552", | |
| 81 | + "listedPrice": null | |
| 82 | + }, | |
| 83 | + { | |
| 84 | + "tab": "used", | |
| 85 | + "date": "2026-08-06", | |
| 86 | + "title": "DEFECTIVE LEGO Star Wars Cloud City Princess Leia 10123 AUTHENTIC sw0104 G3D", | |
| 87 | + "price": 199.08, | |
| 88 | + "ebayId": "178307381822", | |
| 89 | + "listedPrice": null | |
| 90 | + }, | |
| 91 | + { | |
| 92 | + "tab": "used", | |
| 93 | + "date": "2026-06-30", | |
| 94 | + "title": "DEFECTIVE LEGO Star Wars Cloud City Princess Leia 10123 AUTHENTIC sw0104 G3D", | |
| 95 | + "price": 225, | |
| 96 | + "ebayId": "178251283626", | |
| 97 | + "listedPrice": null | |
| 98 | + }, | |
| 99 | + { | |
| 100 | + "tab": "used", | |
| 101 | + "date": "2026-06-24", | |
| 102 | + "title": "LEGO 10123 Cloud City Star Wars WITHOUT FIGURES Vintage Retro", | |
| 103 | + "price": 660.14, | |
| 104 | + "ebayId": "127934127224", | |
| 105 | + "listedPrice": null | |
| 106 | + }, | |
| 107 | + { | |
| 108 | + "tab": "used", | |
| 109 | + "date": "2026-06-24", | |
| 110 | + "title": "LEGO Boba Fett Cloud City - Printed Arms & Legs 10123 sw0107", | |
| 111 | + "price": 1422.74, | |
| 112 | + "ebayId": "127873306092", | |
| 113 | + "listedPrice": null | |
| 114 | + }, | |
| 115 | + { | |
| 116 | + "tab": "used", | |
| 117 | + "date": "2026-06-20", | |
| 118 | + "title": "LEGO Star Wars: Cloud City (10123)", | |
| 119 | + "price": 1100, | |
| 120 | + "ebayId": "257558031025", | |
| 121 | + "listedPrice": null | |
| 122 | + }, | |
| 123 | + { | |
| 124 | + "tab": "used", | |
| 125 | + "date": "2026-06-09", | |
| 126 | + "title": "LEGO Star Wars: Cloud City (10123)", | |
| 127 | + "price": 1200, | |
| 128 | + "ebayId": "257556562436", | |
| 129 | + "listedPrice": 1800 | |
| 130 | + }, | |
| 131 | + { | |
| 132 | + "tab": "used", | |
| 133 | + "date": "2026-06-09", | |
| 134 | + "title": "LEGO 10123 Cloud City Star Wars COMPLETE WITHOUT FIGURES w/ Instructions Good", | |
| 135 | + "price": 945.78, | |
| 136 | + "ebayId": "127815273892", | |
| 137 | + "listedPrice": null | |
| 138 | + }, | |
| 139 | + { | |
| 140 | + "tab": "used", | |
| 141 | + "date": "2026-06-06", | |
| 142 | + "title": "DEFECTIVE LEGO Star Wars Cloud City Princess Leia 10123 AUTHENTIC sw0104 G3D", | |
| 143 | + "price": 202.5, | |
| 144 | + "ebayId": "178154939848", | |
| 145 | + "listedPrice": null | |
| 146 | + }, | |
| 147 | + { | |
| 148 | + "tab": "used", | |
| 149 | + "date": "2026-05-24", | |
| 150 | + "title": "LEGO Star Wars Cloud City 10123 Complete Set All Minifigs", | |
| 151 | + "price": 3000, | |
| 152 | + "ebayId": "358207765201", | |
| 153 | + "listedPrice": null | |
| 154 | + }, | |
| 155 | + { | |
| 156 | + "tab": "used", | |
| 157 | + "date": "2026-04-17", | |
| 158 | + "title": "LEGO Luke Skywalker Cloud City 10123 sw0103 VERY GOOD Condition", | |
| 159 | + "price": 575.55, | |
| 160 | + "ebayId": "127627729205", | |
| 161 | + "listedPrice": 692.03 | |
| 162 | + }, | |
| 163 | + { | |
| 164 | + "tab": "used", | |
| 165 | + "date": "2026-04-10", | |
| 166 | + "title": "LEGO Star Wars Cloud City Princess Leia 10123 AUTHENTIC sw0104 MINT", | |
| 167 | + "price": 225, | |
| 168 | + "ebayId": "257377261940", | |
| 169 | + "listedPrice": 245 | |
| 170 | + }, | |
| 171 | + { | |
| 172 | + "tab": "used", | |
| 173 | + "date": "2026-04-09", | |
| 174 | + "title": "LEGO Cloud City 10123 Princess Leia SW0104", | |
| 175 | + "price": 239, | |
| 176 | + "ebayId": "267506565413", | |
| 177 | + "listedPrice": null | |
| 178 | + }, | |
| 179 | + { | |
| 180 | + "tab": "used", | |
| 181 | + "date": "2026-03-08", | |
| 182 | + "title": "LEGO Princess Leia Organa Cloud City 10123 sw0104 VERY GOOD CONDITION", | |
| 183 | + "price": 188.21, | |
| 184 | + "ebayId": "127699082882", | |
| 185 | + "listedPrice": null | |
| 186 | + }, | |
| 187 | + { | |
| 188 | + "tab": "used", | |
| 189 | + "date": "2026-02-23", | |
| 190 | + "title": "LEGO Star Wars Cloud City Princess Leia 10123 AUTHENTIC sw0104 MINT", | |
| 191 | + "price": 237, | |
| 192 | + "ebayId": "306785466116", | |
| 193 | + "listedPrice": null | |
| 194 | + }, | |
| 195 | + { | |
| 196 | + "tab": "used", | |
| 197 | + "date": "2026-01-06", | |
| 198 | + "title": "Lego Star Wars Cloud City Manual 10123", | |
| 199 | + "price": 250, | |
| 200 | + "ebayId": "257097053006", | |
| 201 | + "listedPrice": null | |
| 202 | + }, | |
| 203 | + { | |
| 204 | + "tab": "used", | |
| 205 | + "date": "2025-08-08", | |
| 206 | + "title": "LEGO Star Wars: Cloud City (10123) Manual", | |
| 207 | + "price": 359.99, | |
| 208 | + "ebayId": "406096494831", | |
| 209 | + "listedPrice": null | |
| 210 | + }, | |
| 211 | + { | |
| 212 | + "tab": "used", | |
| 213 | + "date": "2025-07-26", | |
| 214 | + "title": "LEGO Cloud City 10123 Star Wars Ultimate Collector Series Remastered 2003 Set", | |
| 215 | + "price": 428, | |
| 216 | + "ebayId": "157140812251", | |
| 217 | + "listedPrice": null | |
| 218 | + }, | |
| 219 | + { | |
| 220 | + "tab": "used", | |
| 221 | + "date": "2025-07-16", | |
| 222 | + "title": "LEGO Star Wars: Cloud City (10123)", | |
| 223 | + "price": 300, | |
| 224 | + "ebayId": "177258660132", | |
| 225 | + "listedPrice": null | |
| 226 | + }, | |
| 227 | + { | |
| 228 | + "tab": "used", | |
| 229 | + "date": "2025-06-24", | |
| 230 | + "title": "RARE lego star wars cloud city 10123 100% complete build only", | |
| 231 | + "price": 280, | |
| 232 | + "ebayId": "357140493509", | |
| 233 | + "listedPrice": null | |
| 234 | + }, | |
| 235 | + { | |
| 236 | + "tab": "used", | |
| 237 | + "date": "2025-06-19", | |
| 238 | + "title": "LEGO Star Wars: Cloud City (10123) BUILD + INSTRUCTIONS - COMPLETE", | |
| 239 | + "price": 600, | |
| 240 | + "ebayId": "405978650168", | |
| 241 | + "listedPrice": null | |
| 242 | + }, | |
| 243 | + { | |
| 244 | + "tab": "used", | |
| 245 | + "date": "2025-06-19", | |
| 246 | + "title": "Cloud City Luke Skywalker 10123 100% Genuine LEGO", | |
| 247 | + "price": 110, | |
| 248 | + "ebayId": "336017108385", | |
| 249 | + "listedPrice": null | |
| 250 | + }, | |
| 251 | + { | |
| 252 | + "tab": "used", | |
| 253 | + "date": "2025-06-02", | |
| 254 | + "title": "Lego Cloud City Luke 10123", | |
| 255 | + "price": 310, | |
| 256 | + "ebayId": "277163332303", | |
| 257 | + "listedPrice": null | |
| 258 | + }, | |
| 259 | + { | |
| 260 | + "tab": "used", | |
| 261 | + "date": "2025-04-14", | |
| 262 | + "title": "Star Wars Lego 10123 Cloud City vintage set complete", | |
| 263 | + "price": 825, | |
| 264 | + "ebayId": "267220610006", | |
| 265 | + "listedPrice": null | |
| 266 | + }, | |
| 267 | + { | |
| 268 | + "tab": "used", | |
| 269 | + "date": "2025-03-19", | |
| 270 | + "title": "Lego Cloud City Boba Fett 10123 Authentic Printed (no Legs) (used condition)", | |
| 271 | + "price": 219, | |
| 272 | + "ebayId": "286418003377", | |
| 273 | + "listedPrice": null | |
| 274 | + }, | |
| 275 | + { | |
| 276 | + "tab": "used", | |
| 277 | + "date": "2025-03-17", | |
| 278 | + "title": "Lego Cloud City 10123 Boba Fett Legs Only", | |
| 279 | + "price": 400, | |
| 280 | + "ebayId": "286416457388", | |
| 281 | + "listedPrice": null | |
| 282 | + }, | |
| 283 | + { | |
| 284 | + "tab": "used", | |
| 285 | + "date": "2025-03-03", | |
| 286 | + "title": "Lego 10123 Cloud City Princess Leia Read Description", | |
| 287 | + "price": 149.99, | |
| 288 | + "ebayId": "356625407396", | |
| 289 | + "listedPrice": null | |
| 290 | + }, | |
| 291 | + { | |
| 292 | + "tab": "used", | |
| 293 | + "date": "2025-02-25", | |
| 294 | + "title": "* RARE *LEGO Star Wars Cloud City (10123)", | |
| 295 | + "price": 767.83, | |
| 296 | + "ebayId": "256823095410", | |
| 297 | + "listedPrice": null | |
| 298 | + }, | |
| 299 | + { | |
| 300 | + "tab": "used", | |
| 301 | + "date": "2025-01-28", | |
| 302 | + "title": "2003 LEGO Star Wars Cloud City 10123 Lando Calrissian Figure Collection", | |
| 303 | + "price": 629.51, | |
| 304 | + "ebayId": "203256183181", | |
| 305 | + "listedPrice": null | |
| 306 | + }, | |
| 307 | + { | |
| 308 | + "tab": "cib", | |
| 309 | + "date": "2026-07-27", | |
| 310 | + "title": "LEGO Star Wars Cloud City 10123 - Used - 100% Complete - All Figures and manual.", | |
| 311 | + "price": 4000, | |
| 312 | + "ebayId": "298446501387", | |
| 313 | + "listedPrice": 5000 | |
| 314 | + }, | |
| 315 | + { | |
| 316 | + "tab": "cib", | |
| 317 | + "date": "2026-06-24", | |
| 318 | + "title": "LEGO Star Wars Cloud City 10123 In 2003 Used Boba Fett & Figures", | |
| 319 | + "price": 3599, | |
| 320 | + "ebayId": "398066260392", | |
| 321 | + "listedPrice": null | |
| 322 | + }, | |
| 323 | + { | |
| 324 | + "tab": "cib", | |
| 325 | + "date": "2026-06-02", | |
| 326 | + "title": "Lego Star Wars Cloud City 10123 W/ Manual. Retired, Used, Year 2003", | |
| 327 | + "price": 799, | |
| 328 | + "ebayId": "800055619842", | |
| 329 | + "listedPrice": null | |
| 330 | + }, | |
| 331 | + { | |
| 332 | + "tab": "cib", | |
| 333 | + "date": "2026-05-31", | |
| 334 | + "title": "LEGO Star Wars: Cloud City (10123) Used 100% Complete with Instructions & Box", | |
| 335 | + "price": 3700, | |
| 336 | + "ebayId": "336610734633", | |
| 337 | + "listedPrice": 4999 | |
| 338 | + }, | |
| 339 | + { | |
| 340 | + "tab": "cib", | |
| 341 | + "date": "2026-05-30", | |
| 342 | + "title": "LEGO Star Wars Cloud City 10123, Original Owner", | |
| 343 | + "price": 3500, | |
| 344 | + "ebayId": "236847390694", | |
| 345 | + "listedPrice": null | |
| 346 | + }, | |
| 347 | + { | |
| 348 | + "tab": "cib", | |
| 349 | + "date": "2026-05-30", | |
| 350 | + "title": "LEGO Cloud City 10123 100% Complete & Pristine | All figures, box and manual", | |
| 351 | + "price": 6000, | |
| 352 | + "ebayId": "298347078905", | |
| 353 | + "listedPrice": 6500 | |
| 354 | + }, | |
| 355 | + { | |
| 356 | + "tab": "cib", | |
| 357 | + "date": "2026-05-26", | |
| 358 | + "title": "LEGO 10123 Cloud City All Minifigures Boba Fett STAR WARS | RARE | 100% complete", | |
| 359 | + "price": 1399, | |
| 360 | + "ebayId": "318340057129", | |
| 361 | + "listedPrice": null | |
| 362 | + }, | |
| 363 | + { | |
| 364 | + "tab": "cib", | |
| 365 | + "date": "2026-05-24", | |
| 366 | + "title": "LEGO Star Wars: Cloud City 10123 Mini Figure Boba Lando Luke GRAIL RARE Complete", | |
| 367 | + "price": 3850, | |
| 368 | + "ebayId": "188392816617", | |
| 369 | + "listedPrice": null | |
| 370 | + }, | |
| 371 | + { | |
| 372 | + "tab": "cib", | |
| 373 | + "date": "2026-05-16", | |
| 374 | + "title": "LEGO 10123 Cloud City All Minifigures Boba Fett STAR WARS | RARE | 100% Complete", | |
| 375 | + "price": 5696.24, | |
| 376 | + "ebayId": "167252437550", | |
| 377 | + "listedPrice": null | |
| 378 | + }, | |
| 379 | + { | |
| 380 | + "tab": "cib", | |
| 381 | + "date": "2026-05-13", | |
| 382 | + "title": "LEGO Star Wars Cloud City 10123 Complete Set w/ all Minifigs with Box & Instruct", | |
| 383 | + "price": 4500, | |
| 384 | + "ebayId": "236806135910", | |
| 385 | + "listedPrice": null | |
| 386 | + }, | |
| 387 | + { | |
| 388 | + "tab": "cib", | |
| 389 | + "date": "2026-05-01", | |
| 390 | + "title": "LEGO Star Wars Cloud City 10123 Complete Set w/ Minifigures, Manual & Parts", | |
| 391 | + "price": 2900, | |
| 392 | + "ebayId": "206229109537", | |
| 393 | + "listedPrice": null | |
| 394 | + }, | |
| 395 | + { | |
| 396 | + "tab": "cib", | |
| 397 | + "date": "2026-04-25", | |
| 398 | + "title": "💎Lego Star Wars Rare 10123 Cloud Ci plus bonuses", | |
| 399 | + "price": 2500, | |
| 400 | + "ebayId": "206230930165", | |
| 401 | + "listedPrice": 3500 | |
| 402 | + }, | |
| 403 | + { | |
| 404 | + "tab": "cib", | |
| 405 | + "date": "2026-04-18", | |
| 406 | + "title": "LEGO Cloud City 10123 | 100% Complete & Pristine | All figs, box, manual, & bags", | |
| 407 | + "price": 5000, | |
| 408 | + "ebayId": "257454452156", | |
| 409 | + "listedPrice": 6000 | |
| 410 | + }, | |
| 411 | + { | |
| 412 | + "tab": "cib", | |
| 413 | + "date": "2026-04-02", | |
| 414 | + "title": "star wars lego set Cloud City (10123), Retired, 2003, 7 Minifigures & Manual", | |
| 415 | + "price": 3000, | |
| 416 | + "ebayId": "389837480827", | |
| 417 | + "listedPrice": 4200 | |
| 418 | + }, | |
| 419 | + { | |
| 420 | + "tab": "cib", | |
| 421 | + "date": "2026-03-27", | |
| 422 | + "title": "LEGO Star Wars 10123 Cloud City – 100% Complete – Box + Instructions + Case", | |
| 423 | + "price": 4500, | |
| 424 | + "ebayId": "406802073344", | |
| 425 | + "listedPrice": 4750 | |
| 426 | + }, | |
| 427 | + { | |
| 428 | + "tab": "cib", | |
| 429 | + "date": "2026-03-25", | |
| 430 | + "title": "LEGO Star Wars: Cloud City (10123) 100% complete set with Boba Fett!! (2003)", | |
| 431 | + "price": 4050, | |
| 432 | + "ebayId": "358334639899", | |
| 433 | + "listedPrice": null | |
| 434 | + }, | |
| 435 | + { | |
| 436 | + "tab": "cib", | |
| 437 | + "date": "2026-03-24", | |
| 438 | + "title": "LEGO Star Wars: Cloud City (10123) 100% COMPLETE!!! (Assembled Once in 2003)", | |
| 439 | + "price": 4350, | |
| 440 | + "ebayId": "298145843929", | |
| 441 | + "listedPrice": null | |
| 442 | + }, | |
| 443 | + { | |
| 444 | + "tab": "cib", | |
| 445 | + "date": "2026-03-17", | |
| 446 | + "title": "Rare Collectors Lego Star Wars Cloud City 10123", | |
| 447 | + "price": 2777.67, | |
| 448 | + "ebayId": "227260832523", | |
| 449 | + "listedPrice": 2909.94 | |
| 450 | + }, | |
| 451 | + { | |
| 452 | + "tab": "cib", | |
| 453 | + "date": "2026-03-07", | |
| 454 | + "title": "LEGO STAR WARS Set 10123 Cloud City 2003 100% complete with Boba Fett!!", | |
| 455 | + "price": 3450, | |
| 456 | + "ebayId": "177921321503", | |
| 457 | + "listedPrice": null | |
| 458 | + }, | |
| 459 | + { | |
| 460 | + "tab": "cib", | |
| 461 | + "date": "2026-03-04", | |
| 462 | + "title": "LEGO STAR WARS Set 10123 Cloud City 2003 100% complete with Boba Fett!!", | |
| 463 | + "price": 3600, | |
| 464 | + "ebayId": "177902916013", | |
| 465 | + "listedPrice": null | |
| 466 | + }, | |
| 467 | + { | |
| 468 | + "tab": "cib", | |
| 469 | + "date": "2026-02-24", | |
| 470 | + "title": "LEGO STAR WARS Set 10123 Cloud City 2003 100% complete with Boba Fett!!", | |
| 471 | + "price": 3050, | |
| 472 | + "ebayId": "267579189893", | |
| 473 | + "listedPrice": null | |
| 474 | + }, | |
| 475 | + { | |
| 476 | + "tab": "cib", | |
| 477 | + "date": "2026-02-22", | |
| 478 | + "title": "LEGO STAR WARS Set 10123 Cloud City 2003 100% complete with Boba Fett!!", | |
| 479 | + "price": 4055, | |
| 480 | + "ebayId": "177871649996", | |
| 481 | + "listedPrice": null | |
| 482 | + }, | |
| 483 | + { | |
| 484 | + "tab": "cib", | |
| 485 | + "date": "2026-02-17", | |
| 486 | + "title": "LEGO STAR WARS Set 10123 Cloud City 2003 100% complete with Boba Fett!!", | |
| 487 | + "price": 3250, | |
| 488 | + "ebayId": "177858763965", | |
| 489 | + "listedPrice": null | |
| 490 | + }, | |
| 491 | + { | |
| 492 | + "tab": "cib", | |
| 493 | + "date": "2026-02-08", | |
| 494 | + "title": "LEGO STAR WARS Set 10123 Cloud City 2003 100% complete with Boba Fett!!", | |
| 495 | + "price": 3250, | |
| 496 | + "ebayId": "177833331269", | |
| 497 | + "listedPrice": null | |
| 498 | + }, | |
| 499 | + { | |
| 500 | + "tab": "cib", | |
| 501 | + "date": "2026-02-01", | |
| 502 | + "title": "LEGO STAR WARS Set 10123 Cloud City 2003 Inc Figures, Instructions sw0107 RARE!", | |
| 503 | + "price": 3199.77, | |
| 504 | + "ebayId": "206017421732", | |
| 505 | + "listedPrice": null | |
| 506 | + }, | |
| 507 | + { | |
| 508 | + "tab": "cib", | |
| 509 | + "date": "2026-01-03", | |
| 510 | + "title": "LEGO Star Wars: Cloud City (10123) Complete, All Minifigures, Manual, No Box", | |
| 511 | + "price": 3200, | |
| 512 | + "ebayId": "136905451171", | |
| 513 | + "listedPrice": null | |
| 514 | + }, | |
| 515 | + { | |
| 516 | + "tab": "cib", | |
| 517 | + "date": "2025-12-28", | |
| 518 | + "title": "LEGO Star Wars: Cloud City (10123) Minifigures", | |
| 519 | + "price": 2900, | |
| 520 | + "ebayId": "227133539310", | |
| 521 | + "listedPrice": null | |
| 522 | + }, | |
| 523 | + { | |
| 524 | + "tab": "cib", | |
| 525 | + "date": "2025-12-28", | |
| 526 | + "title": "( Lego Star Wars cloud city set 10123 ) Please Read Description Before Buying", | |
| 527 | + "price": 3300, | |
| 528 | + "ebayId": "357981175115", | |
| 529 | + "listedPrice": null | |
| 530 | + }, | |
| 531 | + { | |
| 532 | + "tab": "cib", | |
| 533 | + "date": "2025-12-26", | |
| 534 | + "title": "LEGO Star Wars: Cloud City (10123) New but box not sealed", | |
| 535 | + "price": 4250, | |
| 536 | + "ebayId": "336362057736", | |
| 537 | + "listedPrice": null | |
| 538 | + }, | |
| 539 | + { | |
| 540 | + "tab": "cib", | |
| 541 | + "date": "2025-12-20", | |
| 542 | + "title": "LEGO Star Wars: Cloud City (10123)", | |
| 543 | + "price": 4000, | |
| 544 | + "ebayId": "297842057875", | |
| 545 | + "listedPrice": null | |
| 546 | + }, | |
| 547 | + { | |
| 548 | + "tab": "new", | |
| 549 | + "date": "2026-08-02", | |
| 550 | + "title": "LEGO Star Wars: Cloud City (10123) NEW & SEALED - BOBA FETT MINIATURE", | |
| 551 | + "price": 3500, | |
| 552 | + "ebayId": "358867663173", | |
| 553 | + "listedPrice": null | |
| 554 | + }, | |
| 555 | + { | |
| 556 | + "tab": "new", | |
| 557 | + "date": "2026-08-02", | |
| 558 | + "title": "LEGO Star Wars Cloud City 10123 New Sealed Rare Never Been Opened", | |
| 559 | + "price": 8000, | |
| 560 | + "ebayId": "188732256957", | |
| 561 | + "listedPrice": null | |
| 562 | + }, | |
| 563 | + { | |
| 564 | + "tab": "new", | |
| 565 | + "date": "2026-07-10", | |
| 566 | + "title": "LEGO Star Wars Cloud City 10123 Vintage Complete Set 698 pcs 9+ Boba Fett Box", | |
| 567 | + "price": 4500, | |
| 568 | + "ebayId": "358761213158", | |
| 569 | + "listedPrice": null | |
| 570 | + }, | |
| 571 | + { | |
| 572 | + "tab": "new", | |
| 573 | + "date": "2026-07-08", | |
| 574 | + "title": "💎LEGO 10123 CLOUD CITY SET WITH BOX *MINT CONDITION SOME SEALED* CC BOBA FETT", | |
| 575 | + "price": 6000, | |
| 576 | + "ebayId": "127945598206", | |
| 577 | + "listedPrice": null | |
| 578 | + }, | |
| 579 | + { | |
| 580 | + "tab": "new", | |
| 581 | + "date": "2026-06-20", | |
| 582 | + "title": "LEGO Star Wars Cloud City 10123 Vintage Complete Set 698 pcs Box Age 9+", | |
| 583 | + "price": 2499, | |
| 584 | + "ebayId": "800124340175", | |
| 585 | + "listedPrice": null | |
| 586 | + }, | |
| 587 | + { | |
| 588 | + "tab": "new", | |
| 589 | + "date": "2026-06-11", | |
| 590 | + "title": "LEGO Star Wars Cloud City 10123 - New, Sealed with Rare Boba Fett Minifigure", | |
| 591 | + "price": 12503, | |
| 592 | + "ebayId": "336612272659", | |
| 593 | + "listedPrice": null | |
| 594 | + }, | |
| 595 | + { | |
| 596 | + "tab": "new", | |
| 597 | + "date": "2026-06-09", | |
| 598 | + "title": "LEGO Star Wars Cloud City 10123 Vintage Complete Set 698 pcs Box Age 9+", | |
| 599 | + "price": 1389.99, | |
| 600 | + "ebayId": "398023601710", | |
| 601 | + "listedPrice": null | |
| 602 | + }, | |
| 603 | + { | |
| 604 | + "tab": "new", | |
| 605 | + "date": "2026-05-31", | |
| 606 | + "title": "LEGO Star Wars Cloud City 10123 Vintage Complete Set 698 pcs Box Age 9+", | |
| 607 | + "price": 3995, | |
| 608 | + "ebayId": "377223094599", | |
| 609 | + "listedPrice": null | |
| 610 | + }, | |
| 611 | + { | |
| 612 | + "tab": "new", | |
| 613 | + "date": "2026-05-29", | |
| 614 | + "title": "LEGO Star Wars Cloud City 10123 - New, Sealed with Rare Boba Fett Minifigure", | |
| 615 | + "price": 7499, | |
| 616 | + "ebayId": "127882727016", | |
| 617 | + "listedPrice": null | |
| 618 | + }, | |
| 619 | + { | |
| 620 | + "tab": "new", | |
| 621 | + "date": "2026-05-26", | |
| 622 | + "title": "LEGO Star Wars: Cloud City (10123) - New Sealed CC Boba Lando Luke - GRAIL RARE", | |
| 623 | + "price": 12500, | |
| 624 | + "ebayId": "227333009460", | |
| 625 | + "listedPrice": 14999.99 | |
| 626 | + }, | |
| 627 | + { | |
| 628 | + "tab": "new", | |
| 629 | + "date": "2026-05-26", | |
| 630 | + "title": "BRAND NEW LEGO Star Wars Cloud City Sealed Set 10123 EXTREMELY RARE!", | |
| 631 | + "price": 7500, | |
| 632 | + "ebayId": "397991721120", | |
| 633 | + "listedPrice": null | |
| 634 | + }, | |
| 635 | + { | |
| 636 | + "tab": "new", | |
| 637 | + "date": "2026-05-21", | |
| 638 | + "title": "LEGO Star Wars Cloud City 10123 All 5 bags sealed. Instruction minifig", | |
| 639 | + "price": 5500, | |
| 640 | + "ebayId": "397968515846", | |
| 641 | + "listedPrice": 6000 | |
| 642 | + }, | |
| 643 | + { | |
| 644 | + "tab": "new", | |
| 645 | + "date": "2026-05-21", | |
| 646 | + "title": "Lego Star Wars Cloud City 10123 BRAND NEW SEALED Rare Boba Fett minifig see pics", | |
| 647 | + "price": 8195, | |
| 648 | + "ebayId": "406930387584", | |
| 649 | + "listedPrice": null | |
| 650 | + }, | |
| 651 | + { | |
| 652 | + "tab": "new", | |
| 653 | + "date": "2026-05-17", | |
| 654 | + "title": "LEGO STAR WARS CLOUD CITY 10123 BOBA FETT LUKE LANDO NEW SEALED VERY RARE!", | |
| 655 | + "price": 6600, | |
| 656 | + "ebayId": "406914554614", | |
| 657 | + "listedPrice": null | |
| 658 | + }, | |
| 659 | + { | |
| 660 | + "tab": "new", | |
| 661 | + "date": "2026-04-17", | |
| 662 | + "title": "LEGO Star Wars 10123 Cloud City Boba Fett AFA 9.0 - Rare", | |
| 663 | + "price": 4000, | |
| 664 | + "ebayId": "206212147538", | |
| 665 | + "listedPrice": 5000 | |
| 666 | + }, | |
| 667 | + { | |
| 668 | + "tab": "new", | |
| 669 | + "date": "2026-03-29", | |
| 670 | + "title": "LEGO Star Wars Cloud City 10123 Factory New", | |
| 671 | + "price": 8000, | |
| 672 | + "ebayId": "177973534504", | |
| 673 | + "listedPrice": null | |
| 674 | + }, | |
| 675 | + { | |
| 676 | + "tab": "new", | |
| 677 | + "date": "2026-03-25", | |
| 678 | + "title": "10123 Lego Star Wars Cloud City Set NEW IN BOX RETIRED SET", | |
| 679 | + "price": 13000, | |
| 680 | + "ebayId": "157764992203", | |
| 681 | + "listedPrice": null | |
| 682 | + }, | |
| 683 | + { | |
| 684 | + "tab": "new", | |
| 685 | + "date": "2026-02-12", | |
| 686 | + "title": "LEGO Cloud City 10123 SW0107 Very Rare New Retired Set", | |
| 687 | + "price": 5596.91, | |
| 688 | + "ebayId": "366183755232", | |
| 689 | + "listedPrice": null | |
| 690 | + }, | |
| 691 | + { | |
| 692 | + "tab": "new", | |
| 693 | + "date": "2026-02-09", | |
| 694 | + "title": "⚜️[SEALED] MINT LEGO Star Wars: Cloud City (10123)", | |
| 695 | + "price": 12500, | |
| 696 | + "ebayId": "389594601497", | |
| 697 | + "listedPrice": 12995.95 | |
| 698 | + }, | |
| 699 | + { | |
| 700 | + "tab": "new", | |
| 701 | + "date": "2026-01-17", | |
| 702 | + "title": "LEGO Star Wars Cloud City 10123 AFA 8.5 Factory Sealed New Graded Not CAS Grail", | |
| 703 | + "price": 14500, | |
| 704 | + "ebayId": "236578416007", | |
| 705 | + "listedPrice": null | |
| 706 | + }, | |
| 707 | + { | |
| 708 | + "tab": "new", | |
| 709 | + "date": "2026-01-03", | |
| 710 | + "title": "LEGO Star Wars Cloud City 10123 – Factory Sealed, Mint Condition, Ultra-Rare", | |
| 711 | + "price": 12500, | |
| 712 | + "ebayId": "326834534737", | |
| 713 | + "listedPrice": null | |
| 714 | + }, | |
| 715 | + { | |
| 716 | + "tab": "new", | |
| 717 | + "date": "2025-12-30", | |
| 718 | + "title": "LEGO Cloud City 10123 SW0107 Very Rare New Retired Set", | |
| 719 | + "price": 5460.4, | |
| 720 | + "ebayId": "366091262347", | |
| 721 | + "listedPrice": null | |
| 722 | + }, | |
| 723 | + { | |
| 724 | + "tab": "new", | |
| 725 | + "date": "2025-12-30", | |
| 726 | + "title": "LEGO Cloud City 10123 SW0107 Very Rare New Retired Set", | |
| 727 | + "price": 5460.4, | |
| 728 | + "ebayId": "366089445105", | |
| 729 | + "listedPrice": null | |
| 730 | + }, | |
| 731 | + { | |
| 732 | + "tab": "new", | |
| 733 | + "date": "2025-12-21", | |
| 734 | + "title": "LEGO Star Wars Cloud City 10123 – Factory Sealed, Mint Condition, Ultra-Rare", | |
| 735 | + "price": 11500, | |
| 736 | + "ebayId": "187698094074", | |
| 737 | + "listedPrice": 12500 | |
| 738 | + }, | |
| 739 | + { | |
| 740 | + "tab": "new", | |
| 741 | + "date": "2025-10-25", | |
| 742 | + "title": "LEGO Star Wars Cloud City 10123 – Factory Sealed, Mint Condition, Ultra-Rare", | |
| 743 | + "price": 12500, | |
| 744 | + "ebayId": "326516473345", | |
| 745 | + "listedPrice": null | |
| 746 | + }, | |
| 747 | + { | |
| 748 | + "tab": "new", | |
| 749 | + "date": "2025-10-20", | |
| 750 | + "title": "Lego Star Wars Cloud City set 10123 NEW UNOPENED", | |
| 751 | + "price": 5913, | |
| 752 | + "ebayId": "406299213194", | |
| 753 | + "listedPrice": null | |
| 754 | + }, | |
| 755 | + { | |
| 756 | + "tab": "new", | |
| 757 | + "date": "2025-10-09", | |
| 758 | + "title": "Lego Star Wars Cloud City set 10123 NEW UNOPENED", | |
| 759 | + "price": 10100, | |
| 760 | + "ebayId": "226717294323", | |
| 761 | + "listedPrice": null | |
| 762 | + }, | |
| 763 | + { | |
| 764 | + "tab": "new", | |
| 765 | + "date": "2025-07-21", | |
| 766 | + "title": "Lego Star Wars Set 10123 Cloud City UNUSED COMPLETE SEALED BAGS Original 2004", | |
| 767 | + "price": 5342.8, | |
| 768 | + "ebayId": "388730452005", | |
| 769 | + "listedPrice": null | |
| 770 | + }, | |
| 771 | + { | |
| 772 | + "tab": "new", | |
| 773 | + "date": "2025-04-18", | |
| 774 | + "title": "LEGO Star Wars Cloud City 10123 - Factory Sealed, Mint, Ultra-Rare", | |
| 775 | + "price": 8000, | |
| 776 | + "ebayId": "306254551906", | |
| 777 | + "listedPrice": null | |
| 778 | + }, | |
| 779 | + { | |
| 780 | + "tab": "new", | |
| 781 | + "date": "2025-04-18", | |
| 782 | + "title": "LEGO Star Wars Cloud City 10123 - Factory Sealed, Mint, Ultra-Rare", | |
| 783 | + "price": 8000, | |
| 784 | + "ebayId": "306254474462", | |
| 785 | + "listedPrice": null | |
| 786 | + }, | |
| 787 | + { | |
| 788 | + "tab": "box-only", | |
| 789 | + "date": "2026-01-20", | |
| 790 | + "title": "LEGO Star Wars: Cloud City (10123) Box ONLY - Super Nice", | |
| 791 | + "price": 999, | |
| 792 | + "ebayId": "306720579787", | |
| 793 | + "listedPrice": null | |
| 794 | + }, | |
| 795 | + { | |
| 796 | + "tab": "box-only", | |
| 797 | + "date": "2026-01-11", | |
| 798 | + "title": "LEGO 10123 Cloud City BOX ONLY Empty Box VERY GOOD Collectors Item Star Wars", | |
| 799 | + "price": 2094.65, | |
| 800 | + "ebayId": "127605557204", | |
| 801 | + "listedPrice": null | |
| 802 | + }, | |
| 803 | + { | |
| 804 | + "tab": "box-only", | |
| 805 | + "date": "2025-07-07", | |
| 806 | + "title": "LEGO Star Wars 10123 Cloud City BOX ONLY – Rare Original Packaging", | |
| 807 | + "price": 550, | |
| 808 | + "ebayId": "365714839479", | |
| 809 | + "listedPrice": null | |
| 810 | + }, | |
| 811 | + { | |
| 812 | + "tab": "box-only", | |
| 813 | + "date": "2025-03-14", | |
| 814 | + "title": "Lego 10123 Cloud City Box - 2003 - Star Wars - *Empty Box Only*", | |
| 815 | + "price": 588.68, | |
| 816 | + "ebayId": "276903663376", | |
| 817 | + "listedPrice": null | |
| 818 | + }, | |
| 819 | + { | |
| 820 | + "tab": "box-only", | |
| 821 | + "date": "2024-11-26", | |
| 822 | + "title": "LEGO Star Wars: Cloud City (10123) - BOX ONLY - No Lego Pieces Or Figures", | |
| 823 | + "price": 479.99, | |
| 824 | + "ebayId": "395902064789", | |
| 825 | + "listedPrice": null | |
| 826 | + }, | |
| 827 | + { | |
| 828 | + "tab": "box-only", | |
| 829 | + "date": "2024-07-06", | |
| 830 | + "title": "LEGO Star Wars: Cloud City (10123) BOX ONLY NO PARTS", | |
| 831 | + "price": 904.4, | |
| 832 | + "ebayId": "326188809173", | |
| 833 | + "listedPrice": null | |
| 834 | + }, | |
| 835 | + { | |
| 836 | + "tab": "manual-only", | |
| 837 | + "date": "2025-10-31", | |
| 838 | + "title": "LEGO Star Wars: Cloud City (10123) Manual **Book Only**", | |
| 839 | + "price": 249.99, | |
| 840 | + "ebayId": "326831779274", | |
| 841 | + "listedPrice": null | |
| 842 | + }, | |
| 843 | + { | |
| 844 | + "tab": "manual-only", | |
| 845 | + "date": "2025-06-26", | |
| 846 | + "title": "vintage lego star wars cloud city booklet 10123", | |
| 847 | + "price": 257.42, | |
| 848 | + "ebayId": "376352154131", | |
| 849 | + "listedPrice": null | |
| 850 | + }, | |
| 851 | + { | |
| 852 | + "tab": "manual-only", | |
| 853 | + "date": "2024-05-24", | |
| 854 | + "title": "Vintage Original Lego Star Wars 10123 Cloud City Instruction Manual Book ONLY", | |
| 855 | + "price": 100, | |
| 856 | + "ebayId": "226135367862", | |
| 857 | + "listedPrice": null | |
| 858 | + }, | |
| 859 | + { | |
| 860 | + "tab": "manual-only", | |
| 861 | + "date": "2024-04-24", | |
| 862 | + "title": "LEGO® Star Wars 10123 Cloud City Anleitung, Bauanleitung, Instructions", | |
| 863 | + "price": 113.18, | |
| 864 | + "ebayId": "315277890259", | |
| 865 | + "listedPrice": null | |
| 866 | + }, | |
| 867 | + { | |
| 868 | + "tab": "manual-only", | |
| 869 | + "date": "2024-03-15", | |
| 870 | + "title": "Vintage Original Lego Star Wars 10123 Cloud City Instruction Manual Book ONLY", | |
| 871 | + "price": 109.99, | |
| 872 | + "ebayId": "296278130704", | |
| 873 | + "listedPrice": null | |
| 874 | + }, | |
| 875 | + { | |
| 876 | + "tab": "manual-only", | |
| 877 | + "date": "2024-01-31", | |
| 878 | + "title": "Original Lego Star Wars 10123 Cloud City Instruction Manual ONLY 9/10 Condition", | |
| 879 | + "price": 145, | |
| 880 | + "ebayId": "126264875697", | |
| 881 | + "listedPrice": null | |
| 882 | + }, | |
| 883 | + { | |
| 884 | + "tab": "manual-only", | |
| 885 | + "date": "2023-12-25", | |
| 886 | + "title": "LEGO Star Wars Cloud City 10123 Set and Instruction Manual ONLY", | |
| 887 | + "price": 203.5, | |
| 888 | + "ebayId": "395073158071", | |
| 889 | + "listedPrice": null | |
| 890 | + }, | |
| 891 | + { | |
| 892 | + "tab": "loose-and-manual", | |
| 893 | + "date": "2026-04-06", | |
| 894 | + "title": "LEGO Star Wars: Cloud City (10123) Complete, All Minifigures, Manual, No Box", | |
| 895 | + "price": 2700, | |
| 896 | + "ebayId": "165812498539", | |
| 897 | + "listedPrice": 5000 | |
| 898 | + }, | |
| 899 | + { | |
| 900 | + "tab": "loose-and-manual", | |
| 901 | + "date": "2025-11-11", | |
| 902 | + "title": "LEGO Star Wars: Cloud City (10123) Complete With Instructions & box!", | |
| 903 | + "price": 4200, | |
| 904 | + "ebayId": "286915664973", | |
| 905 | + "listedPrice": null | |
| 906 | + }, | |
| 907 | + { | |
| 908 | + "tab": "loose-and-manual", | |
| 909 | + "date": "2025-11-01", | |
| 910 | + "title": "LEGO Star Wars: Cloud City (10123) Complete With Instructions No Box Or Leia Fig", | |
| 911 | + "price": 2030, | |
| 912 | + "ebayId": "136676527305", | |
| 913 | + "listedPrice": null | |
| 914 | + }, | |
| 915 | + { | |
| 916 | + "tab": "loose-and-manual", | |
| 917 | + "date": "2025-10-28", | |
| 918 | + "title": "LEGO Star Wars: Cloud City (10123) Complete With Instructions No Box", | |
| 919 | + "price": 2800, | |
| 920 | + "ebayId": "406298537405", | |
| 921 | + "listedPrice": 3000 | |
| 922 | + }, | |
| 923 | + { | |
| 924 | + "tab": "loose-and-manual", | |
| 925 | + "date": "2025-09-10", | |
| 926 | + "title": "LEGO Star Wars: Cloud City (10123)", | |
| 927 | + "price": 950, | |
| 928 | + "ebayId": "167770626569", | |
| 929 | + "listedPrice": null | |
| 930 | + }, | |
| 931 | + { | |
| 932 | + "tab": "loose-and-manual", | |
| 933 | + "date": "2025-07-12", | |
| 934 | + "title": "LEGO Star Wars 10123: Cloud City - 100% Complete w/Manual and Minifigures", | |
| 935 | + "price": 2000, | |
| 936 | + "ebayId": "187405009118", | |
| 937 | + "listedPrice": null | |
| 938 | + }, | |
| 939 | + { | |
| 940 | + "tab": "loose-and-manual", | |
| 941 | + "date": "2025-06-30", | |
| 942 | + "title": "LEGO Star Wars 10123: Cloud City - 100% Complete! w/Manual and Minifigures", | |
| 943 | + "price": 2999, | |
| 944 | + "ebayId": "205571105547", | |
| 945 | + "listedPrice": null | |
| 946 | + }, | |
| 947 | + { | |
| 948 | + "tab": "loose-and-manual", | |
| 949 | + "date": "2025-06-25", | |
| 950 | + "title": "Lego Star Wars Cloud City 10123 - COMPLETE. All pieces and minifigs. NO BOX.", | |
| 951 | + "price": 3400, | |
| 952 | + "ebayId": "286232515067", | |
| 953 | + "listedPrice": null | |
| 954 | + }, | |
| 955 | + { | |
| 956 | + "tab": "loose-and-manual", | |
| 957 | + "date": "2025-02-05", | |
| 958 | + "title": "LEGO Star Wars Cloud City 10123 100% complete w/ instructions. Figures superb!", | |
| 959 | + "price": 2542.41, | |
| 960 | + "ebayId": "235940247077", | |
| 961 | + "listedPrice": null | |
| 962 | + }, | |
| 963 | + { | |
| 964 | + "tab": "loose-and-manual", | |
| 965 | + "date": "2025-01-26", | |
| 966 | + "title": "LEGO Star Wars Cloud City 10123 100% complete w/ instructions + all mini figures", | |
| 967 | + "price": 2355.05, | |
| 968 | + "ebayId": "196688199527", | |
| 969 | + "listedPrice": null | |
| 970 | + }, | |
| 971 | + { | |
| 972 | + "tab": "loose-and-manual", | |
| 973 | + "date": "2024-11-16", | |
| 974 | + "title": "Cloud City Star Wars Lego Set 10123 100% COMPLETE - Authentic Boba Fett - No box", | |
| 975 | + "price": 1575, | |
| 976 | + "ebayId": "375778196277", | |
| 977 | + "listedPrice": null | |
| 978 | + }, | |
| 979 | + { | |
| 980 | + "tab": "loose-and-manual", | |
| 981 | + "date": "2024-11-11", | |
| 982 | + "title": "Lego Cloud City 10123 Complete w/ Instructions Very Good Condition", | |
| 983 | + "price": 1600, | |
| 984 | + "ebayId": "156494155989", | |
| 985 | + "listedPrice": null | |
| 986 | + }, | |
| 987 | + { | |
| 988 | + "tab": "loose-and-manual", | |
| 989 | + "date": "2024-10-14", | |
| 990 | + "title": "Cloud City Star Wars Lego Set 10123 100% COMPLETE - No box", | |
| 991 | + "price": 1950, | |
| 992 | + "ebayId": "186730016761", | |
| 993 | + "listedPrice": null | |
| 994 | + }, | |
| 995 | + { | |
| 996 | + "tab": "loose-and-manual", | |
| 997 | + "date": "2024-09-24", | |
| 998 | + "title": "LEGO 10123 Cloud City All Minifigures Boba Fett STAR WARS | RARE | No Box", | |
| 999 | + "price": 3381.12, | |
| 1000 | + "ebayId": "315777201735", | |
| 1001 | + "listedPrice": null | |
| 1002 | + }, | |
| 1003 | + { | |
| 1004 | + "tab": "loose-and-manual", | |
| 1005 | + "date": "2024-08-29", | |
| 1006 | + "title": "Lego Cloud City 10123 Complete w/ Instructions Very Good Condition", | |
| 1007 | + "price": 2000, | |
| 1008 | + "ebayId": "355991513415", | |
| 1009 | + "listedPrice": null | |
| 1010 | + }, | |
| 1011 | + { | |
| 1012 | + "tab": "loose-and-manual", | |
| 1013 | + "date": "2024-05-27", | |
| 1014 | + "title": "Used Lego Cloud City 10123 100% Complete All Pieces, Minifigures, Manual -No Box", | |
| 1015 | + "price": 2100, | |
| 1016 | + "ebayId": "266832614145", | |
| 1017 | + "listedPrice": null | |
| 1018 | + }, | |
| 1019 | + { | |
| 1020 | + "tab": "loose-and-manual", | |
| 1021 | + "date": "2024-04-14", | |
| 1022 | + "title": "LEGO STAR WARS 10123 Cloud City Inkl. Anleitung NEUWERTIG ! RAR!", | |
| 1023 | + "price": 2593.84, | |
| 1024 | + "ebayId": "204731064343", | |
| 1025 | + "listedPrice": null | |
| 1026 | + }, | |
| 1027 | + { | |
| 1028 | + "tab": "loose-and-manual", | |
| 1029 | + "date": "2024-02-04", | |
| 1030 | + "title": "Lego Star Wars 10123 Cloud City UCS 2004", | |
| 1031 | + "price": 1938.15, | |
| 1032 | + "ebayId": "276318351185", | |
| 1033 | + "listedPrice": null | |
| 1034 | + }, | |
| 1035 | + { | |
| 1036 | + "tab": "loose-and-manual", | |
| 1037 | + "date": "2023-11-17", | |
| 1038 | + "title": "LEGO Star Wars Cloud City 10123 Genuine Product With Instruction Manual", | |
| 1039 | + "price": 1148, | |
| 1040 | + "ebayId": "394941923824", | |
| 1041 | + "listedPrice": null | |
| 1042 | + }, | |
| 1043 | + { | |
| 1044 | + "tab": "loose-and-manual", | |
| 1045 | + "date": "2023-09-14", | |
| 1046 | + "title": "LEGO Star Wars: Cloud City (10123)", | |
| 1047 | + "price": 3039.6, | |
| 1048 | + "ebayId": "325803183358", | |
| 1049 | + "listedPrice": null | |
| 1050 | + } | |
| 1051 | + ], | |
| 1052 | + "details": { | |
| 1053 | + "Genre": "LEGO Set", | |
| 1054 | + "Release Date": "January 1, 2003", | |
| 1055 | + "Model Number": "#10123", | |
| 1056 | + "UPC": "5702014367579,0673419034746", | |
| 1057 | + "ePID (eBay)": "17053422855", | |
| 1058 | + "PriceCharting ID": "5863335" | |
| 1059 | + }, | |
| 1060 | + "images": [ | |
| 1061 | + "https://storage.googleapis.com/images.pricecharting.com/e35077465088c8bb8ad5a777035e378528fd0fe8924a2fb8c92871edc1f85ec2/240.jpg", | |
| 1062 | + "https://storage.googleapis.com/images.pricecharting.com/276a1737c9443844ac939d8c6dd11e0c24396889a083e31cb7a8c655ee43a651/240.jpg", | |
| 1063 | + "https://storage.googleapis.com/images.pricecharting.com/e35077465088c8bb8ad5a777035e378528fd0fe8924a2fb8c92871edc1f85ec2/1600.jpg" | |
| 1064 | + ] | |
| 1065 | + } | |
| 1066 | + }, | |
| 1067 | + "expect": { | |
| 1068 | + "minCount": 1, | |
| 1069 | + "kinds": [ | |
| 1070 | + "catalog_item", | |
| 1071 | + "price_observation", | |
| 1072 | + "sale" | |
| 1073 | + ] | |
| 1074 | + }, | |
| 1075 | + "note": "captured live from https://www.pricecharting.com/game/lego-star-wars/cloud-city-10123", | |
| 1076 | + "capturedAt": "2026-09-07T04:33:30.167Z" | |
| 1077 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/pricecharting/nintendo-64__conker's-bad-fur-day.json
+1772 −0
@@ -0,0 +1,1772 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.pricecharting.com/game/nintendo-64/conker's-bad-fur-day", | |
| 4 | + "externalId": "3732", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:33:26.089Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "product", | |
| 10 | + "url": "https://www.pricecharting.com/game/nintendo-64/conker's-bad-fur-day", | |
| 11 | + "productId": "3732", | |
| 12 | + "consoleUri": "nintendo-64", | |
| 13 | + "consoleName": "Nintendo 64", | |
| 14 | + "title": "Conker's Bad Fur Day", | |
| 15 | + "flags": { | |
| 16 | + "isComic": false, | |
| 17 | + "isLegoSet": false, | |
| 18 | + "isFunkoPop": false, | |
| 19 | + "isCard": false, | |
| 20 | + "isCoin": false, | |
| 21 | + "isSystem": false | |
| 22 | + }, | |
| 23 | + "columnLabels": [ | |
| 24 | + "Loose Price", | |
| 25 | + "Complete Price", | |
| 26 | + "New Price", | |
| 27 | + "Graded Price", | |
| 28 | + "Box Only Price", | |
| 29 | + "Manual Only Price", | |
| 30 | + "Graded", | |
| 31 | + "Box Only", | |
| 32 | + "Manual Only" | |
| 33 | + ], | |
| 34 | + "prices": [ | |
| 35 | + { | |
| 36 | + "key": "used_price", | |
| 37 | + "value": 160.5, | |
| 38 | + "raw": "$160.50" | |
| 39 | + }, | |
| 40 | + { | |
| 41 | + "key": "complete_price", | |
| 42 | + "value": 398.98, | |
| 43 | + "raw": "$398.98" | |
| 44 | + }, | |
| 45 | + { | |
| 46 | + "key": "new_price", | |
| 47 | + "value": 798, | |
| 48 | + "raw": "$798.00" | |
| 49 | + }, | |
| 50 | + { | |
| 51 | + "key": "graded_price", | |
| 52 | + "value": 1128.04, | |
| 53 | + "raw": "$1,128.04" | |
| 54 | + }, | |
| 55 | + { | |
| 56 | + "key": "box_only_price", | |
| 57 | + "value": 141.34, | |
| 58 | + "raw": "$141.34" | |
| 59 | + }, | |
| 60 | + { | |
| 61 | + "key": "manual_only_price", | |
| 62 | + "value": 40, | |
| 63 | + "raw": "$40.00" | |
| 64 | + } | |
| 65 | + ], | |
| 66 | + "sales": [ | |
| 67 | + { | |
| 68 | + "tab": "used", | |
| 69 | + "date": "2026-09-05", | |
| 70 | + "title": "Conker's Bad Fur Day (Nintendo 64 N64) Cartridge Only w/ Rental Store Stickers", | |
| 71 | + "price": 135, | |
| 72 | + "ebayId": "257689585095", | |
| 73 | + "listedPrice": null | |
| 74 | + }, | |
| 75 | + { | |
| 76 | + "tab": "used", | |
| 77 | + "date": "2026-09-04", | |
| 78 | + "title": "Conker's Bad Fur Day Nintendo 64 Tested Working In Great Condition N64 2001", | |
| 79 | + "price": 160.5, | |
| 80 | + "ebayId": "227494527631", | |
| 81 | + "listedPrice": null | |
| 82 | + }, | |
| 83 | + { | |
| 84 | + "tab": "used", | |
| 85 | + "date": "2026-09-03", | |
| 86 | + "title": "Conker's Bad Fur Day - Nintendo 64 Cartridge Only", | |
| 87 | + "price": 162.5, | |
| 88 | + "ebayId": "298619569044", | |
| 89 | + "listedPrice": null | |
| 90 | + }, | |
| 91 | + { | |
| 92 | + "tab": "used", | |
| 93 | + "date": "2026-09-02", | |
| 94 | + "title": "Conkers Bad Fur Day (Nintendo 64, 2001) N64 Authentic Tested Working", | |
| 95 | + "price": 169.99, | |
| 96 | + "ebayId": "398345570615", | |
| 97 | + "listedPrice": null | |
| 98 | + }, | |
| 99 | + { | |
| 100 | + "tab": "used", | |
| 101 | + "date": "2026-09-02", | |
| 102 | + "title": "Conker's Bad Fur Day N64 (Nintendo 64, 2001) cartridge only", | |
| 103 | + "price": 75, | |
| 104 | + "ebayId": "820076442117", | |
| 105 | + "listedPrice": null | |
| 106 | + }, | |
| 107 | + { | |
| 108 | + "tab": "used", | |
| 109 | + "date": "2026-09-01", | |
| 110 | + "title": "AUTHENTIC! Conker's Bad Fur Day - GAME ONLY - NINTENDO 64 - 829a", | |
| 111 | + "price": 161.99, | |
| 112 | + "ebayId": "188859018536", | |
| 113 | + "listedPrice": null | |
| 114 | + }, | |
| 115 | + { | |
| 116 | + "tab": "used", | |
| 117 | + "date": "2026-09-01", | |
| 118 | + "title": "Conker’s Bad Fur Day N64 Nintendo 64 Authentic OEM Cartridge Only - Tested", | |
| 119 | + "price": 190.7, | |
| 120 | + "ebayId": "336761529696", | |
| 121 | + "listedPrice": null | |
| 122 | + }, | |
| 123 | + { | |
| 124 | + "tab": "used", | |
| 125 | + "date": "2026-09-01", | |
| 126 | + "title": "Conker’s Bad Fur Day (Nintendo 64, 2001) AUTHENTIC TESTED NICE! N64", | |
| 127 | + "price": 189.95, | |
| 128 | + "ebayId": "327316474916", | |
| 129 | + "listedPrice": null | |
| 130 | + }, | |
| 131 | + { | |
| 132 | + "tab": "used", | |
| 133 | + "date": "2026-09-01", | |
| 134 | + "title": "Nintendo 64 N64 Conker's Bad Fur Day Cartridge and Manual Authentic RARE Tested", | |
| 135 | + "price": 199.95, | |
| 136 | + "ebayId": "278316750564", | |
| 137 | + "listedPrice": null | |
| 138 | + }, | |
| 139 | + { | |
| 140 | + "tab": "used", | |
| 141 | + "date": "2026-08-31", | |
| 142 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) Authentic & Tested Fast Shipping!", | |
| 143 | + "price": 155, | |
| 144 | + "ebayId": "137682385426", | |
| 145 | + "listedPrice": null | |
| 146 | + }, | |
| 147 | + { | |
| 148 | + "tab": "used", | |
| 149 | + "date": "2026-08-31", | |
| 150 | + "title": "Conkers Bad Fur Day (Nintendo 64, 2001) N64 Authentic Tested Working", | |
| 151 | + "price": 155, | |
| 152 | + "ebayId": "820062774904", | |
| 153 | + "listedPrice": null | |
| 154 | + }, | |
| 155 | + { | |
| 156 | + "tab": "used", | |
| 157 | + "date": "2026-08-31", | |
| 158 | + "title": "Conker's Bad Fur Day - Nintendo 64 (N64), Tested, Works, Authentic", | |
| 159 | + "price": 140, | |
| 160 | + "ebayId": "128052879234", | |
| 161 | + "listedPrice": null | |
| 162 | + }, | |
| 163 | + { | |
| 164 | + "tab": "used", | |
| 165 | + "date": "2026-08-30", | |
| 166 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Cartridge", | |
| 167 | + "price": 177.5, | |
| 168 | + "ebayId": "820055456930", | |
| 169 | + "listedPrice": null | |
| 170 | + }, | |
| 171 | + { | |
| 172 | + "tab": "used", | |
| 173 | + "date": "2026-08-30", | |
| 174 | + "title": "Conker's Bad Fur Day - Nintendo 64 N64 Genuine Cartridge ONLY", | |
| 175 | + "price": 182.5, | |
| 176 | + "ebayId": "318769368989", | |
| 177 | + "listedPrice": null | |
| 178 | + }, | |
| 179 | + { | |
| 180 | + "tab": "used", | |
| 181 | + "date": "2026-08-29", | |
| 182 | + "title": "Conker's Bad Fur Day - Nintendo 64 (N64)", | |
| 183 | + "price": 94.5, | |
| 184 | + "ebayId": "820033851386", | |
| 185 | + "listedPrice": null | |
| 186 | + }, | |
| 187 | + { | |
| 188 | + "tab": "used", | |
| 189 | + "date": "2026-08-28", | |
| 190 | + "title": "Conker's Bad Fur Day - Nintendo 64 (Cartridge Only)", | |
| 191 | + "price": 150, | |
| 192 | + "ebayId": "147530395441", | |
| 193 | + "listedPrice": null | |
| 194 | + }, | |
| 195 | + { | |
| 196 | + "tab": "used", | |
| 197 | + "date": "2026-08-26", | |
| 198 | + "title": "Conker’s Bad Fur Day Nintendo 64 N64 Authentic Original Rare Tested Excellent", | |
| 199 | + "price": 180.45, | |
| 200 | + "ebayId": "188797330651", | |
| 201 | + "listedPrice": null | |
| 202 | + }, | |
| 203 | + { | |
| 204 | + "tab": "used", | |
| 205 | + "date": "2026-08-26", | |
| 206 | + "title": "Nintendo 64 N64 Conker's Bad Fur Day Cartridge and Manual Authentic Tested Rare", | |
| 207 | + "price": 199, | |
| 208 | + "ebayId": "278305714552", | |
| 209 | + "listedPrice": null | |
| 210 | + }, | |
| 211 | + { | |
| 212 | + "tab": "used", | |
| 213 | + "date": "2026-08-26", | |
| 214 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Nintendo M Mature NTSC-U/C US/CA", | |
| 215 | + "price": 100, | |
| 216 | + "ebayId": "128044445740", | |
| 217 | + "listedPrice": null | |
| 218 | + }, | |
| 219 | + { | |
| 220 | + "tab": "used", | |
| 221 | + "date": "2026-08-25", | |
| 222 | + "title": "Rare Conker's Bad Fur Day for Nintendo 64 N64 - Cartridge Only, M, NTSC-U/C", | |
| 223 | + "price": 152.98, | |
| 224 | + "ebayId": "358823064190", | |
| 225 | + "listedPrice": null | |
| 226 | + }, | |
| 227 | + { | |
| 228 | + "tab": "used", | |
| 229 | + "date": "2026-08-24", | |
| 230 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) Cleaned / Tested / Authentic - N64", | |
| 231 | + "price": 187.64, | |
| 232 | + "ebayId": "237025795164", | |
| 233 | + "listedPrice": null | |
| 234 | + }, | |
| 235 | + { | |
| 236 | + "tab": "used", | |
| 237 | + "date": "2026-08-24", | |
| 238 | + "title": "Conker’s Bad Fur Day Nintendo 64 N64 Authentic OEM Cartridge Tested Working", | |
| 239 | + "price": 189.99, | |
| 240 | + "ebayId": "206511100519", | |
| 241 | + "listedPrice": null | |
| 242 | + }, | |
| 243 | + { | |
| 244 | + "tab": "used", | |
| 245 | + "date": "2026-08-23", | |
| 246 | + "title": "Conker's Bad Fur Day N64 Game Pak Cartridge TESTED AUTHENTIC CLEANED", | |
| 247 | + "price": 200, | |
| 248 | + "ebayId": "147489779490", | |
| 249 | + "listedPrice": null | |
| 250 | + }, | |
| 251 | + { | |
| 252 | + "tab": "used", | |
| 253 | + "date": "2026-08-23", | |
| 254 | + "title": "Conker’s Bad Fur Day N64 Nintendo 64 AUTHENTIC💯 CLEANED & TESTED Near Mint💎", | |
| 255 | + "price": 187.99, | |
| 256 | + "ebayId": "227484546404", | |
| 257 | + "listedPrice": null | |
| 258 | + }, | |
| 259 | + { | |
| 260 | + "tab": "used", | |
| 261 | + "date": "2026-08-23", | |
| 262 | + "title": "Conkers bad fur day n64 authentic. Cartridge only", | |
| 263 | + "price": 165, | |
| 264 | + "ebayId": "318768596498", | |
| 265 | + "listedPrice": null | |
| 266 | + }, | |
| 267 | + { | |
| 268 | + "tab": "used", | |
| 269 | + "date": "2026-08-23", | |
| 270 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) Authentic Tested And Working", | |
| 271 | + "price": 189.99, | |
| 272 | + "ebayId": "117370480652", | |
| 273 | + "listedPrice": null | |
| 274 | + }, | |
| 275 | + { | |
| 276 | + "tab": "used", | |
| 277 | + "date": "2026-08-23", | |
| 278 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) Cleaned / Tested / Authentic - N64", | |
| 279 | + "price": 189.64, | |
| 280 | + "ebayId": "237021350343", | |
| 281 | + "listedPrice": null | |
| 282 | + }, | |
| 283 | + { | |
| 284 | + "tab": "used", | |
| 285 | + "date": "2026-08-22", | |
| 286 | + "title": "Conker’s Bad Fur Day Nintendo 64 N64 Authentic Tested Working Cart Only", | |
| 287 | + "price": 160, | |
| 288 | + "ebayId": "398312127760", | |
| 289 | + "listedPrice": null | |
| 290 | + }, | |
| 291 | + { | |
| 292 | + "tab": "used", | |
| 293 | + "date": "2026-08-21", | |
| 294 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Cartridge Only", | |
| 295 | + "price": 155.49, | |
| 296 | + "ebayId": "158189132032", | |
| 297 | + "listedPrice": null | |
| 298 | + }, | |
| 299 | + { | |
| 300 | + "tab": "used", | |
| 301 | + "date": "2026-08-20", | |
| 302 | + "title": "Conker's Bad Fur Day - Nintendo 64 (N64) As Pictured! Authentic Tested works!", | |
| 303 | + "price": 164.99, | |
| 304 | + "ebayId": "336751003130", | |
| 305 | + "listedPrice": null | |
| 306 | + }, | |
| 307 | + { | |
| 308 | + "tab": "cib", | |
| 309 | + "date": "2026-09-03", | |
| 310 | + "title": "AUTHENTIC! Conker's Bad Fur Day - COMPLETE BOX - NINTENDO 64 - 91a", | |
| 311 | + "price": 359.09, | |
| 312 | + "ebayId": "366641918737", | |
| 313 | + "listedPrice": null | |
| 314 | + }, | |
| 315 | + { | |
| 316 | + "tab": "cib", | |
| 317 | + "date": "2026-09-02", | |
| 318 | + "title": "Conker's Bad Fur Day N64 Authentic W/2001 BlockBuster Stickers CIB", | |
| 319 | + "price": 295.95, | |
| 320 | + "ebayId": "398291426383", | |
| 321 | + "listedPrice": null | |
| 322 | + }, | |
| 323 | + { | |
| 324 | + "tab": "cib", | |
| 325 | + "date": "2026-08-30", | |
| 326 | + "title": "N64 Conker's Bad Fur Day 2001 Complete In Box Authentic CIB", | |
| 327 | + "price": 455, | |
| 328 | + "ebayId": "820038306968", | |
| 329 | + "listedPrice": null | |
| 330 | + }, | |
| 331 | + { | |
| 332 | + "tab": "cib", | |
| 333 | + "date": "2026-08-30", | |
| 334 | + "title": "Conker's Bad Fur Day (Nintendo 64) Complete CIB Authentic w/ inserts! Excellent", | |
| 335 | + "price": 370, | |
| 336 | + "ebayId": "206524031739", | |
| 337 | + "listedPrice": null | |
| 338 | + }, | |
| 339 | + { | |
| 340 | + "tab": "cib", | |
| 341 | + "date": "2026-08-30", | |
| 342 | + "title": "Conker's Bad Fur Day (Nintendo 64) Complete CIB Authentic w/ inserts! Excellent", | |
| 343 | + "price": 370, | |
| 344 | + "ebayId": "158238055176", | |
| 345 | + "listedPrice": null | |
| 346 | + }, | |
| 347 | + { | |
| 348 | + "tab": "cib", | |
| 349 | + "date": "2026-08-30", | |
| 350 | + "title": "Nintendo 64 (N64) Conker’s Bad Fur Day, Genuine, Mint CIB, With Original Shrink", | |
| 351 | + "price": 670, | |
| 352 | + "ebayId": "278304026913", | |
| 353 | + "listedPrice": null | |
| 354 | + }, | |
| 355 | + { | |
| 356 | + "tab": "cib", | |
| 357 | + "date": "2026-08-27", | |
| 358 | + "title": "Nintendo N64 Conker's Bad Fur Day Action Adventure M NTSC-U/C 2001 Box Manual", | |
| 359 | + "price": 375, | |
| 360 | + "ebayId": "117376606247", | |
| 361 | + "listedPrice": null | |
| 362 | + }, | |
| 363 | + { | |
| 364 | + "tab": "cib", | |
| 365 | + "date": "2026-08-25", | |
| 366 | + "title": "Conker's Bad Fur Day (64, 2001)", | |
| 367 | + "price": 450, | |
| 368 | + "ebayId": "403265304441", | |
| 369 | + "listedPrice": null | |
| 370 | + }, | |
| 371 | + { | |
| 372 | + "tab": "cib", | |
| 373 | + "date": "2026-08-24", | |
| 374 | + "title": "Conker's Bad Fur Day (Nintendo 64 N64) Tested CIB", | |
| 375 | + "price": 440.31, | |
| 376 | + "ebayId": "398305054981", | |
| 377 | + "listedPrice": null | |
| 378 | + }, | |
| 379 | + { | |
| 380 | + "tab": "cib", | |
| 381 | + "date": "2026-08-24", | |
| 382 | + "title": "CONKER'S BAD FUR DAY Complete CIB Nintendo 64 Authentic Tested And Working", | |
| 383 | + "price": 360.18, | |
| 384 | + "ebayId": "336744143695", | |
| 385 | + "listedPrice": null | |
| 386 | + }, | |
| 387 | + { | |
| 388 | + "tab": "cib", | |
| 389 | + "date": "2026-08-24", | |
| 390 | + "title": "Conker's Bad Fur Day - Nintendo 64 (N64)", | |
| 391 | + "price": 299, | |
| 392 | + "ebayId": "336758726355", | |
| 393 | + "listedPrice": null | |
| 394 | + }, | |
| 395 | + { | |
| 396 | + "tab": "cib", | |
| 397 | + "date": "2026-08-24", | |
| 398 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001)", | |
| 399 | + "price": 221.66, | |
| 400 | + "ebayId": "188806527977", | |
| 401 | + "listedPrice": null | |
| 402 | + }, | |
| 403 | + { | |
| 404 | + "tab": "cib", | |
| 405 | + "date": "2026-08-23", | |
| 406 | + "title": "Conkers Bad Fur Day Nintendo 64 Tested Authentic", | |
| 407 | + "price": 300, | |
| 408 | + "ebayId": "178414433831", | |
| 409 | + "listedPrice": null | |
| 410 | + }, | |
| 411 | + { | |
| 412 | + "tab": "cib", | |
| 413 | + "date": "2026-08-22", | |
| 414 | + "title": "Conker's Bad Fur Day Nintendo 64 w/ Box & Manual (Complete in Box)", | |
| 415 | + "price": 460.55, | |
| 416 | + "ebayId": "137622416380", | |
| 417 | + "listedPrice": null | |
| 418 | + }, | |
| 419 | + { | |
| 420 | + "tab": "cib", | |
| 421 | + "date": "2026-08-21", | |
| 422 | + "title": "N64 Conker's Bad Fur Day 2001 Complete In Box Authentic Tested Working One Owner", | |
| 423 | + "price": 500, | |
| 424 | + "ebayId": "227456485012", | |
| 425 | + "listedPrice": null | |
| 426 | + }, | |
| 427 | + { | |
| 428 | + "tab": "cib", | |
| 429 | + "date": "2026-08-21", | |
| 430 | + "title": "N64 Conker's Bad Fur Day 2001 Complete In Box Authentic Tested Working", | |
| 431 | + "price": 369.99, | |
| 432 | + "ebayId": "158210974454", | |
| 433 | + "listedPrice": null | |
| 434 | + }, | |
| 435 | + { | |
| 436 | + "tab": "cib", | |
| 437 | + "date": "2026-08-19", | |
| 438 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) N64 Authentic Complete CIB w/ inserts", | |
| 439 | + "price": 375, | |
| 440 | + "ebayId": "336679065893", | |
| 441 | + "listedPrice": null | |
| 442 | + }, | |
| 443 | + { | |
| 444 | + "tab": "cib", | |
| 445 | + "date": "2026-08-19", | |
| 446 | + "title": "Conker's Bad Fur Day - Nintendo 64 (N64) COMPLETE - RENTAL COPY", | |
| 447 | + "price": 380, | |
| 448 | + "ebayId": "366609199716", | |
| 449 | + "listedPrice": null | |
| 450 | + }, | |
| 451 | + { | |
| 452 | + "tab": "cib", | |
| 453 | + "date": "2026-08-15", | |
| 454 | + "title": "Conker’s Bad Fur Day Nintendo 64 N64 Game Complete Excellent", | |
| 455 | + "price": 599.99, | |
| 456 | + "ebayId": "236896887361", | |
| 457 | + "listedPrice": null | |
| 458 | + }, | |
| 459 | + { | |
| 460 | + "tab": "cib", | |
| 461 | + "date": "2026-08-13", | |
| 462 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Authentic CIB Complete Near-Mint", | |
| 463 | + "price": 499, | |
| 464 | + "ebayId": "168571174802", | |
| 465 | + "listedPrice": null | |
| 466 | + }, | |
| 467 | + { | |
| 468 | + "tab": "cib", | |
| 469 | + "date": "2026-08-13", | |
| 470 | + "title": "Conker's Bad Fur Day (Nintendo 64 N64) Authentic - CIB W/ Insert - Very Clean!", | |
| 471 | + "price": 504.5, | |
| 472 | + "ebayId": "147233471667", | |
| 473 | + "listedPrice": null | |
| 474 | + }, | |
| 475 | + { | |
| 476 | + "tab": "cib", | |
| 477 | + "date": "2026-08-11", | |
| 478 | + "title": "Conker's Bad Fur Day CIB Complete In Box Rare Nintendo 64 N64 With Manuals Works", | |
| 479 | + "price": 650, | |
| 480 | + "ebayId": "298549328528", | |
| 481 | + "listedPrice": null | |
| 482 | + }, | |
| 483 | + { | |
| 484 | + "tab": "cib", | |
| 485 | + "date": "2026-08-11", | |
| 486 | + "title": "Conker's Bad Fur Day (Nintendo 64) - Complete in box - Slight box wear", | |
| 487 | + "price": 500, | |
| 488 | + "ebayId": "287516638147", | |
| 489 | + "listedPrice": null | |
| 490 | + }, | |
| 491 | + { | |
| 492 | + "tab": "cib", | |
| 493 | + "date": "2026-08-10", | |
| 494 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) Tested, CIB", | |
| 495 | + "price": 626.97, | |
| 496 | + "ebayId": "307104774080", | |
| 497 | + "listedPrice": null | |
| 498 | + }, | |
| 499 | + { | |
| 500 | + "tab": "cib", | |
| 501 | + "date": "2026-08-09", | |
| 502 | + "title": "Conkers Bad Fur Day (Nintendo 64 N64)➡️CIB - AUTHENTIC - Tested🔥CLEAN COPY", | |
| 503 | + "price": 648.65, | |
| 504 | + "ebayId": "358859319509", | |
| 505 | + "listedPrice": null | |
| 506 | + }, | |
| 507 | + { | |
| 508 | + "tab": "cib", | |
| 509 | + "date": "2026-08-09", | |
| 510 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Authentic Complete With Original Packaging", | |
| 511 | + "price": 500, | |
| 512 | + "ebayId": "398045349669", | |
| 513 | + "listedPrice": null | |
| 514 | + }, | |
| 515 | + { | |
| 516 | + "tab": "cib", | |
| 517 | + "date": "2026-08-08", | |
| 518 | + "title": "Conker's Bad Fur Day N64 CIB", | |
| 519 | + "price": 305, | |
| 520 | + "ebayId": "327290109157", | |
| 521 | + "listedPrice": null | |
| 522 | + }, | |
| 523 | + { | |
| 524 | + "tab": "cib", | |
| 525 | + "date": "2026-08-08", | |
| 526 | + "title": "Conker's Bad Fur Day - Nintendo 64 N64 Complete In Box CIB Authentic w/ Manual", | |
| 527 | + "price": 399.99, | |
| 528 | + "ebayId": "188729359335", | |
| 529 | + "listedPrice": null | |
| 530 | + }, | |
| 531 | + { | |
| 532 | + "tab": "cib", | |
| 533 | + "date": "2026-08-07", | |
| 534 | + "title": "Conker’s Bad Fur Day N64 CIB Complete Box Manual Authentic Tested Nintendo", | |
| 535 | + "price": 397.97, | |
| 536 | + "ebayId": "147456592538", | |
| 537 | + "listedPrice": null | |
| 538 | + }, | |
| 539 | + { | |
| 540 | + "tab": "cib", | |
| 541 | + "date": "2026-08-04", | |
| 542 | + "title": "Conker's Bad Fur Day Nintendo 64 Authentic Tested Cartridge, Manual & Box Tested", | |
| 543 | + "price": 325, | |
| 544 | + "ebayId": "178364542099", | |
| 545 | + "listedPrice": null | |
| 546 | + }, | |
| 547 | + { | |
| 548 | + "tab": "new", | |
| 549 | + "date": "2026-08-23", | |
| 550 | + "title": "Conker's Bad Fur Day N64 New Sealed Graded 8.5 A+ by Wata", | |
| 551 | + "price": 798, | |
| 552 | + "ebayId": "147513485109", | |
| 553 | + "listedPrice": null | |
| 554 | + }, | |
| 555 | + { | |
| 556 | + "tab": "new", | |
| 557 | + "date": "2026-08-19", | |
| 558 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Brand New Factory Sealed Box Wear", | |
| 559 | + "price": 899.99, | |
| 560 | + "ebayId": "358804980842", | |
| 561 | + "listedPrice": null | |
| 562 | + }, | |
| 563 | + { | |
| 564 | + "tab": "new", | |
| 565 | + "date": "2026-08-18", | |
| 566 | + "title": "Nintendo 64 Conker’s Bad Fur Day SEALED (NEW)", | |
| 567 | + "price": 750, | |
| 568 | + "ebayId": "267715313258", | |
| 569 | + "listedPrice": null | |
| 570 | + }, | |
| 571 | + { | |
| 572 | + "tab": "new", | |
| 573 | + "date": "2026-07-26", | |
| 574 | + "title": "(SEALED) Nintendo 64 Conker's Bad Fur Day 2001 - Mint condition", | |
| 575 | + "price": 1000, | |
| 576 | + "ebayId": "236964934391", | |
| 577 | + "listedPrice": null | |
| 578 | + }, | |
| 579 | + { | |
| 580 | + "tab": "new", | |
| 581 | + "date": "2026-07-19", | |
| 582 | + "title": "Conker's Bad Fur Day Brand New Factory Sealed CIB (Nintendo N64 Game) Authentic", | |
| 583 | + "price": 1426.32, | |
| 584 | + "ebayId": "298213477438", | |
| 585 | + "listedPrice": null | |
| 586 | + }, | |
| 587 | + { | |
| 588 | + "tab": "new", | |
| 589 | + "date": "2026-07-19", | |
| 590 | + "title": "SEALED Conker's Bad Fur Day Nintendo 64 N64 Brand New Factory Sealed", | |
| 591 | + "price": 436.88, | |
| 592 | + "ebayId": "137529713748", | |
| 593 | + "listedPrice": null | |
| 594 | + }, | |
| 595 | + { | |
| 596 | + "tab": "new", | |
| 597 | + "date": "2026-07-13", | |
| 598 | + "title": "SEALED Conker's Bad Fur Day Nintendo 64 N64 Rareware M Rated NTSC-U/C Dolby", | |
| 599 | + "price": 700, | |
| 600 | + "ebayId": "800307280307", | |
| 601 | + "listedPrice": null | |
| 602 | + }, | |
| 603 | + { | |
| 604 | + "tab": "new", | |
| 605 | + "date": "2026-05-14", | |
| 606 | + "title": "Nintendo Conker's Bad Fur Day N64 Cartridge M Mature NTSC-U/C 2001 Brand new", | |
| 607 | + "price": 250, | |
| 608 | + "ebayId": "358547871299", | |
| 609 | + "listedPrice": null | |
| 610 | + }, | |
| 611 | + { | |
| 612 | + "tab": "new", | |
| 613 | + "date": "2026-04-28", | |
| 614 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Brand New Factory Sealed", | |
| 615 | + "price": 710, | |
| 616 | + "ebayId": "127795346104", | |
| 617 | + "listedPrice": null | |
| 618 | + }, | |
| 619 | + { | |
| 620 | + "tab": "new", | |
| 621 | + "date": "2026-04-20", | |
| 622 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) N64 WATA 9.0A+ SEALED", | |
| 623 | + "price": 1299.99, | |
| 624 | + "ebayId": "145669500419", | |
| 625 | + "listedPrice": null | |
| 626 | + }, | |
| 627 | + { | |
| 628 | + "tab": "new", | |
| 629 | + "date": "2026-04-02", | |
| 630 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Brand New Factory Sealed", | |
| 631 | + "price": 705.46, | |
| 632 | + "ebayId": "157584341967", | |
| 633 | + "listedPrice": null | |
| 634 | + }, | |
| 635 | + { | |
| 636 | + "tab": "new", | |
| 637 | + "date": "2026-02-19", | |
| 638 | + "title": "New! Conker's Bad Fur Day (Nintendo 64 N64) Factory Sealed!", | |
| 639 | + "price": 749.95, | |
| 640 | + "ebayId": "205902415011", | |
| 641 | + "listedPrice": null | |
| 642 | + }, | |
| 643 | + { | |
| 644 | + "tab": "new", | |
| 645 | + "date": "2026-02-05", | |
| 646 | + "title": "Conker’s Bad Fur Day Nintendo 64 Authentic Tested & Working", | |
| 647 | + "price": 424.99, | |
| 648 | + "ebayId": "206049927014", | |
| 649 | + "listedPrice": null | |
| 650 | + }, | |
| 651 | + { | |
| 652 | + "tab": "new", | |
| 653 | + "date": "2026-02-04", | |
| 654 | + "title": "Conker’s Bad Fur Day Nintendo 64 N64 FACTORY SEALED Box Damage", | |
| 655 | + "price": 299.99, | |
| 656 | + "ebayId": "187989521467", | |
| 657 | + "listedPrice": null | |
| 658 | + }, | |
| 659 | + { | |
| 660 | + "tab": "new", | |
| 661 | + "date": "2026-01-29", | |
| 662 | + "title": "Conker's Bad Fur Day (Nintendo 64 N64) NEW in Box Factory Sealed", | |
| 663 | + "price": 699.99, | |
| 664 | + "ebayId": "257317986953", | |
| 665 | + "listedPrice": null | |
| 666 | + }, | |
| 667 | + { | |
| 668 | + "tab": "new", | |
| 669 | + "date": "2026-01-14", | |
| 670 | + "title": "Nintendo 64 conkers bad fur day sealed NIB", | |
| 671 | + "price": 600, | |
| 672 | + "ebayId": "277625704463", | |
| 673 | + "listedPrice": null | |
| 674 | + }, | |
| 675 | + { | |
| 676 | + "tab": "new", | |
| 677 | + "date": "2026-01-11", | |
| 678 | + "title": "Conker’s Bad Fur Day – Nintendo 64 (N64) | Brand New | Factory Sealed | CIB", | |
| 679 | + "price": 355, | |
| 680 | + "ebayId": "198002347056", | |
| 681 | + "listedPrice": null | |
| 682 | + }, | |
| 683 | + { | |
| 684 | + "tab": "new", | |
| 685 | + "date": "2025-12-08", | |
| 686 | + "title": "Conquer’s Bad Fur Day CIB ** BRAND NEW ** Nintendo 64 N64 Complete In Box", | |
| 687 | + "price": 382.05, | |
| 688 | + "ebayId": "205885864146", | |
| 689 | + "listedPrice": null | |
| 690 | + }, | |
| 691 | + { | |
| 692 | + "tab": "new", | |
| 693 | + "date": "2025-12-01", | |
| 694 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Brand New Factory Sealed", | |
| 695 | + "price": 655, | |
| 696 | + "ebayId": "317541958312", | |
| 697 | + "listedPrice": null | |
| 698 | + }, | |
| 699 | + { | |
| 700 | + "tab": "new", | |
| 701 | + "date": "2025-10-16", | |
| 702 | + "title": "Sealed N64 Video Game Conker's Bad Fur Day Nintendo 64 Rareware", | |
| 703 | + "price": 366, | |
| 704 | + "ebayId": "267431006779", | |
| 705 | + "listedPrice": null | |
| 706 | + }, | |
| 707 | + { | |
| 708 | + "tab": "new", | |
| 709 | + "date": "2025-06-16", | |
| 710 | + "title": "Conkers Bad Fur Day Nintendo Nintendo 64 N64 NTSC-U Original Packaging CIB NIB Sealed", | |
| 711 | + "price": 1154.9, | |
| 712 | + "ebayId": "226805679225", | |
| 713 | + "listedPrice": null | |
| 714 | + }, | |
| 715 | + { | |
| 716 | + "tab": "new", | |
| 717 | + "date": "2025-04-23", | |
| 718 | + "title": "Conker's Bad Fur Day (Nintendo 64) Factory Sealed", | |
| 719 | + "price": 600, | |
| 720 | + "ebayId": "286514765390", | |
| 721 | + "listedPrice": null | |
| 722 | + }, | |
| 723 | + { | |
| 724 | + "tab": "new", | |
| 725 | + "date": "2025-04-20", | |
| 726 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) Factory Sealed - Brand New W/Case", | |
| 727 | + "price": 600, | |
| 728 | + "ebayId": "326525769131", | |
| 729 | + "listedPrice": null | |
| 730 | + }, | |
| 731 | + { | |
| 732 | + "tab": "new", | |
| 733 | + "date": "2025-03-23", | |
| 734 | + "title": "Conker's Bad Fur Day Nintendo 64 Game FACTORY SEALED Box Damage", | |
| 735 | + "price": 376.33, | |
| 736 | + "ebayId": "286334844015", | |
| 737 | + "listedPrice": null | |
| 738 | + }, | |
| 739 | + { | |
| 740 | + "tab": "new", | |
| 741 | + "date": "2025-02-27", | |
| 742 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) Brand New", | |
| 743 | + "price": 661.1, | |
| 744 | + "ebayId": "167278349004", | |
| 745 | + "listedPrice": null | |
| 746 | + }, | |
| 747 | + { | |
| 748 | + "tab": "new", | |
| 749 | + "date": "2025-02-25", | |
| 750 | + "title": "Conker's Bad Fur Day - Nintendo 64 N64 BRAND NEW SEALED 🔥🔥", | |
| 751 | + "price": 499.99, | |
| 752 | + "ebayId": "235794390319", | |
| 753 | + "listedPrice": null | |
| 754 | + }, | |
| 755 | + { | |
| 756 | + "tab": "new", | |
| 757 | + "date": "2025-02-22", | |
| 758 | + "title": "Conker's Bad Fur Day - Nintendo 64 (N64) *UN-OPENED*", | |
| 759 | + "price": 640, | |
| 760 | + "ebayId": "396214501514", | |
| 761 | + "listedPrice": null | |
| 762 | + }, | |
| 763 | + { | |
| 764 | + "tab": "new", | |
| 765 | + "date": "2025-02-07", | |
| 766 | + "title": "Conker's Bad Fur Day N64 (BRAND NEW SEALED)", | |
| 767 | + "price": 301.44, | |
| 768 | + "ebayId": "156665382629", | |
| 769 | + "listedPrice": null | |
| 770 | + }, | |
| 771 | + { | |
| 772 | + "tab": "new", | |
| 773 | + "date": "2025-02-05", | |
| 774 | + "title": "Conker's Bad Fur Day - Nintendo 64 (N64) SEALED *see pictures*", | |
| 775 | + "price": 351.5, | |
| 776 | + "ebayId": "176813144649", | |
| 777 | + "listedPrice": null | |
| 778 | + }, | |
| 779 | + { | |
| 780 | + "tab": "new", | |
| 781 | + "date": "2025-02-04", | |
| 782 | + "title": "Conker's Bad Fur Day (Nintendo 64 N64) NEW in Box Factory Sealed", | |
| 783 | + "price": 675, | |
| 784 | + "ebayId": "286300333110", | |
| 785 | + "listedPrice": null | |
| 786 | + }, | |
| 787 | + { | |
| 788 | + "tab": "graded", | |
| 789 | + "date": "2026-08-19", | |
| 790 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 New Sealed GRADED WATA 8.5 A+", | |
| 791 | + "price": 1000, | |
| 792 | + "ebayId": "377432583394", | |
| 793 | + "listedPrice": null | |
| 794 | + }, | |
| 795 | + { | |
| 796 | + "tab": "graded", | |
| 797 | + "date": "2026-08-19", | |
| 798 | + "title": "Conker's Bad Fur Day Nintendo 64 PSA 8.5 A++ Sealed N64 Freshly Graded", | |
| 799 | + "price": 1290, | |
| 800 | + "ebayId": "117334887975", | |
| 801 | + "listedPrice": null | |
| 802 | + }, | |
| 803 | + { | |
| 804 | + "tab": "graded", | |
| 805 | + "date": "2026-08-17", | |
| 806 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Factory Sealed WATA 8.5 A", | |
| 807 | + "price": 1049.99, | |
| 808 | + "ebayId": "407044150173", | |
| 809 | + "listedPrice": null | |
| 810 | + }, | |
| 811 | + { | |
| 812 | + "tab": "graded", | |
| 813 | + "date": "2026-08-06", | |
| 814 | + "title": "💎 Conker's Bad Fur Day N64 PSA 8.0 A+ Sealed V-Overlap Rare 2001 / NOT WATA PSA", | |
| 815 | + "price": 699.99, | |
| 816 | + "ebayId": "158153675958", | |
| 817 | + "listedPrice": null | |
| 818 | + }, | |
| 819 | + { | |
| 820 | + "tab": "graded", | |
| 821 | + "date": "2026-08-04", | |
| 822 | + "title": "💎 Conker's Bad Fur Day Nintendo 64 N64 New Sealed CGC Graded 9.2 A++ / NOT PSA", | |
| 823 | + "price": 1299.99, | |
| 824 | + "ebayId": "158153666671", | |
| 825 | + "listedPrice": null | |
| 826 | + }, | |
| 827 | + { | |
| 828 | + "tab": "graded", | |
| 829 | + "date": "2026-07-16", | |
| 830 | + "title": "Conker’s Bad Fur Day WATA 8.0 A++ | Factory Sealed | Rare N64 |", | |
| 831 | + "price": 628.88, | |
| 832 | + "ebayId": "197886338716", | |
| 833 | + "listedPrice": null | |
| 834 | + }, | |
| 835 | + { | |
| 836 | + "tab": "graded", | |
| 837 | + "date": "2026-07-01", | |
| 838 | + "title": "Conker's Bad Fur Day - Nintendo 64 (N64) Factory Sealed - GRADED WATA PSA 9.2 A+", | |
| 839 | + "price": 2800, | |
| 840 | + "ebayId": "198446428574", | |
| 841 | + "listedPrice": null | |
| 842 | + }, | |
| 843 | + { | |
| 844 | + "tab": "graded", | |
| 845 | + "date": "2026-06-25", | |
| 846 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 New Sealed CGC Graded 9.2 A++", | |
| 847 | + "price": 1499.99, | |
| 848 | + "ebayId": "158002387162", | |
| 849 | + "listedPrice": null | |
| 850 | + }, | |
| 851 | + { | |
| 852 | + "tab": "graded", | |
| 853 | + "date": "2026-06-21", | |
| 854 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Factory Sealed WATA 8.5 A", | |
| 855 | + "price": 765, | |
| 856 | + "ebayId": "307008092353", | |
| 857 | + "listedPrice": null | |
| 858 | + }, | |
| 859 | + { | |
| 860 | + "tab": "graded", | |
| 861 | + "date": "2026-06-18", | |
| 862 | + "title": "2001 N64 Nintendo 64 Conker's Bad Fur Day (USA) Sealed Video Game - Made in Japan - WATA 7.0/A", | |
| 863 | + "price": 360, | |
| 864 | + "ebayId": null, | |
| 865 | + "listedPrice": null | |
| 866 | + }, | |
| 867 | + { | |
| 868 | + "tab": "graded", | |
| 869 | + "date": "2026-06-17", | |
| 870 | + "title": "Conker's Bad Fur Day New Nintendo 64 N64 2001 Factory Sealed WATA Mint 9.4 A++", | |
| 871 | + "price": 2399.99, | |
| 872 | + "ebayId": "375216402820", | |
| 873 | + "listedPrice": null | |
| 874 | + }, | |
| 875 | + { | |
| 876 | + "tab": "graded", | |
| 877 | + "date": "2026-06-12", | |
| 878 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 New Sealed GRADED WATA 8.5 A+", | |
| 879 | + "price": 1458.72, | |
| 880 | + "ebayId": "266022041512", | |
| 881 | + "listedPrice": null | |
| 882 | + }, | |
| 883 | + { | |
| 884 | + "tab": "graded", | |
| 885 | + "date": "2026-05-14", | |
| 886 | + "title": "Conker's Bad Fur Day - Wata 7.5 A++ Sealed, N64 Rare 2001 USA....", | |
| 887 | + "price": 575, | |
| 888 | + "ebayId": null, | |
| 889 | + "listedPrice": null | |
| 890 | + }, | |
| 891 | + { | |
| 892 | + "tab": "graded", | |
| 893 | + "date": "2026-05-10", | |
| 894 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Sealed PSA 8.0 A+ Graded NOT WATA Rareware", | |
| 895 | + "price": 800, | |
| 896 | + "ebayId": "157841328848", | |
| 897 | + "listedPrice": null | |
| 898 | + }, | |
| 899 | + { | |
| 900 | + "tab": "graded", | |
| 901 | + "date": "2026-04-28", | |
| 902 | + "title": "2001 N64 Conker's Bad Fur Day Graded WATA 9.0 A Sealed - NC17 Conker BRAND NEW", | |
| 903 | + "price": 995, | |
| 904 | + "ebayId": "136284655646", | |
| 905 | + "listedPrice": null | |
| 906 | + }, | |
| 907 | + { | |
| 908 | + "tab": "graded", | |
| 909 | + "date": "2026-04-20", | |
| 910 | + "title": "Conker's Bad Fur Day New N64 2001 Factory Sealed WATA Mint 9.4 A++", | |
| 911 | + "price": 2200, | |
| 912 | + "ebayId": "377127214232", | |
| 913 | + "listedPrice": null | |
| 914 | + }, | |
| 915 | + { | |
| 916 | + "tab": "graded", | |
| 917 | + "date": "2026-04-14", | |
| 918 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Graded PSA WATA 9.0 A+ NEW Factory Sealed", | |
| 919 | + "price": 1125, | |
| 920 | + "ebayId": "168292031295", | |
| 921 | + "listedPrice": null | |
| 922 | + }, | |
| 923 | + { | |
| 924 | + "tab": "graded", | |
| 925 | + "date": "2026-04-06", | |
| 926 | + "title": "Conker's Bad Fur Day (Nintendo 64 N64) CGC 9.4 A++ NEW Sealed", | |
| 927 | + "price": 1699.99, | |
| 928 | + "ebayId": "287251253964", | |
| 929 | + "listedPrice": null | |
| 930 | + }, | |
| 931 | + { | |
| 932 | + "tab": "graded", | |
| 933 | + "date": "2026-03-31", | |
| 934 | + "title": "Conker’s Bad Fur Day WATA 8.0 B+ | Factory Sealed | Rare N64 | Nintendo 64", | |
| 935 | + "price": 1500, | |
| 936 | + "ebayId": "336509677342", | |
| 937 | + "listedPrice": null | |
| 938 | + }, | |
| 939 | + { | |
| 940 | + "tab": "graded", | |
| 941 | + "date": "2026-03-31", | |
| 942 | + "title": "Conker’s Bad Fur Day WATA 8.0 B+ | Factory Sealed | Rare N64 | Nintendo 64", | |
| 943 | + "price": 1500, | |
| 944 | + "ebayId": "336492665689", | |
| 945 | + "listedPrice": null | |
| 946 | + }, | |
| 947 | + { | |
| 948 | + "tab": "graded", | |
| 949 | + "date": "2026-03-14", | |
| 950 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Factory Sealed New VGA 95 Graded Rareware", | |
| 951 | + "price": 7499.99, | |
| 952 | + "ebayId": "157703854905", | |
| 953 | + "listedPrice": null | |
| 954 | + }, | |
| 955 | + { | |
| 956 | + "tab": "graded", | |
| 957 | + "date": "2026-02-26", | |
| 958 | + "title": "2001 N64 Nintendo 64 Conker's Bad Fur Day (USA) Sealed Video Game - Made In Japan, 100% Fiber (USA Code), Oval SOQ - WATA 9.4/A++", | |
| 959 | + "price": 1391, | |
| 960 | + "ebayId": null, | |
| 961 | + "listedPrice": null | |
| 962 | + }, | |
| 963 | + { | |
| 964 | + "tab": "graded", | |
| 965 | + "date": "2026-02-10", | |
| 966 | + "title": "Conker's Bad Fur Day (Nintendo 64, N64 2001) Brand New Sealed CGC Graded 9.4 A++", | |
| 967 | + "price": 2508.82, | |
| 968 | + "ebayId": "127647723225", | |
| 969 | + "listedPrice": null | |
| 970 | + }, | |
| 971 | + { | |
| 972 | + "tab": "graded", | |
| 973 | + "date": "2026-02-09", | |
| 974 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Sealed Wata Graded 7.0 Seal A+ Free Ship", | |
| 975 | + "price": 700, | |
| 976 | + "ebayId": "366042936976", | |
| 977 | + "listedPrice": null | |
| 978 | + }, | |
| 979 | + { | |
| 980 | + "tab": "graded", | |
| 981 | + "date": "2026-02-02", | |
| 982 | + "title": "Conker's Bad Fur Day N64 Wata Graded Sealed Nintendo", | |
| 983 | + "price": 397, | |
| 984 | + "ebayId": "117002321764", | |
| 985 | + "listedPrice": null | |
| 986 | + }, | |
| 987 | + { | |
| 988 | + "tab": "graded", | |
| 989 | + "date": "2026-01-19", | |
| 990 | + "title": "Conker's Bad Fur Day - Wata 9.0 A+ Sealed, N64 Rare 2001 USA....", | |
| 991 | + "price": 781, | |
| 992 | + "ebayId": null, | |
| 993 | + "listedPrice": null | |
| 994 | + }, | |
| 995 | + { | |
| 996 | + "tab": "graded", | |
| 997 | + "date": "2026-01-13", | |
| 998 | + "title": "Conker's Bad Fur Day (Nintendo 64 N64) Wata PSA 9.4 A+ Brand New Factory Sealed", | |
| 999 | + "price": 1999.99, | |
| 1000 | + "ebayId": "177760285146", | |
| 1001 | + "listedPrice": null | |
| 1002 | + }, | |
| 1003 | + { | |
| 1004 | + "tab": "graded", | |
| 1005 | + "date": "2026-01-13", | |
| 1006 | + "title": "Conker’s Bad Fur Day (Nintendo 64) – WATA 9.6 A++ Sealed – USA 2001", | |
| 1007 | + "price": 2999, | |
| 1008 | + "ebayId": "147085797107", | |
| 1009 | + "listedPrice": null | |
| 1010 | + }, | |
| 1011 | + { | |
| 1012 | + "tab": "graded", | |
| 1013 | + "date": "2025-12-30", | |
| 1014 | + "title": "2001 N64 Conker's Bad Fur Day Graded WATA 9.0 A+ Sealed - NC17 Conker BRAND NEW", | |
| 1015 | + "price": 1999, | |
| 1016 | + "ebayId": "336351529551", | |
| 1017 | + "listedPrice": null | |
| 1018 | + }, | |
| 1019 | + { | |
| 1020 | + "tab": "graded", | |
| 1021 | + "date": "2025-12-28", | |
| 1022 | + "title": "Conker’s Bad Fur Day WATA 9.0 A+ | Factory Sealed | Rare N64 | NOT CGC VGA", | |
| 1023 | + "price": 1026, | |
| 1024 | + "ebayId": "157559208410", | |
| 1025 | + "listedPrice": null | |
| 1026 | + }, | |
| 1027 | + { | |
| 1028 | + "tab": "box-only", | |
| 1029 | + "date": "2026-09-04", | |
| 1030 | + "title": "Nintendo 64 Conkers Bad Fur Day BOX Only", | |
| 1031 | + "price": 117.5, | |
| 1032 | + "ebayId": "318793535929", | |
| 1033 | + "listedPrice": null | |
| 1034 | + }, | |
| 1035 | + { | |
| 1036 | + "tab": "box-only", | |
| 1037 | + "date": "2026-07-02", | |
| 1038 | + "title": "N64 Conker's Bad Fur Day Nintendo 64 Authentic Cart & NON-OEM BOX Only TESTED", | |
| 1039 | + "price": 179.99, | |
| 1040 | + "ebayId": "158012511258", | |
| 1041 | + "listedPrice": null | |
| 1042 | + }, | |
| 1043 | + { | |
| 1044 | + "tab": "box-only", | |
| 1045 | + "date": "2026-05-03", | |
| 1046 | + "title": "Conkers Bad Fur Day N64 Nintendo 64 Box Only Authentic! MINT CONDITION RARE", | |
| 1047 | + "price": 250, | |
| 1048 | + "ebayId": "318243090752", | |
| 1049 | + "listedPrice": null | |
| 1050 | + }, | |
| 1051 | + { | |
| 1052 | + "tab": "box-only", | |
| 1053 | + "date": "2026-02-18", | |
| 1054 | + "title": "Conkers Bad Fur Day N64 Box Only Read", | |
| 1055 | + "price": 149.99, | |
| 1056 | + "ebayId": "397625967771", | |
| 1057 | + "listedPrice": null | |
| 1058 | + }, | |
| 1059 | + { | |
| 1060 | + "tab": "box-only", | |
| 1061 | + "date": "2025-12-10", | |
| 1062 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) Box only - Authentic", | |
| 1063 | + "price": 95, | |
| 1064 | + "ebayId": "236495764707", | |
| 1065 | + "listedPrice": null | |
| 1066 | + }, | |
| 1067 | + { | |
| 1068 | + "tab": "box-only", | |
| 1069 | + "date": "2025-12-02", | |
| 1070 | + "title": "Conker's Bad Fur Day Nintendo 64 2001 Box Only - NO GAME", | |
| 1071 | + "price": 125.99, | |
| 1072 | + "ebayId": "127525223719", | |
| 1073 | + "listedPrice": null | |
| 1074 | + }, | |
| 1075 | + { | |
| 1076 | + "tab": "box-only", | |
| 1077 | + "date": "2025-11-24", | |
| 1078 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) Box only - Authentic", | |
| 1079 | + "price": 89, | |
| 1080 | + "ebayId": "326879658458", | |
| 1081 | + "listedPrice": null | |
| 1082 | + }, | |
| 1083 | + { | |
| 1084 | + "tab": "box-only", | |
| 1085 | + "date": "2025-10-11", | |
| 1086 | + "title": "Conker's Bad Fur Day (Nintendo 64 2001) BOX ONLY NO GAME INCLUDED authentic Orig", | |
| 1087 | + "price": 69.99, | |
| 1088 | + "ebayId": "365894495349", | |
| 1089 | + "listedPrice": null | |
| 1090 | + }, | |
| 1091 | + { | |
| 1092 | + "tab": "box-only", | |
| 1093 | + "date": "2025-09-28", | |
| 1094 | + "title": "Conker's Bad Fur Day (Nintendo 64 2001) BOX ONLY NO GAME INCLUDED", | |
| 1095 | + "price": 129.99, | |
| 1096 | + "ebayId": "205731648292", | |
| 1097 | + "listedPrice": null | |
| 1098 | + }, | |
| 1099 | + { | |
| 1100 | + "tab": "box-only", | |
| 1101 | + "date": "2025-08-31", | |
| 1102 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) N64 [Box Only]", | |
| 1103 | + "price": 159.99, | |
| 1104 | + "ebayId": "136346432971", | |
| 1105 | + "listedPrice": null | |
| 1106 | + }, | |
| 1107 | + { | |
| 1108 | + "tab": "box-only", | |
| 1109 | + "date": "2025-07-05", | |
| 1110 | + "title": "(No Game) Conker's Bad Fur Day Box Only w/Manual Authentic N64 Nintendo 64", | |
| 1111 | + "price": 166.5, | |
| 1112 | + "ebayId": "267282213059", | |
| 1113 | + "listedPrice": null | |
| 1114 | + }, | |
| 1115 | + { | |
| 1116 | + "tab": "box-only", | |
| 1117 | + "date": "2025-06-03", | |
| 1118 | + "title": "Conker's Bad Fur Day Box Only w/Manual & Inserts Authentic N64 Nintendo 64, 2001", | |
| 1119 | + "price": 170, | |
| 1120 | + "ebayId": "297374149109", | |
| 1121 | + "listedPrice": null | |
| 1122 | + }, | |
| 1123 | + { | |
| 1124 | + "tab": "box-only", | |
| 1125 | + "date": "2025-05-29", | |
| 1126 | + "title": "Conkers Bad Fur Day Box Only Authentic Nintendo 64 N64", | |
| 1127 | + "price": 160, | |
| 1128 | + "ebayId": "286589843580", | |
| 1129 | + "listedPrice": null | |
| 1130 | + }, | |
| 1131 | + { | |
| 1132 | + "tab": "box-only", | |
| 1133 | + "date": "2025-05-20", | |
| 1134 | + "title": "Conkers Bad Fur Day N64 Box Only", | |
| 1135 | + "price": 164.99, | |
| 1136 | + "ebayId": "396629515194", | |
| 1137 | + "listedPrice": null | |
| 1138 | + }, | |
| 1139 | + { | |
| 1140 | + "tab": "box-only", | |
| 1141 | + "date": "2025-05-16", | |
| 1142 | + "title": "Conkers Bad Fur Day Box Only Authentic Nintendo 64 N64 Some Inserts", | |
| 1143 | + "price": 155, | |
| 1144 | + "ebayId": "167517379390", | |
| 1145 | + "listedPrice": null | |
| 1146 | + }, | |
| 1147 | + { | |
| 1148 | + "tab": "box-only", | |
| 1149 | + "date": "2025-05-10", | |
| 1150 | + "title": "Conkers Bad Fur Day Box Only Authentic Nintendo 64 N64", | |
| 1151 | + "price": 145, | |
| 1152 | + "ebayId": "286533600749", | |
| 1153 | + "listedPrice": null | |
| 1154 | + }, | |
| 1155 | + { | |
| 1156 | + "tab": "box-only", | |
| 1157 | + "date": "2025-04-24", | |
| 1158 | + "title": "Conker's Bad Fur Day N64 Nintendo 64 Rare - Authentic - BOX ONLY - EXCELLENT", | |
| 1159 | + "price": 137.06, | |
| 1160 | + "ebayId": "297236023306", | |
| 1161 | + "listedPrice": null | |
| 1162 | + }, | |
| 1163 | + { | |
| 1164 | + "tab": "box-only", | |
| 1165 | + "date": "2025-04-17", | |
| 1166 | + "title": "conkers bad fur day n64 box only", | |
| 1167 | + "price": 30, | |
| 1168 | + "ebayId": "356760509268", | |
| 1169 | + "listedPrice": null | |
| 1170 | + }, | |
| 1171 | + { | |
| 1172 | + "tab": "box-only", | |
| 1173 | + "date": "2025-04-02", | |
| 1174 | + "title": "Conker's Bad Fur Day Authentic Box Only Nintendo 64 N64 ROUGH", | |
| 1175 | + "price": 38, | |
| 1176 | + "ebayId": "286438967084", | |
| 1177 | + "listedPrice": null | |
| 1178 | + }, | |
| 1179 | + { | |
| 1180 | + "tab": "box-only", | |
| 1181 | + "date": "2025-03-07", | |
| 1182 | + "title": "Conker's Bad Fur Day BOX ONLY Original Authentic - N64 Nintendo 64", | |
| 1183 | + "price": 135, | |
| 1184 | + "ebayId": "286388606277", | |
| 1185 | + "listedPrice": null | |
| 1186 | + }, | |
| 1187 | + { | |
| 1188 | + "tab": "box-only", | |
| 1189 | + "date": "2024-12-09", | |
| 1190 | + "title": "Conker's Bad Fur Day (Blockbuster Rental) (Nintendo 64) Authentic Box Only - N64", | |
| 1191 | + "price": 103.5, | |
| 1192 | + "ebayId": "226476482167", | |
| 1193 | + "listedPrice": null | |
| 1194 | + }, | |
| 1195 | + { | |
| 1196 | + "tab": "box-only", | |
| 1197 | + "date": "2024-09-23", | |
| 1198 | + "title": "Conker's Bad Fur Day - Nintendo 64 (N64) Box Only", | |
| 1199 | + "price": 38, | |
| 1200 | + "ebayId": "387393891608", | |
| 1201 | + "listedPrice": null | |
| 1202 | + }, | |
| 1203 | + { | |
| 1204 | + "tab": "box-only", | |
| 1205 | + "date": "2024-09-11", | |
| 1206 | + "title": "Conker's Bad Fur Day - Nintendo 64 (N64) Box Only", | |
| 1207 | + "price": 50, | |
| 1208 | + "ebayId": "387358390961", | |
| 1209 | + "listedPrice": null | |
| 1210 | + }, | |
| 1211 | + { | |
| 1212 | + "tab": "box-only", | |
| 1213 | + "date": "2024-08-13", | |
| 1214 | + "title": "Original - conkers bad fur day n64 box only - So Rare !! 🔥🔥", | |
| 1215 | + "price": 83, | |
| 1216 | + "ebayId": "226280721594", | |
| 1217 | + "listedPrice": null | |
| 1218 | + }, | |
| 1219 | + { | |
| 1220 | + "tab": "box-only", | |
| 1221 | + "date": "2024-06-17", | |
| 1222 | + "title": "Conkers Bad Fur Day Nintendo 64 Box Only", | |
| 1223 | + "price": 105, | |
| 1224 | + "ebayId": "226186197631", | |
| 1225 | + "listedPrice": null | |
| 1226 | + }, | |
| 1227 | + { | |
| 1228 | + "tab": "box-only", | |
| 1229 | + "date": "2024-03-07", | |
| 1230 | + "title": "Conker's Bad Fur Day N64 BOX ONLY - Authentic - Very Good Condition - no game", | |
| 1231 | + "price": 99.75, | |
| 1232 | + "ebayId": "266702153968", | |
| 1233 | + "listedPrice": null | |
| 1234 | + }, | |
| 1235 | + { | |
| 1236 | + "tab": "box-only", | |
| 1237 | + "date": "2024-01-13", | |
| 1238 | + "title": "AUTHENTIC BOX ONLY! Conker’s Bad Fur Day (Nintendo 64 N64) No Game! Official", | |
| 1239 | + "price": 119.99, | |
| 1240 | + "ebayId": "186250096905", | |
| 1241 | + "listedPrice": null | |
| 1242 | + }, | |
| 1243 | + { | |
| 1244 | + "tab": "box-only", | |
| 1245 | + "date": "2023-11-17", | |
| 1246 | + "title": "Nintendo 64 N64 Conker’s Bad Fur Day Original Box Only *Authentic* *No Game*", | |
| 1247 | + "price": 214.95, | |
| 1248 | + "ebayId": "325875337941", | |
| 1249 | + "listedPrice": null | |
| 1250 | + }, | |
| 1251 | + { | |
| 1252 | + "tab": "box-only", | |
| 1253 | + "date": "2023-11-15", | |
| 1254 | + "title": "Conker's Bad Fur Day BOX ONLY W/Protector Case - Nintendo 64 (Rare, 2001) N64", | |
| 1255 | + "price": 85, | |
| 1256 | + "ebayId": "235291340557", | |
| 1257 | + "listedPrice": null | |
| 1258 | + }, | |
| 1259 | + { | |
| 1260 | + "tab": "box-only", | |
| 1261 | + "date": "2023-09-06", | |
| 1262 | + "title": "Nintendo 64 Conker's Bad Fur Day- BOX ONLY (Rare, 2001) N64", | |
| 1263 | + "price": 99.95, | |
| 1264 | + "ebayId": "394856587806", | |
| 1265 | + "listedPrice": null | |
| 1266 | + }, | |
| 1267 | + { | |
| 1268 | + "tab": "manual-only", | |
| 1269 | + "date": "2026-08-05", | |
| 1270 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Manual Instruction Booklet Only Authentic", | |
| 1271 | + "price": 35, | |
| 1272 | + "ebayId": "158137455346", | |
| 1273 | + "listedPrice": null | |
| 1274 | + }, | |
| 1275 | + { | |
| 1276 | + "tab": "manual-only", | |
| 1277 | + "date": "2026-04-01", | |
| 1278 | + "title": "Conker's Bad Fur Day - Nintendo 64 N64 - Manual Only - MINTY", | |
| 1279 | + "price": 44.99, | |
| 1280 | + "ebayId": "298069957943", | |
| 1281 | + "listedPrice": null | |
| 1282 | + }, | |
| 1283 | + { | |
| 1284 | + "tab": "manual-only", | |
| 1285 | + "date": "2025-12-28", | |
| 1286 | + "title": "Conker's Bad Fur Day ~ Manual only ~ Nintendo 64 N64 ~ Authentic ~ Conker", | |
| 1287 | + "price": 39, | |
| 1288 | + "ebayId": "397436397271", | |
| 1289 | + "listedPrice": null | |
| 1290 | + }, | |
| 1291 | + { | |
| 1292 | + "tab": "manual-only", | |
| 1293 | + "date": "2025-12-24", | |
| 1294 | + "title": "Conker's Bad Fur Day MANUAL ONLY (No game or box) Nintendo 64 N64", | |
| 1295 | + "price": 39, | |
| 1296 | + "ebayId": "306671460816", | |
| 1297 | + "listedPrice": null | |
| 1298 | + }, | |
| 1299 | + { | |
| 1300 | + "tab": "manual-only", | |
| 1301 | + "date": "2025-11-25", | |
| 1302 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Game Instruction Booklet Manual Only", | |
| 1303 | + "price": 49.99, | |
| 1304 | + "ebayId": "127476775769", | |
| 1305 | + "listedPrice": null | |
| 1306 | + }, | |
| 1307 | + { | |
| 1308 | + "tab": "manual-only", | |
| 1309 | + "date": "2025-10-15", | |
| 1310 | + "title": "Conker's Bad Fur Day Nintendo 64 Manual GREAT condition", | |
| 1311 | + "price": 40, | |
| 1312 | + "ebayId": "136595766050", | |
| 1313 | + "listedPrice": null | |
| 1314 | + }, | |
| 1315 | + { | |
| 1316 | + "tab": "manual-only", | |
| 1317 | + "date": "2025-10-03", | |
| 1318 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Game Instruction Booklet Manual Only", | |
| 1319 | + "price": 49.99, | |
| 1320 | + "ebayId": "167607960943", | |
| 1321 | + "listedPrice": null | |
| 1322 | + }, | |
| 1323 | + { | |
| 1324 | + "tab": "manual-only", | |
| 1325 | + "date": "2025-10-01", | |
| 1326 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Manual Instruction Booklet Only Authentic", | |
| 1327 | + "price": 40, | |
| 1328 | + "ebayId": "167793762309", | |
| 1329 | + "listedPrice": null | |
| 1330 | + }, | |
| 1331 | + { | |
| 1332 | + "tab": "manual-only", | |
| 1333 | + "date": "2025-09-15", | |
| 1334 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Manual Instruction Booklet ONLY Clean Nice!", | |
| 1335 | + "price": 40, | |
| 1336 | + "ebayId": "317256502507", | |
| 1337 | + "listedPrice": null | |
| 1338 | + }, | |
| 1339 | + { | |
| 1340 | + "tab": "manual-only", | |
| 1341 | + "date": "2025-09-15", | |
| 1342 | + "title": "Conker's Bad Fur Day - N64 Manual Instruction Booklet Only", | |
| 1343 | + "price": 35, | |
| 1344 | + "ebayId": "257100991488", | |
| 1345 | + "listedPrice": null | |
| 1346 | + }, | |
| 1347 | + { | |
| 1348 | + "tab": "manual-only", | |
| 1349 | + "date": "2025-09-13", | |
| 1350 | + "title": "******Conker's Bad Fur Day Nintendo 64 Manual Instruction Booklet/Manual******", | |
| 1351 | + "price": 50, | |
| 1352 | + "ebayId": "127355743853", | |
| 1353 | + "listedPrice": null | |
| 1354 | + }, | |
| 1355 | + { | |
| 1356 | + "tab": "manual-only", | |
| 1357 | + "date": "2025-09-12", | |
| 1358 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Manual Instruction Booklet ONLY Clean Nice!", | |
| 1359 | + "price": 37.95, | |
| 1360 | + "ebayId": "388918060760", | |
| 1361 | + "listedPrice": null | |
| 1362 | + }, | |
| 1363 | + { | |
| 1364 | + "tab": "manual-only", | |
| 1365 | + "date": "2025-09-07", | |
| 1366 | + "title": "Conker's Bad Fur Day - Nintendo 64 N64 - Instruction Manual Only", | |
| 1367 | + "price": 42.5, | |
| 1368 | + "ebayId": "236308058752", | |
| 1369 | + "listedPrice": null | |
| 1370 | + }, | |
| 1371 | + { | |
| 1372 | + "tab": "manual-only", | |
| 1373 | + "date": "2025-08-21", | |
| 1374 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Manual Instruction Booklet ONLY Clean Nice!", | |
| 1375 | + "price": 41.99, | |
| 1376 | + "ebayId": "205682725691", | |
| 1377 | + "listedPrice": null | |
| 1378 | + }, | |
| 1379 | + { | |
| 1380 | + "tab": "manual-only", | |
| 1381 | + "date": "2025-08-20", | |
| 1382 | + "title": "Conker's Bad Fur Day / Nintendo 64 2001 /Authentic Manual Only / N64 / No Game", | |
| 1383 | + "price": 35, | |
| 1384 | + "ebayId": "157254541971", | |
| 1385 | + "listedPrice": null | |
| 1386 | + }, | |
| 1387 | + { | |
| 1388 | + "tab": "manual-only", | |
| 1389 | + "date": "2025-08-04", | |
| 1390 | + "title": "Authentic Conker's Bad Fur Day Nintendo 64 Manual Only, 2001, No Game", | |
| 1391 | + "price": 39.99, | |
| 1392 | + "ebayId": "167685510230", | |
| 1393 | + "listedPrice": null | |
| 1394 | + }, | |
| 1395 | + { | |
| 1396 | + "tab": "manual-only", | |
| 1397 | + "date": "2025-07-21", | |
| 1398 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Manual Instruction Booklet Only", | |
| 1399 | + "price": 37.99, | |
| 1400 | + "ebayId": "136183040849", | |
| 1401 | + "listedPrice": null | |
| 1402 | + }, | |
| 1403 | + { | |
| 1404 | + "tab": "manual-only", | |
| 1405 | + "date": "2025-06-27", | |
| 1406 | + "title": "Conker's Bad Fur Day (Nintendo 64 N64) Manual only, Great Shape", | |
| 1407 | + "price": 44.99, | |
| 1408 | + "ebayId": "326650767772", | |
| 1409 | + "listedPrice": null | |
| 1410 | + }, | |
| 1411 | + { | |
| 1412 | + "tab": "manual-only", | |
| 1413 | + "date": "2025-06-23", | |
| 1414 | + "title": "Conker's Bad Fur Day N64 Nintendo 64 Authentic Manual Only - Very Good", | |
| 1415 | + "price": 52.75, | |
| 1416 | + "ebayId": "256969355902", | |
| 1417 | + "listedPrice": null | |
| 1418 | + }, | |
| 1419 | + { | |
| 1420 | + "tab": "manual-only", | |
| 1421 | + "date": "2025-06-21", | |
| 1422 | + "title": "Authentic Conker's Bad Fur Day Nintendo 64 Manual Only, 2001, No Game", | |
| 1423 | + "price": 47.99, | |
| 1424 | + "ebayId": "187350964305", | |
| 1425 | + "listedPrice": null | |
| 1426 | + }, | |
| 1427 | + { | |
| 1428 | + "tab": "manual-only", | |
| 1429 | + "date": "2025-05-16", | |
| 1430 | + "title": "Conker's Bad Fur Day N64 Nintendo 64 Authentic Manual Only *", | |
| 1431 | + "price": 59.95, | |
| 1432 | + "ebayId": "205476556229", | |
| 1433 | + "listedPrice": null | |
| 1434 | + }, | |
| 1435 | + { | |
| 1436 | + "tab": "manual-only", | |
| 1437 | + "date": "2025-04-14", | |
| 1438 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Authentic OEM Instruction Manual Book Only", | |
| 1439 | + "price": 38, | |
| 1440 | + "ebayId": "277012850749", | |
| 1441 | + "listedPrice": null | |
| 1442 | + }, | |
| 1443 | + { | |
| 1444 | + "tab": "manual-only", | |
| 1445 | + "date": "2025-04-09", | |
| 1446 | + "title": "Conker's Bad Fur Day N64 (Nintendo 64, 2001) **MANUAL ONLY** Authentic", | |
| 1447 | + "price": 34.99, | |
| 1448 | + "ebayId": "146497892032", | |
| 1449 | + "listedPrice": null | |
| 1450 | + }, | |
| 1451 | + { | |
| 1452 | + "tab": "manual-only", | |
| 1453 | + "date": "2025-03-17", | |
| 1454 | + "title": "Conker's Bad Fur Day N64 Manual Only (Nintendo 64, 2001) No Game", | |
| 1455 | + "price": 40, | |
| 1456 | + "ebayId": "197101669391", | |
| 1457 | + "listedPrice": null | |
| 1458 | + }, | |
| 1459 | + { | |
| 1460 | + "tab": "manual-only", | |
| 1461 | + "date": "2025-02-26", | |
| 1462 | + "title": "Conker's Bad Fur Day - (Nintendo 64) N64 Manual instruction booklet only⭐", | |
| 1463 | + "price": 39.99, | |
| 1464 | + "ebayId": "306073823185", | |
| 1465 | + "listedPrice": null | |
| 1466 | + }, | |
| 1467 | + { | |
| 1468 | + "tab": "manual-only", | |
| 1469 | + "date": "2025-02-20", | |
| 1470 | + "title": "Nintendo 64 N64 Conker's Bad Fur Day Instruction Manual + Like + More", | |
| 1471 | + "price": 31, | |
| 1472 | + "ebayId": "405549703153", | |
| 1473 | + "listedPrice": null | |
| 1474 | + }, | |
| 1475 | + { | |
| 1476 | + "tab": "manual-only", | |
| 1477 | + "date": "2025-02-20", | |
| 1478 | + "title": "Conker's Bad Fur Day N64 Manual Only (Nintendo 64, 2001) No Game", | |
| 1479 | + "price": 40, | |
| 1480 | + "ebayId": "267140558627", | |
| 1481 | + "listedPrice": null | |
| 1482 | + }, | |
| 1483 | + { | |
| 1484 | + "tab": "manual-only", | |
| 1485 | + "date": "2025-02-11", | |
| 1486 | + "title": "Nintendo 64 N64 Conker's Bad Fur Day Instruction Manual ORIGINAL GAME MANUAL", | |
| 1487 | + "price": 38.99, | |
| 1488 | + "ebayId": "156671405806", | |
| 1489 | + "listedPrice": null | |
| 1490 | + }, | |
| 1491 | + { | |
| 1492 | + "tab": "manual-only", | |
| 1493 | + "date": "2025-01-30", | |
| 1494 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 Manual Instruction Booklet Only No Game", | |
| 1495 | + "price": 37.99, | |
| 1496 | + "ebayId": "356519125954", | |
| 1497 | + "listedPrice": null | |
| 1498 | + }, | |
| 1499 | + { | |
| 1500 | + "tab": "manual-only", | |
| 1501 | + "date": "2025-01-18", | |
| 1502 | + "title": "Nintendo 64 N64 Conker's Bad Fur Day Instruction Manual OEM Original Game Book", | |
| 1503 | + "price": 30, | |
| 1504 | + "ebayId": "186886866145", | |
| 1505 | + "listedPrice": null | |
| 1506 | + }, | |
| 1507 | + { | |
| 1508 | + "tab": "grade-three", | |
| 1509 | + "date": "2026-08-07", | |
| 1510 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 PSA Graded 8.5 CIB Complete In Box!!! ✨✨✨", | |
| 1511 | + "price": 599.99, | |
| 1512 | + "ebayId": "117338605361", | |
| 1513 | + "listedPrice": null | |
| 1514 | + }, | |
| 1515 | + { | |
| 1516 | + "tab": "grade-three", | |
| 1517 | + "date": "2026-07-28", | |
| 1518 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 PSA Graded 8.5 CIB Complete In Box!!! ✨✨✨", | |
| 1519 | + "price": 699.99, | |
| 1520 | + "ebayId": "117179732361", | |
| 1521 | + "listedPrice": null | |
| 1522 | + }, | |
| 1523 | + { | |
| 1524 | + "tab": "grade-three", | |
| 1525 | + "date": "2026-06-01", | |
| 1526 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 WATA 7.5 A+", | |
| 1527 | + "price": 610, | |
| 1528 | + "ebayId": "287351596995", | |
| 1529 | + "listedPrice": null | |
| 1530 | + }, | |
| 1531 | + { | |
| 1532 | + "tab": "grade-three", | |
| 1533 | + "date": "2026-03-01", | |
| 1534 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 CIB CGC Graded 8.5 w/ 8.5 Manual!", | |
| 1535 | + "price": 800, | |
| 1536 | + "ebayId": "376923713386", | |
| 1537 | + "listedPrice": null | |
| 1538 | + }, | |
| 1539 | + { | |
| 1540 | + "tab": "grade-three", | |
| 1541 | + "date": "2025-11-23", | |
| 1542 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 CIB CGC Graded 9.4 w/ 9.6 Manual!", | |
| 1543 | + "price": 899.99, | |
| 1544 | + "ebayId": "167656124403", | |
| 1545 | + "listedPrice": null | |
| 1546 | + }, | |
| 1547 | + { | |
| 1548 | + "tab": "grade-three", | |
| 1549 | + "date": "2025-10-23", | |
| 1550 | + "title": "N64 Conkers Bad Fur Day CIB Graded Wata 8.5 w/Guide", | |
| 1551 | + "price": 800, | |
| 1552 | + "ebayId": "205781667269", | |
| 1553 | + "listedPrice": null | |
| 1554 | + }, | |
| 1555 | + { | |
| 1556 | + "tab": "grade-three", | |
| 1557 | + "date": "2025-09-29", | |
| 1558 | + "title": "Conker's Bad Fur Day WATA 9.4 CIB Nintendo 64 N64 Top Pop!", | |
| 1559 | + "price": 621, | |
| 1560 | + "ebayId": "267410350423", | |
| 1561 | + "listedPrice": null | |
| 1562 | + }, | |
| 1563 | + { | |
| 1564 | + "tab": "grade-three", | |
| 1565 | + "date": "2025-04-29", | |
| 1566 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) WATA Graded 9.0 A+", | |
| 1567 | + "price": 1199.95, | |
| 1568 | + "ebayId": "286261877306", | |
| 1569 | + "listedPrice": null | |
| 1570 | + }, | |
| 1571 | + { | |
| 1572 | + "tab": "grade-three", | |
| 1573 | + "date": "2025-02-01", | |
| 1574 | + "title": "Conker's Bad Fur Day (Nintendo 64, 2001) WATA Graded 9.0 A+", | |
| 1575 | + "price": 995, | |
| 1576 | + "ebayId": "387858513619", | |
| 1577 | + "listedPrice": null | |
| 1578 | + }, | |
| 1579 | + { | |
| 1580 | + "tab": "grade-three", | |
| 1581 | + "date": "2025-01-30", | |
| 1582 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 WATA Graded 7.0 A", | |
| 1583 | + "price": 899.99, | |
| 1584 | + "ebayId": "305969178191", | |
| 1585 | + "listedPrice": null | |
| 1586 | + }, | |
| 1587 | + { | |
| 1588 | + "tab": "grade-three", | |
| 1589 | + "date": "2025-01-03", | |
| 1590 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 WATA Graded 9.0 CIB MIB NOT VGA CGC Rare", | |
| 1591 | + "price": 630.99, | |
| 1592 | + "ebayId": "167227936130", | |
| 1593 | + "listedPrice": null | |
| 1594 | + }, | |
| 1595 | + { | |
| 1596 | + "tab": "grade-three", | |
| 1597 | + "date": "2024-10-06", | |
| 1598 | + "title": "Conker's Bad Fur Day CIB Nintendo 64 N64 9.2 WATA Graded. Box 9.0, Cart 9.4", | |
| 1599 | + "price": 699.95, | |
| 1600 | + "ebayId": "205029430863", | |
| 1601 | + "listedPrice": null | |
| 1602 | + }, | |
| 1603 | + { | |
| 1604 | + "tab": "grade-three", | |
| 1605 | + "date": "2024-10-05", | |
| 1606 | + "title": "Conker's Bad Fur Day CIB Nintendo 64 N64 9.2 WATA Graded. Box 9.0, Cart 9.4", | |
| 1607 | + "price": 710, | |
| 1608 | + "ebayId": "205012451411", | |
| 1609 | + "listedPrice": null | |
| 1610 | + }, | |
| 1611 | + { | |
| 1612 | + "tab": "grade-three", | |
| 1613 | + "date": "2024-08-04", | |
| 1614 | + "title": "Grade 9 CIB Conker's Bad Fur Day Nintendo 64 CGC Graded 9", | |
| 1615 | + "price": 650, | |
| 1616 | + "ebayId": "256586598882", | |
| 1617 | + "listedPrice": null | |
| 1618 | + }, | |
| 1619 | + { | |
| 1620 | + "tab": "grade-three", | |
| 1621 | + "date": "2024-07-25", | |
| 1622 | + "title": "Grade 9 CIB Conker's Bad Fur Day Nintendo 64 CGC Graded 9", | |
| 1623 | + "price": 650, | |
| 1624 | + "ebayId": "256544624164", | |
| 1625 | + "listedPrice": null | |
| 1626 | + }, | |
| 1627 | + { | |
| 1628 | + "tab": "grade-three", | |
| 1629 | + "date": "2024-04-04", | |
| 1630 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 WATA Graded 9.0 CIB MIB NOT VGA CGC RARE!!!", | |
| 1631 | + "price": 999.97, | |
| 1632 | + "ebayId": "315154132168", | |
| 1633 | + "listedPrice": null | |
| 1634 | + }, | |
| 1635 | + { | |
| 1636 | + "tab": "grade-three", | |
| 1637 | + "date": "2024-01-22", | |
| 1638 | + "title": "Conkers Bad Fur Day N64 CIB CGC Not Wata! Rare! Complete In Box Very Good", | |
| 1639 | + "price": 650, | |
| 1640 | + "ebayId": "145565813492", | |
| 1641 | + "listedPrice": null | |
| 1642 | + }, | |
| 1643 | + { | |
| 1644 | + "tab": "grade-three", | |
| 1645 | + "date": "2023-11-16", | |
| 1646 | + "title": "CONKER'S BAD FUR DAY 2001 CVG / CGC 7.5 CARTRIDGE RARE NINTENDO 64 N64 RARE", | |
| 1647 | + "price": 123, | |
| 1648 | + "ebayId": "276157165591", | |
| 1649 | + "listedPrice": null | |
| 1650 | + }, | |
| 1651 | + { | |
| 1652 | + "tab": "grade-three", | |
| 1653 | + "date": "2023-07-14", | |
| 1654 | + "title": "Conker's Bad Fur Day BFD Nintendo 64 N64 CIB Complete in Box CGC Graded 9.0 Wata", | |
| 1655 | + "price": 625, | |
| 1656 | + "ebayId": "115854786997", | |
| 1657 | + "listedPrice": null | |
| 1658 | + }, | |
| 1659 | + { | |
| 1660 | + "tab": "grade-three", | |
| 1661 | + "date": "2023-07-04", | |
| 1662 | + "title": "WATA 6.0 : SEAL (A+) - NINTENDO 64 - CONKER'S BAD FUR DAY N64 GAME -", | |
| 1663 | + "price": 559.95, | |
| 1664 | + "ebayId": "385688152736", | |
| 1665 | + "listedPrice": null | |
| 1666 | + }, | |
| 1667 | + { | |
| 1668 | + "tab": "grade-three", | |
| 1669 | + "date": "2023-06-24", | |
| 1670 | + "title": "Conker's Bad Fur Day Nintendo 64 N64 2001 CIB Complete in Box CGC Graded 9.0", | |
| 1671 | + "price": 599.99, | |
| 1672 | + "ebayId": "155612658700", | |
| 1673 | + "listedPrice": null | |
| 1674 | + }, | |
| 1675 | + { | |
| 1676 | + "tab": "grade-three", | |
| 1677 | + "date": "2023-06-21", | |
| 1678 | + "title": "Conker's Bad Fur Day Nintendo N64 CGC 6.0 cartridge", | |
| 1679 | + "price": 185, | |
| 1680 | + "ebayId": "354734430985", | |
| 1681 | + "listedPrice": null | |
| 1682 | + }, | |
| 1683 | + { | |
| 1684 | + "tab": "grade-three", | |
| 1685 | + "date": "2023-03-26", | |
| 1686 | + "title": "Conkers Bad Fur Day CIB WATA Graded 6.5 N64 Nintendo Complete Authentic Rare", | |
| 1687 | + "price": 300, | |
| 1688 | + "ebayId": "225489866751", | |
| 1689 | + "listedPrice": null | |
| 1690 | + }, | |
| 1691 | + { | |
| 1692 | + "tab": "grade-three", | |
| 1693 | + "date": "2023-03-16", | |
| 1694 | + "title": "Conkers Bad Fur Day CIB WATA Graded 6.5 N64 Nintendo Complete Authentic Rare", | |
| 1695 | + "price": 355, | |
| 1696 | + "ebayId": "225471568597", | |
| 1697 | + "listedPrice": null | |
| 1698 | + }, | |
| 1699 | + { | |
| 1700 | + "tab": "grade-three", | |
| 1701 | + "date": "2021-02-05", | |
| 1702 | + "title": "Conkers Bad Fur Day N64 Vga 80+ Nintendo", | |
| 1703 | + "price": 982.99, | |
| 1704 | + "ebayId": "154311467777", | |
| 1705 | + "listedPrice": null | |
| 1706 | + }, | |
| 1707 | + { | |
| 1708 | + "tab": "grade-three", | |
| 1709 | + "date": "2020-09-26", | |
| 1710 | + "title": "Conker's Bad Fur Day N64 Vga Graded Rare!!", | |
| 1711 | + "price": 1099.43, | |
| 1712 | + "ebayId": "264877978738", | |
| 1713 | + "listedPrice": null | |
| 1714 | + }, | |
| 1715 | + { | |
| 1716 | + "tab": "grade-three", | |
| 1717 | + "date": "2020-05-20", | |
| 1718 | + "title": "*VGA 85+* Conker‘s Bad Fur Day Nintendo 64 N64", | |
| 1719 | + "price": 602, | |
| 1720 | + "ebayId": "184294847594", | |
| 1721 | + "listedPrice": null | |
| 1722 | + }, | |
| 1723 | + { | |
| 1724 | + "tab": "grade-three", | |
| 1725 | + "date": "2020-05-16", | |
| 1726 | + "title": "*VGA 85+* Conker‘s Bad Fur Day Nintendo 64 N64 Qualified", | |
| 1727 | + "price": 324.45, | |
| 1728 | + "ebayId": "184294857706", | |
| 1729 | + "listedPrice": null | |
| 1730 | + }, | |
| 1731 | + { | |
| 1732 | + "tab": "grade-three", | |
| 1733 | + "date": "2020-05-14", | |
| 1734 | + "title": "*VGA 85+* Conker‘s Bad Fur Day Nintendo 64 N64", | |
| 1735 | + "price": 650.23, | |
| 1736 | + "ebayId": "184280340427", | |
| 1737 | + "listedPrice": null | |
| 1738 | + } | |
| 1739 | + ], | |
| 1740 | + "details": { | |
| 1741 | + "Genre": "Platformer", | |
| 1742 | + "Release Date": "March 5, 2001", | |
| 1743 | + "ESRB Rating": "Mature", | |
| 1744 | + "Publisher": "Rare", | |
| 1745 | + "Developer": "Rare", | |
| 1746 | + "Player Count": "Single Player", | |
| 1747 | + "Notes": "Conker's Bad Fur Day is a 2001 platform game developed and published by Rare for the Nintendo 64. The game follows Conker, a greedy, hard-drinking red squirrel who must return home to his girlfriend. Most of the game requires the player to complete a linear sequence of challenges that involve jumping over obstacles, solving puzzles, and fighting enemies. A multiplayer mode where up to four players can compete against each other and the AI in seven different game types is also included.", | |
| 1748 | + "UPC": "045496870805", | |
| 1749 | + "ASIN (Amazon)": "B00004U1R2", | |
| 1750 | + "ePID (eBay)": "2790", | |
| 1751 | + "PriceCharting ID": "3732", | |
| 1752 | + "Description": "The guys at Rare have been very, very naughty. The day after his 21st birthday bash. Conker's sporting the worst hangover ever, and he just can't seem to find his way home. Prepare to stagger through randy, raunchy, raucous scenarios crammed full of bad manners, twisted humor, and graphic bodily functions. Unless you're a fan of violence, foul language, and racy innuendo, you'd best steer clear of this one." | |
| 1753 | + }, | |
| 1754 | + "images": [ | |
| 1755 | + "https://storage.googleapis.com/images.pricecharting.com/AMIfv94utlmsg8lJGLz9NSKXBNzKNu0k36Q7D5wW36ApvFvgeQilcaM34MNMo5Bmw9n1LnO3OEAEzg0bXOjqpLJx_yereIVPtldN51IJjxsGFqioaZw-wCvD7uB1er4Ia8MZKIOfvc8E4VN35SbqHvrIAnwkNN5bXA/240.jpg", | |
| 1756 | + "https://storage.googleapis.com/images.pricecharting.com/232c92ba4d14157ad4336972daa1b0cf6bc36ec1fd043c9624e9c8ed2c1be4dc/240.jpg", | |
| 1757 | + "https://storage.googleapis.com/images.pricecharting.com/445ee537701769d430d6f4b6389e6e7805e98a14d16b3d4b3f34fddbf27a37b7/240.jpg", | |
| 1758 | + "https://storage.googleapis.com/images.pricecharting.com/4a51b1a3dc983b4bd8e058de0928fedddbcefea8c20f9cf8611106ed2404451d/240.jpg" | |
| 1759 | + ] | |
| 1760 | + } | |
| 1761 | + }, | |
| 1762 | + "expect": { | |
| 1763 | + "minCount": 1, | |
| 1764 | + "kinds": [ | |
| 1765 | + "catalog_item", | |
| 1766 | + "price_observation", | |
| 1767 | + "sale" | |
| 1768 | + ] | |
| 1769 | + }, | |
| 1770 | + "note": "captured live from https://www.pricecharting.com/game/nintendo-64/conker's-bad-fur-day", | |
| 1771 | + "capturedAt": "2026-09-07T04:33:26.166Z" | |
| 1772 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/pricecharting/nintendo-64__zelda-ocarina-of-time.json
+1781 −0
@@ -0,0 +1,1781 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://www.pricecharting.com/game/nintendo-64/zelda-ocarina-of-time", | |
| 4 | + "externalId": "3977", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:33:24.486Z", | |
| 8 | + "payload": { | |
| 9 | + "kind": "product", | |
| 10 | + "url": "https://www.pricecharting.com/game/nintendo-64/zelda-ocarina-of-time", | |
| 11 | + "productId": "3977", | |
| 12 | + "consoleUri": "nintendo-64", | |
| 13 | + "consoleName": "Nintendo 64", | |
| 14 | + "title": "Zelda Ocarina of Time", | |
| 15 | + "flags": { | |
| 16 | + "isComic": false, | |
| 17 | + "isLegoSet": false, | |
| 18 | + "isFunkoPop": false, | |
| 19 | + "isCard": false, | |
| 20 | + "isCoin": false, | |
| 21 | + "isSystem": false | |
| 22 | + }, | |
| 23 | + "columnLabels": [ | |
| 24 | + "Loose Price", | |
| 25 | + "Complete Price", | |
| 26 | + "New Price", | |
| 27 | + "Graded Price", | |
| 28 | + "Box Only Price", | |
| 29 | + "Manual Only Price", | |
| 30 | + "Graded", | |
| 31 | + "Box Only", | |
| 32 | + "Manual Only" | |
| 33 | + ], | |
| 34 | + "prices": [ | |
| 35 | + { | |
| 36 | + "key": "used_price", | |
| 37 | + "value": 50, | |
| 38 | + "raw": "$50.00" | |
| 39 | + }, | |
| 40 | + { | |
| 41 | + "key": "complete_price", | |
| 42 | + "value": 171.24, | |
| 43 | + "raw": "$171.24" | |
| 44 | + }, | |
| 45 | + { | |
| 46 | + "key": "new_price", | |
| 47 | + "value": 911.19, | |
| 48 | + "raw": "$911.19" | |
| 49 | + }, | |
| 50 | + { | |
| 51 | + "key": "graded_price", | |
| 52 | + "value": 5250, | |
| 53 | + "raw": "$5,250.00" | |
| 54 | + }, | |
| 55 | + { | |
| 56 | + "key": "box_only_price", | |
| 57 | + "value": 76.39, | |
| 58 | + "raw": "$76.39" | |
| 59 | + }, | |
| 60 | + { | |
| 61 | + "key": "manual_only_price", | |
| 62 | + "value": 16.15, | |
| 63 | + "raw": "$16.15" | |
| 64 | + } | |
| 65 | + ], | |
| 66 | + "sales": [ | |
| 67 | + { | |
| 68 | + "tab": "used", | |
| 69 | + "date": "2026-09-06", | |
| 70 | + "title": "Legend of Zelda Ocarina of Time N64 Nintendo 64 Game Cartridge tested", | |
| 71 | + "price": 50, | |
| 72 | + "ebayId": "287567435353", | |
| 73 | + "listedPrice": null | |
| 74 | + }, | |
| 75 | + { | |
| 76 | + "tab": "used", | |
| 77 | + "date": "2026-09-06", | |
| 78 | + "title": "The Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) N64 Authentic Cart Only", | |
| 79 | + "price": 49.99, | |
| 80 | + "ebayId": "366651969189", | |
| 81 | + "listedPrice": null | |
| 82 | + }, | |
| 83 | + { | |
| 84 | + "tab": "used", | |
| 85 | + "date": "2026-09-06", | |
| 86 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) Tested Authentic USA", | |
| 87 | + "price": 49.99, | |
| 88 | + "ebayId": "287563399750", | |
| 89 | + "listedPrice": null | |
| 90 | + }, | |
| 91 | + { | |
| 92 | + "tab": "used", | |
| 93 | + "date": "2026-09-06", | |
| 94 | + "title": "Legend of Zelda Ocarina of Time V1.1 (Nintendo 64 N64) Authentic & Tested", | |
| 95 | + "price": 69.95, | |
| 96 | + "ebayId": "137699166570", | |
| 97 | + "listedPrice": null | |
| 98 | + }, | |
| 99 | + { | |
| 100 | + "tab": "used", | |
| 101 | + "date": "2026-09-06", | |
| 102 | + "title": "The Legend of Zelda: Ocarina of Time - Nintendo 64 (N64) Tested and working", | |
| 103 | + "price": 21.99, | |
| 104 | + "ebayId": "257719768824", | |
| 105 | + "listedPrice": null | |
| 106 | + }, | |
| 107 | + { | |
| 108 | + "tab": "used", | |
| 109 | + "date": "2026-09-06", | |
| 110 | + "title": "The Legend of Zelda: Ocarina Of Time. N64. Cartridge Only. TESTED.", | |
| 111 | + "price": 49.99, | |
| 112 | + "ebayId": "336778386136", | |
| 113 | + "listedPrice": null | |
| 114 | + }, | |
| 115 | + { | |
| 116 | + "tab": "used", | |
| 117 | + "date": "2026-09-06", | |
| 118 | + "title": "The Legend of Zelda Ocarina of Time (Nintendo 64, 64) Authentic - Tested & Works", | |
| 119 | + "price": 55, | |
| 120 | + "ebayId": "188890659816", | |
| 121 | + "listedPrice": null | |
| 122 | + }, | |
| 123 | + { | |
| 124 | + "tab": "used", | |
| 125 | + "date": "2026-09-05", | |
| 126 | + "title": "The Legend of Zelda Ocarina of Time Nintendo 64 N64 Authentic Tested Cartridge", | |
| 127 | + "price": 50, | |
| 128 | + "ebayId": "327343738832", | |
| 129 | + "listedPrice": null | |
| 130 | + }, | |
| 131 | + { | |
| 132 | + "tab": "used", | |
| 133 | + "date": "2026-09-05", | |
| 134 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998)(NEW BATTERY)(TESTED)", | |
| 135 | + "price": 54.94, | |
| 136 | + "ebayId": "198611150471", | |
| 137 | + "listedPrice": null | |
| 138 | + }, | |
| 139 | + { | |
| 140 | + "tab": "used", | |
| 141 | + "date": "2026-09-05", | |
| 142 | + "title": "The Legend of Zelda Ocarina of Time (Nintendo 64, 64) Authentic - Tested & Works", | |
| 143 | + "price": 59.99, | |
| 144 | + "ebayId": "398358835081", | |
| 145 | + "listedPrice": null | |
| 146 | + }, | |
| 147 | + { | |
| 148 | + "tab": "used", | |
| 149 | + "date": "2026-09-05", | |
| 150 | + "title": "Zelda Ocarina of Time Nintendo 64 N64 Gray Cartridge Tested (CP1127816)", | |
| 151 | + "price": 24.99, | |
| 152 | + "ebayId": "377471502096", | |
| 153 | + "listedPrice": null | |
| 154 | + }, | |
| 155 | + { | |
| 156 | + "tab": "used", | |
| 157 | + "date": "2026-09-04", | |
| 158 | + "title": "The Legend of Zelda Ocarina of Time Nintendo 64 N64 Authentic Tested", | |
| 159 | + "price": 41, | |
| 160 | + "ebayId": "267770875458", | |
| 161 | + "listedPrice": null | |
| 162 | + }, | |
| 163 | + { | |
| 164 | + "tab": "used", | |
| 165 | + "date": "2026-09-03", | |
| 166 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) Tested - Clean", | |
| 167 | + "price": 49, | |
| 168 | + "ebayId": "147525241502", | |
| 169 | + "listedPrice": null | |
| 170 | + }, | |
| 171 | + { | |
| 172 | + "tab": "used", | |
| 173 | + "date": "2026-09-03", | |
| 174 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Authentic New Battery Tested OEM", | |
| 175 | + "price": 70, | |
| 176 | + "ebayId": "237041355825", | |
| 177 | + "listedPrice": null | |
| 178 | + }, | |
| 179 | + { | |
| 180 | + "tab": "used", | |
| 181 | + "date": "2026-09-03", | |
| 182 | + "title": "Nintendo The Legend of Zelda: Ocarina of Time N64 Cartridge Only Players Choice", | |
| 183 | + "price": 45, | |
| 184 | + "ebayId": "307154068976", | |
| 185 | + "listedPrice": null | |
| 186 | + }, | |
| 187 | + { | |
| 188 | + "tab": "used", | |
| 189 | + "date": "2026-09-03", | |
| 190 | + "title": "Authentic Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) Cart Only!", | |
| 191 | + "price": 54.95, | |
| 192 | + "ebayId": "307154094555", | |
| 193 | + "listedPrice": null | |
| 194 | + }, | |
| 195 | + { | |
| 196 | + "tab": "used", | |
| 197 | + "date": "2026-09-03", | |
| 198 | + "title": "The Legend of Zelda: Ocarina of Time Nintendo 64 - N64 1997 Cart Only Tested", | |
| 199 | + "price": 49.99, | |
| 200 | + "ebayId": "287561591651", | |
| 201 | + "listedPrice": null | |
| 202 | + }, | |
| 203 | + { | |
| 204 | + "tab": "used", | |
| 205 | + "date": "2026-09-03", | |
| 206 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, N64, 1998) Authentic - Tested", | |
| 207 | + "price": 49.99, | |
| 208 | + "ebayId": "820070514025", | |
| 209 | + "listedPrice": null | |
| 210 | + }, | |
| 211 | + { | |
| 212 | + "tab": "used", | |
| 213 | + "date": "2026-09-03", | |
| 214 | + "title": "The Legend Of Zelda Ocarina Of Time Nintendo 64 Cart Only, Tested And Works", | |
| 215 | + "price": 44, | |
| 216 | + "ebayId": "227496089760", | |
| 217 | + "listedPrice": null | |
| 218 | + }, | |
| 219 | + { | |
| 220 | + "tab": "used", | |
| 221 | + "date": "2026-09-03", | |
| 222 | + "title": "The Legend of Zelda Ocarina of Time Nintendo 64 N64 Authentic Cartridge Only", | |
| 223 | + "price": 39, | |
| 224 | + "ebayId": "407189047912", | |
| 225 | + "listedPrice": null | |
| 226 | + }, | |
| 227 | + { | |
| 228 | + "tab": "used", | |
| 229 | + "date": "2026-09-03", | |
| 230 | + "title": "Legend of Zelda Ocarina of Time N64 Authentic Nintendo 64 Cart Only - Tested", | |
| 231 | + "price": 37.99, | |
| 232 | + "ebayId": "227499738369", | |
| 233 | + "listedPrice": null | |
| 234 | + }, | |
| 235 | + { | |
| 236 | + "tab": "used", | |
| 237 | + "date": "2026-09-02", | |
| 238 | + "title": "Legend of Zelda: Ocarina of Time N64 Cartridge Only Tested Working Authentic", | |
| 239 | + "price": 55, | |
| 240 | + "ebayId": "257703537028", | |
| 241 | + "listedPrice": null | |
| 242 | + }, | |
| 243 | + { | |
| 244 | + "tab": "used", | |
| 245 | + "date": "2026-09-02", | |
| 246 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) N64 AUTHENTIC TESTED", | |
| 247 | + "price": 51, | |
| 248 | + "ebayId": "327329727999", | |
| 249 | + "listedPrice": null | |
| 250 | + }, | |
| 251 | + { | |
| 252 | + "tab": "used", | |
| 253 | + "date": "2026-09-01", | |
| 254 | + "title": "Authentic Zelda Ocarina of Time Nintendo 64 N64 Cartridge Only Tested Free Ship", | |
| 255 | + "price": 48.99, | |
| 256 | + "ebayId": "188872547620", | |
| 257 | + "listedPrice": null | |
| 258 | + }, | |
| 259 | + { | |
| 260 | + "tab": "used", | |
| 261 | + "date": "2026-09-01", | |
| 262 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998)(NEW BATTERY)(TESTED)", | |
| 263 | + "price": 54.94, | |
| 264 | + "ebayId": "198611149967", | |
| 265 | + "listedPrice": null | |
| 266 | + }, | |
| 267 | + { | |
| 268 | + "tab": "used", | |
| 269 | + "date": "2026-09-01", | |
| 270 | + "title": "Legend of Zelda Ocarina of Time (1998) - Nintendo 64 N64 Game Players Choice", | |
| 271 | + "price": 69, | |
| 272 | + "ebayId": "256009355757", | |
| 273 | + "listedPrice": null | |
| 274 | + }, | |
| 275 | + { | |
| 276 | + "tab": "used", | |
| 277 | + "date": "2026-09-01", | |
| 278 | + "title": "The Legend of Zelda: Ocarina of Time - Nintendo 64 (N64) Tested and working", | |
| 279 | + "price": 21.99, | |
| 280 | + "ebayId": "257711555540", | |
| 281 | + "listedPrice": null | |
| 282 | + }, | |
| 283 | + { | |
| 284 | + "tab": "used", | |
| 285 | + "date": "2026-09-01", | |
| 286 | + "title": "The Legend Of Zelda : Ocarina Of Time/N64 AUTHENTIC TESTED WORKING!!!*", | |
| 287 | + "price": 50, | |
| 288 | + "ebayId": "206527405735", | |
| 289 | + "listedPrice": null | |
| 290 | + }, | |
| 291 | + { | |
| 292 | + "tab": "used", | |
| 293 | + "date": "2026-09-01", | |
| 294 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) N64 Cartridge Only Working", | |
| 295 | + "price": 49.99, | |
| 296 | + "ebayId": "389779423147", | |
| 297 | + "listedPrice": null | |
| 298 | + }, | |
| 299 | + { | |
| 300 | + "tab": "used", | |
| 301 | + "date": "2026-09-01", | |
| 302 | + "title": "Authentic Zelda Ocarina of Time Nintendo 64 N64 Cartridge Only Tested Free Ship", | |
| 303 | + "price": 48.99, | |
| 304 | + "ebayId": "307155764298", | |
| 305 | + "listedPrice": null | |
| 306 | + }, | |
| 307 | + { | |
| 308 | + "tab": "cib", | |
| 309 | + "date": "2026-09-05", | |
| 310 | + "title": "The Legend Of Zelda Ocarina of Time Complete Box Manual Game Nintendo 64", | |
| 311 | + "price": 105.5, | |
| 312 | + "ebayId": "278323548346", | |
| 313 | + "listedPrice": null | |
| 314 | + }, | |
| 315 | + { | |
| 316 | + "tab": "cib", | |
| 317 | + "date": "2026-09-05", | |
| 318 | + "title": "Legend of Zelda: Ocarina of Time Nintendo 64 w/ Manual and Case TESTED WORKING", | |
| 319 | + "price": 63.99, | |
| 320 | + "ebayId": "158236513467", | |
| 321 | + "listedPrice": null | |
| 322 | + }, | |
| 323 | + { | |
| 324 | + "tab": "cib", | |
| 325 | + "date": "2026-09-05", | |
| 326 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998)", | |
| 327 | + "price": 101.89, | |
| 328 | + "ebayId": "820078237405", | |
| 329 | + "listedPrice": null | |
| 330 | + }, | |
| 331 | + { | |
| 332 | + "tab": "cib", | |
| 333 | + "date": "2026-09-03", | |
| 334 | + "title": "Nintendo 64 Legend of Zelda Ocarina of Time Video Game N64 Complete In Box CIB", | |
| 335 | + "price": 199.99, | |
| 336 | + "ebayId": "318806258985", | |
| 337 | + "listedPrice": null | |
| 338 | + }, | |
| 339 | + { | |
| 340 | + "tab": "cib", | |
| 341 | + "date": "2026-09-01", | |
| 342 | + "title": "The Legend Of Zelda Ocarina of Time CIB Complete Box Manual Game Nintendo 64", | |
| 343 | + "price": 142.49, | |
| 344 | + "ebayId": "317528665542", | |
| 345 | + "listedPrice": null | |
| 346 | + }, | |
| 347 | + { | |
| 348 | + "tab": "cib", | |
| 349 | + "date": "2026-08-28", | |
| 350 | + "title": "Nintendo Zelda: Ocarina of Time N64 NTSC-U/C (US/Canada) w/ Box & Manual", | |
| 351 | + "price": 145, | |
| 352 | + "ebayId": "398334174726", | |
| 353 | + "listedPrice": null | |
| 354 | + }, | |
| 355 | + { | |
| 356 | + "tab": "cib", | |
| 357 | + "date": "2026-08-28", | |
| 358 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 Authentic V1.2 New Battery N64 OOT", | |
| 359 | + "price": 99.99, | |
| 360 | + "ebayId": "198545980949", | |
| 361 | + "listedPrice": null | |
| 362 | + }, | |
| 363 | + { | |
| 364 | + "tab": "cib", | |
| 365 | + "date": "2026-08-20", | |
| 366 | + "title": "N64 Zelda Ocarina of Time Game Box & Manual Authentic Nintendo", | |
| 367 | + "price": 175.5, | |
| 368 | + "ebayId": "307118664306", | |
| 369 | + "listedPrice": null | |
| 370 | + }, | |
| 371 | + { | |
| 372 | + "tab": "cib", | |
| 373 | + "date": "2026-08-17", | |
| 374 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 CIB Complete W/ Manual Authentic", | |
| 375 | + "price": 255, | |
| 376 | + "ebayId": "158135839534", | |
| 377 | + "listedPrice": null | |
| 378 | + }, | |
| 379 | + { | |
| 380 | + "tab": "cib", | |
| 381 | + "date": "2026-08-16", | |
| 382 | + "title": "Nintendo 64 N64 Authentic Zelda Ocarina of Time CIB", | |
| 383 | + "price": 180.9, | |
| 384 | + "ebayId": "168433912954", | |
| 385 | + "listedPrice": null | |
| 386 | + }, | |
| 387 | + { | |
| 388 | + "tab": "cib", | |
| 389 | + "date": "2026-08-16", | |
| 390 | + "title": "The Legend of Zelda Ocarina of Time Nintendo N64 CIB + Guide / TESTED + Video", | |
| 391 | + "price": 160, | |
| 392 | + "ebayId": "406310652092", | |
| 393 | + "listedPrice": null | |
| 394 | + }, | |
| 395 | + { | |
| 396 | + "tab": "cib", | |
| 397 | + "date": "2026-08-15", | |
| 398 | + "title": "The Legend of Zelda Ocarina of Time N64 CIB Nintendo 64 Complete - Box Wear", | |
| 399 | + "price": 149.97, | |
| 400 | + "ebayId": "267750884438", | |
| 401 | + "listedPrice": null | |
| 402 | + }, | |
| 403 | + { | |
| 404 | + "tab": "cib", | |
| 405 | + "date": "2026-08-14", | |
| 406 | + "title": "Zelda Ocarina of Time N64 Complete CIB Game Box Manual Authentic Nintendo (M)", | |
| 407 | + "price": 143.98, | |
| 408 | + "ebayId": "267674460751", | |
| 409 | + "listedPrice": null | |
| 410 | + }, | |
| 411 | + { | |
| 412 | + "tab": "cib", | |
| 413 | + "date": "2026-08-12", | |
| 414 | + "title": "Legend of Zelda Ocarina of Time (Nintendo 64 N64) Complete CIB", | |
| 415 | + "price": 177.99, | |
| 416 | + "ebayId": "358884096794", | |
| 417 | + "listedPrice": null | |
| 418 | + }, | |
| 419 | + { | |
| 420 | + "tab": "cib", | |
| 421 | + "date": "2026-08-12", | |
| 422 | + "title": "The Legend of Zelda: Ocarina of Time Nintendo 64 CIB Plus Protector", | |
| 423 | + "price": 120, | |
| 424 | + "ebayId": "128015946407", | |
| 425 | + "listedPrice": null | |
| 426 | + }, | |
| 427 | + { | |
| 428 | + "tab": "cib", | |
| 429 | + "date": "2026-08-12", | |
| 430 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) Tested CIB w Inserts", | |
| 431 | + "price": 140, | |
| 432 | + "ebayId": "366592868398", | |
| 433 | + "listedPrice": null | |
| 434 | + }, | |
| 435 | + { | |
| 436 | + "tab": "cib", | |
| 437 | + "date": "2026-08-12", | |
| 438 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) CIB", | |
| 439 | + "price": 180, | |
| 440 | + "ebayId": "287508599330", | |
| 441 | + "listedPrice": null | |
| 442 | + }, | |
| 443 | + { | |
| 444 | + "tab": "cib", | |
| 445 | + "date": "2026-08-11", | |
| 446 | + "title": "Nintendo 64 Legend of Zelda Ocarina of Time Video Game N64 Complete In Box CIB", | |
| 447 | + "price": 170, | |
| 448 | + "ebayId": "137586181105", | |
| 449 | + "listedPrice": null | |
| 450 | + }, | |
| 451 | + { | |
| 452 | + "tab": "cib", | |
| 453 | + "date": "2026-08-11", | |
| 454 | + "title": "Nintendo 64 - The Legend of Zelda: Ocarina of Time - Complete w/ Inserts", | |
| 455 | + "price": 350, | |
| 456 | + "ebayId": "407137077452", | |
| 457 | + "listedPrice": null | |
| 458 | + }, | |
| 459 | + { | |
| 460 | + "tab": "cib", | |
| 461 | + "date": "2026-08-10", | |
| 462 | + "title": "The Legend of Zelda : Ocarina of Time (Nintendo 64, 1998) Tested, CIB", | |
| 463 | + "price": 960, | |
| 464 | + "ebayId": "307104745750", | |
| 465 | + "listedPrice": null | |
| 466 | + }, | |
| 467 | + { | |
| 468 | + "tab": "cib", | |
| 469 | + "date": "2026-08-10", | |
| 470 | + "title": "The Legend of Zelda Ocarina of Time Nintendo 64 N64 Complete CIB Box AUTHENTIC !", | |
| 471 | + "price": 220, | |
| 472 | + "ebayId": "407128179243", | |
| 473 | + "listedPrice": null | |
| 474 | + }, | |
| 475 | + { | |
| 476 | + "tab": "cib", | |
| 477 | + "date": "2026-08-09", | |
| 478 | + "title": "Zelda Ocarina Of Time N64 CIB", | |
| 479 | + "price": 263, | |
| 480 | + "ebayId": "327290311979", | |
| 481 | + "listedPrice": null | |
| 482 | + }, | |
| 483 | + { | |
| 484 | + "tab": "cib", | |
| 485 | + "date": "2026-08-09", | |
| 486 | + "title": "Nintendo 64 N64 Authentic The Legend of Zelda Ocarina of Time CIB", | |
| 487 | + "price": 179.33, | |
| 488 | + "ebayId": "168413339954", | |
| 489 | + "listedPrice": null | |
| 490 | + }, | |
| 491 | + { | |
| 492 | + "tab": "cib", | |
| 493 | + "date": "2026-08-09", | |
| 494 | + "title": "Legend of Zelda Ocarina of Time (Nintendo 64 N64) Complete in Box CIB authentic", | |
| 495 | + "price": 189.99, | |
| 496 | + "ebayId": "317810220105", | |
| 497 | + "listedPrice": null | |
| 498 | + }, | |
| 499 | + { | |
| 500 | + "tab": "cib", | |
| 501 | + "date": "2026-08-09", | |
| 502 | + "title": "N64 Legend of Zelda Ocarina of Time CIB Complete Vintage Authentic", | |
| 503 | + "price": 160, | |
| 504 | + "ebayId": "157618484611", | |
| 505 | + "listedPrice": null | |
| 506 | + }, | |
| 507 | + { | |
| 508 | + "tab": "cib", | |
| 509 | + "date": "2026-08-08", | |
| 510 | + "title": "The Legend of Zelda Ocarina of Time Nintendo 64 N64 Complete CIB with Guides", | |
| 511 | + "price": 182.92, | |
| 512 | + "ebayId": "198147414415", | |
| 513 | + "listedPrice": null | |
| 514 | + }, | |
| 515 | + { | |
| 516 | + "tab": "cib", | |
| 517 | + "date": "2026-08-07", | |
| 518 | + "title": "The Legend of Zelda Ocarina of Time Nintendo 64 N64 Complete CIB Box AUTHENTIC !", | |
| 519 | + "price": 259.99, | |
| 520 | + "ebayId": "306302764903", | |
| 521 | + "listedPrice": null | |
| 522 | + }, | |
| 523 | + { | |
| 524 | + "tab": "cib", | |
| 525 | + "date": "2026-08-06", | |
| 526 | + "title": "Legend of Zelda Ocarina of Time (Nintendo 64 N64) CIB Authentic Complete Tested", | |
| 527 | + "price": 179.45, | |
| 528 | + "ebayId": "117344740710", | |
| 529 | + "listedPrice": null | |
| 530 | + }, | |
| 531 | + { | |
| 532 | + "tab": "cib", | |
| 533 | + "date": "2026-08-06", | |
| 534 | + "title": "The Legend of Zelda Ocarina of Time Nintendo 64 N64 Complete CIB Box AUTHENTIC !", | |
| 535 | + "price": 269.99, | |
| 536 | + "ebayId": "306937089856", | |
| 537 | + "listedPrice": null | |
| 538 | + }, | |
| 539 | + { | |
| 540 | + "tab": "cib", | |
| 541 | + "date": "2026-08-06", | |
| 542 | + "title": "Nintendo 64 Legend of Zelda Ocarina of Time Video Game N64 Complete In Box CIB", | |
| 543 | + "price": 206.5, | |
| 544 | + "ebayId": "128000746472", | |
| 545 | + "listedPrice": null | |
| 546 | + }, | |
| 547 | + { | |
| 548 | + "tab": "new", | |
| 549 | + "date": "2026-08-09", | |
| 550 | + "title": "The Legend of Zelda: Ocarina of Time N64 Nintendo 64 Brand New Sealed", | |
| 551 | + "price": 999.95, | |
| 552 | + "ebayId": "257669885999", | |
| 553 | + "listedPrice": null | |
| 554 | + }, | |
| 555 | + { | |
| 556 | + "tab": "new", | |
| 557 | + "date": "2026-06-12", | |
| 558 | + "title": "N64 Nintendo 64 Zelda Ocarina of Time Collector Edition NIB Brand New in Box", | |
| 559 | + "price": 1199.95, | |
| 560 | + "ebayId": "297319766135", | |
| 561 | + "listedPrice": null | |
| 562 | + }, | |
| 563 | + { | |
| 564 | + "tab": "new", | |
| 565 | + "date": "2026-06-10", | |
| 566 | + "title": "The Legend Of Zelda Ocarina Of Time Sealed", | |
| 567 | + "price": 400, | |
| 568 | + "ebayId": "178208485646", | |
| 569 | + "listedPrice": null | |
| 570 | + }, | |
| 571 | + { | |
| 572 | + "tab": "new", | |
| 573 | + "date": "2026-05-07", | |
| 574 | + "title": "Legend of Zelda: Ocarina of Time Factory Sealed (Nintendo 64, 1998) - NEW N64", | |
| 575 | + "price": 1136, | |
| 576 | + "ebayId": "227322527233", | |
| 577 | + "listedPrice": null | |
| 578 | + }, | |
| 579 | + { | |
| 580 | + "tab": "new", | |
| 581 | + "date": "2026-04-29", | |
| 582 | + "title": "The Legend of Zelda Ocarina of Time (Nintendo 64 N64) New/Sealed H-Seam", | |
| 583 | + "price": 799.99, | |
| 584 | + "ebayId": "168270199971", | |
| 585 | + "listedPrice": null | |
| 586 | + }, | |
| 587 | + { | |
| 588 | + "tab": "new", | |
| 589 | + "date": "2026-03-27", | |
| 590 | + "title": "Zelda Ocarina of Time Nintendo 64 N64 Cartridge, 1998 Sealed", | |
| 591 | + "price": 550, | |
| 592 | + "ebayId": "168259833710", | |
| 593 | + "listedPrice": null | |
| 594 | + }, | |
| 595 | + { | |
| 596 | + "tab": "new", | |
| 597 | + "date": "2026-03-21", | |
| 598 | + "title": "Zelda Ocarina of Time Nintendo 64 N64 Cartridge, 1998 Sealed", | |
| 599 | + "price": 550, | |
| 600 | + "ebayId": "168250671948", | |
| 601 | + "listedPrice": null | |
| 602 | + }, | |
| 603 | + { | |
| 604 | + "tab": "new", | |
| 605 | + "date": "2026-01-23", | |
| 606 | + "title": "The Legend of Zelda Ocarina of Time (Nintendo 64 N64) New/Sealed", | |
| 607 | + "price": 799.99, | |
| 608 | + "ebayId": "267553323024", | |
| 609 | + "listedPrice": null | |
| 610 | + }, | |
| 611 | + { | |
| 612 | + "tab": "new", | |
| 613 | + "date": "2026-01-04", | |
| 614 | + "title": "Sealed Legend of Zelda:Ocarina of Time N64 -100% Authentic Factory Seal - H-Seam", | |
| 615 | + "price": 819, | |
| 616 | + "ebayId": "287039254276", | |
| 617 | + "listedPrice": null | |
| 618 | + }, | |
| 619 | + { | |
| 620 | + "tab": "new", | |
| 621 | + "date": "2025-12-04", | |
| 622 | + "title": "Zelda: Ocarina Of Time N64 - Collectors Edition - Factory Sealed", | |
| 623 | + "price": 800, | |
| 624 | + "ebayId": "187784208719", | |
| 625 | + "listedPrice": null | |
| 626 | + }, | |
| 627 | + { | |
| 628 | + "tab": "new", | |
| 629 | + "date": "2025-11-29", | |
| 630 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64) - In Sealed Box, Never Opened", | |
| 631 | + "price": 690, | |
| 632 | + "ebayId": "297784630491", | |
| 633 | + "listedPrice": null | |
| 634 | + }, | |
| 635 | + { | |
| 636 | + "tab": "new", | |
| 637 | + "date": "2025-11-26", | |
| 638 | + "title": "Zelda Ocarina Of Time N64 Collectors Edition Factory Sealed Small Tears", | |
| 639 | + "price": 950.29, | |
| 640 | + "ebayId": "286971937613", | |
| 641 | + "listedPrice": null | |
| 642 | + }, | |
| 643 | + { | |
| 644 | + "tab": "new", | |
| 645 | + "date": "2025-11-19", | |
| 646 | + "title": "Zelda Ocarina Of Time N64 Collectors Edition Factory Sealed", | |
| 647 | + "price": 881.51, | |
| 648 | + "ebayId": "286915288269", | |
| 649 | + "listedPrice": null | |
| 650 | + }, | |
| 651 | + { | |
| 652 | + "tab": "new", | |
| 653 | + "date": "2025-11-13", | |
| 654 | + "title": "N64 Nintendo 64 Zelda Ocarina of Time NIB Brand New in Box French/Dutch RARE", | |
| 655 | + "price": 249.95, | |
| 656 | + "ebayId": "297319766139", | |
| 657 | + "listedPrice": null | |
| 658 | + }, | |
| 659 | + { | |
| 660 | + "tab": "new", | |
| 661 | + "date": "2025-11-03", | |
| 662 | + "title": "Zelda Ocarina Of Time N64 Collectors Edition Factory Sealed", | |
| 663 | + "price": 1156.57, | |
| 664 | + "ebayId": "286872381777", | |
| 665 | + "listedPrice": null | |
| 666 | + }, | |
| 667 | + { | |
| 668 | + "tab": "new", | |
| 669 | + "date": "2025-10-26", | |
| 670 | + "title": "N64 The Legend of Zelda: Ocarina of Time (Nintendo 64 Players Choice) Sealed", | |
| 671 | + "price": 700, | |
| 672 | + "ebayId": "167886887484", | |
| 673 | + "listedPrice": null | |
| 674 | + }, | |
| 675 | + { | |
| 676 | + "tab": "new", | |
| 677 | + "date": "2025-09-29", | |
| 678 | + "title": "1999 Legend Of Zelda Ocarina Of Time Brand New Sealed Box Nintendo 64", | |
| 679 | + "price": 1500, | |
| 680 | + "ebayId": "187587586956", | |
| 681 | + "listedPrice": null | |
| 682 | + }, | |
| 683 | + { | |
| 684 | + "tab": "new", | |
| 685 | + "date": "2025-08-13", | |
| 686 | + "title": "Zelda Ocarina of Time Nintendo 64 N64 Sealed New In Box - Free Shipping", | |
| 687 | + "price": 799.99, | |
| 688 | + "ebayId": "257063166742", | |
| 689 | + "listedPrice": null | |
| 690 | + }, | |
| 691 | + { | |
| 692 | + "tab": "new", | |
| 693 | + "date": "2025-07-19", | |
| 694 | + "title": "Factory SEALED Legend of Zelda Ocarina of Time OOT nintendo64 n64 clean box/seal", | |
| 695 | + "price": 3499, | |
| 696 | + "ebayId": "297463818896", | |
| 697 | + "listedPrice": null | |
| 698 | + }, | |
| 699 | + { | |
| 700 | + "tab": "new", | |
| 701 | + "date": "2025-07-19", | |
| 702 | + "title": "Factory SEALED The Legend of Zelda Ocarina of Time nintendo 64 n64 authentic OOT", | |
| 703 | + "price": 1599, | |
| 704 | + "ebayId": "297466390825", | |
| 705 | + "listedPrice": null | |
| 706 | + }, | |
| 707 | + { | |
| 708 | + "tab": "new", | |
| 709 | + "date": "2025-07-11", | |
| 710 | + "title": "factory sealed The Legend of Zelda Ocarina of Time OOT nintendo 64 n64 clean box", | |
| 711 | + "price": 2499, | |
| 712 | + "ebayId": "297462925107", | |
| 713 | + "listedPrice": null | |
| 714 | + }, | |
| 715 | + { | |
| 716 | + "tab": "new", | |
| 717 | + "date": "2025-04-24", | |
| 718 | + "title": "zelda ocarina of time n64 new", | |
| 719 | + "price": 700, | |
| 720 | + "ebayId": "177017959862", | |
| 721 | + "listedPrice": null | |
| 722 | + }, | |
| 723 | + { | |
| 724 | + "tab": "new", | |
| 725 | + "date": "2025-03-24", | |
| 726 | + "title": "Legend of Zelda: Ocarina of Time Brand new Sealed", | |
| 727 | + "price": 2654, | |
| 728 | + "ebayId": "276975786305", | |
| 729 | + "listedPrice": null | |
| 730 | + }, | |
| 731 | + { | |
| 732 | + "tab": "new", | |
| 733 | + "date": "2025-03-07", | |
| 734 | + "title": "Faded Sealed Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) Good Condition", | |
| 735 | + "price": 600, | |
| 736 | + "ebayId": "146431835097", | |
| 737 | + "listedPrice": null | |
| 738 | + }, | |
| 739 | + { | |
| 740 | + "tab": "new", | |
| 741 | + "date": "2025-03-06", | |
| 742 | + "title": "Sealed Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) Good Condition", | |
| 743 | + "price": 600, | |
| 744 | + "ebayId": "146431760026", | |
| 745 | + "listedPrice": null | |
| 746 | + }, | |
| 747 | + { | |
| 748 | + "tab": "new", | |
| 749 | + "date": "2025-02-16", | |
| 750 | + "title": "1998 N64 Nintendo 64 The Legend of Zelda: Ocarina of Time (USA) - Collector's Edition Sealed Video Game - VGA NM+ 85+", | |
| 751 | + "price": 159.82, | |
| 752 | + "ebayId": null, | |
| 753 | + "listedPrice": null | |
| 754 | + }, | |
| 755 | + { | |
| 756 | + "tab": "new", | |
| 757 | + "date": "2025-01-02", | |
| 758 | + "title": "Zelda: Ocarina Of Time N64 Sealed. Original Wal-Mart Price Tag !!!!!", | |
| 759 | + "price": 1500, | |
| 760 | + "ebayId": "395945136432", | |
| 761 | + "listedPrice": null | |
| 762 | + }, | |
| 763 | + { | |
| 764 | + "tab": "new", | |
| 765 | + "date": "2024-12-24", | |
| 766 | + "title": "The Legend of Zelda Ocarina of Time - Nintendo 64 N64 NTSC-UC USA con scatola", | |
| 767 | + "price": 360.54, | |
| 768 | + "ebayId": "305984814816", | |
| 769 | + "listedPrice": null | |
| 770 | + }, | |
| 771 | + { | |
| 772 | + "tab": "new", | |
| 773 | + "date": "2024-10-07", | |
| 774 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) N64 *SEALED, NEW*", | |
| 775 | + "price": 352, | |
| 776 | + "ebayId": "365149442325", | |
| 777 | + "listedPrice": null | |
| 778 | + }, | |
| 779 | + { | |
| 780 | + "tab": "new", | |
| 781 | + "date": "2024-09-15", | |
| 782 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998)◇Factory Sealed◇ Rare GEM💎", | |
| 783 | + "price": 975, | |
| 784 | + "ebayId": "356026312212", | |
| 785 | + "listedPrice": null | |
| 786 | + }, | |
| 787 | + { | |
| 788 | + "tab": "graded", | |
| 789 | + "date": "2026-09-04", | |
| 790 | + "title": "The Legend of Zelda: Ocarina of Time - PSA 9.8 A++ Sealed [Standard Release], N64 Nintendo 1998 USA....", | |
| 791 | + "price": 81250, | |
| 792 | + "ebayId": null, | |
| 793 | + "listedPrice": null | |
| 794 | + }, | |
| 795 | + { | |
| 796 | + "tab": "graded", | |
| 797 | + "date": "2026-07-28", | |
| 798 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Sealed New PSA 7.0 B", | |
| 799 | + "price": 2100, | |
| 800 | + "ebayId": "158093559092", | |
| 801 | + "listedPrice": null | |
| 802 | + }, | |
| 803 | + { | |
| 804 | + "tab": "graded", | |
| 805 | + "date": "2026-07-24", | |
| 806 | + "title": "WATA 9.2 A+ Legend of Zelda Ocarina of Time Nintendo 64 N64 1998 Sealed VGA CGC", | |
| 807 | + "price": 3999.99, | |
| 808 | + "ebayId": "187586164390", | |
| 809 | + "listedPrice": null | |
| 810 | + }, | |
| 811 | + { | |
| 812 | + "tab": "graded", | |
| 813 | + "date": "2026-07-12", | |
| 814 | + "title": "Legend Zelda Ocarina Time CE Nintendo 64 N64 Sealed New PSA 9.2 A+ Graded", | |
| 815 | + "price": 6500, | |
| 816 | + "ebayId": "158024094234", | |
| 817 | + "listedPrice": null | |
| 818 | + }, | |
| 819 | + { | |
| 820 | + "tab": "graded", | |
| 821 | + "date": "2026-06-29", | |
| 822 | + "title": "The Legend of Zelda Ocarina of Time Nintendo 64 N64 Sealed New PSA 9.0 B+ Graded", | |
| 823 | + "price": 1750, | |
| 824 | + "ebayId": "158005222702", | |
| 825 | + "listedPrice": null | |
| 826 | + }, | |
| 827 | + { | |
| 828 | + "tab": "graded", | |
| 829 | + "date": "2026-06-18", | |
| 830 | + "title": "1998 N64 Nintendo 64 The Legend of Zelda: Ocarina of Time (USA) - Collector's Edition Sealed Video Game - VGA NM+ 85+", | |
| 831 | + "price": 15982, | |
| 832 | + "ebayId": null, | |
| 833 | + "listedPrice": null | |
| 834 | + }, | |
| 835 | + { | |
| 836 | + "tab": "graded", | |
| 837 | + "date": "2026-06-18", | |
| 838 | + "title": "1998 N64 Nintendo 64 The Legend of Zelda: Ocarina of Time (USA) Sealed Video Game - Collector's Edition, Flatback/Small Vents - VGA NM 80+", | |
| 839 | + "price": 3050, | |
| 840 | + "ebayId": null, | |
| 841 | + "listedPrice": null | |
| 842 | + }, | |
| 843 | + { | |
| 844 | + "tab": "graded", | |
| 845 | + "date": "2026-05-29", | |
| 846 | + "title": "Legend Zelda Ocarina of Time CE Nintendo 64 N64 Sealed New PSA 7.0 B+", | |
| 847 | + "price": 1800, | |
| 848 | + "ebayId": "157950250088", | |
| 849 | + "listedPrice": null | |
| 850 | + }, | |
| 851 | + { | |
| 852 | + "tab": "graded", | |
| 853 | + "date": "2026-05-14", | |
| 854 | + "title": "The Legend of Zelda: Ocarina of Time - Wata 5.5 B Sealed [Standard Release], N64 Nintendo 1998 USA....", | |
| 855 | + "price": 550, | |
| 856 | + "ebayId": null, | |
| 857 | + "listedPrice": null | |
| 858 | + }, | |
| 859 | + { | |
| 860 | + "tab": "graded", | |
| 861 | + "date": "2026-05-14", | |
| 862 | + "title": "The Legend of Zelda: Ocarina of Time - Wata 6.0 A Sealed [Standard Release], N64 Nintendo 1998 USA....", | |
| 863 | + "price": 938, | |
| 864 | + "ebayId": null, | |
| 865 | + "listedPrice": null | |
| 866 | + }, | |
| 867 | + { | |
| 868 | + "tab": "graded", | |
| 869 | + "date": "2026-05-09", | |
| 870 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Sealed New WATA 8.5 A+ Graded", | |
| 871 | + "price": 2399, | |
| 872 | + "ebayId": "397894783668", | |
| 873 | + "listedPrice": null | |
| 874 | + }, | |
| 875 | + { | |
| 876 | + "tab": "graded", | |
| 877 | + "date": "2026-04-20", | |
| 878 | + "title": "PSA 7.0 Legend of Zelda: Ocarina of Time Nintendo 64 N64 New Sealed WATA VGA CGC", | |
| 879 | + "price": 1999.99, | |
| 880 | + "ebayId": "188247759657", | |
| 881 | + "listedPrice": null | |
| 882 | + }, | |
| 883 | + { | |
| 884 | + "tab": "graded", | |
| 885 | + "date": "2026-04-16", | |
| 886 | + "title": "The Legend of Zelda: Ocarina of Time - Wata 9.0 A+ Sealed [Standard Release], N64 Nintendo 1998 USA....", | |
| 887 | + "price": 2875, | |
| 888 | + "ebayId": null, | |
| 889 | + "listedPrice": null | |
| 890 | + }, | |
| 891 | + { | |
| 892 | + "tab": "graded", | |
| 893 | + "date": "2026-04-15", | |
| 894 | + "title": "Legend of Zelda: Ocarina of Time N64 Collector's Edition Sealed 1998 WATA 9.4 A+", | |
| 895 | + "price": 6750, | |
| 896 | + "ebayId": "285140938771", | |
| 897 | + "listedPrice": null | |
| 898 | + }, | |
| 899 | + { | |
| 900 | + "tab": "graded", | |
| 901 | + "date": "2026-04-14", | |
| 902 | + "title": "Sealed Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) VGA 80+ First Print", | |
| 903 | + "price": 4500, | |
| 904 | + "ebayId": "137185321962", | |
| 905 | + "listedPrice": null | |
| 906 | + }, | |
| 907 | + { | |
| 908 | + "tab": "graded", | |
| 909 | + "date": "2026-04-12", | |
| 910 | + "title": "Zelda Ocarina of Time N64 PSA 7.0 Sealed A+ V-Seam 1998 Graded", | |
| 911 | + "price": 1476, | |
| 912 | + "ebayId": "336519292811", | |
| 913 | + "listedPrice": null | |
| 914 | + }, | |
| 915 | + { | |
| 916 | + "tab": "graded", | |
| 917 | + "date": "2026-03-04", | |
| 918 | + "title": "The Legend of Zelda Ocarina of Time Nintendo 64 N64 New 1998 Sealed PSA 9.6 A++", | |
| 919 | + "price": 15500, | |
| 920 | + "ebayId": "375602885950", | |
| 921 | + "listedPrice": null | |
| 922 | + }, | |
| 923 | + { | |
| 924 | + "tab": "graded", | |
| 925 | + "date": "2026-03-01", | |
| 926 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) Sealed PSA 7.5 A+", | |
| 927 | + "price": 1400, | |
| 928 | + "ebayId": "358270396139", | |
| 929 | + "listedPrice": null | |
| 930 | + }, | |
| 931 | + { | |
| 932 | + "tab": "graded", | |
| 933 | + "date": "2026-02-17", | |
| 934 | + "title": "WATA 9.0 A+ Zelda Ocarina of Time N64 Sealed Players Choice 1999 Graded", | |
| 935 | + "price": 2900, | |
| 936 | + "ebayId": "187880837637", | |
| 937 | + "listedPrice": null | |
| 938 | + }, | |
| 939 | + { | |
| 940 | + "tab": "graded", | |
| 941 | + "date": "2026-02-09", | |
| 942 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Sealed New CGC 9.2 A+ Graded", | |
| 943 | + "price": 4499.99, | |
| 944 | + "ebayId": "157655505357", | |
| 945 | + "listedPrice": null | |
| 946 | + }, | |
| 947 | + { | |
| 948 | + "tab": "graded", | |
| 949 | + "date": "2026-01-30", | |
| 950 | + "title": "The Legend of Zelda Ocarina of Time New Nintendo 64 N64 Sealed WATA VGA Grade 75", | |
| 951 | + "price": 1699.99, | |
| 952 | + "ebayId": "374410077717", | |
| 953 | + "listedPrice": null | |
| 954 | + }, | |
| 955 | + { | |
| 956 | + "tab": "graded", | |
| 957 | + "date": "2026-01-23", | |
| 958 | + "title": "Legend of Zelda Ocarina of Time CE Nintendo 64 N64 Sealed New WATA 9.4 A+", | |
| 959 | + "price": 5999.99, | |
| 960 | + "ebayId": "157443435571", | |
| 961 | + "listedPrice": null | |
| 962 | + }, | |
| 963 | + { | |
| 964 | + "tab": "graded", | |
| 965 | + "date": "2026-01-21", | |
| 966 | + "title": "1998 N64 The Legend of Zelda Ocarina of Time Graded WATA 9.0 A+ Sealed 1st Print", | |
| 967 | + "price": 8999, | |
| 968 | + "ebayId": "336313423095", | |
| 969 | + "listedPrice": null | |
| 970 | + }, | |
| 971 | + { | |
| 972 | + "tab": "graded", | |
| 973 | + "date": "2026-01-15", | |
| 974 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Sealed New CGC 9.0 A+ Graded", | |
| 975 | + "price": 3400, | |
| 976 | + "ebayId": "187662651185", | |
| 977 | + "listedPrice": null | |
| 978 | + }, | |
| 979 | + { | |
| 980 | + "tab": "graded", | |
| 981 | + "date": "2026-01-14", | |
| 982 | + "title": "Legend of Zelda: Ocarina of Time (N64 1998) 1st Print V-Seam VGA Graded 80+ Rare", | |
| 983 | + "price": 1682, | |
| 984 | + "ebayId": "227160405734", | |
| 985 | + "listedPrice": null | |
| 986 | + }, | |
| 987 | + { | |
| 988 | + "tab": "graded", | |
| 989 | + "date": "2025-12-25", | |
| 990 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Sealed New CGC 9.2 A+ Graded", | |
| 991 | + "price": 4499.99, | |
| 992 | + "ebayId": "157443549182", | |
| 993 | + "listedPrice": null | |
| 994 | + }, | |
| 995 | + { | |
| 996 | + "tab": "graded", | |
| 997 | + "date": "2025-12-15", | |
| 998 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Collectors Ed Sealed Wata 9.6 A", | |
| 999 | + "price": 5116.96, | |
| 1000 | + "ebayId": "317465237497", | |
| 1001 | + "listedPrice": null | |
| 1002 | + }, | |
| 1003 | + { | |
| 1004 | + "tab": "graded", | |
| 1005 | + "date": "2025-12-07", | |
| 1006 | + "title": "1998 N64 Nintendo 64 The Legend of Zelda: Ocarina of Time (USA) Sealed Video Game - Made in Japan, Collectors Edition - PSA 9.8/A++", | |
| 1007 | + "price": 37826, | |
| 1008 | + "ebayId": null, | |
| 1009 | + "listedPrice": null | |
| 1010 | + }, | |
| 1011 | + { | |
| 1012 | + "tab": "graded", | |
| 1013 | + "date": "2025-12-02", | |
| 1014 | + "title": "The Legend of Zelda: Ocarina of Time - Wata 8.0 A+ Sealed [Standard Release], N64 Nintendo 1998 USA....", | |
| 1015 | + "price": 1000, | |
| 1016 | + "ebayId": null, | |
| 1017 | + "listedPrice": null | |
| 1018 | + }, | |
| 1019 | + { | |
| 1020 | + "tab": "graded", | |
| 1021 | + "date": "2025-12-02", | |
| 1022 | + "title": "The Legend of Zelda: Ocarina of Time - Wata 9.2 A+ Sealed [Standard Release], N64 Nintendo 1998 USA....", | |
| 1023 | + "price": 2750, | |
| 1024 | + "ebayId": null, | |
| 1025 | + "listedPrice": null | |
| 1026 | + }, | |
| 1027 | + { | |
| 1028 | + "tab": "box-only", | |
| 1029 | + "date": "2026-08-31", | |
| 1030 | + "title": "Legend Of Zelda Ocarina Of Time Nintendo 64 N64 Authentic Box Only No Game 1998", | |
| 1031 | + "price": 103.5, | |
| 1032 | + "ebayId": "168639701374", | |
| 1033 | + "listedPrice": null | |
| 1034 | + }, | |
| 1035 | + { | |
| 1036 | + "tab": "box-only", | |
| 1037 | + "date": "2026-08-23", | |
| 1038 | + "title": "Nintendo Nintendo 64 Cartridge Case Box - Zelda Ocarina of Time", | |
| 1039 | + "price": 71.02, | |
| 1040 | + "ebayId": "206496089101", | |
| 1041 | + "listedPrice": null | |
| 1042 | + }, | |
| 1043 | + { | |
| 1044 | + "tab": "box-only", | |
| 1045 | + "date": "2026-07-13", | |
| 1046 | + "title": "Legend of Zelda Ocarina of Time N64 Original Box ONLY Nintendo 64", | |
| 1047 | + "price": 99.99, | |
| 1048 | + "ebayId": "287435909125", | |
| 1049 | + "listedPrice": null | |
| 1050 | + }, | |
| 1051 | + { | |
| 1052 | + "tab": "box-only", | |
| 1053 | + "date": "2026-07-13", | |
| 1054 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) BOX Only", | |
| 1055 | + "price": 41, | |
| 1056 | + "ebayId": "178282821900", | |
| 1057 | + "listedPrice": null | |
| 1058 | + }, | |
| 1059 | + { | |
| 1060 | + "tab": "box-only", | |
| 1061 | + "date": "2026-07-09", | |
| 1062 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) ~~~BOX ONLY~~~", | |
| 1063 | + "price": 39.95, | |
| 1064 | + "ebayId": "178297122263", | |
| 1065 | + "listedPrice": null | |
| 1066 | + }, | |
| 1067 | + { | |
| 1068 | + "tab": "box-only", | |
| 1069 | + "date": "2026-07-05", | |
| 1070 | + "title": "Nintendo 64 N64 The Legend Of Zelda Ocarina Of Time BOX ONLY *FREE SHIPPING*", | |
| 1071 | + "price": 65, | |
| 1072 | + "ebayId": "147403013297", | |
| 1073 | + "listedPrice": null | |
| 1074 | + }, | |
| 1075 | + { | |
| 1076 | + "tab": "box-only", | |
| 1077 | + "date": "2026-06-14", | |
| 1078 | + "title": "Legend Of Zelda Ocarina Of Time Nintendo 64 N64 Authentic Box Only No Game 1998", | |
| 1079 | + "price": 79.99, | |
| 1080 | + "ebayId": "358672640555", | |
| 1081 | + "listedPrice": null | |
| 1082 | + }, | |
| 1083 | + { | |
| 1084 | + "tab": "box-only", | |
| 1085 | + "date": "2026-06-11", | |
| 1086 | + "title": "The Legend of Zelda Ocarina of Time OOT Nintendo 64 N64 BOX ONLY", | |
| 1087 | + "price": 29.99, | |
| 1088 | + "ebayId": "227383904665", | |
| 1089 | + "listedPrice": null | |
| 1090 | + }, | |
| 1091 | + { | |
| 1092 | + "tab": "box-only", | |
| 1093 | + "date": "2026-06-10", | |
| 1094 | + "title": "The Legend of Zelda Ocarina of Time Box EMPTY Box & Manual For Nintendo 64", | |
| 1095 | + "price": 98.99, | |
| 1096 | + "ebayId": "178198148928", | |
| 1097 | + "listedPrice": null | |
| 1098 | + }, | |
| 1099 | + { | |
| 1100 | + "tab": "box-only", | |
| 1101 | + "date": "2026-06-09", | |
| 1102 | + "title": "The Legend of Zelda Ocarina of Time Box + Inserts - Nintendo 64 N64 **SEE DESC**", | |
| 1103 | + "price": 114.95, | |
| 1104 | + "ebayId": "336458620387", | |
| 1105 | + "listedPrice": null | |
| 1106 | + }, | |
| 1107 | + { | |
| 1108 | + "tab": "box-only", | |
| 1109 | + "date": "2026-06-01", | |
| 1110 | + "title": "Legend Of Zelda Ocarina Of Time Nintendo 64 N64 Authentic Box Only No Game 1998", | |
| 1111 | + "price": 89.99, | |
| 1112 | + "ebayId": "358529841974", | |
| 1113 | + "listedPrice": null | |
| 1114 | + }, | |
| 1115 | + { | |
| 1116 | + "tab": "box-only", | |
| 1117 | + "date": "2026-05-27", | |
| 1118 | + "title": "The Legend Of Zelda Ocarina Of Time N64 Gold Box Box Only)", | |
| 1119 | + "price": 90.99, | |
| 1120 | + "ebayId": "318366650445", | |
| 1121 | + "listedPrice": null | |
| 1122 | + }, | |
| 1123 | + { | |
| 1124 | + "tab": "box-only", | |
| 1125 | + "date": "2026-05-21", | |
| 1126 | + "title": "The Legend of Zelda: Ocarina of Time N64 Nintendo 64 BOX ONLY! Authentic! Rare!", | |
| 1127 | + "price": 45, | |
| 1128 | + "ebayId": "336582122258", | |
| 1129 | + "listedPrice": null | |
| 1130 | + }, | |
| 1131 | + { | |
| 1132 | + "tab": "box-only", | |
| 1133 | + "date": "2026-05-17", | |
| 1134 | + "title": "Legend of Zelda: Ocarina of Time BOX ONLY N64 Nintendo 64 players choice", | |
| 1135 | + "price": 65.25, | |
| 1136 | + "ebayId": "267671881460", | |
| 1137 | + "listedPrice": null | |
| 1138 | + }, | |
| 1139 | + { | |
| 1140 | + "tab": "box-only", | |
| 1141 | + "date": "2026-05-15", | |
| 1142 | + "title": "N64 Zelda Ocarina Of Time Box Inserts And Manual Only/No Game/ Nintendo 64", | |
| 1143 | + "price": 120.5, | |
| 1144 | + "ebayId": "236805958008", | |
| 1145 | + "listedPrice": null | |
| 1146 | + }, | |
| 1147 | + { | |
| 1148 | + "tab": "box-only", | |
| 1149 | + "date": "2026-05-12", | |
| 1150 | + "title": "The Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) N64 BOX ONLY", | |
| 1151 | + "price": 49.99, | |
| 1152 | + "ebayId": "306930412237", | |
| 1153 | + "listedPrice": null | |
| 1154 | + }, | |
| 1155 | + { | |
| 1156 | + "tab": "box-only", | |
| 1157 | + "date": "2026-05-12", | |
| 1158 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) BOX ONLY", | |
| 1159 | + "price": 50, | |
| 1160 | + "ebayId": "127861290830", | |
| 1161 | + "listedPrice": null | |
| 1162 | + }, | |
| 1163 | + { | |
| 1164 | + "tab": "box-only", | |
| 1165 | + "date": "2026-05-11", | |
| 1166 | + "title": "The Legend of Zelda Ocarina of Time N64 Players Choice_Box & Manual ONLY_No Game", | |
| 1167 | + "price": 39.9, | |
| 1168 | + "ebayId": "267666846000", | |
| 1169 | + "listedPrice": null | |
| 1170 | + }, | |
| 1171 | + { | |
| 1172 | + "tab": "box-only", | |
| 1173 | + "date": "2026-05-07", | |
| 1174 | + "title": "The Legend of Zelda: Ocarina of Time Nintendo 64 Box Only", | |
| 1175 | + "price": 55, | |
| 1176 | + "ebayId": "298296145518", | |
| 1177 | + "listedPrice": null | |
| 1178 | + }, | |
| 1179 | + { | |
| 1180 | + "tab": "box-only", | |
| 1181 | + "date": "2026-05-03", | |
| 1182 | + "title": "Legend Of Zelda Ocarina Of Time Nintendo 64 N64 Authentic Box Only No Game 1998", | |
| 1183 | + "price": 95.99, | |
| 1184 | + "ebayId": "157291814272", | |
| 1185 | + "listedPrice": null | |
| 1186 | + }, | |
| 1187 | + { | |
| 1188 | + "tab": "box-only", | |
| 1189 | + "date": "2026-04-23", | |
| 1190 | + "title": "Legend of Zelda: Ocarina of Time BOX ONLY N64 Nintendo 64 players choice", | |
| 1191 | + "price": 40, | |
| 1192 | + "ebayId": "147267560963", | |
| 1193 | + "listedPrice": null | |
| 1194 | + }, | |
| 1195 | + { | |
| 1196 | + "tab": "box-only", | |
| 1197 | + "date": "2026-04-19", | |
| 1198 | + "title": "Legend of Zelda: Ocarina of Time BOX ONLY N64 Nintendo 64 players choice", | |
| 1199 | + "price": 64, | |
| 1200 | + "ebayId": "267637007014", | |
| 1201 | + "listedPrice": null | |
| 1202 | + }, | |
| 1203 | + { | |
| 1204 | + "tab": "box-only", | |
| 1205 | + "date": "2026-04-14", | |
| 1206 | + "title": "Nintendo The Legend of Zelda: Ocarina of Time Nintendo 64 Original Game Box", | |
| 1207 | + "price": 51, | |
| 1208 | + "ebayId": "358420736099", | |
| 1209 | + "listedPrice": null | |
| 1210 | + }, | |
| 1211 | + { | |
| 1212 | + "tab": "box-only", | |
| 1213 | + "date": "2026-03-30", | |
| 1214 | + "title": "Legend Of Zelda Ocarina Of Time Nintendo 64 N64 Authentic Box Only No Game 1998", | |
| 1215 | + "price": 40, | |
| 1216 | + "ebayId": "157788938575", | |
| 1217 | + "listedPrice": null | |
| 1218 | + }, | |
| 1219 | + { | |
| 1220 | + "tab": "box-only", | |
| 1221 | + "date": "2026-03-29", | |
| 1222 | + "title": "Legend Of Zelda Ocarina Of Time Nintendo 64 N64 BOX ONLY NO GAME", | |
| 1223 | + "price": 25, | |
| 1224 | + "ebayId": "206176173131", | |
| 1225 | + "listedPrice": null | |
| 1226 | + }, | |
| 1227 | + { | |
| 1228 | + "tab": "box-only", | |
| 1229 | + "date": "2026-03-21", | |
| 1230 | + "title": "Legend of Zelda Ocarina of Time (Nintendo 64 N64) Box Only, No Cartridge", | |
| 1231 | + "price": 152.5, | |
| 1232 | + "ebayId": "377024714017", | |
| 1233 | + "listedPrice": null | |
| 1234 | + }, | |
| 1235 | + { | |
| 1236 | + "tab": "box-only", | |
| 1237 | + "date": "2026-02-21", | |
| 1238 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) BOX ONLY!!", | |
| 1239 | + "price": 40, | |
| 1240 | + "ebayId": "177809738280", | |
| 1241 | + "listedPrice": null | |
| 1242 | + }, | |
| 1243 | + { | |
| 1244 | + "tab": "box-only", | |
| 1245 | + "date": "2026-02-20", | |
| 1246 | + "title": "Legend of Zelda Ocarina of Time (Nintendo 64 N64) Inserts & Box Only No Game", | |
| 1247 | + "price": 199.99, | |
| 1248 | + "ebayId": "389555316102", | |
| 1249 | + "listedPrice": null | |
| 1250 | + }, | |
| 1251 | + { | |
| 1252 | + "tab": "box-only", | |
| 1253 | + "date": "2026-02-09", | |
| 1254 | + "title": "Legend of Zelda: Ocarina of Time - Nintendo 64 -1998 - Box Only", | |
| 1255 | + "price": 40, | |
| 1256 | + "ebayId": "397588936248", | |
| 1257 | + "listedPrice": null | |
| 1258 | + }, | |
| 1259 | + { | |
| 1260 | + "tab": "box-only", | |
| 1261 | + "date": "2026-02-01", | |
| 1262 | + "title": "N64 The Legend of Zelda Ocarina of Time **BOX ONLY w Inner Tray** NO GAME", | |
| 1263 | + "price": 74.95, | |
| 1264 | + "ebayId": "136254005187", | |
| 1265 | + "listedPrice": null | |
| 1266 | + }, | |
| 1267 | + { | |
| 1268 | + "tab": "manual-only", | |
| 1269 | + "date": "2026-07-22", | |
| 1270 | + "title": "N64 The Legend of Zelda Ocarina of Time Instruction Booklet Nintendo 64 Manual", | |
| 1271 | + "price": 6.01, | |
| 1272 | + "ebayId": "358800667726", | |
| 1273 | + "listedPrice": null | |
| 1274 | + }, | |
| 1275 | + { | |
| 1276 | + "tab": "manual-only", | |
| 1277 | + "date": "2026-07-22", | |
| 1278 | + "title": "Nintendo 64 N64 The Legend of Zelda: Ocarina of Time Manual Booklet Only", | |
| 1279 | + "price": 19.99, | |
| 1280 | + "ebayId": "227441019166", | |
| 1281 | + "listedPrice": null | |
| 1282 | + }, | |
| 1283 | + { | |
| 1284 | + "tab": "manual-only", | |
| 1285 | + "date": "2026-07-17", | |
| 1286 | + "title": "Nintendo 64 N64 The Legend of Zelda: Ocarina of Time Manual Booklet Only", | |
| 1287 | + "price": 16.15, | |
| 1288 | + "ebayId": "287463505258", | |
| 1289 | + "listedPrice": null | |
| 1290 | + }, | |
| 1291 | + { | |
| 1292 | + "tab": "manual-only", | |
| 1293 | + "date": "2026-07-11", | |
| 1294 | + "title": "Legend of Zelda Ocarina of Time (Nintendo 64 N64)Instruction Manual booklet Only", | |
| 1295 | + "price": 12.88, | |
| 1296 | + "ebayId": "168421628543", | |
| 1297 | + "listedPrice": null | |
| 1298 | + }, | |
| 1299 | + { | |
| 1300 | + "tab": "manual-only", | |
| 1301 | + "date": "2026-07-09", | |
| 1302 | + "title": "The Legend of Zelda: Ocarina of Time Manual- Booklet Nintendo 64 N64 - VERY GOOD", | |
| 1303 | + "price": 35.6, | |
| 1304 | + "ebayId": "127922631477", | |
| 1305 | + "listedPrice": null | |
| 1306 | + }, | |
| 1307 | + { | |
| 1308 | + "tab": "manual-only", | |
| 1309 | + "date": "2026-07-02", | |
| 1310 | + "title": "The Legend of Zelda Ocarina of Time Nintendo 64 N64 Instruction Booklet Manual", | |
| 1311 | + "price": 7.31, | |
| 1312 | + "ebayId": "158024102815", | |
| 1313 | + "listedPrice": null | |
| 1314 | + }, | |
| 1315 | + { | |
| 1316 | + "tab": "manual-only", | |
| 1317 | + "date": "2026-06-22", | |
| 1318 | + "title": "Nintendo 64 N64 The Legend of Zelda: Ocarina of Time Manual Booklet Only", | |
| 1319 | + "price": 19.95, | |
| 1320 | + "ebayId": "327047624159", | |
| 1321 | + "listedPrice": null | |
| 1322 | + }, | |
| 1323 | + { | |
| 1324 | + "tab": "manual-only", | |
| 1325 | + "date": "2026-06-14", | |
| 1326 | + "title": "Nintendo 64 N64 The Legend of Zelda: Ocarina of Time Manual Booklet Only", | |
| 1327 | + "price": 20.85, | |
| 1328 | + "ebayId": "406994671288", | |
| 1329 | + "listedPrice": null | |
| 1330 | + }, | |
| 1331 | + { | |
| 1332 | + "tab": "manual-only", | |
| 1333 | + "date": "2026-06-12", | |
| 1334 | + "title": "The Legend of Zelda: Ocarina of Time Manual- Booklet Nintendo 64 N64", | |
| 1335 | + "price": 41, | |
| 1336 | + "ebayId": "257543147753", | |
| 1337 | + "listedPrice": null | |
| 1338 | + }, | |
| 1339 | + { | |
| 1340 | + "tab": "manual-only", | |
| 1341 | + "date": "2026-06-01", | |
| 1342 | + "title": "Zelda Ocarina of Time Nintendo 64 N64 Instruction Manual Booklet Only Clean Page", | |
| 1343 | + "price": 24.99, | |
| 1344 | + "ebayId": "198244681329", | |
| 1345 | + "listedPrice": null | |
| 1346 | + }, | |
| 1347 | + { | |
| 1348 | + "tab": "manual-only", | |
| 1349 | + "date": "2026-05-31", | |
| 1350 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Manual Instruction Booklet ONLY", | |
| 1351 | + "price": 39.99, | |
| 1352 | + "ebayId": "800000830335", | |
| 1353 | + "listedPrice": null | |
| 1354 | + }, | |
| 1355 | + { | |
| 1356 | + "tab": "manual-only", | |
| 1357 | + "date": "2026-05-25", | |
| 1358 | + "title": "Nintendo 64 N64 the Legend of Zelda: Ocarina of Time Instruction Manual Booklet", | |
| 1359 | + "price": 12.99, | |
| 1360 | + "ebayId": "136983049554", | |
| 1361 | + "listedPrice": null | |
| 1362 | + }, | |
| 1363 | + { | |
| 1364 | + "tab": "manual-only", | |
| 1365 | + "date": "2026-05-18", | |
| 1366 | + "title": "Legend of Zelda Ocarina of Time (Nintendo 64 N64) Instruction Manual booklet", | |
| 1367 | + "price": 19.99, | |
| 1368 | + "ebayId": "327155011997", | |
| 1369 | + "listedPrice": null | |
| 1370 | + }, | |
| 1371 | + { | |
| 1372 | + "tab": "manual-only", | |
| 1373 | + "date": "2026-05-15", | |
| 1374 | + "title": "Legend of Zelda Ocarina of Time (Nintendo 64 N64)Instruction Manual booklet Only", | |
| 1375 | + "price": 9.99, | |
| 1376 | + "ebayId": "168368995903", | |
| 1377 | + "listedPrice": null | |
| 1378 | + }, | |
| 1379 | + { | |
| 1380 | + "tab": "manual-only", | |
| 1381 | + "date": "2026-05-07", | |
| 1382 | + "title": "Legend of Zelda Ocarina of Time (Nintendo 64 N64)Instruction Manual booklet Only", | |
| 1383 | + "price": 17.99, | |
| 1384 | + "ebayId": "306918273129", | |
| 1385 | + "listedPrice": null | |
| 1386 | + }, | |
| 1387 | + { | |
| 1388 | + "tab": "manual-only", | |
| 1389 | + "date": "2026-05-07", | |
| 1390 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Manual Instruction Booklet ONLY", | |
| 1391 | + "price": 15.99, | |
| 1392 | + "ebayId": "168327860125", | |
| 1393 | + "listedPrice": null | |
| 1394 | + }, | |
| 1395 | + { | |
| 1396 | + "tab": "manual-only", | |
| 1397 | + "date": "2026-04-24", | |
| 1398 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Instruction Booklet Manual Only", | |
| 1399 | + "price": 8.5, | |
| 1400 | + "ebayId": "366353151361", | |
| 1401 | + "listedPrice": null | |
| 1402 | + }, | |
| 1403 | + { | |
| 1404 | + "tab": "manual-only", | |
| 1405 | + "date": "2026-04-21", | |
| 1406 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Manual Instruction Booklet ONLY", | |
| 1407 | + "price": 15.95, | |
| 1408 | + "ebayId": "188277501986", | |
| 1409 | + "listedPrice": null | |
| 1410 | + }, | |
| 1411 | + { | |
| 1412 | + "tab": "manual-only", | |
| 1413 | + "date": "2026-04-19", | |
| 1414 | + "title": "The Legend of Zelda Ocarina of Time Nintendo 64 N64 Prima Song Sheet", | |
| 1415 | + "price": 16.14, | |
| 1416 | + "ebayId": "157147264256", | |
| 1417 | + "listedPrice": null | |
| 1418 | + }, | |
| 1419 | + { | |
| 1420 | + "tab": "manual-only", | |
| 1421 | + "date": "2026-03-21", | |
| 1422 | + "title": "Nintendo 64 N64 The Legend of Zelda: Ocarina of Time Manual Booklet Only", | |
| 1423 | + "price": 12.5, | |
| 1424 | + "ebayId": "206138701226", | |
| 1425 | + "listedPrice": null | |
| 1426 | + }, | |
| 1427 | + { | |
| 1428 | + "tab": "manual-only", | |
| 1429 | + "date": "2026-03-19", | |
| 1430 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Instruction Booklet Manual Only", | |
| 1431 | + "price": 22.99, | |
| 1432 | + "ebayId": "376994045360", | |
| 1433 | + "listedPrice": null | |
| 1434 | + }, | |
| 1435 | + { | |
| 1436 | + "tab": "manual-only", | |
| 1437 | + "date": "2026-03-15", | |
| 1438 | + "title": "The Legend Of Zelda Ocarina Of Time Instruction Manual Only N64 Nintendo 64", | |
| 1439 | + "price": 19.95, | |
| 1440 | + "ebayId": "197932220794", | |
| 1441 | + "listedPrice": null | |
| 1442 | + }, | |
| 1443 | + { | |
| 1444 | + "tab": "manual-only", | |
| 1445 | + "date": "2026-03-08", | |
| 1446 | + "title": "Nintendo Legend of Zelda Ocarina of Time Manual & Inserts Nintendo 64 Original", | |
| 1447 | + "price": 16.01, | |
| 1448 | + "ebayId": "358271510282", | |
| 1449 | + "listedPrice": null | |
| 1450 | + }, | |
| 1451 | + { | |
| 1452 | + "tab": "manual-only", | |
| 1453 | + "date": "2026-03-06", | |
| 1454 | + "title": "Nintendo 64 The Legend of Zelda: Ocarina of Time Instruction Manual Booklet", | |
| 1455 | + "price": 14.99, | |
| 1456 | + "ebayId": "298042153422", | |
| 1457 | + "listedPrice": null | |
| 1458 | + }, | |
| 1459 | + { | |
| 1460 | + "tab": "manual-only", | |
| 1461 | + "date": "2026-03-05", | |
| 1462 | + "title": "The Legend Of Zelda Ocarina Of Time Instruction Booklet Manual Only N64 Nintendo", | |
| 1463 | + "price": 14.99, | |
| 1464 | + "ebayId": "257389943433", | |
| 1465 | + "listedPrice": null | |
| 1466 | + }, | |
| 1467 | + { | |
| 1468 | + "tab": "manual-only", | |
| 1469 | + "date": "2026-03-04", | |
| 1470 | + "title": "The Legend Of Zelda Ocarina Of Time Instruction Manual Only N64 Nintendo 64", | |
| 1471 | + "price": 21.99, | |
| 1472 | + "ebayId": "157721575685", | |
| 1473 | + "listedPrice": null | |
| 1474 | + }, | |
| 1475 | + { | |
| 1476 | + "tab": "manual-only", | |
| 1477 | + "date": "2026-03-03", | |
| 1478 | + "title": "The Legend Of Zelda: Ocarina Of Time (1998) - Nintendo N64 - MANUAL ONLY", | |
| 1479 | + "price": 9.99, | |
| 1480 | + "ebayId": "326864528931", | |
| 1481 | + "listedPrice": null | |
| 1482 | + }, | |
| 1483 | + { | |
| 1484 | + "tab": "manual-only", | |
| 1485 | + "date": "2026-02-24", | |
| 1486 | + "title": "The Legend Of Zelda Ocarina Of Time Instruction Booklet Manual Only N64 Nintendo", | |
| 1487 | + "price": 9.95, | |
| 1488 | + "ebayId": "358204928350", | |
| 1489 | + "listedPrice": null | |
| 1490 | + }, | |
| 1491 | + { | |
| 1492 | + "tab": "manual-only", | |
| 1493 | + "date": "2026-02-23", | |
| 1494 | + "title": "The Legend of Zelda: Ocarina of Time, Nintendo 64, Manual Only!", | |
| 1495 | + "price": 14.59, | |
| 1496 | + "ebayId": "357795853411", | |
| 1497 | + "listedPrice": null | |
| 1498 | + }, | |
| 1499 | + { | |
| 1500 | + "tab": "manual-only", | |
| 1501 | + "date": "2026-02-19", | |
| 1502 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Instruction Booklet Manual Only", | |
| 1503 | + "price": 18.99, | |
| 1504 | + "ebayId": "236636369122", | |
| 1505 | + "listedPrice": null | |
| 1506 | + }, | |
| 1507 | + { | |
| 1508 | + "tab": "grade-three", | |
| 1509 | + "date": "2026-08-26", | |
| 1510 | + "title": "The Legend of Zelda Ocarina of Time N64 PSA 8.5 CIB", | |
| 1511 | + "price": 850, | |
| 1512 | + "ebayId": "820032216965", | |
| 1513 | + "listedPrice": null | |
| 1514 | + }, | |
| 1515 | + { | |
| 1516 | + "tab": "grade-three", | |
| 1517 | + "date": "2026-07-10", | |
| 1518 | + "title": "Zelda Ocarina of Time (Rev. A 00A, CGC Graded 9.0!!!) Nintendo 64 N64 not WATA", | |
| 1519 | + "price": 299, | |
| 1520 | + "ebayId": "389774280630", | |
| 1521 | + "listedPrice": null | |
| 1522 | + }, | |
| 1523 | + { | |
| 1524 | + "tab": "grade-three", | |
| 1525 | + "date": "2026-07-09", | |
| 1526 | + "title": "ZELDA OCARINA OF TIME 64 Nintendo N64 Graded WATA PSA 7.0 CIB Complete Box 1998!", | |
| 1527 | + "price": 549.99, | |
| 1528 | + "ebayId": "336669923761", | |
| 1529 | + "listedPrice": null | |
| 1530 | + }, | |
| 1531 | + { | |
| 1532 | + "tab": "grade-three", | |
| 1533 | + "date": "2026-07-07", | |
| 1534 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) PSA 8.5. Box 9.0 CIB+", | |
| 1535 | + "price": 699.99, | |
| 1536 | + "ebayId": "227419707576", | |
| 1537 | + "listedPrice": null | |
| 1538 | + }, | |
| 1539 | + { | |
| 1540 | + "tab": "grade-three", | |
| 1541 | + "date": "2026-07-06", | |
| 1542 | + "title": "Legend Of Zelda Ocarina Of Time N64 Graded Complete In Box PSA 8.0 CIB Graded", | |
| 1543 | + "price": 441, | |
| 1544 | + "ebayId": "800258124182", | |
| 1545 | + "listedPrice": null | |
| 1546 | + }, | |
| 1547 | + { | |
| 1548 | + "tab": "grade-three", | |
| 1549 | + "date": "2026-07-03", | |
| 1550 | + "title": "ZELDA OCARINA OF TIME Nintendo N64 Graded WATA PSA 8.5 CIB Box 1998 9.2 CART!", | |
| 1551 | + "price": 699.99, | |
| 1552 | + "ebayId": "336668283769", | |
| 1553 | + "listedPrice": null | |
| 1554 | + }, | |
| 1555 | + { | |
| 1556 | + "tab": "grade-three", | |
| 1557 | + "date": "2026-06-29", | |
| 1558 | + "title": "Zelda Ocarina of Time WATA 9.2 CIB Nintendo N64 Collector's Edition CE", | |
| 1559 | + "price": 2750, | |
| 1560 | + "ebayId": "327237612232", | |
| 1561 | + "listedPrice": null | |
| 1562 | + }, | |
| 1563 | + { | |
| 1564 | + "tab": "grade-three", | |
| 1565 | + "date": "2026-06-29", | |
| 1566 | + "title": "Zelda Ocarina of Time WATA 9.2 CIB Nintendo N64 Collector's Edition CE", | |
| 1567 | + "price": 2750, | |
| 1568 | + "ebayId": "326369195938", | |
| 1569 | + "listedPrice": null | |
| 1570 | + }, | |
| 1571 | + { | |
| 1572 | + "tab": "grade-three", | |
| 1573 | + "date": "2026-06-29", | |
| 1574 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Collectors CIB Complete CGC 9.2", | |
| 1575 | + "price": 1275, | |
| 1576 | + "ebayId": "158008000482", | |
| 1577 | + "listedPrice": null | |
| 1578 | + }, | |
| 1579 | + { | |
| 1580 | + "tab": "grade-three", | |
| 1581 | + "date": "2026-06-22", | |
| 1582 | + "title": "Legend Zelda Ocarina Time Nintendo 64 N64 Collectors Ed CIB Complete CGC 9.0", | |
| 1583 | + "price": 1225, | |
| 1584 | + "ebayId": "157985709760", | |
| 1585 | + "listedPrice": null | |
| 1586 | + }, | |
| 1587 | + { | |
| 1588 | + "tab": "grade-three", | |
| 1589 | + "date": "2026-06-16", | |
| 1590 | + "title": "Legend Of Zelda Ocarina Of Time N64 Nintendo 64 Complete In Box PSA 8.0", | |
| 1591 | + "price": 499.99, | |
| 1592 | + "ebayId": "377260640780", | |
| 1593 | + "listedPrice": null | |
| 1594 | + }, | |
| 1595 | + { | |
| 1596 | + "tab": "grade-three", | |
| 1597 | + "date": "2026-06-12", | |
| 1598 | + "title": "Legend Of Zelda Ocarina Of Time Nintendo 64 N64 Game Complete In Box PSA 8.0", | |
| 1599 | + "price": 549.99, | |
| 1600 | + "ebayId": "306994816302", | |
| 1601 | + "listedPrice": null | |
| 1602 | + }, | |
| 1603 | + { | |
| 1604 | + "tab": "grade-three", | |
| 1605 | + "date": "2026-06-10", | |
| 1606 | + "title": "ZELDA OCARINA OF TIME Nintendo N64 Graded WATA PSA 8.5 CIB Box 1998 9.0 Manual!", | |
| 1607 | + "price": 689.99, | |
| 1608 | + "ebayId": "336626383895", | |
| 1609 | + "listedPrice": null | |
| 1610 | + }, | |
| 1611 | + { | |
| 1612 | + "tab": "grade-three", | |
| 1613 | + "date": "2026-06-10", | |
| 1614 | + "title": "Zelda Ocarina of Time (1st Print Rev. 0, CGC 7.0 CIB) Nintendo N64 not WATA PSA", | |
| 1615 | + "price": 749, | |
| 1616 | + "ebayId": "389989391866", | |
| 1617 | + "listedPrice": null | |
| 1618 | + }, | |
| 1619 | + { | |
| 1620 | + "tab": "grade-three", | |
| 1621 | + "date": "2026-06-09", | |
| 1622 | + "title": "ZELDA OCARINA OF TIME Nintendo 64 N64 Graded WATA PSA 7.5 CIB Complete Box 1998", | |
| 1623 | + "price": 449.99, | |
| 1624 | + "ebayId": "336609380997", | |
| 1625 | + "listedPrice": null | |
| 1626 | + }, | |
| 1627 | + { | |
| 1628 | + "tab": "grade-three", | |
| 1629 | + "date": "2026-05-14", | |
| 1630 | + "title": "The Legend of Zelda: Ocarina of Time - Wata 9.0 CIB [Standard Release], N64 Nintendo 1998 USA....", | |
| 1631 | + "price": 575, | |
| 1632 | + "ebayId": null, | |
| 1633 | + "listedPrice": null | |
| 1634 | + }, | |
| 1635 | + { | |
| 1636 | + "tab": "grade-three", | |
| 1637 | + "date": "2026-04-21", | |
| 1638 | + "title": "ZELDA OCARINA OF TIME Nintendo N64 Graded WATA PSA 8.5 CIB Box 1998 9.0 Cart!", | |
| 1639 | + "price": 649.99, | |
| 1640 | + "ebayId": "336538827443", | |
| 1641 | + "listedPrice": null | |
| 1642 | + }, | |
| 1643 | + { | |
| 1644 | + "tab": "grade-three", | |
| 1645 | + "date": "2026-03-30", | |
| 1646 | + "title": "Legend Zelda Ocarina Time Nintendo 64 N64 CIB Complete PSA 8.5 Graded Not WATA", | |
| 1647 | + "price": 749, | |
| 1648 | + "ebayId": "157760555709", | |
| 1649 | + "listedPrice": null | |
| 1650 | + }, | |
| 1651 | + { | |
| 1652 | + "tab": "grade-three", | |
| 1653 | + "date": "2026-03-28", | |
| 1654 | + "title": "Nintendo 64 N64 Zelda Ocarina Of Time CIB Graded 8.5 CGC", | |
| 1655 | + "price": 611.81, | |
| 1656 | + "ebayId": "168209139826", | |
| 1657 | + "listedPrice": null | |
| 1658 | + }, | |
| 1659 | + { | |
| 1660 | + "tab": "grade-three", | |
| 1661 | + "date": "2026-03-16", | |
| 1662 | + "title": "The Legend of Zelda: Ocarina of Time - CGC 8.0 CIB [Standard Release], N64 Nintendo 1998 USA....", | |
| 1663 | + "price": 450, | |
| 1664 | + "ebayId": null, | |
| 1665 | + "listedPrice": null | |
| 1666 | + }, | |
| 1667 | + { | |
| 1668 | + "tab": "grade-three", | |
| 1669 | + "date": "2026-03-07", | |
| 1670 | + "title": "The Legend of Zelda Ocarina of Time N64 CIB PSA 9.2 w/ 9.2 Box and Manual!", | |
| 1671 | + "price": 1299.99, | |
| 1672 | + "ebayId": "127721490382", | |
| 1673 | + "listedPrice": null | |
| 1674 | + }, | |
| 1675 | + { | |
| 1676 | + "tab": "grade-three", | |
| 1677 | + "date": "2026-02-16", | |
| 1678 | + "title": "Zelda Ocarina Of Time N64 CIB WATA Graded 8.0", | |
| 1679 | + "price": 381, | |
| 1680 | + "ebayId": "236626951080", | |
| 1681 | + "listedPrice": null | |
| 1682 | + }, | |
| 1683 | + { | |
| 1684 | + "tab": "grade-three", | |
| 1685 | + "date": "2026-02-02", | |
| 1686 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 CGC 7.5 Graded N64 CIB Not WATA PSA", | |
| 1687 | + "price": 76, | |
| 1688 | + "ebayId": "277673906058", | |
| 1689 | + "listedPrice": null | |
| 1690 | + }, | |
| 1691 | + { | |
| 1692 | + "tab": "grade-three", | |
| 1693 | + "date": "2026-01-21", | |
| 1694 | + "title": "CGC Graded 7.5 CIB Complete Legend of Zelda: Ocarina of Time Nintendo 64 N64", | |
| 1695 | + "price": 279.99, | |
| 1696 | + "ebayId": "187956538521", | |
| 1697 | + "listedPrice": null | |
| 1698 | + }, | |
| 1699 | + { | |
| 1700 | + "tab": "grade-three", | |
| 1701 | + "date": "2025-12-22", | |
| 1702 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 Unopened New VGA 85 NM+ Graded", | |
| 1703 | + "price": 586, | |
| 1704 | + "ebayId": "157531130738", | |
| 1705 | + "listedPrice": null | |
| 1706 | + }, | |
| 1707 | + { | |
| 1708 | + "tab": "grade-three", | |
| 1709 | + "date": "2025-12-12", | |
| 1710 | + "title": "Legend of Zelda: Ocarina of Time (Nintendo 64, 1998) 100% CIB - CGC Graded 8.0", | |
| 1711 | + "price": 750, | |
| 1712 | + "ebayId": "397338149503", | |
| 1713 | + "listedPrice": null | |
| 1714 | + }, | |
| 1715 | + { | |
| 1716 | + "tab": "grade-three", | |
| 1717 | + "date": "2025-12-01", | |
| 1718 | + "title": "ZELDA OCARINA OF TIME Graded WATA PSA 7.5 CIB Nintendo 64 N64 1996 Graded RARE!", | |
| 1719 | + "price": 499.99, | |
| 1720 | + "ebayId": "336316196607", | |
| 1721 | + "listedPrice": null | |
| 1722 | + }, | |
| 1723 | + { | |
| 1724 | + "tab": "grade-three", | |
| 1725 | + "date": "2025-12-01", | |
| 1726 | + "title": "Legend of Zelda Ocarina of Time Nintendo 64 N64 CIB Complete WATA 8.0 Graded", | |
| 1727 | + "price": 640, | |
| 1728 | + "ebayId": "157474507906", | |
| 1729 | + "listedPrice": null | |
| 1730 | + }, | |
| 1731 | + { | |
| 1732 | + "tab": "grade-three", | |
| 1733 | + "date": "2025-11-26", | |
| 1734 | + "title": "ZELDA OCARINA OF TIME Graded WATA PSA 8.5 CIB Nintendo 64 N64 1996 Graded RARE!", | |
| 1735 | + "price": 599.99, | |
| 1736 | + "ebayId": "336305257886", | |
| 1737 | + "listedPrice": null | |
| 1738 | + }, | |
| 1739 | + { | |
| 1740 | + "tab": "grade-three", | |
| 1741 | + "date": "2025-11-24", | |
| 1742 | + "title": "ZELDA OCARINA OF TIME Graded WATA 8.0 Nintendo 64 N64 - 8.5 Box & 9.2 Manual!", | |
| 1743 | + "price": 439.99, | |
| 1744 | + "ebayId": "336274735432", | |
| 1745 | + "listedPrice": null | |
| 1746 | + } | |
| 1747 | + ], | |
| 1748 | + "details": { | |
| 1749 | + "Genre": "Action & Adventure", | |
| 1750 | + "Release Date": "November 23, 1998", | |
| 1751 | + "ESRB Rating": "Everyone", | |
| 1752 | + "Publisher": "Nintendo", | |
| 1753 | + "Developer": "Nintendo", | |
| 1754 | + "Model Number": "#NUS-CZLE-USA", | |
| 1755 | + "Player Count": "1 player", | |
| 1756 | + "UPC": "045496870041", | |
| 1757 | + "ASIN (Amazon)": "B00000DMB3", | |
| 1758 | + "ePID (eBay)": "214719169", | |
| 1759 | + "PriceCharting ID": "3977", | |
| 1760 | + "Variants": "collectors edition / players choice / not for resale /", | |
| 1761 | + "Description": "As a young boy, Link is tricked by Ganondorf, the King of the Gerudo Thieves. The evil human uses Link to gain access to the Sacred Realm, where he places his tainted hands on Triforce and transforms the beautiful Hyrulean landscape into a barren wasteland. Link is determined to fix the problems he helped to create, so with the help of Rauru he travels through time gathering the powers of the Seven Sages." | |
| 1762 | + }, | |
| 1763 | + "images": [ | |
| 1764 | + "https://storage.googleapis.com/images.pricecharting.com/bidbex33joqxpepk/240.jpg", | |
| 1765 | + "https://storage.googleapis.com/images.pricecharting.com/09051053534684cffc99b993dbf22e911888d53f17cf796c605a79439012a651/240.jpg", | |
| 1766 | + "https://storage.googleapis.com/images.pricecharting.com/0b294585f8bbc9dffedab6cc066596af53b357a3f8dfa3292088e4dd54b41fe3/240.jpg", | |
| 1767 | + "https://storage.googleapis.com/images.pricecharting.com/68c0df4a8fff640289c1a9d98071bf85e10cb2d0413fe3647d4c8e40defd5dba/240.jpg" | |
| 1768 | + ] | |
| 1769 | + } | |
| 1770 | + }, | |
| 1771 | + "expect": { | |
| 1772 | + "minCount": 1, | |
| 1773 | + "kinds": [ | |
| 1774 | + "catalog_item", | |
| 1775 | + "price_observation", | |
| 1776 | + "sale" | |
| 1777 | + ] | |
| 1778 | + }, | |
| 1779 | + "note": "captured live from https://www.pricecharting.com/game/nintendo-64/zelda-ocarina-of-time", | |
| 1780 | + "capturedAt": "2026-09-07T04:33:24.584Z" | |
| 1781 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/scryfall/black-lotus-alpha.json
+83 −0
@@ -0,0 +1,83 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://scryfall.com/card/lea/232/black-lotus?utm_source=api", | |
| 4 | + "externalId": "b0faa7f2-b547-42c4-a810-839da50dadfe", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:27:44.899Z", | |
| 8 | + "payload": { | |
| 9 | + "card": { | |
| 10 | + "id": "b0faa7f2-b547-42c4-a810-839da50dadfe", | |
| 11 | + "oracle_id": "5089ec1a-f881-4d55-af14-5d996171203b", | |
| 12 | + "name": "Black Lotus", | |
| 13 | + "lang": "en", | |
| 14 | + "released_at": "1993-08-05", | |
| 15 | + "set": "lea", | |
| 16 | + "set_name": "Limited Edition Alpha", | |
| 17 | + "set_type": "core", | |
| 18 | + "collector_number": "232", | |
| 19 | + "rarity": "rare", | |
| 20 | + "layout": "normal", | |
| 21 | + "finishes": [ | |
| 22 | + "nonfoil" | |
| 23 | + ], | |
| 24 | + "promo": false, | |
| 25 | + "reserved": true, | |
| 26 | + "reprint": false, | |
| 27 | + "variation": false, | |
| 28 | + "full_art": false, | |
| 29 | + "border_color": "black", | |
| 30 | + "frame": "1993", | |
| 31 | + "digital": false, | |
| 32 | + "artist": "Christopher Rush", | |
| 33 | + "mana_cost": "{0}", | |
| 34 | + "type_line": "Artifact", | |
| 35 | + "cmc": 0, | |
| 36 | + "colors": [], | |
| 37 | + "tcgplayer_id": 1042, | |
| 38 | + "cardmarket_id": 5465, | |
| 39 | + "mtgo_id": 347, | |
| 40 | + "multiverse_ids": [ | |
| 41 | + 3 | |
| 42 | + ], | |
| 43 | + "scryfall_uri": "https://scryfall.com/card/lea/232/black-lotus?utm_source=api", | |
| 44 | + "image_uris": { | |
| 45 | + "small": "https://cards.scryfall.io/small/front/b/0/b0faa7f2-b547-42c4-a810-839da50dadfe.jpg?1783948669", | |
| 46 | + "normal": "https://cards.scryfall.io/normal/front/b/0/b0faa7f2-b547-42c4-a810-839da50dadfe.jpg?1783948669", | |
| 47 | + "large": "https://cards.scryfall.io/large/front/b/0/b0faa7f2-b547-42c4-a810-839da50dadfe.jpg?1783948669", | |
| 48 | + "png": "https://cards.scryfall.io/png/front/b/0/b0faa7f2-b547-42c4-a810-839da50dadfe.png?1783948669", | |
| 49 | + "art_crop": "https://cards.scryfall.io/art_crop/front/b/0/b0faa7f2-b547-42c4-a810-839da50dadfe.jpg?1783948669", | |
| 50 | + "border_crop": "https://cards.scryfall.io/border_crop/front/b/0/b0faa7f2-b547-42c4-a810-839da50dadfe.jpg?1783948669", | |
| 51 | + "thumb": "https://cards.scryfall.io/thumb/front/b/0/b0faa7f2-b547-42c4-a810-839da50dadfe.webp?1783948669", | |
| 52 | + "grid": "https://cards.scryfall.io/grid/front/b/0/b0faa7f2-b547-42c4-a810-839da50dadfe.webp?1783948669", | |
| 53 | + "display": "https://cards.scryfall.io/display/front/b/0/b0faa7f2-b547-42c4-a810-839da50dadfe.webp?1783948669", | |
| 54 | + "art": "https://cards.scryfall.io/art/front/b/0/b0faa7f2-b547-42c4-a810-839da50dadfe.webp?1783948669", | |
| 55 | + "crop": "https://cards.scryfall.io/crop/front/b/0/b0faa7f2-b547-42c4-a810-839da50dadfe.webp?1783948669" | |
| 56 | + }, | |
| 57 | + "prices": { | |
| 58 | + "usd": null, | |
| 59 | + "usd_foil": null, | |
| 60 | + "usd_etched": null, | |
| 61 | + "eur": "33768.47", | |
| 62 | + "eur_foil": null, | |
| 63 | + "tix": "491.06" | |
| 64 | + } | |
| 65 | + }, | |
| 66 | + "bulkUpdatedAt": "2026-09-06T21:05:43.673+00:00" | |
| 67 | + } | |
| 68 | + }, | |
| 69 | + "expect": { | |
| 70 | + "count": 2, | |
| 71 | + "kinds": [ | |
| 72 | + "catalog_item", | |
| 73 | + "price_observation" | |
| 74 | + ], | |
| 75 | + "requiredFields": [ | |
| 76 | + "attributes.identifiers.scryfall_id", | |
| 77 | + "attributes.setCode", | |
| 78 | + "attributes.number" | |
| 79 | + ] | |
| 80 | + }, | |
| 81 | + "note": "Live capture of https://api.scryfall.com/cards/lea/232; bulkUpdatedAt copied from the bulk-data listing of the same day.", | |
| 82 | + "capturedAt": "2026-09-07T04:27:45.151Z" | |
| 83 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/scryfall/clb-double-faced.json
+89 −0
@@ -0,0 +1,89 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://scryfall.com/card/clb/682/tlincalli-hunter-retrieve-prey?utm_source=api", | |
| 4 | + "externalId": "45b5d677-ff77-47ce-8612-bae70c326e4e", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:27:44.899Z", | |
| 8 | + "payload": { | |
| 9 | + "card": { | |
| 10 | + "id": "45b5d677-ff77-47ce-8612-bae70c326e4e", | |
| 11 | + "oracle_id": "79b69b38-c01d-499a-a865-8c1cecf9fae0", | |
| 12 | + "name": "Tlincalli Hunter // Retrieve Prey", | |
| 13 | + "lang": "en", | |
| 14 | + "released_at": "2022-06-10", | |
| 15 | + "set": "clb", | |
| 16 | + "set_name": "Commander Legends: Battle for Baldur's Gate", | |
| 17 | + "set_type": "draft_innovation", | |
| 18 | + "collector_number": "682", | |
| 19 | + "rarity": "rare", | |
| 20 | + "layout": "adventure", | |
| 21 | + "finishes": [ | |
| 22 | + "nonfoil" | |
| 23 | + ], | |
| 24 | + "promo": false, | |
| 25 | + "reserved": false, | |
| 26 | + "reprint": false, | |
| 27 | + "variation": false, | |
| 28 | + "full_art": false, | |
| 29 | + "border_color": "black", | |
| 30 | + "frame": "2015", | |
| 31 | + "digital": false, | |
| 32 | + "artist": "Helge C. Balzer", | |
| 33 | + "mana_cost": "{5}{G}{G} // {1}{G}", | |
| 34 | + "type_line": "Creature — Scorpion Scout // Sorcery — Adventure", | |
| 35 | + "cmc": 7, | |
| 36 | + "colors": [ | |
| 37 | + "G" | |
| 38 | + ], | |
| 39 | + "tcgplayer_id": 273671, | |
| 40 | + "cardmarket_id": 661382, | |
| 41 | + "mtgo_id": 101460, | |
| 42 | + "multiverse_ids": [ | |
| 43 | + 567247 | |
| 44 | + ], | |
| 45 | + "scryfall_uri": "https://scryfall.com/card/clb/682/tlincalli-hunter-retrieve-prey?utm_source=api", | |
| 46 | + "image_uris": { | |
| 47 | + "small": "https://cards.scryfall.io/small/front/4/5/45b5d677-ff77-47ce-8612-bae70c326e4e.jpg?1783922499", | |
| 48 | + "normal": "https://cards.scryfall.io/normal/front/4/5/45b5d677-ff77-47ce-8612-bae70c326e4e.jpg?1783922499", | |
| 49 | + "large": "https://cards.scryfall.io/large/front/4/5/45b5d677-ff77-47ce-8612-bae70c326e4e.jpg?1783922499", | |
| 50 | + "png": "https://cards.scryfall.io/png/front/4/5/45b5d677-ff77-47ce-8612-bae70c326e4e.png?1783922499", | |
| 51 | + "art_crop": "https://cards.scryfall.io/art_crop/front/4/5/45b5d677-ff77-47ce-8612-bae70c326e4e.jpg?1783922499", | |
| 52 | + "border_crop": "https://cards.scryfall.io/border_crop/front/4/5/45b5d677-ff77-47ce-8612-bae70c326e4e.jpg?1783922499", | |
| 53 | + "thumb": "https://cards.scryfall.io/thumb/front/4/5/45b5d677-ff77-47ce-8612-bae70c326e4e.webp?1783922499", | |
| 54 | + "grid": "https://cards.scryfall.io/grid/front/4/5/45b5d677-ff77-47ce-8612-bae70c326e4e.webp?1783922499", | |
| 55 | + "display": "https://cards.scryfall.io/display/front/4/5/45b5d677-ff77-47ce-8612-bae70c326e4e.webp?1783922499", | |
| 56 | + "art": "https://cards.scryfall.io/art/front/4/5/45b5d677-ff77-47ce-8612-bae70c326e4e.webp?1783922499", | |
| 57 | + "crop": "https://cards.scryfall.io/crop/front/4/5/45b5d677-ff77-47ce-8612-bae70c326e4e.webp?1783922499" | |
| 58 | + }, | |
| 59 | + "card_faces": [ | |
| 60 | + { | |
| 61 | + "name": "Tlincalli Hunter" | |
| 62 | + }, | |
| 63 | + { | |
| 64 | + "name": "Retrieve Prey" | |
| 65 | + } | |
| 66 | + ], | |
| 67 | + "prices": { | |
| 68 | + "usd": "0.80", | |
| 69 | + "usd_foil": null, | |
| 70 | + "usd_etched": null, | |
| 71 | + "eur": "1.03", | |
| 72 | + "eur_foil": null, | |
| 73 | + "tix": "0.24" | |
| 74 | + } | |
| 75 | + }, | |
| 76 | + "bulkUpdatedAt": "2026-09-06T21:05:43.673+00:00" | |
| 77 | + } | |
| 78 | + }, | |
| 79 | + "expect": { | |
| 80 | + "minCount": 2, | |
| 81 | + "requiredFields": [ | |
| 82 | + "attributes.identifiers.scryfall_id", | |
| 83 | + "attributes.setCode", | |
| 84 | + "attributes.number" | |
| 85 | + ] | |
| 86 | + }, | |
| 87 | + "note": "Live capture of https://api.scryfall.com/cards/clb/682; bulkUpdatedAt copied from the bulk-data listing of the same day.", | |
| 88 | + "capturedAt": "2026-09-07T04:27:45.625Z" | |
| 89 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/scryfall/neo-showcase-foil-only.json
+87 −0
@@ -0,0 +1,87 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://scryfall.com/card/neo/430/hidetsugu-devouring-chaos?utm_source=api", | |
| 4 | + "externalId": "c046b0b3-05f0-4468-817f-355e87552faf", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:27:44.899Z", | |
| 8 | + "payload": { | |
| 9 | + "card": { | |
| 10 | + "id": "c046b0b3-05f0-4468-817f-355e87552faf", | |
| 11 | + "oracle_id": "d56f24a1-04dc-4769-9941-05bd99508e40", | |
| 12 | + "name": "Hidetsugu, Devouring Chaos", | |
| 13 | + "lang": "en", | |
| 14 | + "released_at": "2022-02-18", | |
| 15 | + "set": "neo", | |
| 16 | + "set_name": "Kamigawa: Neon Dynasty", | |
| 17 | + "set_type": "expansion", | |
| 18 | + "collector_number": "430", | |
| 19 | + "rarity": "rare", | |
| 20 | + "layout": "normal", | |
| 21 | + "finishes": [ | |
| 22 | + "foil" | |
| 23 | + ], | |
| 24 | + "frame_effects": [ | |
| 25 | + "showcase", | |
| 26 | + "legendary", | |
| 27 | + "inverted" | |
| 28 | + ], | |
| 29 | + "promo_types": [ | |
| 30 | + "neonink", | |
| 31 | + "boosterfun" | |
| 32 | + ], | |
| 33 | + "promo": false, | |
| 34 | + "reserved": false, | |
| 35 | + "reprint": false, | |
| 36 | + "variation": false, | |
| 37 | + "full_art": false, | |
| 38 | + "border_color": "black", | |
| 39 | + "frame": "2015", | |
| 40 | + "digital": false, | |
| 41 | + "artist": "SENNSU", | |
| 42 | + "mana_cost": "{3}{B}", | |
| 43 | + "type_line": "Legendary Creature — Ogre Demon", | |
| 44 | + "cmc": 4, | |
| 45 | + "colors": [ | |
| 46 | + "B" | |
| 47 | + ], | |
| 48 | + "tcgplayer_id": 262489, | |
| 49 | + "cardmarket_id": 605025, | |
| 50 | + "multiverse_ids": [], | |
| 51 | + "scryfall_uri": "https://scryfall.com/card/neo/430/hidetsugu-devouring-chaos?utm_source=api", | |
| 52 | + "image_uris": { | |
| 53 | + "small": "https://cards.scryfall.io/small/front/c/0/c046b0b3-05f0-4468-817f-355e87552faf.jpg?1783923754", | |
| 54 | + "normal": "https://cards.scryfall.io/normal/front/c/0/c046b0b3-05f0-4468-817f-355e87552faf.jpg?1783923754", | |
| 55 | + "large": "https://cards.scryfall.io/large/front/c/0/c046b0b3-05f0-4468-817f-355e87552faf.jpg?1783923754", | |
| 56 | + "png": "https://cards.scryfall.io/png/front/c/0/c046b0b3-05f0-4468-817f-355e87552faf.png?1783923754", | |
| 57 | + "art_crop": "https://cards.scryfall.io/art_crop/front/c/0/c046b0b3-05f0-4468-817f-355e87552faf.jpg?1783923754", | |
| 58 | + "border_crop": "https://cards.scryfall.io/border_crop/front/c/0/c046b0b3-05f0-4468-817f-355e87552faf.jpg?1783923754", | |
| 59 | + "thumb": "https://cards.scryfall.io/thumb/front/c/0/c046b0b3-05f0-4468-817f-355e87552faf.webp?1783923754", | |
| 60 | + "grid": "https://cards.scryfall.io/grid/front/c/0/c046b0b3-05f0-4468-817f-355e87552faf.webp?1783923754", | |
| 61 | + "display": "https://cards.scryfall.io/display/front/c/0/c046b0b3-05f0-4468-817f-355e87552faf.webp?1783923754", | |
| 62 | + "art": "https://cards.scryfall.io/art/front/c/0/c046b0b3-05f0-4468-817f-355e87552faf.webp?1783923754", | |
| 63 | + "crop": "https://cards.scryfall.io/crop/front/c/0/c046b0b3-05f0-4468-817f-355e87552faf.webp?1783923754" | |
| 64 | + }, | |
| 65 | + "prices": { | |
| 66 | + "usd": null, | |
| 67 | + "usd_foil": "93.85", | |
| 68 | + "usd_etched": null, | |
| 69 | + "eur": null, | |
| 70 | + "eur_foil": "63.89", | |
| 71 | + "tix": null | |
| 72 | + } | |
| 73 | + }, | |
| 74 | + "bulkUpdatedAt": "2026-09-06T21:05:43.673+00:00" | |
| 75 | + } | |
| 76 | + }, | |
| 77 | + "expect": { | |
| 78 | + "minCount": 2, | |
| 79 | + "requiredFields": [ | |
| 80 | + "attributes.identifiers.scryfall_id", | |
| 81 | + "attributes.setCode", | |
| 82 | + "attributes.number" | |
| 83 | + ] | |
| 84 | + }, | |
| 85 | + "note": "Live capture of https://api.scryfall.com/cards/neo/430; bulkUpdatedAt copied from the bulk-data listing of the same day.", | |
| 86 | + "capturedAt": "2026-09-07T04:27:45.464Z" | |
| 87 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/scryfall/secret-lair-foil-nonfoil.json
+82 −0
@@ -0,0 +1,82 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://scryfall.com/card/sld/1145/lathliss-dragon-queen?utm_source=api", | |
| 4 | + "externalId": "0f0cdff4-c81e-4e53-8721-748eb71d9e81", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:27:44.899Z", | |
| 8 | + "payload": { | |
| 9 | + "card": { | |
| 10 | + "id": "0f0cdff4-c81e-4e53-8721-748eb71d9e81", | |
| 11 | + "oracle_id": "15fef45d-f1a9-49b2-abaa-fe77bb9d1afd", | |
| 12 | + "name": "Lathliss, Dragon Queen", | |
| 13 | + "lang": "en", | |
| 14 | + "released_at": "2022-11-04", | |
| 15 | + "set": "sld", | |
| 16 | + "set_name": "Secret Lair Drop", | |
| 17 | + "set_type": "box", | |
| 18 | + "collector_number": "1145", | |
| 19 | + "rarity": "rare", | |
| 20 | + "layout": "normal", | |
| 21 | + "finishes": [ | |
| 22 | + "nonfoil", | |
| 23 | + "foil" | |
| 24 | + ], | |
| 25 | + "frame_effects": [ | |
| 26 | + "legendary" | |
| 27 | + ], | |
| 28 | + "promo": false, | |
| 29 | + "reserved": false, | |
| 30 | + "reprint": true, | |
| 31 | + "variation": false, | |
| 32 | + "full_art": false, | |
| 33 | + "border_color": "black", | |
| 34 | + "frame": "2015", | |
| 35 | + "digital": false, | |
| 36 | + "artist": "Tyler Jacobson, age 39", | |
| 37 | + "mana_cost": "{4}{R}{R}", | |
| 38 | + "type_line": "Legendary Creature — Dragon", | |
| 39 | + "cmc": 6, | |
| 40 | + "colors": [ | |
| 41 | + "R" | |
| 42 | + ], | |
| 43 | + "tcgplayer_id": 451241, | |
| 44 | + "cardmarket_id": 685701, | |
| 45 | + "multiverse_ids": [], | |
| 46 | + "scryfall_uri": "https://scryfall.com/card/sld/1145/lathliss-dragon-queen?utm_source=api", | |
| 47 | + "image_uris": { | |
| 48 | + "small": "https://cards.scryfall.io/small/front/0/f/0f0cdff4-c81e-4e53-8721-748eb71d9e81.jpg?1783920209", | |
| 49 | + "normal": "https://cards.scryfall.io/normal/front/0/f/0f0cdff4-c81e-4e53-8721-748eb71d9e81.jpg?1783920209", | |
| 50 | + "large": "https://cards.scryfall.io/large/front/0/f/0f0cdff4-c81e-4e53-8721-748eb71d9e81.jpg?1783920209", | |
| 51 | + "png": "https://cards.scryfall.io/png/front/0/f/0f0cdff4-c81e-4e53-8721-748eb71d9e81.png?1783920209", | |
| 52 | + "art_crop": "https://cards.scryfall.io/art_crop/front/0/f/0f0cdff4-c81e-4e53-8721-748eb71d9e81.jpg?1783920209", | |
| 53 | + "border_crop": "https://cards.scryfall.io/border_crop/front/0/f/0f0cdff4-c81e-4e53-8721-748eb71d9e81.jpg?1783920209", | |
| 54 | + "thumb": "https://cards.scryfall.io/thumb/front/0/f/0f0cdff4-c81e-4e53-8721-748eb71d9e81.webp?1783920209", | |
| 55 | + "grid": "https://cards.scryfall.io/grid/front/0/f/0f0cdff4-c81e-4e53-8721-748eb71d9e81.webp?1783920209", | |
| 56 | + "display": "https://cards.scryfall.io/display/front/0/f/0f0cdff4-c81e-4e53-8721-748eb71d9e81.webp?1783920209", | |
| 57 | + "art": "https://cards.scryfall.io/art/front/0/f/0f0cdff4-c81e-4e53-8721-748eb71d9e81.webp?1783920209", | |
| 58 | + "crop": "https://cards.scryfall.io/crop/front/0/f/0f0cdff4-c81e-4e53-8721-748eb71d9e81.webp?1783920209" | |
| 59 | + }, | |
| 60 | + "prices": { | |
| 61 | + "usd": "6.74", | |
| 62 | + "usd_foil": "7.79", | |
| 63 | + "usd_etched": null, | |
| 64 | + "eur": "5.96", | |
| 65 | + "eur_foil": "6.24", | |
| 66 | + "tix": null | |
| 67 | + } | |
| 68 | + }, | |
| 69 | + "bulkUpdatedAt": "2026-09-06T21:05:43.673+00:00" | |
| 70 | + } | |
| 71 | + }, | |
| 72 | + "expect": { | |
| 73 | + "minCount": 4, | |
| 74 | + "requiredFields": [ | |
| 75 | + "attributes.identifiers.scryfall_id", | |
| 76 | + "attributes.setCode", | |
| 77 | + "attributes.number" | |
| 78 | + ] | |
| 79 | + }, | |
| 80 | + "note": "Live capture of https://api.scryfall.com/cards/sld/1145; bulkUpdatedAt copied from the bulk-data listing of the same day.", | |
| 81 | + "capturedAt": "2026-09-07T04:27:45.306Z" | |
| 82 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/ygoprodeck/46986421.json
+549 −0
@@ -0,0 +1,549 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://ygoprodeck.com/card/dark-magician-4003", | |
| 4 | + "externalId": "46986421", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:27:44.899Z", | |
| 8 | + "payload": { | |
| 9 | + "card": { | |
| 10 | + "id": 46986421, | |
| 11 | + "name": "Dark Magician", | |
| 12 | + "type": "Normal Monster", | |
| 13 | + "humanReadableCardType": "Normal Monster", | |
| 14 | + "frameType": "normal", | |
| 15 | + "race": "Spellcaster", | |
| 16 | + "attribute": "DARK", | |
| 17 | + "archetype": "Dark Magician", | |
| 18 | + "atk": 2500, | |
| 19 | + "def": 2100, | |
| 20 | + "level": 7, | |
| 21 | + "ygoprodeck_url": "https://ygoprodeck.com/card/dark-magician-4003", | |
| 22 | + "card_sets": [ | |
| 23 | + { | |
| 24 | + "set_name": "2-Player Starter Set", | |
| 25 | + "set_code": "STAX-EN005", | |
| 26 | + "set_rarity": "Common", | |
| 27 | + "set_rarity_code": "(C)", | |
| 28 | + "set_price": "0" | |
| 29 | + }, | |
| 30 | + { | |
| 31 | + "set_name": "2016 Mega-Tins", | |
| 32 | + "set_code": "CT13-EN003", | |
| 33 | + "set_rarity": "Ultra Rare", | |
| 34 | + "set_rarity_code": "(UR)", | |
| 35 | + "set_price": "6.97" | |
| 36 | + }, | |
| 37 | + { | |
| 38 | + "set_name": "2017 Mega-Tins", | |
| 39 | + "set_code": "CT14-EN001", | |
| 40 | + "set_rarity": "Secret Rare", | |
| 41 | + "set_rarity_code": "(ScR)", | |
| 42 | + "set_price": "9.66" | |
| 43 | + }, | |
| 44 | + { | |
| 45 | + "set_name": "25th Anniversary Tin: Dueling Heroes", | |
| 46 | + "set_code": "TN23-EN001", | |
| 47 | + "set_rarity": "Quarter Century Secret Rare", | |
| 48 | + "set_rarity_code": "", | |
| 49 | + "set_price": "0" | |
| 50 | + }, | |
| 51 | + { | |
| 52 | + "set_name": "Adidas collaboration card", | |
| 53 | + "set_code": "ADC1-EN001", | |
| 54 | + "set_rarity": "Secret Rare", | |
| 55 | + "set_rarity_code": "(ScR)", | |
| 56 | + "set_price": "0" | |
| 57 | + }, | |
| 58 | + { | |
| 59 | + "set_name": "Battle of Chaos", | |
| 60 | + "set_code": "25TH-EN001", | |
| 61 | + "set_rarity": "Ultra Rare", | |
| 62 | + "set_rarity_code": "(UR)", | |
| 63 | + "set_price": "0" | |
| 64 | + }, | |
| 65 | + { | |
| 66 | + "set_name": "Booster Pack Collectors Tins 2002", | |
| 67 | + "set_code": "BPT-001", | |
| 68 | + "set_rarity": "Secret Rare", | |
| 69 | + "set_rarity_code": "(ScR)", | |
| 70 | + "set_price": "63.01" | |
| 71 | + }, | |
| 72 | + { | |
| 73 | + "set_name": "Collectible Tins 2003", | |
| 74 | + "set_code": "BPT-007", | |
| 75 | + "set_rarity": "Secret Rare", | |
| 76 | + "set_rarity_code": "(ScR)", | |
| 77 | + "set_price": "19.08" | |
| 78 | + }, | |
| 79 | + { | |
| 80 | + "set_name": "Dark Beginning 1", | |
| 81 | + "set_code": "DB1-EN102", | |
| 82 | + "set_rarity": "Ultra Rare", | |
| 83 | + "set_rarity_code": "(UR)", | |
| 84 | + "set_price": "0" | |
| 85 | + }, | |
| 86 | + { | |
| 87 | + "set_name": "Dark Legends", | |
| 88 | + "set_code": "DLG1-EN004", | |
| 89 | + "set_rarity": "Rare", | |
| 90 | + "set_rarity_code": "(R)", | |
| 91 | + "set_price": "11.64" | |
| 92 | + }, | |
| 93 | + { | |
| 94 | + "set_name": "Duel Power", | |
| 95 | + "set_code": "DUPO-EN101", | |
| 96 | + "set_rarity": "Ultra Rare", | |
| 97 | + "set_rarity_code": "(UR)", | |
| 98 | + "set_price": "3.52" | |
| 99 | + }, | |
| 100 | + { | |
| 101 | + "set_name": "Duel Terminal - Preview Wave 1", | |
| 102 | + "set_code": "DTP1-EN002", | |
| 103 | + "set_rarity": "Duel Terminal Normal Parallel Rare", | |
| 104 | + "set_rarity_code": "(DNPR)", | |
| 105 | + "set_price": "0.00" | |
| 106 | + }, | |
| 107 | + { | |
| 108 | + "set_name": "Duel Terminal - Preview Wave 2", | |
| 109 | + "set_code": "DTP1-EN002", | |
| 110 | + "set_rarity": "Duel Terminal Rare Parallel Rare", | |
| 111 | + "set_rarity_code": "(DRPR)", | |
| 112 | + "set_price": "0" | |
| 113 | + }, | |
| 114 | + { | |
| 115 | + "set_name": "Duel Terminal 1", | |
| 116 | + "set_code": "DT01-EN002", | |
| 117 | + "set_rarity": "Duel Terminal Rare Parallel Rare", | |
| 118 | + "set_rarity_code": "(DRPR)", | |
| 119 | + "set_price": "0" | |
| 120 | + }, | |
| 121 | + { | |
| 122 | + "set_name": "Duelist League 2 participation cards", | |
| 123 | + "set_code": "DL11-EN001", | |
| 124 | + "set_rarity": "Rare", | |
| 125 | + "set_rarity_code": "(R)", | |
| 126 | + "set_price": "70.6" | |
| 127 | + }, | |
| 128 | + { | |
| 129 | + "set_name": "Duelist Pack: Battle City", | |
| 130 | + "set_code": "DPBC-EN008", | |
| 131 | + "set_rarity": "Super Rare", | |
| 132 | + "set_rarity_code": "(SR)", | |
| 133 | + "set_price": "0" | |
| 134 | + }, | |
| 135 | + { | |
| 136 | + "set_name": "Duelist Pack: Yugi", | |
| 137 | + "set_code": "DPYG-EN001", | |
| 138 | + "set_rarity": "Rare", | |
| 139 | + "set_rarity_code": "(R)", | |
| 140 | + "set_price": "2.24" | |
| 141 | + }, | |
| 142 | + { | |
| 143 | + "set_name": "Duelist Saga", | |
| 144 | + "set_code": "DUSA-EN100", | |
| 145 | + "set_rarity": "Ultra Rare", | |
| 146 | + "set_rarity_code": "(UR)", | |
| 147 | + "set_price": "11.34" | |
| 148 | + }, | |
| 149 | + { | |
| 150 | + "set_name": "Forbidden Legacy", | |
| 151 | + "set_code": "FL1-EN002", | |
| 152 | + "set_rarity": "Secret Rare", | |
| 153 | + "set_rarity_code": "(ScR)", | |
| 154 | + "set_price": "16.26" | |
| 155 | + }, | |
| 156 | + { | |
| 157 | + "set_name": "Ghosts From the Past", | |
| 158 | + "set_code": "GFTP-EN128", | |
| 159 | + "set_rarity": "Ghost Rare", | |
| 160 | + "set_rarity_code": "(GR)", | |
| 161 | + "set_price": "0" | |
| 162 | + }, | |
| 163 | + { | |
| 164 | + "set_name": "Hidden Arsenal: Chapter 1", | |
| 165 | + "set_code": "HAC1-EN002", | |
| 166 | + "set_rarity": "Duel Terminal Ultra Parallel Rare", | |
| 167 | + "set_rarity_code": "(DUPR)", | |
| 168 | + "set_price": "0" | |
| 169 | + }, | |
| 170 | + { | |
| 171 | + "set_name": "KC Grand Tournament 2021 prize card", | |
| 172 | + "set_code": "2021-EN001", | |
| 173 | + "set_rarity": "Extra Secret Rare", | |
| 174 | + "set_rarity_code": "", | |
| 175 | + "set_price": "0.00" | |
| 176 | + }, | |
| 177 | + { | |
| 178 | + "set_name": "Legend of Blue Eyes White Dragon", | |
| 179 | + "set_code": "LOB-005", | |
| 180 | + "set_rarity": "Ultra Rare", | |
| 181 | + "set_rarity_code": "(UR)", | |
| 182 | + "set_price": "46.71" | |
| 183 | + }, | |
| 184 | + { | |
| 185 | + "set_name": "Legend of Blue Eyes White Dragon", | |
| 186 | + "set_code": "LOB-E003", | |
| 187 | + "set_rarity": "Ultra Rare", | |
| 188 | + "set_rarity_code": "(UR)", | |
| 189 | + "set_price": "53.66" | |
| 190 | + }, | |
| 191 | + { | |
| 192 | + "set_name": "Legend of Blue Eyes White Dragon", | |
| 193 | + "set_code": "LOB-EN005", | |
| 194 | + "set_rarity": "Ultra Rare", | |
| 195 | + "set_rarity_code": "(UR)", | |
| 196 | + "set_price": "49.41" | |
| 197 | + }, | |
| 198 | + { | |
| 199 | + "set_name": "Legendary Collection", | |
| 200 | + "set_code": "LC01-EN005", | |
| 201 | + "set_rarity": "Ultra Rare", | |
| 202 | + "set_rarity_code": "(UR)", | |
| 203 | + "set_price": "0" | |
| 204 | + }, | |
| 205 | + { | |
| 206 | + "set_name": "Legendary Collection 3: Yugi's World Mega Pack", | |
| 207 | + "set_code": "LCYW-EN001", | |
| 208 | + "set_rarity": "Secret Rare", | |
| 209 | + "set_rarity_code": "(ScR)", | |
| 210 | + "set_price": "0" | |
| 211 | + }, | |
| 212 | + { | |
| 213 | + "set_name": "Legendary Collection: 25th Anniversary Edition", | |
| 214 | + "set_code": "LC01-EN005", | |
| 215 | + "set_rarity": "Quarter Century Secret Rare", | |
| 216 | + "set_rarity_code": "", | |
| 217 | + "set_price": "0" | |
| 218 | + }, | |
| 219 | + { | |
| 220 | + "set_name": "Legendary Decks II", | |
| 221 | + "set_code": "LDK2-ENY10", | |
| 222 | + "set_rarity": "Common", | |
| 223 | + "set_rarity_code": "(C)", | |
| 224 | + "set_price": "2.35" | |
| 225 | + }, | |
| 226 | + { | |
| 227 | + "set_name": "Legendary Dragon Decks", | |
| 228 | + "set_code": "LEDD-ENA01", | |
| 229 | + "set_rarity": "Common", | |
| 230 | + "set_rarity_code": "(C)", | |
| 231 | + "set_price": "1.72" | |
| 232 | + }, | |
| 233 | + { | |
| 234 | + "set_name": "Maximum Gold", | |
| 235 | + "set_code": "MAGO-EN002", | |
| 236 | + "set_rarity": "Premium Gold Rare", | |
| 237 | + "set_rarity_code": "(PG)", | |
| 238 | + "set_price": "0" | |
| 239 | + }, | |
| 240 | + { | |
| 241 | + "set_name": "Maximum Gold: El Dorado", | |
| 242 | + "set_code": "MGED-EN002", | |
| 243 | + "set_rarity": "Premium Gold Rare", | |
| 244 | + "set_rarity_code": "(PG)", | |
| 245 | + "set_price": "0" | |
| 246 | + }, | |
| 247 | + { | |
| 248 | + "set_name": "Retro Pack", | |
| 249 | + "set_code": "RP01-EN003", | |
| 250 | + "set_rarity": "Ultra Rare", | |
| 251 | + "set_rarity_code": "(UR)", | |
| 252 | + "set_price": "503.21" | |
| 253 | + }, | |
| 254 | + { | |
| 255 | + "set_name": "Shonen Jump Vol. 9, Issue 4 promotional card", | |
| 256 | + "set_code": "JUMP-EN049", | |
| 257 | + "set_rarity": "Ultra Rare", | |
| 258 | + "set_rarity_code": "(UR)", | |
| 259 | + "set_price": "129.27" | |
| 260 | + }, | |
| 261 | + { | |
| 262 | + "set_name": "Speed Duel Starter Decks: Destiny Masters", | |
| 263 | + "set_code": "SS01-ENA01", | |
| 264 | + "set_rarity": "Common", | |
| 265 | + "set_rarity_code": "(C)", | |
| 266 | + "set_price": "1.61" | |
| 267 | + }, | |
| 268 | + { | |
| 269 | + "set_name": "Speed Duel Starter Decks: Match of the Millennium", | |
| 270 | + "set_code": "SS04-ENA01", | |
| 271 | + "set_rarity": "Common", | |
| 272 | + "set_rarity_code": "(C)", | |
| 273 | + "set_price": "0" | |
| 274 | + }, | |
| 275 | + { | |
| 276 | + "set_name": "Speed Duel Tournament Pack 1", | |
| 277 | + "set_code": "STP1-EN001", | |
| 278 | + "set_rarity": "Ultra Rare", | |
| 279 | + "set_rarity_code": "(UR)", | |
| 280 | + "set_price": "0" | |
| 281 | + }, | |
| 282 | + { | |
| 283 | + "set_name": "Speed Duel: Battle City Box", | |
| 284 | + "set_code": "SBCB-EN001", | |
| 285 | + "set_rarity": "Common", | |
| 286 | + "set_rarity_code": "(C)", | |
| 287 | + "set_price": "1.55" | |
| 288 | + }, | |
| 289 | + { | |
| 290 | + "set_name": "Speed Duel: Battle City Box", | |
| 291 | + "set_code": "SBCB-EN001", | |
| 292 | + "set_rarity": "Secret Rare", | |
| 293 | + "set_rarity_code": "(ScR)", | |
| 294 | + "set_price": "6.53" | |
| 295 | + }, | |
| 296 | + { | |
| 297 | + "set_name": "Speed Duel: Streets of Battle City", | |
| 298 | + "set_code": "SBC1-ENA01", | |
| 299 | + "set_rarity": "Common", | |
| 300 | + "set_rarity_code": "(C)", | |
| 301 | + "set_price": "0" | |
| 302 | + }, | |
| 303 | + { | |
| 304 | + "set_name": "Speed Duel: Streets of Battle City", | |
| 305 | + "set_code": "SBC1-ENA01", | |
| 306 | + "set_rarity": "Secret Rare", | |
| 307 | + "set_rarity_code": "(ScR)", | |
| 308 | + "set_price": "0" | |
| 309 | + }, | |
| 310 | + { | |
| 311 | + "set_name": "Starter Deck: Yugi", | |
| 312 | + "set_code": "SDY-006", | |
| 313 | + "set_rarity": "Ultra Rare", | |
| 314 | + "set_rarity_code": "(UR)", | |
| 315 | + "set_price": "9.96" | |
| 316 | + }, | |
| 317 | + { | |
| 318 | + "set_name": "Starter Deck: Yugi", | |
| 319 | + "set_code": "SDY-E005", | |
| 320 | + "set_rarity": "Ultra Rare", | |
| 321 | + "set_rarity_code": "(UR)", | |
| 322 | + "set_price": "24.46" | |
| 323 | + }, | |
| 324 | + { | |
| 325 | + "set_name": "Starter Deck: Yugi Evolution", | |
| 326 | + "set_code": "SYE-001", | |
| 327 | + "set_rarity": "Super Rare", | |
| 328 | + "set_rarity_code": "(SR)", | |
| 329 | + "set_price": "0" | |
| 330 | + }, | |
| 331 | + { | |
| 332 | + "set_name": "Starter Deck: Yugi Reloaded", | |
| 333 | + "set_code": "YSYR-EN001", | |
| 334 | + "set_rarity": "Common", | |
| 335 | + "set_rarity_code": "(C)", | |
| 336 | + "set_price": "2.34" | |
| 337 | + }, | |
| 338 | + { | |
| 339 | + "set_name": "Starter Deck: Yugi Reloaded", | |
| 340 | + "set_code": "YSYR-EN001", | |
| 341 | + "set_rarity": "Ultimate Rare", | |
| 342 | + "set_rarity_code": "(UtR)", | |
| 343 | + "set_price": "0" | |
| 344 | + }, | |
| 345 | + { | |
| 346 | + "set_name": "Structure Deck: Spellcaster's Judgment", | |
| 347 | + "set_code": "SD6-EN003", | |
| 348 | + "set_rarity": "Common", | |
| 349 | + "set_rarity_code": "(C)", | |
| 350 | + "set_price": "2.26" | |
| 351 | + }, | |
| 352 | + { | |
| 353 | + "set_name": "Structure Deck: Yugi Muto", | |
| 354 | + "set_code": "SDMY-EN010", | |
| 355 | + "set_rarity": "Common", | |
| 356 | + "set_rarity_code": "(C)", | |
| 357 | + "set_price": "0" | |
| 358 | + }, | |
| 359 | + { | |
| 360 | + "set_name": "WSJ Jump Pack Fall 2016 promotional card", | |
| 361 | + "set_code": "JMPS-EN003", | |
| 362 | + "set_rarity": "Ultra Rare", | |
| 363 | + "set_rarity_code": "(UR)", | |
| 364 | + "set_price": "171.83" | |
| 365 | + }, | |
| 366 | + { | |
| 367 | + "set_name": "Yu-Gi-Oh! Dark Duel Stories promotional cards", | |
| 368 | + "set_code": "DDS-002", | |
| 369 | + "set_rarity": "Prismatic Secret Rare", | |
| 370 | + "set_rarity_code": "(PScR)", | |
| 371 | + "set_price": "797.61" | |
| 372 | + }, | |
| 373 | + { | |
| 374 | + "set_name": "Yu-Gi-Oh! Power of Chaos: Yugi the Destiny promotional cards", | |
| 375 | + "set_code": "PCY-004", | |
| 376 | + "set_rarity": "Prismatic Secret Rare", | |
| 377 | + "set_rarity_code": "(PScR)", | |
| 378 | + "set_price": "82.23" | |
| 379 | + }, | |
| 380 | + { | |
| 381 | + "set_name": "Yu-Gi-Oh! Power of Chaos: Yugi the Destiny promotional cards", | |
| 382 | + "set_code": "PCY-E004", | |
| 383 | + "set_rarity": "Prismatic Secret Rare", | |
| 384 | + "set_rarity_code": "(PScR)", | |
| 385 | + "set_price": "74.4" | |
| 386 | + }, | |
| 387 | + { | |
| 388 | + "set_name": "Yu-Gi-Oh! The Dark Side of Dimensions Movie Pack", | |
| 389 | + "set_code": "MVP1-EN054", | |
| 390 | + "set_rarity": "Ultra Rare", | |
| 391 | + "set_rarity_code": "(UR)", | |
| 392 | + "set_price": "3.3" | |
| 393 | + }, | |
| 394 | + { | |
| 395 | + "set_name": "Yu-Gi-Oh! The Dark Side of Dimensions Movie Pack Secret Edition", | |
| 396 | + "set_code": "MVP1-ENS54", | |
| 397 | + "set_rarity": "Secret Rare", | |
| 398 | + "set_rarity_code": "(ScR)", | |
| 399 | + "set_price": "19.53" | |
| 400 | + }, | |
| 401 | + { | |
| 402 | + "set_name": "Yu-Gi-Oh! The Dark Side of Dimensions Movie Pack Secret Edition", | |
| 403 | + "set_code": "MVP1-ENSV3", | |
| 404 | + "set_rarity": "Ultra Rare", | |
| 405 | + "set_rarity_code": "(UR)", | |
| 406 | + "set_price": "4.19" | |
| 407 | + }, | |
| 408 | + { | |
| 409 | + "set_name": "Yu-Gi-Oh! The Dark Side of Dimensions Movie Pack Special Edition", | |
| 410 | + "set_code": "MVP1-ENSE3", | |
| 411 | + "set_rarity": "Ultra Rare", | |
| 412 | + "set_rarity_code": "(UR)", | |
| 413 | + "set_price": "4.11" | |
| 414 | + }, | |
| 415 | + { | |
| 416 | + "set_name": "Yu-Gi-Oh! The Dark Side of Dimensions Movie Pack: Gold Edition", | |
| 417 | + "set_code": "MVP1-ENG54", | |
| 418 | + "set_rarity": "Gold Rare", | |
| 419 | + "set_rarity_code": "(GUR)", | |
| 420 | + "set_price": "5.83" | |
| 421 | + }, | |
| 422 | + { | |
| 423 | + "set_name": "Yu-Gi-Oh! The Dark Side of Dimensions Movie Pack: Gold Edition", | |
| 424 | + "set_code": "MVP1-ENGV3", | |
| 425 | + "set_rarity": "Gold Secret Rare", | |
| 426 | + "set_rarity_code": "(GScR)", | |
| 427 | + "set_price": "8.39" | |
| 428 | + }, | |
| 429 | + { | |
| 430 | + "set_name": "Yugi's Collector Box", | |
| 431 | + "set_code": "YUCB-EN001", | |
| 432 | + "set_rarity": "Ultra Rare", | |
| 433 | + "set_rarity_code": "(UR)", | |
| 434 | + "set_price": "0" | |
| 435 | + }, | |
| 436 | + { | |
| 437 | + "set_name": "Yugi's Legendary Decks", | |
| 438 | + "set_code": "YGLD-ENA03", | |
| 439 | + "set_rarity": "Common", | |
| 440 | + "set_rarity_code": "(C)", | |
| 441 | + "set_price": "1.7" | |
| 442 | + }, | |
| 443 | + { | |
| 444 | + "set_name": "Yugi's Legendary Decks", | |
| 445 | + "set_code": "YGLD-ENB02", | |
| 446 | + "set_rarity": "Ultra Rare", | |
| 447 | + "set_rarity_code": "(UR)", | |
| 448 | + "set_price": "0" | |
| 449 | + }, | |
| 450 | + { | |
| 451 | + "set_name": "Yugi's Legendary Decks", | |
| 452 | + "set_code": "YGLD-ENC09", | |
| 453 | + "set_rarity": "Ultra Rare", | |
| 454 | + "set_rarity_code": "(UR)", | |
| 455 | + "set_price": "0" | |
| 456 | + } | |
| 457 | + ], | |
| 458 | + "card_images": [ | |
| 459 | + { | |
| 460 | + "id": 46986421, | |
| 461 | + "image_url": "https://images.ygoprodeck.com/images/cards/46986421.jpg", | |
| 462 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/46986421.jpg", | |
| 463 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/46986421.jpg" | |
| 464 | + }, | |
| 465 | + { | |
| 466 | + "id": 46986414, | |
| 467 | + "image_url": "https://images.ygoprodeck.com/images/cards/46986414.jpg", | |
| 468 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/46986414.jpg", | |
| 469 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/46986414.jpg" | |
| 470 | + }, | |
| 471 | + { | |
| 472 | + "id": 46986420, | |
| 473 | + "image_url": "https://images.ygoprodeck.com/images/cards/46986420.jpg", | |
| 474 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/46986420.jpg", | |
| 475 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/46986420.jpg" | |
| 476 | + }, | |
| 477 | + { | |
| 478 | + "id": 36996508, | |
| 479 | + "image_url": "https://images.ygoprodeck.com/images/cards/36996508.jpg", | |
| 480 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/36996508.jpg", | |
| 481 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/36996508.jpg" | |
| 482 | + }, | |
| 483 | + { | |
| 484 | + "id": 46986419, | |
| 485 | + "image_url": "https://images.ygoprodeck.com/images/cards/46986419.jpg", | |
| 486 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/46986419.jpg", | |
| 487 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/46986419.jpg" | |
| 488 | + }, | |
| 489 | + { | |
| 490 | + "id": 46986418, | |
| 491 | + "image_url": "https://images.ygoprodeck.com/images/cards/46986418.jpg", | |
| 492 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/46986418.jpg", | |
| 493 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/46986418.jpg" | |
| 494 | + }, | |
| 495 | + { | |
| 496 | + "id": 46986417, | |
| 497 | + "image_url": "https://images.ygoprodeck.com/images/cards/46986417.jpg", | |
| 498 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/46986417.jpg", | |
| 499 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/46986417.jpg" | |
| 500 | + }, | |
| 501 | + { | |
| 502 | + "id": 46986416, | |
| 503 | + "image_url": "https://images.ygoprodeck.com/images/cards/46986416.jpg", | |
| 504 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/46986416.jpg", | |
| 505 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/46986416.jpg" | |
| 506 | + }, | |
| 507 | + { | |
| 508 | + "id": 46986415, | |
| 509 | + "image_url": "https://images.ygoprodeck.com/images/cards/46986415.jpg", | |
| 510 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/46986415.jpg", | |
| 511 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/46986415.jpg" | |
| 512 | + } | |
| 513 | + ], | |
| 514 | + "card_prices": [ | |
| 515 | + { | |
| 516 | + "cardmarket_price": "0.02", | |
| 517 | + "tcgplayer_price": "0.33", | |
| 518 | + "ebay_price": "0.99", | |
| 519 | + "amazon_price": "14.45", | |
| 520 | + "coolstuffinc_price": "0.39" | |
| 521 | + } | |
| 522 | + ], | |
| 523 | + "misc_info": [ | |
| 524 | + { | |
| 525 | + "konami_id": 4041, | |
| 526 | + "tcg_date": "2002-03-08", | |
| 527 | + "ocg_date": "1999-02-04", | |
| 528 | + "md_rarity": "Ultra Rare", | |
| 529 | + "treated_as": "Dark Magician" | |
| 530 | + } | |
| 531 | + ] | |
| 532 | + } | |
| 533 | + } | |
| 534 | + }, | |
| 535 | + "expect": { | |
| 536 | + "minCount": 62, | |
| 537 | + "kinds": [ | |
| 538 | + "catalog_item", | |
| 539 | + "price_observation" | |
| 540 | + ], | |
| 541 | + "requiredFields": [ | |
| 542 | + "attributes.identifiers.ygo_id", | |
| 543 | + "attributes.set", | |
| 544 | + "attributes.number" | |
| 545 | + ] | |
| 546 | + }, | |
| 547 | + "note": "Live capture of cardinfo.php?name=…&misc=yes (trimmed).", | |
| 548 | + "capturedAt": "2026-09-07T04:27:53.794Z" | |
| 549 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/ygoprodeck/55144522.json
+209 −0
@@ -0,0 +1,209 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://ygoprodeck.com/card/pot-of-greed-4698", | |
| 4 | + "externalId": "55144522", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:27:44.899Z", | |
| 8 | + "payload": { | |
| 9 | + "card": { | |
| 10 | + "id": 55144522, | |
| 11 | + "name": "Pot of Greed", | |
| 12 | + "type": "Spell Card", | |
| 13 | + "humanReadableCardType": "Normal Spell", | |
| 14 | + "frameType": "spell", | |
| 15 | + "race": "Normal", | |
| 16 | + "archetype": "Greed", | |
| 17 | + "ygoprodeck_url": "https://ygoprodeck.com/card/pot-of-greed-4698", | |
| 18 | + "card_sets": [ | |
| 19 | + { | |
| 20 | + "set_name": "2025 Mega-Pack Tin", | |
| 21 | + "set_code": "MP25-EN050", | |
| 22 | + "set_rarity": "Starlight Rare", | |
| 23 | + "set_rarity_code": "(StR)", | |
| 24 | + "set_price": "0" | |
| 25 | + }, | |
| 26 | + { | |
| 27 | + "set_name": "Battle Pack 2: War of the Giants", | |
| 28 | + "set_code": "BP02-EN129", | |
| 29 | + "set_rarity": "Mosaic Rare", | |
| 30 | + "set_rarity_code": "(MSR)", | |
| 31 | + "set_price": "0" | |
| 32 | + }, | |
| 33 | + { | |
| 34 | + "set_name": "Battle Pack 2: War of the Giants", | |
| 35 | + "set_code": "BP02-EN129", | |
| 36 | + "set_rarity": "Rare", | |
| 37 | + "set_rarity_code": "(R)", | |
| 38 | + "set_price": "0" | |
| 39 | + }, | |
| 40 | + { | |
| 41 | + "set_name": "Battle Pack: Epic Dawn", | |
| 42 | + "set_code": "BP01-EN034", | |
| 43 | + "set_rarity": "Rare", | |
| 44 | + "set_rarity_code": "(R)", | |
| 45 | + "set_price": "0" | |
| 46 | + }, | |
| 47 | + { | |
| 48 | + "set_name": "Battle Pack: Epic Dawn", | |
| 49 | + "set_code": "BP01-EN034", | |
| 50 | + "set_rarity": "Starfoil Rare", | |
| 51 | + "set_rarity_code": "(SFR)", | |
| 52 | + "set_price": "0" | |
| 53 | + }, | |
| 54 | + { | |
| 55 | + "set_name": "Dark Beginning 1", | |
| 56 | + "set_code": "DB1-EN134", | |
| 57 | + "set_rarity": "Super Rare", | |
| 58 | + "set_rarity_code": "(SR)", | |
| 59 | + "set_price": "0" | |
| 60 | + }, | |
| 61 | + { | |
| 62 | + "set_name": "Duelist Pack: Kaiba", | |
| 63 | + "set_code": "DPKB-EN029", | |
| 64 | + "set_rarity": "Ultimate Rare", | |
| 65 | + "set_rarity_code": "(UtR)", | |
| 66 | + "set_price": "0" | |
| 67 | + }, | |
| 68 | + { | |
| 69 | + "set_name": "Legend of Blue Eyes White Dragon", | |
| 70 | + "set_code": "LOB-119", | |
| 71 | + "set_rarity": "Rare", | |
| 72 | + "set_rarity_code": "(R)", | |
| 73 | + "set_price": "4.2" | |
| 74 | + }, | |
| 75 | + { | |
| 76 | + "set_name": "Legend of Blue Eyes White Dragon", | |
| 77 | + "set_code": "LOB-EN119", | |
| 78 | + "set_rarity": "Rare", | |
| 79 | + "set_rarity_code": "(R)", | |
| 80 | + "set_price": "0" | |
| 81 | + }, | |
| 82 | + { | |
| 83 | + "set_name": "Legendary Collection 3: Yugi's World Mega Pack", | |
| 84 | + "set_code": "LCYW-EN059", | |
| 85 | + "set_rarity": "Secret Rare", | |
| 86 | + "set_rarity_code": "(ScR)", | |
| 87 | + "set_price": "0" | |
| 88 | + }, | |
| 89 | + { | |
| 90 | + "set_name": "Legendary Collection 4: Joey's World Mega Pack", | |
| 91 | + "set_code": "LCJW-EN061", | |
| 92 | + "set_rarity": "Secret Rare", | |
| 93 | + "set_rarity_code": "(ScR)", | |
| 94 | + "set_price": "0" | |
| 95 | + }, | |
| 96 | + { | |
| 97 | + "set_name": "Magic Ruler", | |
| 98 | + "set_code": "MRL-E129", | |
| 99 | + "set_rarity": "Rare", | |
| 100 | + "set_rarity_code": "(R)", | |
| 101 | + "set_price": "25.34" | |
| 102 | + }, | |
| 103 | + { | |
| 104 | + "set_name": "Starter Deck: Yugi Evolution", | |
| 105 | + "set_code": "SYE-040", | |
| 106 | + "set_rarity": "Common", | |
| 107 | + "set_rarity_code": "(C)", | |
| 108 | + "set_price": "4.61" | |
| 109 | + }, | |
| 110 | + { | |
| 111 | + "set_name": "Structure Deck: Blaze of Destruction", | |
| 112 | + "set_code": "SD3-EN019", | |
| 113 | + "set_rarity": "Common", | |
| 114 | + "set_rarity_code": "(C)", | |
| 115 | + "set_price": "0" | |
| 116 | + }, | |
| 117 | + { | |
| 118 | + "set_name": "Structure Deck: Dragon's Roar", | |
| 119 | + "set_code": "SD1-EN015", | |
| 120 | + "set_rarity": "Common", | |
| 121 | + "set_rarity_code": "(C)", | |
| 122 | + "set_price": "4.66" | |
| 123 | + }, | |
| 124 | + { | |
| 125 | + "set_name": "Structure Deck: Fury from the Deep", | |
| 126 | + "set_code": "SD4-EN018", | |
| 127 | + "set_rarity": "Common", | |
| 128 | + "set_rarity_code": "(C)", | |
| 129 | + "set_price": "4.62" | |
| 130 | + }, | |
| 131 | + { | |
| 132 | + "set_name": "Structure Deck: Zombie Madness", | |
| 133 | + "set_code": "SD2-EN017", | |
| 134 | + "set_rarity": "Common", | |
| 135 | + "set_rarity_code": "(C)", | |
| 136 | + "set_price": "4.57" | |
| 137 | + }, | |
| 138 | + { | |
| 139 | + "set_name": "The Pot Collection", | |
| 140 | + "set_code": "TBC1-EN001", | |
| 141 | + "set_rarity": "Ultra Parallel Rare", | |
| 142 | + "set_rarity_code": "(UPR)", | |
| 143 | + "set_price": "0" | |
| 144 | + }, | |
| 145 | + { | |
| 146 | + "set_name": "The Pot Collection", | |
| 147 | + "set_code": "TBC1-ENS01", | |
| 148 | + "set_rarity": "Quarter Century Secret Rare", | |
| 149 | + "set_rarity_code": "", | |
| 150 | + "set_price": "0" | |
| 151 | + }, | |
| 152 | + { | |
| 153 | + "set_name": "Tournament Pack: 3rd Season", | |
| 154 | + "set_code": "TP3-014", | |
| 155 | + "set_rarity": "Common", | |
| 156 | + "set_rarity_code": "(C)", | |
| 157 | + "set_price": "7.61" | |
| 158 | + }, | |
| 159 | + { | |
| 160 | + "set_name": "Yugi's Legendary Decks", | |
| 161 | + "set_code": "YGLD-ENB26", | |
| 162 | + "set_rarity": "Common", | |
| 163 | + "set_rarity_code": "(C)", | |
| 164 | + "set_price": "4.58" | |
| 165 | + } | |
| 166 | + ], | |
| 167 | + "card_images": [ | |
| 168 | + { | |
| 169 | + "id": 55144522, | |
| 170 | + "image_url": "https://images.ygoprodeck.com/images/cards/55144522.jpg", | |
| 171 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/55144522.jpg", | |
| 172 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/55144522.jpg" | |
| 173 | + } | |
| 174 | + ], | |
| 175 | + "card_prices": [ | |
| 176 | + { | |
| 177 | + "cardmarket_price": "0.15", | |
| 178 | + "tcgplayer_price": "4.49", | |
| 179 | + "ebay_price": "4.95", | |
| 180 | + "amazon_price": "6.18", | |
| 181 | + "coolstuffinc_price": "3.99" | |
| 182 | + } | |
| 183 | + ], | |
| 184 | + "misc_info": [ | |
| 185 | + { | |
| 186 | + "konami_id": 4844, | |
| 187 | + "tcg_date": "2002-03-08", | |
| 188 | + "ocg_date": "1999-05-27", | |
| 189 | + "md_rarity": "Ultra Rare" | |
| 190 | + } | |
| 191 | + ] | |
| 192 | + } | |
| 193 | + } | |
| 194 | + }, | |
| 195 | + "expect": { | |
| 196 | + "minCount": 21, | |
| 197 | + "kinds": [ | |
| 198 | + "catalog_item", | |
| 199 | + "price_observation" | |
| 200 | + ], | |
| 201 | + "requiredFields": [ | |
| 202 | + "attributes.identifiers.ygo_id", | |
| 203 | + "attributes.set", | |
| 204 | + "attributes.number" | |
| 205 | + ] | |
| 206 | + }, | |
| 207 | + "note": "Live capture of cardinfo.php?name=…&misc=yes (trimmed).", | |
| 208 | + "capturedAt": "2026-09-07T04:27:53.794Z" | |
| 209 | +} | |
| \ No newline at end of file | ||
added
data/fixtures/ygoprodeck/89631146.json
+487 −0
@@ -0,0 +1,487 @@ | ||
| 1 | +{ | |
| 2 | + "raw": { | |
| 3 | + "url": "https://ygoprodeck.com/card/blue-eyes-white-dragon-7485", | |
| 4 | + "externalId": "89631146", | |
| 5 | + "kind": "catalog_item", | |
| 6 | + "engine": "api", | |
| 7 | + "fetchedAt": "2026-09-07T04:27:44.899Z", | |
| 8 | + "payload": { | |
| 9 | + "card": { | |
| 10 | + "id": 89631146, | |
| 11 | + "name": "Blue-Eyes White Dragon", | |
| 12 | + "type": "Normal Monster", | |
| 13 | + "humanReadableCardType": "Normal Monster", | |
| 14 | + "frameType": "normal", | |
| 15 | + "race": "Dragon", | |
| 16 | + "attribute": "LIGHT", | |
| 17 | + "archetype": "Blue-Eyes", | |
| 18 | + "atk": 3000, | |
| 19 | + "def": 2500, | |
| 20 | + "level": 8, | |
| 21 | + "ygoprodeck_url": "https://ygoprodeck.com/card/blue-eyes-white-dragon-7485", | |
| 22 | + "card_sets": [ | |
| 23 | + { | |
| 24 | + "set_name": "2016 Mega-Tins", | |
| 25 | + "set_code": "CT13-EN008", | |
| 26 | + "set_rarity": "Ultra Rare", | |
| 27 | + "set_rarity_code": "(UR)", | |
| 28 | + "set_price": "74.49" | |
| 29 | + }, | |
| 30 | + { | |
| 31 | + "set_name": "2017 Mega-Tins", | |
| 32 | + "set_code": "CT14-EN002", | |
| 33 | + "set_rarity": "Secret Rare", | |
| 34 | + "set_rarity_code": "(ScR)", | |
| 35 | + "set_price": "27.92" | |
| 36 | + }, | |
| 37 | + { | |
| 38 | + "set_name": "Anniversary Pack", | |
| 39 | + "set_code": "YAP1-EN001", | |
| 40 | + "set_rarity": "Ultra Rare", | |
| 41 | + "set_rarity_code": "(UR)", | |
| 42 | + "set_price": "282.08" | |
| 43 | + }, | |
| 44 | + { | |
| 45 | + "set_name": "Booster Pack Collectors Tins 2002", | |
| 46 | + "set_code": "BPT-003", | |
| 47 | + "set_rarity": "Secret Rare", | |
| 48 | + "set_rarity_code": "(ScR)", | |
| 49 | + "set_price": "57.39" | |
| 50 | + }, | |
| 51 | + { | |
| 52 | + "set_name": "Collectible Tins 2003", | |
| 53 | + "set_code": "BPT-009", | |
| 54 | + "set_rarity": "Secret Rare", | |
| 55 | + "set_rarity_code": "(ScR)", | |
| 56 | + "set_price": "28.27" | |
| 57 | + }, | |
| 58 | + { | |
| 59 | + "set_name": "Dark Beginning 1", | |
| 60 | + "set_code": "DB1-EN098", | |
| 61 | + "set_rarity": "Ultra Rare", | |
| 62 | + "set_rarity_code": "(UR)", | |
| 63 | + "set_price": "24.4" | |
| 64 | + }, | |
| 65 | + { | |
| 66 | + "set_name": "Dark Legends", | |
| 67 | + "set_code": "DLG1-EN002", | |
| 68 | + "set_rarity": "Super Rare", | |
| 69 | + "set_rarity_code": "(SR)", | |
| 70 | + "set_price": "173.93" | |
| 71 | + }, | |
| 72 | + { | |
| 73 | + "set_name": "Dragons Collide Structure Deck", | |
| 74 | + "set_code": "SDDC-EN004", | |
| 75 | + "set_rarity": "Common", | |
| 76 | + "set_rarity_code": "(C)", | |
| 77 | + "set_price": "1.97" | |
| 78 | + }, | |
| 79 | + { | |
| 80 | + "set_name": "Duel Terminal - Preview Wave 1", | |
| 81 | + "set_code": "DTP1-EN001", | |
| 82 | + "set_rarity": "Duel Terminal Normal Parallel Rare", | |
| 83 | + "set_rarity_code": "(DNPR)", | |
| 84 | + "set_price": "0.00" | |
| 85 | + }, | |
| 86 | + { | |
| 87 | + "set_name": "Duel Terminal - Preview Wave 2", | |
| 88 | + "set_code": "DTP1-EN001", | |
| 89 | + "set_rarity": "Duel Terminal Super Parallel Rare", | |
| 90 | + "set_rarity_code": "(DSPR)", | |
| 91 | + "set_price": "4167.22" | |
| 92 | + }, | |
| 93 | + { | |
| 94 | + "set_name": "Duel Terminal 1", | |
| 95 | + "set_code": "DT01-EN001", | |
| 96 | + "set_rarity": "Duel Terminal Super Parallel Rare", | |
| 97 | + "set_rarity_code": "(DSPR)", | |
| 98 | + "set_price": "439.99" | |
| 99 | + }, | |
| 100 | + { | |
| 101 | + "set_name": "Duelist League 2010 participation cards", | |
| 102 | + "set_code": "DL09-EN001", | |
| 103 | + "set_rarity": "Rare", | |
| 104 | + "set_rarity_code": "(R)", | |
| 105 | + "set_price": "103.53" | |
| 106 | + }, | |
| 107 | + { | |
| 108 | + "set_name": "Duelist Pack: Battle City", | |
| 109 | + "set_code": "DPBC-EN016", | |
| 110 | + "set_rarity": "Ultra Rare", | |
| 111 | + "set_rarity_code": "(UR)", | |
| 112 | + "set_price": "6.64" | |
| 113 | + }, | |
| 114 | + { | |
| 115 | + "set_name": "Duelist Pack: Kaiba", | |
| 116 | + "set_code": "DPKB-EN001", | |
| 117 | + "set_rarity": "Super Rare", | |
| 118 | + "set_rarity_code": "(SR)", | |
| 119 | + "set_price": "13.79" | |
| 120 | + }, | |
| 121 | + { | |
| 122 | + "set_name": "Duelist Saga", | |
| 123 | + "set_code": "DUSA-EN043", | |
| 124 | + "set_rarity": "Ultra Rare", | |
| 125 | + "set_rarity_code": "(UR)", | |
| 126 | + "set_price": "19.02" | |
| 127 | + }, | |
| 128 | + { | |
| 129 | + "set_name": "Forbidden Legacy", | |
| 130 | + "set_code": "FL1-EN001", | |
| 131 | + "set_rarity": "Secret Rare", | |
| 132 | + "set_rarity_code": "(ScR)", | |
| 133 | + "set_price": "21.66" | |
| 134 | + }, | |
| 135 | + { | |
| 136 | + "set_name": "Gold Series: Haunted Mine", | |
| 137 | + "set_code": "GLD5-EN001", | |
| 138 | + "set_rarity": "Ghost/Gold Rare", | |
| 139 | + "set_rarity_code": "(GGR)", | |
| 140 | + "set_price": "244.44" | |
| 141 | + }, | |
| 142 | + { | |
| 143 | + "set_name": "Kaiba's Collector Box", | |
| 144 | + "set_code": "KACB-EN001", | |
| 145 | + "set_rarity": "Ultra Rare", | |
| 146 | + "set_rarity_code": "(UR)", | |
| 147 | + "set_price": "18.52" | |
| 148 | + }, | |
| 149 | + { | |
| 150 | + "set_name": "KC Grand Tournament prize card", | |
| 151 | + "set_code": "2020-EN001", | |
| 152 | + "set_rarity": "Extra Secret Rare", | |
| 153 | + "set_rarity_code": "", | |
| 154 | + "set_price": "0.00" | |
| 155 | + }, | |
| 156 | + { | |
| 157 | + "set_name": "Legend of Blue Eyes White Dragon", | |
| 158 | + "set_code": "LOB-001", | |
| 159 | + "set_rarity": "Ultra Rare", | |
| 160 | + "set_rarity_code": "(UR)", | |
| 161 | + "set_price": "62.15" | |
| 162 | + }, | |
| 163 | + { | |
| 164 | + "set_name": "Legend of Blue Eyes White Dragon", | |
| 165 | + "set_code": "LOB-E001", | |
| 166 | + "set_rarity": "Ultra Rare", | |
| 167 | + "set_rarity_code": "(UR)", | |
| 168 | + "set_price": "681.49" | |
| 169 | + }, | |
| 170 | + { | |
| 171 | + "set_name": "Legend of Blue Eyes White Dragon", | |
| 172 | + "set_code": "LOB-EN001", | |
| 173 | + "set_rarity": "Ultra Rare", | |
| 174 | + "set_rarity_code": "(UR)", | |
| 175 | + "set_price": "253.34" | |
| 176 | + }, | |
| 177 | + { | |
| 178 | + "set_name": "Legendary Collection", | |
| 179 | + "set_code": "LC01-EN004", | |
| 180 | + "set_rarity": "Ultra Rare", | |
| 181 | + "set_rarity_code": "(UR)", | |
| 182 | + "set_price": "19.57" | |
| 183 | + }, | |
| 184 | + { | |
| 185 | + "set_name": "Legendary Collection Kaiba Mega Pack", | |
| 186 | + "set_code": "LCKC-EN001", | |
| 187 | + "set_rarity": "Ultra Rare", | |
| 188 | + "set_rarity_code": "(UR)", | |
| 189 | + "set_price": "15.87" | |
| 190 | + }, | |
| 191 | + { | |
| 192 | + "set_name": "Legendary Decks II", | |
| 193 | + "set_code": "LDK2-ENK01", | |
| 194 | + "set_rarity": "Common", | |
| 195 | + "set_rarity_code": "(C)", | |
| 196 | + "set_price": "11.9" | |
| 197 | + }, | |
| 198 | + { | |
| 199 | + "set_name": "Legendary Duelists: Season 2", | |
| 200 | + "set_code": "LDS2-EN001", | |
| 201 | + "set_rarity": "Ultra Rare", | |
| 202 | + "set_rarity_code": "(UR)", | |
| 203 | + "set_price": "14.85" | |
| 204 | + }, | |
| 205 | + { | |
| 206 | + "set_name": "Legendary Duelists: White Dragon Abyss", | |
| 207 | + "set_code": "LED3-EN006", | |
| 208 | + "set_rarity": "Common", | |
| 209 | + "set_rarity_code": "(C)", | |
| 210 | + "set_price": "2.14" | |
| 211 | + }, | |
| 212 | + { | |
| 213 | + "set_name": "Maximum Gold", | |
| 214 | + "set_code": "MAGO-EN001", | |
| 215 | + "set_rarity": "Premium Gold Rare", | |
| 216 | + "set_rarity_code": "(PG)", | |
| 217 | + "set_price": "21.96" | |
| 218 | + }, | |
| 219 | + { | |
| 220 | + "set_name": "Premium Gold: Return of the Bling", | |
| 221 | + "set_code": "PGL2-EN080", | |
| 222 | + "set_rarity": "Gold Rare", | |
| 223 | + "set_rarity_code": "(GUR)", | |
| 224 | + "set_price": "4.27" | |
| 225 | + }, | |
| 226 | + { | |
| 227 | + "set_name": "Retro Pack", | |
| 228 | + "set_code": "RP01-EN001", | |
| 229 | + "set_rarity": "Ultra Rare", | |
| 230 | + "set_rarity_code": "(UR)", | |
| 231 | + "set_price": "2999.98" | |
| 232 | + }, | |
| 233 | + { | |
| 234 | + "set_name": "Saga of Blue-Eyes White Dragon Structure Deck", | |
| 235 | + "set_code": "SDBE-EN001", | |
| 236 | + "set_rarity": "Ultra Rare", | |
| 237 | + "set_rarity_code": "(UR)", | |
| 238 | + "set_price": "5.15" | |
| 239 | + }, | |
| 240 | + { | |
| 241 | + "set_name": "Shonen Jump Vol. 1, Issue 1 promotional card", | |
| 242 | + "set_code": "JMP-001", | |
| 243 | + "set_rarity": "Ultra Rare", | |
| 244 | + "set_rarity_code": "(UR)", | |
| 245 | + "set_price": "22.47" | |
| 246 | + }, | |
| 247 | + { | |
| 248 | + "set_name": "Speed Duel Starter Decks: Duelists of Tomorrow", | |
| 249 | + "set_code": "SS02-ENA01", | |
| 250 | + "set_rarity": "Common", | |
| 251 | + "set_rarity_code": "(C)", | |
| 252 | + "set_price": "2.36" | |
| 253 | + }, | |
| 254 | + { | |
| 255 | + "set_name": "Speed Duel Tournament Pack 1", | |
| 256 | + "set_code": "STP1-EN004", | |
| 257 | + "set_rarity": "Ultra Rare", | |
| 258 | + "set_rarity_code": "(UR)", | |
| 259 | + "set_price": "39.61" | |
| 260 | + }, | |
| 261 | + { | |
| 262 | + "set_name": "Speed Duel: Battle City Box", | |
| 263 | + "set_code": "SBCB-EN087", | |
| 264 | + "set_rarity": "Common", | |
| 265 | + "set_rarity_code": "(C)", | |
| 266 | + "set_price": "2" | |
| 267 | + }, | |
| 268 | + { | |
| 269 | + "set_name": "Speed Duel: Battle City Box", | |
| 270 | + "set_code": "SBCB-EN087", | |
| 271 | + "set_rarity": "Secret Rare", | |
| 272 | + "set_rarity_code": "(ScR)", | |
| 273 | + "set_price": "2" | |
| 274 | + }, | |
| 275 | + { | |
| 276 | + "set_name": "Starter Deck: Kaiba", | |
| 277 | + "set_code": "SDK-001", | |
| 278 | + "set_rarity": "Ultra Rare", | |
| 279 | + "set_rarity_code": "(UR)", | |
| 280 | + "set_price": "25.6" | |
| 281 | + }, | |
| 282 | + { | |
| 283 | + "set_name": "Starter Deck: Kaiba", | |
| 284 | + "set_code": "SDK-E001", | |
| 285 | + "set_rarity": "Ultra Rare", | |
| 286 | + "set_rarity_code": "(UR)", | |
| 287 | + "set_price": "35.03" | |
| 288 | + }, | |
| 289 | + { | |
| 290 | + "set_name": "Starter Deck: Kaiba Evolution", | |
| 291 | + "set_code": "SKE-001", | |
| 292 | + "set_rarity": "Super Rare", | |
| 293 | + "set_rarity_code": "(SR)", | |
| 294 | + "set_price": "6.87" | |
| 295 | + }, | |
| 296 | + { | |
| 297 | + "set_name": "Starter Deck: Kaiba Reloaded", | |
| 298 | + "set_code": "YSKR-EN001", | |
| 299 | + "set_rarity": "Common", | |
| 300 | + "set_rarity_code": "(C)", | |
| 301 | + "set_price": "6.79" | |
| 302 | + }, | |
| 303 | + { | |
| 304 | + "set_name": "Starter Deck: Kaiba Reloaded", | |
| 305 | + "set_code": "YSKR-EN001", | |
| 306 | + "set_rarity": "Ultimate Rare", | |
| 307 | + "set_rarity_code": "(UtR)", | |
| 308 | + "set_price": "17.64" | |
| 309 | + }, | |
| 310 | + { | |
| 311 | + "set_name": "Structure Deck: Seto Kaiba", | |
| 312 | + "set_code": "SDKS-EN009", | |
| 313 | + "set_rarity": "Common", | |
| 314 | + "set_rarity_code": "(C)", | |
| 315 | + "set_price": "2.7" | |
| 316 | + }, | |
| 317 | + { | |
| 318 | + "set_name": "Swedish Shonen Jump 2004, Issue 2 promotional card", | |
| 319 | + "set_code": "JMP-EN001", | |
| 320 | + "set_rarity": "Ultra Rare", | |
| 321 | + "set_rarity_code": "(UR)", | |
| 322 | + "set_price": "674.33" | |
| 323 | + }, | |
| 324 | + { | |
| 325 | + "set_name": "Weekly Shonen Jump March 2014 membership promotional card", | |
| 326 | + "set_code": "JUMP-EN068", | |
| 327 | + "set_rarity": "Ultra Rare", | |
| 328 | + "set_rarity_code": "(UR)", | |
| 329 | + "set_price": "189.88" | |
| 330 | + }, | |
| 331 | + { | |
| 332 | + "set_name": "WSJ Jump Pack Spring 2016 promotional card", | |
| 333 | + "set_code": "JMPS-EN002", | |
| 334 | + "set_rarity": "Ultra Rare", | |
| 335 | + "set_rarity_code": "(UR)", | |
| 336 | + "set_price": "999.99" | |
| 337 | + }, | |
| 338 | + { | |
| 339 | + "set_name": "Yu-Gi-Oh! Dark Duel Stories promotional cards", | |
| 340 | + "set_code": "DDS-001", | |
| 341 | + "set_rarity": "Prismatic Secret Rare", | |
| 342 | + "set_rarity_code": "(PScR)", | |
| 343 | + "set_price": "1647.85" | |
| 344 | + }, | |
| 345 | + { | |
| 346 | + "set_name": "Yu-Gi-Oh! Power of Chaos: Kaiba the Revenge promotional cards", | |
| 347 | + "set_code": "PCK-001", | |
| 348 | + "set_rarity": "Prismatic Secret Rare", | |
| 349 | + "set_rarity_code": "(PScR)", | |
| 350 | + "set_price": "92.91" | |
| 351 | + }, | |
| 352 | + { | |
| 353 | + "set_name": "Yu-Gi-Oh! Power of Chaos: Kaiba the Revenge promotional cards", | |
| 354 | + "set_code": "PCK-E001", | |
| 355 | + "set_rarity": "Prismatic Secret Rare", | |
| 356 | + "set_rarity_code": "(PScR)", | |
| 357 | + "set_price": "0.00" | |
| 358 | + }, | |
| 359 | + { | |
| 360 | + "set_name": "Yu-Gi-Oh! The Dark Side of Dimensions Movie Pack", | |
| 361 | + "set_code": "MVP1-EN055", | |
| 362 | + "set_rarity": "Ultra Rare", | |
| 363 | + "set_rarity_code": "(UR)", | |
| 364 | + "set_price": "2.99" | |
| 365 | + }, | |
| 366 | + { | |
| 367 | + "set_name": "Yu-Gi-Oh! The Dark Side of Dimensions Movie Pack Secret Edition", | |
| 368 | + "set_code": "MVP1-ENS55", | |
| 369 | + "set_rarity": "Secret Rare", | |
| 370 | + "set_rarity_code": "(ScR)", | |
| 371 | + "set_price": "139.13" | |
| 372 | + }, | |
| 373 | + { | |
| 374 | + "set_name": "Yu-Gi-Oh! The Dark Side of Dimensions Movie Pack Secret Edition", | |
| 375 | + "set_code": "MVP1-ENSV4", | |
| 376 | + "set_rarity": "Ultra Rare", | |
| 377 | + "set_rarity_code": "(UR)", | |
| 378 | + "set_price": "41" | |
| 379 | + }, | |
| 380 | + { | |
| 381 | + "set_name": "Yu-Gi-Oh! The Dark Side of Dimensions Movie Pack Special Edition", | |
| 382 | + "set_code": "MVP1-ENSE4", | |
| 383 | + "set_rarity": "Ultra Rare", | |
| 384 | + "set_rarity_code": "(UR)", | |
| 385 | + "set_price": "83.11" | |
| 386 | + }, | |
| 387 | + { | |
| 388 | + "set_name": "Yu-Gi-Oh! The Dark Side of Dimensions Movie Pack: Gold Edition", | |
| 389 | + "set_code": "MVP1-ENG55", | |
| 390 | + "set_rarity": "Gold Rare", | |
| 391 | + "set_rarity_code": "(GUR)", | |
| 392 | + "set_price": "3.67" | |
| 393 | + }, | |
| 394 | + { | |
| 395 | + "set_name": "Yu-Gi-Oh! The Dark Side of Dimensions Movie Pack: Gold Edition", | |
| 396 | + "set_code": "MVP1-ENGV4", | |
| 397 | + "set_rarity": "Gold Secret Rare", | |
| 398 | + "set_rarity_code": "(GScR)", | |
| 399 | + "set_price": "44.61" | |
| 400 | + } | |
| 401 | + ], | |
| 402 | + "card_images": [ | |
| 403 | + { | |
| 404 | + "id": 89631146, | |
| 405 | + "image_url": "https://images.ygoprodeck.com/images/cards/89631146.jpg", | |
| 406 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/89631146.jpg", | |
| 407 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/89631146.jpg" | |
| 408 | + }, | |
| 409 | + { | |
| 410 | + "id": 89631145, | |
| 411 | + "image_url": "https://images.ygoprodeck.com/images/cards/89631145.jpg", | |
| 412 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/89631145.jpg", | |
| 413 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/89631145.jpg" | |
| 414 | + }, | |
| 415 | + { | |
| 416 | + "id": 89631144, | |
| 417 | + "image_url": "https://images.ygoprodeck.com/images/cards/89631144.jpg", | |
| 418 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/89631144.jpg", | |
| 419 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/89631144.jpg" | |
| 420 | + }, | |
| 421 | + { | |
| 422 | + "id": 89631143, | |
| 423 | + "image_url": "https://images.ygoprodeck.com/images/cards/89631143.jpg", | |
| 424 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/89631143.jpg", | |
| 425 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/89631143.jpg" | |
| 426 | + }, | |
| 427 | + { | |
| 428 | + "id": 89631142, | |
| 429 | + "image_url": "https://images.ygoprodeck.com/images/cards/89631142.jpg", | |
| 430 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/89631142.jpg", | |
| 431 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/89631142.jpg" | |
| 432 | + }, | |
| 433 | + { | |
| 434 | + "id": 89631139, | |
| 435 | + "image_url": "https://images.ygoprodeck.com/images/cards/89631139.jpg", | |
| 436 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/89631139.jpg", | |
| 437 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/89631139.jpg" | |
| 438 | + }, | |
| 439 | + { | |
| 440 | + "id": 89631140, | |
| 441 | + "image_url": "https://images.ygoprodeck.com/images/cards/89631140.jpg", | |
| 442 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/89631140.jpg", | |
| 443 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/89631140.jpg" | |
| 444 | + }, | |
| 445 | + { | |
| 446 | + "id": 89631141, | |
| 447 | + "image_url": "https://images.ygoprodeck.com/images/cards/89631141.jpg", | |
| 448 | + "image_url_small": "https://images.ygoprodeck.com/images/cards_small/89631141.jpg", | |
| 449 | + "image_url_cropped": "https://images.ygoprodeck.com/images/cards_cropped/89631141.jpg" | |
| 450 | + } | |
| 451 | + ], | |
| 452 | + "card_prices": [ | |
| 453 | + { | |
| 454 | + "cardmarket_price": "0.06", | |
| 455 | + "tcgplayer_price": "0.13", | |
| 456 | + "ebay_price": "5.95", | |
| 457 | + "amazon_price": "3.90", | |
| 458 | + "coolstuffinc_price": "0.99" | |
| 459 | + } | |
| 460 | + ], | |
| 461 | + "misc_info": [ | |
| 462 | + { | |
| 463 | + "konami_id": 4007, | |
| 464 | + "tcg_date": "2002-03-08", | |
| 465 | + "ocg_date": "1999-03-06", | |
| 466 | + "md_rarity": "Ultra Rare", | |
| 467 | + "treated_as": "Blue-Eyes White Dragon" | |
| 468 | + } | |
| 469 | + ] | |
| 470 | + } | |
| 471 | + } | |
| 472 | + }, | |
| 473 | + "expect": { | |
| 474 | + "minCount": 54, | |
| 475 | + "kinds": [ | |
| 476 | + "catalog_item", | |
| 477 | + "price_observation" | |
| 478 | + ], | |
| 479 | + "requiredFields": [ | |
| 480 | + "attributes.identifiers.ygo_id", | |
| 481 | + "attributes.set", | |
| 482 | + "attributes.number" | |
| 483 | + ] | |
| 484 | + }, | |
| 485 | + "note": "Live capture of cardinfo.php?name=…&misc=yes (trimmed).", | |
| 486 | + "capturedAt": "2026-09-07T04:27:53.793Z" | |
| 487 | +} | |
| \ No newline at end of file | ||
added
docs/METHODOLOGY.md
+127 −0
@@ -0,0 +1,127 @@ | ||
| 1 | +# RareIndex methodology | |
| 2 | + | |
| 3 | +RareIndex turns fragmented public collectibles data into structured market data. This page explains | |
| 4 | +how every number on the platform is produced, what evidence it rests on, and where its limits are. | |
| 5 | +Nothing on RareIndex is invented: every sale, listing, guide price, population count and index value | |
| 6 | +traces back to a source record with its URL, capture time, parser version and connector version. | |
| 7 | + | |
| 8 | +## 1. Data sources and pipeline | |
| 9 | + | |
| 10 | +Data enters through connectors (marketplaces, auction houses, price guides, grading companies, | |
| 11 | +catalogs). Each capture is stored immutably as a raw record, then normalised into a canonical shape, | |
| 12 | +matched to a canonical asset (entity resolution), de-duplicated, validated and only then written to | |
| 13 | +the sales, listings and observations tables that feed valuations and indices. | |
| 14 | + | |
| 15 | +Three kinds of price evidence are kept strictly apart: | |
| 16 | + | |
| 17 | +| Evidence | Meaning | Used for | | |
| 18 | +| --- | --- | --- | | |
| 19 | +| **Sale** | An observed transaction with a source date and price | RIV, indices, records, liquidity | | |
| 20 | +| **Listing** | An asking price; not a transaction | Value opportunity, spread, supply signals | | |
| 21 | +| **Price observation** | A published guide value (e.g. a marketplace's market price) | Fallback estimate only, flagged as guide-based | | |
| 22 | + | |
| 23 | +Currency: every price is stored in its native currency together with the USD conversion at the | |
| 24 | +**historical** ECB reference rate of the transaction date. Display currencies are converted at view | |
| 25 | +time; historical sales are never converted at today's rate. | |
| 26 | + | |
| 27 | +## 2. Entity resolution | |
| 28 | + | |
| 29 | +Descriptions of the same object differ across sources ("1999 Pokemon Base Charizard 1st PSA 10" vs | |
| 30 | +"Pokémon Base Set Charizard Holo 1st Edition #4/102 PSA GEM MT 10"). Records are resolved in order: | |
| 31 | +deterministic identifiers (catalog ids, style codes, set numbers, references, UPC/ISBN) → a | |
| 32 | +deterministic canonical key built from structured attributes per category → trigram similarity of | |
| 33 | +titles constrained by hard discriminators (card number, set, year) → creation of a new asset. The | |
| 34 | +match method and confidence are stored on every record, and grade/condition slices are kept as | |
| 35 | +variants of the asset (PSA 10, CIB, deadstock size 10 …) so that different grades are never mixed. | |
| 36 | + | |
| 37 | +## 3. RIV — RareIndex Valuation | |
| 38 | + | |
| 39 | +RIV is an ensemble estimate of the current market value of a variant, computed from verified | |
| 40 | +transactions in the last 365 days (extended to three years when fewer than five recent sales exist, | |
| 41 | +in which case confidence is capped). | |
| 42 | + | |
| 43 | +The estimators are: latest sale, medians of the last 5/10/20 sales, a trimmed mean (10 % each tail), | |
| 44 | +an exponentially weighted mean (90-day half-life) and a weighted mean using source trust, | |
| 45 | +identification confidence and recency. RIV is the median of the core estimators. The low/high band | |
| 46 | +comes from the inter-quartile range of the sales used (widened to at least ±5 %). | |
| 47 | + | |
| 48 | +When a variant has fewer than three sales, RIV may fall back to **grade-adjusted comparables** | |
| 49 | +(sales of other grades of the same asset, adjusted by empirical grade premiums) and, as a last | |
| 50 | +resort, to **guide observations**. Fallback estimates are labelled and their confidence is capped at | |
| 51 | +0.5 (comps) or 0.45 (guide-based). With no evidence at all, RareIndex shows *Data unavailable*. | |
| 52 | + | |
| 53 | +### Confidence | |
| 54 | + | |
| 55 | +Confidence (0–1, shown as High ≥ 0.75, Medium ≥ 0.5, Low > 0.2, Insufficient otherwise) combines | |
| 56 | +sample size (log-scaled, 40 sales ≈ maximum), dispersion of log prices (robust MAD), recency of the | |
| 57 | +latest sale and the trust/identification quality of the sales used. Every RIV is displayed with its | |
| 58 | +sample size, confidence and computation time. | |
| 59 | + | |
| 60 | +### Outliers | |
| 61 | + | |
| 62 | +Within a variant, sales whose modified z-score on log price exceeds 3.5 are **flagged**, not deleted; | |
| 63 | +bundles and multi-quantity lots are excluded from pricing. Every flag is written to the audit log with | |
| 64 | +its reason. | |
| 65 | + | |
| 66 | +### Grade premiums | |
| 67 | + | |
| 68 | +For each category, grader and grade, RareIndex measures the median ratio between graded and raw | |
| 69 | +sales of the same assets (at least eight paired assets). PSA 10, BGS 10 and CGC 10 are never assumed | |
| 70 | +equivalent; premiums are only ever derived from paired evidence. | |
| 71 | + | |
| 72 | +## 4. Scores | |
| 73 | + | |
| 74 | +- **Liquidity (0–100)**: sales per month, active listings, number of sources, median days between | |
| 75 | + sales and the spread between asks and RIV. | |
| 76 | +- **Rarity (0–100)**: graded population, production quantity when documented, and observed | |
| 77 | + sale/listing frequency. Rarity is *null* when no supply signal exists — it is never guessed. | |
| 78 | +- **Momentum (−100…100)** over 7d/30d/90d/1y: price change against the RIV history blended with | |
| 79 | + transaction-volume acceleration. | |
| 80 | +- **Value opportunity**: discount of an active ask against RIV, shown only when RIV confidence ≥ 0.5. | |
| 81 | + Analytical information, not investment advice. | |
| 82 | +- **Data quality (0–100)**: attribute completeness, source trust, identification confidence, images | |
| 83 | + and transaction evidence. | |
| 84 | +- **Trending**: geometric blend of price, volume and listing momenta. | |
| 85 | + | |
| 86 | +## 5. Indices | |
| 87 | + | |
| 88 | +Each subindex (RARE-TCG, RARE-WATCH, …) is a **chain-linked** index of daily RIV changes across its | |
| 89 | +constituents: assets with a valuation confidence of at least 0.4 and at least three sales in the last | |
| 90 | +twelve months (one variant per asset, the most traded). Each day the index moves by the trimmed, | |
| 91 | +equal-weight average of constituents' log returns; composition can change daily without breaking | |
| 92 | +the level. Base = 1000 on 2024-01-01. An index publishes nothing until it has its minimum number of | |
| 93 | +constituents (10 for subindices, 25 for RARE), and every point stores its constituent count and | |
| 94 | +coverage. | |
| 95 | + | |
| 96 | +**RARE**, the flagship index, is the transaction-weighted average of subindex daily returns. | |
| 97 | + | |
| 98 | +A **repeat-sales** estimator (pairs of sales of the same variant, monthly periods, least squares) | |
| 99 | +is provided for research views; it is less exposed to composition bias but requires many pairs. | |
| 100 | + | |
| 101 | +Historical index and asset series are reconstructed from transactions only: for each week since the | |
| 102 | +first sale, the valuation is recomputed with the sales known at that date. | |
| 103 | + | |
| 104 | +## 6. Market capitalisation | |
| 105 | + | |
| 106 | +Category market capitalisation is estimated as Σ (graded population × RIV) **only** for assets with | |
| 107 | +a published population report; the estimate carries a coverage-based confidence label and is never | |
| 108 | +shown as a precise figure. | |
| 109 | + | |
| 110 | +## 7. Benchmarks and correlations | |
| 111 | + | |
| 112 | +Benchmark series (S&P 500, NASDAQ, Bitcoin, CPI, Case-Shiller) come from public datasets (FRED, | |
| 113 | +stooq). Correlations between subindices are Pearson coefficients of daily log returns over 30/90/365 | |
| 114 | +days; collectibles trade far less frequently than securities, so daily comparisons should be read | |
| 115 | +with that in mind. | |
| 116 | + | |
| 117 | +## 8. Rare Radar and records | |
| 118 | + | |
| 119 | +Record sales are the highest verified transactions per category. Radar findings (price | |
| 120 | +discrepancies, first listings in years, ultra-low populations) are derived mechanically from stored | |
| 121 | +transactions, listings and population reports with the underlying evidence attached. | |
| 122 | + | |
| 123 | +## 9. Freshness and limits | |
| 124 | + | |
| 125 | +Connectors run on schedules tuned to each source; every statistic shows its last update. Coverage | |
| 126 | +is uneven by design: categories with few public transactions show fewer valuations and no index | |
| 127 | +rather than a fabricated one. | |
added
docs/PENDING-SCHEMA.md
+11 −0
@@ -0,0 +1,11 @@ | ||
| 1 | +# Pending schema changes (to be folded into the next generated migration) | |
| 2 | + | |
| 3 | +Applied locally with `drizzle-kit push`; regenerate one migration at integration with `pnpm db:generate`. | |
| 4 | + | |
| 5 | +## packages/database/src/schema/ingestion.ts — `normalized_records` | |
| 6 | +- **added** `seq integer not null default 0` — position of the record within `normalize(raw)` output (one raw row commonly yields a catalog item + several price observations). | |
| 7 | +- **changed** unique index `normalized_records_raw_uq`: `(raw_record_id)` → `(raw_record_id, kind, seq)`. | |
| 8 | + | |
| 9 | +## Notes | |
| 10 | +- No other table/column changes were needed by the pipeline; the `assets_title_trgm` GIN index declared in the schema was missing from the local DB and got created by the push (it is already in migration 0000). | |
| 11 | +- pg-boss creates and manages its own schema `pgboss` at worker start (not part of Drizzle migrations). | |
added
docs/SPEC-original.md
+2495 −0
@@ -0,0 +1,4204 @@ | ||
| 1 | +> Verbatim product mandate as provided on 2026-09-07. The repository CLAUDE.md is the condensed working version; this file is the authoritative full text. | |
| 2 | + | |
| 3 | +# CLAUDE.md | |
| 4 | + | |
| 5 | +## RareIndex.io | |
| 6 | + | |
| 7 | +Global Collectibles Market Intelligence, Search, Pricing & Index Platform | |
| 8 | + | |
| 9 | +RareIndex.io must become the global reference platform for discovering, tracking, pricing, comparing, analyzing, and researching collectible assets. | |
| 10 | + | |
| 11 | +The ambition is significantly larger than a marketplace aggregator. | |
| 12 | + | |
| 13 | +RareIndex should become: | |
| 14 | + | |
| 15 | +The Bloomberg Terminal, Google, CoinMarketCap, Zillow, and StockX of the global collectibles economy. | |
| 16 | + | |
| 17 | +The platform must continuously collect public market data from marketplaces, auction houses, dealers, specialized websites, historical databases, grading companies, collector communities, manufacturer catalogs, archives, and other relevant sources. | |
| 18 | + | |
| 19 | +RareIndex should cover as many collectible categories as technically possible. | |
| 20 | + | |
| 21 | +The architecture must be built around: | |
| 22 | + | |
| 23 | +- Firecrawl | |
| 24 | +- Scrapfly | |
| 25 | +- direct APIs when available | |
| 26 | +- structured feeds | |
| 27 | +- official datasets | |
| 28 | +- auction databases | |
| 29 | +- marketplace connectors | |
| 30 | +- AI extraction | |
| 31 | +- multimodal image analysis | |
| 32 | +- entity resolution | |
| 33 | +- historical sale normalization | |
| 34 | +- deduplication | |
| 35 | +- valuation models | |
| 36 | +- global collectible indices | |
| 37 | +- category indices | |
| 38 | +- individual asset price histories | |
| 39 | +- collection tracking | |
| 40 | +- alerts | |
| 41 | +- comparable-sales analysis | |
| 42 | +- rarity analysis | |
| 43 | +- grading normalization | |
| 44 | +- liquidity analysis | |
| 45 | +- AI-assisted identification | |
| 46 | + | |
| 47 | +The platform language must be English-first. | |
| 48 | + | |
| 49 | +The application must be: | |
| 50 | + | |
| 51 | +- extremely fast | |
| 52 | +- visually exceptional | |
| 53 | +- mobile-first | |
| 54 | +- responsive | |
| 55 | +- data dense without feeling cluttered | |
| 56 | +- professional | |
| 57 | +- credible | |
| 58 | +- research-grade | |
| 59 | +- scalable to hundreds of millions of records | |
| 60 | + | |
| 61 | +## 1. CORE PRODUCT VISION | |
| 62 | + | |
| 63 | +RareIndex should answer questions such as: | |
| 64 | + | |
| 65 | +- What is this collectible worth? | |
| 66 | +- How rare is it? | |
| 67 | +- Has its value increased? | |
| 68 | +- What are the latest comparable sales? | |
| 69 | +- Where is it currently for sale? | |
| 70 | +- Which marketplace has the cheapest listing? | |
| 71 | +- What is the global market price? | |
| 72 | +- What is the price trend? | |
| 73 | +- What is the liquidity? | |
| 74 | +- How often does it sell? | |
| 75 | +- Is the market accelerating or declining? | |
| 76 | +- What grade commands the highest premium? | |
| 77 | +- Is this listing unusually cheap? | |
| 78 | +- Is this listing unusually expensive? | |
| 79 | +- Is the collectible likely misidentified? | |
| 80 | +- How many examples exist? | |
| 81 | +- What are similar collectibles? | |
| 82 | +- What are the most valuable objects in this category? | |
| 83 | +- What collectibles are trending globally? | |
| 84 | +- Which categories are outperforming? | |
| 85 | +- Where are collectors moving capital? | |
| 86 | +- How has Pokémon performed versus watches? | |
| 87 | +- How has LEGO performed versus the S&P 500? | |
| 88 | +- What are the best performing collectibles over 1Y / 5Y / 10Y? | |
| 89 | +- What is the most liquid collectible market? | |
| 90 | +- What items are becoming scarce? | |
| 91 | +- What discontinued products are appreciating rapidly? | |
| 92 | + | |
| 93 | +RareIndex must transform fragmented collectible markets into structured financial-style data. | |
| 94 | + | |
| 95 | +## 2. PRIMARY PLATFORM MODULES | |
| 96 | + | |
| 97 | +Main navigation: | |
| 98 | + | |
| 99 | +1. Home | |
| 100 | +2. Explore | |
| 101 | +3. Markets | |
| 102 | +4. Categories | |
| 103 | +5. RareIndex | |
| 104 | +6. Trending | |
| 105 | +7. Sales | |
| 106 | +8. Listings | |
| 107 | +9. Auctions | |
| 108 | +10. Price History | |
| 109 | +11. Collections | |
| 110 | +12. Watchlist | |
| 111 | +13. Compare | |
| 112 | +14. Scanner | |
| 113 | +15. AI Research | |
| 114 | +16. Market Map | |
| 115 | +17. Grading | |
| 116 | +18. Auction Calendar | |
| 117 | +19. News | |
| 118 | +20. Data | |
| 119 | +21. API | |
| 120 | +22. About | |
| 121 | + | |
| 122 | +## 3. RAREINDEX GLOBAL INDEX | |
| 123 | + | |
| 124 | +Create a flagship index: | |
| 125 | + | |
| 126 | +RareIndex Global Collectibles Index | |
| 127 | + | |
| 128 | +Ticker: | |
| 129 | + | |
| 130 | +RARE | |
| 131 | + | |
| 132 | +Possible subindices: | |
| 133 | + | |
| 134 | +- RARE-TCG | |
| 135 | +- RARE-SPORT | |
| 136 | +- RARE-WATCH | |
| 137 | +- RARE-SNEAKER | |
| 138 | +- RARE-LEGO | |
| 139 | +- RARE-COMIC | |
| 140 | +- RARE-GAME | |
| 141 | +- RARE-ART | |
| 142 | +- RARE-LUXURY | |
| 143 | +- RARE-WINE | |
| 144 | +- RARE-COIN | |
| 145 | +- RARE-TOY | |
| 146 | +- RARE-MUSIC | |
| 147 | +- RARE-AUTO | |
| 148 | +- RARE-TECH | |
| 149 | +- RARE-BOOK | |
| 150 | +- RARE-MILITARIA | |
| 151 | +- RARE-SPACE | |
| 152 | +- RARE-FOSSIL | |
| 153 | +- RARE-DESIGN | |
| 154 | + | |
| 155 | +Each index should support: | |
| 156 | + | |
| 157 | +- current value | |
| 158 | +- daily change | |
| 159 | +- weekly change | |
| 160 | +- monthly change | |
| 161 | +- YTD | |
| 162 | +- 1 year | |
| 163 | +- 3 years | |
| 164 | +- 5 years | |
| 165 | +- 10 years | |
| 166 | +- all time | |
| 167 | +- volatility | |
| 168 | +- drawdown | |
| 169 | +- liquidity score | |
| 170 | +- transaction count | |
| 171 | +- median sale price | |
| 172 | +- average sale price | |
| 173 | +- market capitalization estimate | |
| 174 | +- number of tracked assets | |
| 175 | +- category breadth | |
| 176 | +- momentum | |
| 177 | + | |
| 178 | +## 4. COLLECTIBLE CATEGORY UNIVERSE | |
| 179 | + | |
| 180 | +The architecture MUST NOT hardcode a small number of collectible categories. | |
| 181 | + | |
| 182 | +Use an extensible taxonomy. | |
| 183 | + | |
| 184 | +Every category should support: | |
| 185 | + | |
| 186 | +- category | |
| 187 | +- subcategory | |
| 188 | +- franchise | |
| 189 | +- brand | |
| 190 | +- series | |
| 191 | +- model | |
| 192 | +- release | |
| 193 | +- variant | |
| 194 | +- year | |
| 195 | +- edition | |
| 196 | +- condition | |
| 197 | +- grade | |
| 198 | +- grading company | |
| 199 | +- certification number | |
| 200 | +- provenance | |
| 201 | +- country | |
| 202 | +- material | |
| 203 | +- size | |
| 204 | +- color | |
| 205 | +- serial number | |
| 206 | +- production quantity | |
| 207 | +- rarity | |
| 208 | +- population | |
| 209 | +- original MSRP | |
| 210 | +- estimated value | |
| 211 | +- latest sale | |
| 212 | +- listing price | |
| 213 | +- currency | |
| 214 | +- marketplace | |
| 215 | +- images | |
| 216 | +- description | |
| 217 | +- source URLs | |
| 218 | + | |
| 219 | +## 5. CATEGORY MASTER LIST | |
| 220 | + | |
| 221 | +RareIndex should attempt to cover all of the following. | |
| 222 | + | |
| 223 | +### 5.1 Trading Cards | |
| 224 | + | |
| 225 | +Pokémon | |
| 226 | + | |
| 227 | +Track: | |
| 228 | + | |
| 229 | +- Base Set | |
| 230 | +- Base Set 2 | |
| 231 | +- Jungle | |
| 232 | +- Fossil | |
| 233 | +- Team Rocket | |
| 234 | +- Gym Heroes | |
| 235 | +- Gym Challenge | |
| 236 | +- Neo Genesis | |
| 237 | +- Neo Discovery | |
| 238 | +- Neo Revelation | |
| 239 | +- Neo Destiny | |
| 240 | +- Legendary Collection | |
| 241 | +- Expedition | |
| 242 | +- Aquapolis | |
| 243 | +- Skyridge | |
| 244 | +- EX era | |
| 245 | +- Diamond & Pearl | |
| 246 | +- Platinum | |
| 247 | +- HeartGold SoulSilver | |
| 248 | +- Black & White | |
| 249 | +- XY | |
| 250 | +- Sun & Moon | |
| 251 | +- Sword & Shield | |
| 252 | +- Scarlet & Violet | |
| 253 | +- Japanese expansions | |
| 254 | +- Korean editions | |
| 255 | +- Chinese editions | |
| 256 | +- promotional cards | |
| 257 | +- tournament cards | |
| 258 | +- trophy cards | |
| 259 | +- staff cards | |
| 260 | +- prerelease cards | |
| 261 | +- stamped cards | |
| 262 | +- error cards | |
| 263 | +- shadowless | |
| 264 | +- first edition | |
| 265 | +- unlimited | |
| 266 | +- reverse holo | |
| 267 | +- holo | |
| 268 | +- secret rare | |
| 269 | +- illustration rare | |
| 270 | +- special illustration rare | |
| 271 | +- gold cards | |
| 272 | +- rainbow rares | |
| 273 | +- alternate arts | |
| 274 | + | |
| 275 | +Grades: | |
| 276 | + | |
| 277 | +- PSA | |
| 278 | +- BGS | |
| 279 | +- CGC | |
| 280 | +- SGC | |
| 281 | +- TAG | |
| 282 | +- raw | |
| 283 | + | |
| 284 | +### 5.2 Magic: The Gathering | |
| 285 | + | |
| 286 | +Track: | |
| 287 | + | |
| 288 | +- Alpha | |
| 289 | +- Beta | |
| 290 | +- Unlimited | |
| 291 | +- Revised | |
| 292 | +- Arabian Nights | |
| 293 | +- Antiquities | |
| 294 | +- Legends | |
| 295 | +- The Dark | |
| 296 | +- Fallen Empires | |
| 297 | +- Ice Age | |
| 298 | +- Alliances | |
| 299 | +- Mirage | |
| 300 | +- Visions | |
| 301 | +- Weatherlight | |
| 302 | +- Tempest | |
| 303 | +- Urza block | |
| 304 | +- Mercadian Masques | |
| 305 | +- Invasion | |
| 306 | +- Odyssey | |
| 307 | +- Onslaught | |
| 308 | +- Mirrodin | |
| 309 | +- Kamigawa | |
| 310 | +- Ravnica | |
| 311 | +- Lorwyn | |
| 312 | +- Zendikar | |
| 313 | +- Innistrad | |
| 314 | +- Return to Ravnica | |
| 315 | +- Theros | |
| 316 | +- Khans | |
| 317 | +- Battle for Zendikar | |
| 318 | +- Kaladesh | |
| 319 | +- Dominaria | |
| 320 | +- War of the Spark | |
| 321 | +- Modern Horizons | |
| 322 | +- Commander | |
| 323 | +- Secret Lair | |
| 324 | +- serialized cards | |
| 325 | +- artist proofs | |
| 326 | +- reserved list | |
| 327 | +- Judge promos | |
| 328 | +- foils | |
| 329 | +- etched foils | |
| 330 | +- masterpieces | |
| 331 | +- special treatments | |
| 332 | + | |
| 333 | +### 5.3 Yu-Gi-Oh! | |
| 334 | + | |
| 335 | +Track: | |
| 336 | + | |
| 337 | +- Legend of Blue Eyes | |
| 338 | +- Metal Raiders | |
| 339 | +- Spell Ruler | |
| 340 | +- Pharaoh's Servant | |
| 341 | +- Labyrinth of Nightmare | |
| 342 | +- Legacy of Darkness | |
| 343 | +- tournament packs | |
| 344 | +- championship cards | |
| 345 | +- prize cards | |
| 346 | +- Ghost Rare | |
| 347 | +- Ultimate Rare | |
| 348 | +- Collector Rare | |
| 349 | +- Starlight Rare | |
| 350 | +- Quarter Century | |
| 351 | +- first edition | |
| 352 | +- unlimited | |
| 353 | +- Japanese cards | |
| 354 | +- Korean cards | |
| 355 | +- promotional cards | |
| 356 | + | |
| 357 | +### 5.4 One Piece Card Game | |
| 358 | + | |
| 359 | +Track: | |
| 360 | + | |
| 361 | +- booster sets | |
| 362 | +- starter decks | |
| 363 | +- promotional cards | |
| 364 | +- manga rares | |
| 365 | +- alternate arts | |
| 366 | +- tournament cards | |
| 367 | +- championship cards | |
| 368 | +- serialized cards | |
| 369 | +- Japanese variants | |
| 370 | +- English variants | |
| 371 | + | |
| 372 | +### 5.5 Disney Lorcana | |
| 373 | + | |
| 374 | +Track: | |
| 375 | + | |
| 376 | +- First Chapter | |
| 377 | +- Rise of the Floodborn | |
| 378 | +- Into the Inklands | |
| 379 | +- Ursula's Return | |
| 380 | +- Shimmering Skies | |
| 381 | +- future sets | |
| 382 | +- Enchanted cards | |
| 383 | +- promos | |
| 384 | +- tournament cards | |
| 385 | +- graded cards | |
| 386 | + | |
| 387 | +### 5.6 Other TCGs | |
| 388 | + | |
| 389 | +Include: | |
| 390 | + | |
| 391 | +- Dragon Ball Super | |
| 392 | +- Dragon Ball Masters | |
| 393 | +- Digimon | |
| 394 | +- Flesh and Blood | |
| 395 | +- Weiss Schwarz | |
| 396 | +- Final Fantasy TCG | |
| 397 | +- Star Wars Unlimited | |
| 398 | +- Star Wars CCG | |
| 399 | +- Star Wars Destiny | |
| 400 | +- Naruto | |
| 401 | +- My Hero Academia | |
| 402 | +- UniVersus | |
| 403 | +- MetaZoo | |
| 404 | +- Cardfight Vanguard | |
| 405 | +- Battle Spirits | |
| 406 | +- Force of Will | |
| 407 | +- KeyForge | |
| 408 | +- Chaotic | |
| 409 | +- Duel Masters | |
| 410 | +- Altered | |
| 411 | +- Sorcery Contested Realm | |
| 412 | +- Riftbound | |
| 413 | +- Grand Archive | |
| 414 | +- Gundam Card Game | |
| 415 | +- Marvel trading cards | |
| 416 | +- DC trading cards | |
| 417 | +- Garbage Pail Kids | |
| 418 | +- Topps entertainment cards | |
| 419 | +- non-sport cards | |
| 420 | + | |
| 421 | +## 6. SPORTS CARDS | |
| 422 | + | |
| 423 | +Sports: | |
| 424 | + | |
| 425 | +- baseball | |
| 426 | +- basketball | |
| 427 | +- hockey | |
| 428 | +- American football | |
| 429 | +- soccer | |
| 430 | +- Formula 1 | |
| 431 | +- UFC | |
| 432 | +- boxing | |
| 433 | +- golf | |
| 434 | +- tennis | |
| 435 | +- cricket | |
| 436 | +- wrestling | |
| 437 | +- NASCAR | |
| 438 | +- Olympics | |
| 439 | +- lacrosse | |
| 440 | +- rugby | |
| 441 | + | |
| 442 | +Brands: | |
| 443 | + | |
| 444 | +- Topps | |
| 445 | +- Panini | |
| 446 | +- Upper Deck | |
| 447 | +- Bowman | |
| 448 | +- Fleer | |
| 449 | +- Donruss | |
| 450 | +- Score | |
| 451 | +- Leaf | |
| 452 | +- Futera | |
| 453 | + | |
| 454 | +Track: | |
| 455 | + | |
| 456 | +- rookie cards | |
| 457 | +- numbered cards | |
| 458 | +- parallels | |
| 459 | +- refractors | |
| 460 | +- autographs | |
| 461 | +- patches | |
| 462 | +- memorabilia cards | |
| 463 | +- game-used cards | |
| 464 | +- one-of-one cards | |
| 465 | +- printing plates | |
| 466 | +- redemptions | |
| 467 | +- inserts | |
| 468 | +- short prints | |
| 469 | +- super short prints | |
| 470 | + | |
| 471 | +## 7. COMICS | |
| 472 | + | |
| 473 | +Publishers: | |
| 474 | + | |
| 475 | +- Marvel | |
| 476 | +- DC | |
| 477 | +- Image | |
| 478 | +- Dark Horse | |
| 479 | +- IDW | |
| 480 | +- Boom Studios | |
| 481 | +- Archie | |
| 482 | +- Valiant | |
| 483 | +- Dynamite | |
| 484 | +- EC Comics | |
| 485 | + | |
| 486 | +Track: | |
| 487 | + | |
| 488 | +- first appearances | |
| 489 | +- first issues | |
| 490 | +- key issues | |
| 491 | +- variants | |
| 492 | +- retailer exclusives | |
| 493 | +- convention exclusives | |
| 494 | +- signed copies | |
| 495 | +- sketch covers | |
| 496 | +- newsstand variants | |
| 497 | +- direct editions | |
| 498 | +- pedigree copies | |
| 499 | + | |
| 500 | +Grades: | |
| 501 | + | |
| 502 | +- CGC | |
| 503 | +- CBCS | |
| 504 | +- raw | |
| 505 | + | |
| 506 | +## 8. MANGA | |
| 507 | + | |
| 508 | +Track: | |
| 509 | + | |
| 510 | +- first editions | |
| 511 | +- first printings | |
| 512 | +- limited printings | |
| 513 | +- signed copies | |
| 514 | +- Japanese original editions | |
| 515 | +- English editions | |
| 516 | +- French editions | |
| 517 | +- box sets | |
| 518 | +- special editions | |
| 519 | +- promotional volumes | |
| 520 | + | |
| 521 | +Series examples: | |
| 522 | + | |
| 523 | +- Dragon Ball | |
| 524 | +- One Piece | |
| 525 | +- Naruto | |
| 526 | +- Bleach | |
| 527 | +- Berserk | |
| 528 | +- Vagabond | |
| 529 | +- Slam Dunk | |
| 530 | +- Akira | |
| 531 | +- Attack on Titan | |
| 532 | +- Demon Slayer | |
| 533 | +- Jujutsu Kaisen | |
| 534 | +- Chainsaw Man | |
| 535 | +- Hunter x Hunter | |
| 536 | +- JoJo | |
| 537 | +- Death Note | |
| 538 | +- Sailor Moon | |
| 539 | + | |
| 540 | +## 9. VIDEO GAMES | |
| 541 | + | |
| 542 | +Platforms: | |
| 543 | + | |
| 544 | +- Atari | |
| 545 | +- Intellivision | |
| 546 | +- ColecoVision | |
| 547 | +- NES | |
| 548 | +- Famicom | |
| 549 | +- SNES | |
| 550 | +- Super Famicom | |
| 551 | +- Nintendo 64 | |
| 552 | +- GameCube | |
| 553 | +- Wii | |
| 554 | +- Wii U | |
| 555 | +- Switch | |
| 556 | +- Game Boy | |
| 557 | +- Game Boy Color | |
| 558 | +- Game Boy Advance | |
| 559 | +- Nintendo DS | |
| 560 | +- 3DS | |
| 561 | +- Sega Master System | |
| 562 | +- Genesis | |
| 563 | +- Mega Drive | |
| 564 | +- Saturn | |
| 565 | +- Dreamcast | |
| 566 | +- Game Gear | |
| 567 | +- PlayStation | |
| 568 | +- PS2 | |
| 569 | +- PS3 | |
| 570 | +- PS4 | |
| 571 | +- PS5 | |
| 572 | +- PSP | |
| 573 | +- Vita | |
| 574 | +- Xbox | |
| 575 | +- Xbox 360 | |
| 576 | +- Xbox One | |
| 577 | +- Xbox Series | |
| 578 | +- Neo Geo | |
| 579 | +- PC Engine | |
| 580 | +- TurboGrafx | |
| 581 | +- MSX | |
| 582 | +- Commodore | |
| 583 | +- Amiga | |
| 584 | +- PC games | |
| 585 | + | |
| 586 | +Track: | |
| 587 | + | |
| 588 | +- sealed games | |
| 589 | +- graded games | |
| 590 | +- CIB | |
| 591 | +- loose | |
| 592 | +- prototypes | |
| 593 | +- review copies | |
| 594 | +- developer builds | |
| 595 | +- kiosk demos | |
| 596 | +- press kits | |
| 597 | +- collector editions | |
| 598 | +- limited editions | |
| 599 | +- regional variants | |
| 600 | +- misprints | |
| 601 | + | |
| 602 | +## 10. GAMING HARDWARE | |
| 603 | + | |
| 604 | +Track: | |
| 605 | + | |
| 606 | +- consoles | |
| 607 | +- handhelds | |
| 608 | +- controllers | |
| 609 | +- accessories | |
| 610 | +- development kits | |
| 611 | +- prototypes | |
| 612 | +- retail demo units | |
| 613 | +- special editions | |
| 614 | +- limited editions | |
| 615 | +- anniversary editions | |
| 616 | +- transparent consoles | |
| 617 | +- promotional consoles | |
| 618 | + | |
| 619 | +## 11. ARCADE & PINBALL | |
| 620 | + | |
| 621 | +Track: | |
| 622 | + | |
| 623 | +- arcade cabinets | |
| 624 | +- PCBs | |
| 625 | +- conversion kits | |
| 626 | +- marquees | |
| 627 | +- control panels | |
| 628 | +- pinball machines | |
| 629 | +- prototypes | |
| 630 | +- tournament machines | |
| 631 | +- promotional units | |
| 632 | +- replacement art | |
| 633 | +- original parts | |
| 634 | + | |
| 635 | +## 12. SNEAKERS | |
| 636 | + | |
| 637 | +Brands: | |
| 638 | + | |
| 639 | +- Nike | |
| 640 | +- Jordan | |
| 641 | +- Adidas | |
| 642 | +- Yeezy | |
| 643 | +- New Balance | |
| 644 | +- ASICS | |
| 645 | +- Reebok | |
| 646 | +- Puma | |
| 647 | +- Converse | |
| 648 | +- Vans | |
| 649 | +- Salomon | |
| 650 | +- Hoka | |
| 651 | +- BAPE | |
| 652 | +- Supreme collaborations | |
| 653 | + | |
| 654 | +Track: | |
| 655 | + | |
| 656 | +- SKU | |
| 657 | +- size | |
| 658 | +- colorway | |
| 659 | +- release date | |
| 660 | +- original retail | |
| 661 | +- resale | |
| 662 | +- deadstock | |
| 663 | +- used | |
| 664 | +- samples | |
| 665 | +- friends & family | |
| 666 | +- player editions | |
| 667 | +- prototypes | |
| 668 | +- collaborations | |
| 669 | +- region exclusives | |
| 670 | + | |
| 671 | +## 13. WATCHES | |
| 672 | + | |
| 673 | +Brands: | |
| 674 | + | |
| 675 | +- Rolex | |
| 676 | +- Patek Philippe | |
| 677 | +- Audemars Piguet | |
| 678 | +- Richard Mille | |
| 679 | +- Vacheron Constantin | |
| 680 | +- Omega | |
| 681 | +- Cartier | |
| 682 | +- Tudor | |
| 683 | +- Breitling | |
| 684 | +- IWC | |
| 685 | +- Jaeger-LeCoultre | |
| 686 | +- A. Lange & Söhne | |
| 687 | +- Breguet | |
| 688 | +- Blancpain | |
| 689 | +- Zenith | |
| 690 | +- Grand Seiko | |
| 691 | +- Seiko | |
| 692 | +- TAG Heuer | |
| 693 | +- Panerai | |
| 694 | +- Hublot | |
| 695 | +- F.P. Journe | |
| 696 | +- MB&F | |
| 697 | +- De Bethune | |
| 698 | +- Greubel Forsey | |
| 699 | +- Urwerk | |
| 700 | + | |
| 701 | +Track: | |
| 702 | + | |
| 703 | +- reference | |
| 704 | +- dial | |
| 705 | +- bracelet | |
| 706 | +- movement | |
| 707 | +- year | |
| 708 | +- production period | |
| 709 | +- serial | |
| 710 | +- papers | |
| 711 | +- box | |
| 712 | +- service history | |
| 713 | +- auction history | |
| 714 | +- provenance | |
| 715 | + | |
| 716 | +## 14. LUXURY HANDBAGS | |
| 717 | + | |
| 718 | +Brands: | |
| 719 | + | |
| 720 | +- Hermès | |
| 721 | +- Chanel | |
| 722 | +- Louis Vuitton | |
| 723 | +- Dior | |
| 724 | +- Gucci | |
| 725 | +- Goyard | |
| 726 | +- Fendi | |
| 727 | +- Bottega Veneta | |
| 728 | +- Prada | |
| 729 | +- Celine | |
| 730 | +- Loewe | |
| 731 | +- Saint Laurent | |
| 732 | + | |
| 733 | +Models: | |
| 734 | + | |
| 735 | +- Birkin | |
| 736 | +- Kelly | |
| 737 | +- Constance | |
| 738 | +- Chanel Classic Flap | |
| 739 | +- Chanel 2.55 | |
| 740 | +- Louis Vuitton trunks | |
| 741 | +- Speedy | |
| 742 | +- Neverfull | |
| 743 | +- rare runway pieces | |
| 744 | + | |
| 745 | +Track: | |
| 746 | + | |
| 747 | +- leather | |
| 748 | +- hardware | |
| 749 | +- size | |
| 750 | +- year | |
| 751 | +- stamp | |
| 752 | +- condition | |
| 753 | +- color | |
| 754 | +- rarity | |
| 755 | + | |
| 756 | +## 15. FASHION & STREETWEAR | |
| 757 | + | |
| 758 | +Brands: | |
| 759 | + | |
| 760 | +- Supreme | |
| 761 | +- BAPE | |
| 762 | +- Palace | |
| 763 | +- Stüssy | |
| 764 | +- Kith | |
| 765 | +- Off-White | |
| 766 | +- Chrome Hearts | |
| 767 | +- Fear of God | |
| 768 | +- Stone Island | |
| 769 | +- Arc'teryx | |
| 770 | +- Kapital | |
| 771 | +- Visvim | |
| 772 | +- Neighborhood | |
| 773 | +- Undercover | |
| 774 | + | |
| 775 | +Track: | |
| 776 | + | |
| 777 | +- release | |
| 778 | +- season | |
| 779 | +- collaboration | |
| 780 | +- size | |
| 781 | +- condition | |
| 782 | +- retail price | |
| 783 | +- resale price | |
| 784 | + | |
| 785 | +## 16. LEGO | |
| 786 | + | |
| 787 | +Track: | |
| 788 | + | |
| 789 | +- sealed sets | |
| 790 | +- opened complete sets | |
| 791 | +- minifigures | |
| 792 | +- promotional sets | |
| 793 | +- employee exclusives | |
| 794 | +- convention exclusives | |
| 795 | +- LEGO House exclusives | |
| 796 | +- retired sets | |
| 797 | +- prototypes | |
| 798 | + | |
| 799 | +Themes: | |
| 800 | + | |
| 801 | +- Star Wars | |
| 802 | +- Technic | |
| 803 | +- Icons | |
| 804 | +- Ideas | |
| 805 | +- Architecture | |
| 806 | +- Modular Buildings | |
| 807 | +- Castle | |
| 808 | +- Pirates | |
| 809 | +- Space | |
| 810 | +- Harry Potter | |
| 811 | +- Marvel | |
| 812 | +- DC | |
| 813 | +- Lord of the Rings | |
| 814 | +- Indiana Jones | |
| 815 | +- Ninjago | |
| 816 | +- Bionicle | |
| 817 | +- Monkie Kid | |
| 818 | + | |
| 819 | +## 17. FUNKO | |
| 820 | + | |
| 821 | +Track: | |
| 822 | + | |
| 823 | +- Funko Pop | |
| 824 | +- Soda | |
| 825 | +- Wacky Wobblers | |
| 826 | +- prototypes | |
| 827 | +- convention exclusives | |
| 828 | +- chase editions | |
| 829 | +- vaulted products | |
| 830 | +- signed products | |
| 831 | +- error variants | |
| 832 | + | |
| 833 | +## 18. DESIGNER TOYS | |
| 834 | + | |
| 835 | +Brands/artists: | |
| 836 | + | |
| 837 | +- Bearbrick | |
| 838 | +- Medicom | |
| 839 | +- KAWS | |
| 840 | +- Kidrobot | |
| 841 | +- Superplastic | |
| 842 | +- Mighty Jaxx | |
| 843 | +- Pop Mart | |
| 844 | +- Labubu | |
| 845 | +- Molly | |
| 846 | +- Skullpanda | |
| 847 | +- Dimoo | |
| 848 | +- Banksy-related editions | |
| 849 | +- Murakami collectibles | |
| 850 | + | |
| 851 | +## 19. ACTION FIGURES | |
| 852 | + | |
| 853 | +Track: | |
| 854 | + | |
| 855 | +- Hot Toys | |
| 856 | +- Sideshow | |
| 857 | +- NECA | |
| 858 | +- Hasbro | |
| 859 | +- Mattel | |
| 860 | +- McFarlane | |
| 861 | +- Bandai | |
| 862 | +- Tamashii Nations | |
| 863 | +- S.H. Figuarts | |
| 864 | +- Mafex | |
| 865 | +- Mezco | |
| 866 | +- Nendoroid | |
| 867 | +- Figma | |
| 868 | + | |
| 869 | +Franchises: | |
| 870 | + | |
| 871 | +- Star Wars | |
| 872 | +- Marvel | |
| 873 | +- DC | |
| 874 | +- Transformers | |
| 875 | +- G.I. Joe | |
| 876 | +- TMNT | |
| 877 | +- Masters of the Universe | |
| 878 | +- Power Rangers | |
| 879 | +- Dragon Ball | |
| 880 | +- One Piece | |
| 881 | +- Gundam | |
| 882 | +- Pokémon | |
| 883 | + | |
| 884 | +## 20. VINTAGE TOYS | |
| 885 | + | |
| 886 | +Track: | |
| 887 | + | |
| 888 | +- Kenner | |
| 889 | +- Matchbox | |
| 890 | +- Hot Wheels | |
| 891 | +- Dinky Toys | |
| 892 | +- Corgi | |
| 893 | +- Barbie | |
| 894 | +- Fisher-Price | |
| 895 | +- LEGO vintage | |
| 896 | +- Playmobil | |
| 897 | +- Transformers | |
| 898 | +- G.I. Joe | |
| 899 | +- Star Wars | |
| 900 | +- He-Man | |
| 901 | +- TMNT | |
| 902 | +- My Little Pony | |
| 903 | +- Care Bears | |
| 904 | +- Polly Pocket | |
| 905 | +- Micro Machines | |
| 906 | +- Tamagotchi | |
| 907 | +- Furby | |
| 908 | +- Beanie Babies | |
| 909 | + | |
| 910 | +## 21. DOLLS | |
| 911 | + | |
| 912 | +Track: | |
| 913 | + | |
| 914 | +- Barbie | |
| 915 | +- Blythe | |
| 916 | +- American Girl | |
| 917 | +- Bratz | |
| 918 | +- Monster High | |
| 919 | +- antique dolls | |
| 920 | +- bisque dolls | |
| 921 | +- porcelain dolls | |
| 922 | +- artist dolls | |
| 923 | +- limited editions | |
| 924 | + | |
| 925 | +## 22. PLUSH | |
| 926 | + | |
| 927 | +Track: | |
| 928 | + | |
| 929 | +- Steiff | |
| 930 | +- Jellycat | |
| 931 | +- Pokémon | |
| 932 | +- Disney | |
| 933 | +- Sanrio | |
| 934 | +- Squishmallows | |
| 935 | +- Beanie Babies | |
| 936 | +- Build-A-Bear exclusives | |
| 937 | +- vintage plush | |
| 938 | + | |
| 939 | +## 23. MODEL CARS | |
| 940 | + | |
| 941 | +Brands: | |
| 942 | + | |
| 943 | +- Hot Wheels | |
| 944 | +- Matchbox | |
| 945 | +- Tomica | |
| 946 | +- Mini GT | |
| 947 | +- AUTOart | |
| 948 | +- Kyosho | |
| 949 | +- Minichamps | |
| 950 | +- BBR | |
| 951 | +- CMC | |
| 952 | +- Spark | |
| 953 | +- Tarmac Works | |
| 954 | +- GreenLight | |
| 955 | +- Maisto | |
| 956 | + | |
| 957 | +Scales: | |
| 958 | + | |
| 959 | +- 1:64 | |
| 960 | +- 1:43 | |
| 961 | +- 1:24 | |
| 962 | +- 1:18 | |
| 963 | +- 1:12 | |
| 964 | +- 1:8 | |
| 965 | + | |
| 966 | +## 24. MODEL TRAINS | |
| 967 | + | |
| 968 | +Track: | |
| 969 | + | |
| 970 | +- Märklin | |
| 971 | +- Lionel | |
| 972 | +- Hornby | |
| 973 | +- Bachmann | |
| 974 | +- Kato | |
| 975 | +- Atlas | |
| 976 | +- Fleischmann | |
| 977 | +- vintage railway models | |
| 978 | +- locomotives | |
| 979 | +- cars | |
| 980 | +- accessories | |
| 981 | +- limited sets | |
| 982 | + | |
| 983 | +## 25. AUTOMOBILES | |
| 984 | + | |
| 985 | +Collectible vehicle categories: | |
| 986 | + | |
| 987 | +- classic cars | |
| 988 | +- supercars | |
| 989 | +- hypercars | |
| 990 | +- JDM | |
| 991 | +- muscle cars | |
| 992 | +- homologation specials | |
| 993 | +- rally cars | |
| 994 | +- race cars | |
| 995 | +- concept cars | |
| 996 | +- celebrity cars | |
| 997 | +- low-production models | |
| 998 | + | |
| 999 | +Brands: | |
| 1000 | + | |
| 1001 | +- Ferrari | |
| 1002 | +- Porsche | |
| 1003 | +- Lamborghini | |
| 1004 | +- McLaren | |
| 1005 | +- Bugatti | |
| 1006 | +- Pagani | |
| 1007 | +- Koenigsegg | |
| 1008 | +- Mercedes-Benz | |
| 1009 | +- BMW | |
| 1010 | +- Audi | |
| 1011 | +- Ford | |
| 1012 | +- Chevrolet | |
| 1013 | +- Dodge | |
| 1014 | +- Nissan | |
| 1015 | +- Toyota | |
| 1016 | +- Honda | |
| 1017 | +- Mazda | |
| 1018 | +- Subaru | |
| 1019 | +- Mitsubishi | |
| 1020 | + | |
| 1021 | +## 26. MOTORCYCLES | |
| 1022 | + | |
| 1023 | +Brands: | |
| 1024 | + | |
| 1025 | +- Ducati | |
| 1026 | +- Harley-Davidson | |
| 1027 | +- Honda | |
| 1028 | +- Yamaha | |
| 1029 | +- Kawasaki | |
| 1030 | +- Suzuki | |
| 1031 | +- BMW Motorrad | |
| 1032 | +- Triumph | |
| 1033 | +- Indian | |
| 1034 | +- MV Agusta | |
| 1035 | + | |
| 1036 | +Track: | |
| 1037 | + | |
| 1038 | +- rare models | |
| 1039 | +- production numbers | |
| 1040 | +- race provenance | |
| 1041 | +- celebrity ownership | |
| 1042 | +- original condition | |
| 1043 | + | |
| 1044 | +## 27. AUTOMOTIVE MEMORABILIA | |
| 1045 | + | |
| 1046 | +Track: | |
| 1047 | + | |
| 1048 | +- steering wheels | |
| 1049 | +- race-used parts | |
| 1050 | +- engines | |
| 1051 | +- badges | |
| 1052 | +- hood ornaments | |
| 1053 | +- dealership signs | |
| 1054 | +- manuals | |
| 1055 | +- brochures | |
| 1056 | +- license plates | |
| 1057 | +- racing suits | |
| 1058 | +- helmets | |
| 1059 | +- signed parts | |
| 1060 | + | |
| 1061 | +## 28. FORMULA 1 | |
| 1062 | + | |
| 1063 | +Track: | |
| 1064 | + | |
| 1065 | +- race-used helmets | |
| 1066 | +- gloves | |
| 1067 | +- suits | |
| 1068 | +- bodywork | |
| 1069 | +- steering wheels | |
| 1070 | +- signed memorabilia | |
| 1071 | +- cards | |
| 1072 | +- programs | |
| 1073 | +- tickets | |
| 1074 | +- model cars | |
| 1075 | +- team-issued clothing | |
| 1076 | + | |
| 1077 | +Drivers: | |
| 1078 | + | |
| 1079 | +- Ayrton Senna | |
| 1080 | +- Michael Schumacher | |
| 1081 | +- Lewis Hamilton | |
| 1082 | +- Max Verstappen | |
| 1083 | +- Sebastian Vettel | |
| 1084 | +- Fernando Alonso | |
| 1085 | +- Alain Prost | |
| 1086 | +- Niki Lauda | |
| 1087 | +- future drivers dynamically | |
| 1088 | + | |
| 1089 | +## 29. SPORTS MEMORABILIA | |
| 1090 | + | |
| 1091 | +Sports: | |
| 1092 | + | |
| 1093 | +- hockey | |
| 1094 | +- baseball | |
| 1095 | +- basketball | |
| 1096 | +- football | |
| 1097 | +- soccer | |
| 1098 | +- tennis | |
| 1099 | +- golf | |
| 1100 | +- boxing | |
| 1101 | +- UFC | |
| 1102 | +- Olympics | |
| 1103 | + | |
| 1104 | +Assets: | |
| 1105 | + | |
| 1106 | +- jerseys | |
| 1107 | +- game-worn jerseys | |
| 1108 | +- match-issued jerseys | |
| 1109 | +- helmets | |
| 1110 | +- gloves | |
| 1111 | +- shoes | |
| 1112 | +- balls | |
| 1113 | +- pucks | |
| 1114 | +- bats | |
| 1115 | +- sticks | |
| 1116 | +- trophies | |
| 1117 | +- medals | |
| 1118 | +- tickets | |
| 1119 | +- autographs | |
| 1120 | +- photographs | |
| 1121 | + | |
| 1122 | +## 30. COINS | |
| 1123 | + | |
| 1124 | +Track: | |
| 1125 | + | |
| 1126 | +- ancient coins | |
| 1127 | +- Roman coins | |
| 1128 | +- Greek coins | |
| 1129 | +- medieval coins | |
| 1130 | +- US coins | |
| 1131 | +- Canadian coins | |
| 1132 | +- European coins | |
| 1133 | +- Asian coins | |
| 1134 | +- bullion coins | |
| 1135 | +- commemoratives | |
| 1136 | +- proof coins | |
| 1137 | +- mint errors | |
| 1138 | +- pattern coins | |
| 1139 | + | |
| 1140 | +Grading: | |
| 1141 | + | |
| 1142 | +- PCGS | |
| 1143 | +- NGC | |
| 1144 | +- ANACS | |
| 1145 | +- ICCS | |
| 1146 | + | |
| 1147 | +## 31. BANKNOTES | |
| 1148 | + | |
| 1149 | +Track: | |
| 1150 | + | |
| 1151 | +- world currency | |
| 1152 | +- historical notes | |
| 1153 | +- rare serial numbers | |
| 1154 | +- replacement notes | |
| 1155 | +- error notes | |
| 1156 | +- specimen notes | |
| 1157 | +- proof notes | |
| 1158 | +- obsolete currency | |
| 1159 | + | |
| 1160 | +## 32. STAMPS | |
| 1161 | + | |
| 1162 | +Track: | |
| 1163 | + | |
| 1164 | +- world stamps | |
| 1165 | +- classic issues | |
| 1166 | +- rare errors | |
| 1167 | +- inverted centers | |
| 1168 | +- first-day covers | |
| 1169 | +- postal history | |
| 1170 | +- blocks | |
| 1171 | +- sheets | |
| 1172 | +- proofs | |
| 1173 | + | |
| 1174 | +## 33. BOOKS | |
| 1175 | + | |
| 1176 | +Track: | |
| 1177 | + | |
| 1178 | +- first editions | |
| 1179 | +- first printings | |
| 1180 | +- signed editions | |
| 1181 | +- presentation copies | |
| 1182 | +- association copies | |
| 1183 | +- manuscripts | |
| 1184 | +- illuminated manuscripts | |
| 1185 | +- incunabula | |
| 1186 | +- banned editions | |
| 1187 | +- limited editions | |
| 1188 | + | |
| 1189 | +Authors across: | |
| 1190 | + | |
| 1191 | +- literature | |
| 1192 | +- fantasy | |
| 1193 | +- science fiction | |
| 1194 | +- philosophy | |
| 1195 | +- economics | |
| 1196 | +- science | |
| 1197 | +- children's literature | |
| 1198 | +- comic literature | |
| 1199 | + | |
| 1200 | +## 34. HISTORICAL DOCUMENTS | |
| 1201 | + | |
| 1202 | +Track: | |
| 1203 | + | |
| 1204 | +- letters | |
| 1205 | +- manuscripts | |
| 1206 | +- government documents | |
| 1207 | +- presidential documents | |
| 1208 | +- royal documents | |
| 1209 | +- treaties | |
| 1210 | +- maps | |
| 1211 | +- deeds | |
| 1212 | +- certificates | |
| 1213 | +- newspapers | |
| 1214 | +- telegrams | |
| 1215 | +- handwritten notes | |
| 1216 | + | |
| 1217 | +## 35. AUTOGRAPHS | |
| 1218 | + | |
| 1219 | +Categories: | |
| 1220 | + | |
| 1221 | +- politicians | |
| 1222 | +- scientists | |
| 1223 | +- astronauts | |
| 1224 | +- musicians | |
| 1225 | +- actors | |
| 1226 | +- athletes | |
| 1227 | +- authors | |
| 1228 | +- royalty | |
| 1229 | +- entrepreneurs | |
| 1230 | +- historical personalities | |
| 1231 | + | |
| 1232 | +## 36. MUSIC | |
| 1233 | + | |
| 1234 | +Track: | |
| 1235 | + | |
| 1236 | +- vinyl | |
| 1237 | +- shellac | |
| 1238 | +- CDs | |
| 1239 | +- cassettes | |
| 1240 | +- master tapes | |
| 1241 | +- acetates | |
| 1242 | +- test pressings | |
| 1243 | +- promo copies | |
| 1244 | +- signed albums | |
| 1245 | +- rare pressings | |
| 1246 | +- colored vinyl | |
| 1247 | +- box sets | |
| 1248 | + | |
| 1249 | +Artists dynamically discovered. | |
| 1250 | + | |
| 1251 | +## 37. MUSIC MEMORABILIA | |
| 1252 | + | |
| 1253 | +Track: | |
| 1254 | + | |
| 1255 | +- guitars | |
| 1256 | +- stage-used instruments | |
| 1257 | +- handwritten lyrics | |
| 1258 | +- posters | |
| 1259 | +- concert tickets | |
| 1260 | +- backstage passes | |
| 1261 | +- costumes | |
| 1262 | +- tour merchandise | |
| 1263 | +- signed items | |
| 1264 | +- awards | |
| 1265 | +- gold records | |
| 1266 | + | |
| 1267 | +## 38. MUSICAL INSTRUMENTS | |
| 1268 | + | |
| 1269 | +Track: | |
| 1270 | + | |
| 1271 | +- Fender | |
| 1272 | +- Gibson | |
| 1273 | +- Martin | |
| 1274 | +- Gretsch | |
| 1275 | +- Rickenbacker | |
| 1276 | +- PRS | |
| 1277 | +- vintage synthesizers | |
| 1278 | +- Moog | |
| 1279 | +- Roland | |
| 1280 | +- Yamaha | |
| 1281 | +- Sequential | |
| 1282 | +- drum machines | |
| 1283 | +- microphones | |
| 1284 | +- effects pedals | |
| 1285 | +- amplifiers | |
| 1286 | + | |
| 1287 | +## 39. MOVIE MEMORABILIA | |
| 1288 | + | |
| 1289 | +Track: | |
| 1290 | + | |
| 1291 | +- screen-used props | |
| 1292 | +- costumes | |
| 1293 | +- scripts | |
| 1294 | +- storyboards | |
| 1295 | +- production artwork | |
| 1296 | +- posters | |
| 1297 | +- lobby cards | |
| 1298 | +- miniatures | |
| 1299 | +- masks | |
| 1300 | +- weapons props | |
| 1301 | +- signed items | |
| 1302 | + | |
| 1303 | +## 40. MOVIE POSTERS | |
| 1304 | + | |
| 1305 | +Track: | |
| 1306 | + | |
| 1307 | +- one sheets | |
| 1308 | +- half sheets | |
| 1309 | +- inserts | |
| 1310 | +- lobby cards | |
| 1311 | +- international posters | |
| 1312 | +- original theatrical posters | |
| 1313 | +- rare variants | |
| 1314 | +- recalled posters | |
| 1315 | + | |
| 1316 | +## 41. ANIMATION ART | |
| 1317 | + | |
| 1318 | +Track: | |
| 1319 | + | |
| 1320 | +- production cels | |
| 1321 | +- backgrounds | |
| 1322 | +- concept art | |
| 1323 | +- key animation | |
| 1324 | +- storyboards | |
| 1325 | +- model sheets | |
| 1326 | +- signed cels | |
| 1327 | + | |
| 1328 | +Studios: | |
| 1329 | + | |
| 1330 | +- Disney | |
| 1331 | +- Warner Bros. | |
| 1332 | +- Studio Ghibli | |
| 1333 | +- Toei | |
| 1334 | +- Gainax | |
| 1335 | +- Madhouse | |
| 1336 | +- Production I.G | |
| 1337 | +- Pixar | |
| 1338 | +- DreamWorks | |
| 1339 | + | |
| 1340 | +## 42. ART | |
| 1341 | + | |
| 1342 | +Track: | |
| 1343 | + | |
| 1344 | +- paintings | |
| 1345 | +- drawings | |
| 1346 | +- sculptures | |
| 1347 | +- prints | |
| 1348 | +- lithographs | |
| 1349 | +- screenprints | |
| 1350 | +- etchings | |
| 1351 | +- photographs | |
| 1352 | +- editions | |
| 1353 | +- multiples | |
| 1354 | +- artist proofs | |
| 1355 | + | |
| 1356 | +## 43. CONTEMPORARY ART | |
| 1357 | + | |
| 1358 | +Track artists such as: | |
| 1359 | + | |
| 1360 | +- Banksy | |
| 1361 | +- KAWS | |
| 1362 | +- Takashi Murakami | |
| 1363 | +- Damien Hirst | |
| 1364 | +- Jeff Koons | |
| 1365 | +- Yayoi Kusama | |
| 1366 | +- Jean-Michel Basquiat | |
| 1367 | +- Keith Haring | |
| 1368 | + | |
| 1369 | +Do not hardcode value assumptions. | |
| 1370 | + | |
| 1371 | +## 44. PHOTOGRAPHY | |
| 1372 | + | |
| 1373 | +Track: | |
| 1374 | + | |
| 1375 | +- signed prints | |
| 1376 | +- vintage prints | |
| 1377 | +- limited editions | |
| 1378 | +- artist proofs | |
| 1379 | +- contact sheets | |
| 1380 | +- negatives | |
| 1381 | +- historic photographs | |
| 1382 | + | |
| 1383 | +## 45. CAMERAS | |
| 1384 | + | |
| 1385 | +Track: | |
| 1386 | + | |
| 1387 | +- Leica | |
| 1388 | +- Hasselblad | |
| 1389 | +- Rolleiflex | |
| 1390 | +- Contax | |
| 1391 | +- Nikon | |
| 1392 | +- Canon | |
| 1393 | +- Olympus | |
| 1394 | +- Polaroid | |
| 1395 | +- Fujifilm | |
| 1396 | + | |
| 1397 | +Include: | |
| 1398 | + | |
| 1399 | +- rare bodies | |
| 1400 | +- lenses | |
| 1401 | +- prototypes | |
| 1402 | +- military cameras | |
| 1403 | +- limited editions | |
| 1404 | + | |
| 1405 | +## 46. APPLE COLLECTIBLES | |
| 1406 | + | |
| 1407 | +Track: | |
| 1408 | + | |
| 1409 | +- Apple I | |
| 1410 | +- Apple II | |
| 1411 | +- Macintosh | |
| 1412 | +- Lisa | |
| 1413 | +- Newton | |
| 1414 | +- iMac | |
| 1415 | +- iBook | |
| 1416 | +- PowerBook | |
| 1417 | +- Power Macintosh | |
| 1418 | +- iPod | |
| 1419 | +- iPhone | |
| 1420 | +- iPad | |
| 1421 | +- Apple Watch | |
| 1422 | +- prototypes | |
| 1423 | +- engineering samples | |
| 1424 | +- sealed devices | |
| 1425 | +- packaging | |
| 1426 | +- manuals | |
| 1427 | +- posters | |
| 1428 | +- Think Different campaign items | |
| 1429 | +- employee memorabilia | |
| 1430 | + | |
| 1431 | +## 47. VINTAGE COMPUTERS | |
| 1432 | + | |
| 1433 | +Track: | |
| 1434 | + | |
| 1435 | +- Commodore | |
| 1436 | +- Amiga | |
| 1437 | +- Atari | |
| 1438 | +- IBM | |
| 1439 | +- NeXT | |
| 1440 | +- SGI | |
| 1441 | +- DEC | |
| 1442 | +- Sun Microsystems | |
| 1443 | +- Sinclair | |
| 1444 | +- Tandy | |
| 1445 | +- TRS-80 | |
| 1446 | +- Altair | |
| 1447 | +- early PCs | |
| 1448 | +- early laptops | |
| 1449 | + | |
| 1450 | +## 48. COMPUTER HARDWARE | |
| 1451 | + | |
| 1452 | +Track collectible: | |
| 1453 | + | |
| 1454 | +- CPUs | |
| 1455 | +- GPUs | |
| 1456 | +- motherboards | |
| 1457 | +- sound cards | |
| 1458 | +- development hardware | |
| 1459 | +- engineering samples | |
| 1460 | +- vintage memory | |
| 1461 | +- rare graphics accelerators | |
| 1462 | +- boxed hardware | |
| 1463 | +- first-generation hardware | |
| 1464 | + | |
| 1465 | +## 49. MOBILE PHONES | |
| 1466 | + | |
| 1467 | +Track: | |
| 1468 | + | |
| 1469 | +- early mobile phones | |
| 1470 | +- Nokia | |
| 1471 | +- Motorola | |
| 1472 | +- BlackBerry | |
| 1473 | +- Palm | |
| 1474 | +- first-generation iPhones | |
| 1475 | +- prototypes | |
| 1476 | +- limited editions | |
| 1477 | +- sealed products | |
| 1478 | + | |
| 1479 | +## 50. KEYBOARDS | |
| 1480 | + | |
| 1481 | +Track: | |
| 1482 | + | |
| 1483 | +- vintage IBM keyboards | |
| 1484 | +- mechanical keyboards | |
| 1485 | +- custom keyboards | |
| 1486 | +- group buys | |
| 1487 | +- artisan keycaps | |
| 1488 | +- rare switches | |
| 1489 | +- prototype boards | |
| 1490 | + | |
| 1491 | +## 51. AUDIO EQUIPMENT | |
| 1492 | + | |
| 1493 | +Track: | |
| 1494 | + | |
| 1495 | +- turntables | |
| 1496 | +- amplifiers | |
| 1497 | +- receivers | |
| 1498 | +- tape machines | |
| 1499 | +- speakers | |
| 1500 | +- headphones | |
| 1501 | +- vacuum tube equipment | |
| 1502 | +- studio equipment | |
| 1503 | + | |
| 1504 | +Brands: | |
| 1505 | + | |
| 1506 | +- Marantz | |
| 1507 | +- McIntosh | |
| 1508 | +- Technics | |
| 1509 | +- Nakamichi | |
| 1510 | +- Pioneer | |
| 1511 | +- Sony | |
| 1512 | +- JBL | |
| 1513 | +- Klipsch | |
| 1514 | +- Sennheiser | |
| 1515 | + | |
| 1516 | +## 52. WINE | |
| 1517 | + | |
| 1518 | +Regions: | |
| 1519 | + | |
| 1520 | +- Bordeaux | |
| 1521 | +- Burgundy | |
| 1522 | +- Champagne | |
| 1523 | +- Rhône | |
| 1524 | +- Loire | |
| 1525 | +- Tuscany | |
| 1526 | +- Piedmont | |
| 1527 | +- Napa | |
| 1528 | +- Rioja | |
| 1529 | +- Mosel | |
| 1530 | +- Port | |
| 1531 | + | |
| 1532 | +Track: | |
| 1533 | + | |
| 1534 | +- producer | |
| 1535 | +- vintage | |
| 1536 | +- bottle size | |
| 1537 | +- provenance | |
| 1538 | +- fill level | |
| 1539 | +- storage | |
| 1540 | +- auction prices | |
| 1541 | +- critic score | |
| 1542 | +- lot composition | |
| 1543 | + | |
| 1544 | +## 53. WHISKY | |
| 1545 | + | |
| 1546 | +Track: | |
| 1547 | + | |
| 1548 | +- Scotch | |
| 1549 | +- Japanese whisky | |
| 1550 | +- bourbon | |
| 1551 | +- Irish whiskey | |
| 1552 | +- Canadian whisky | |
| 1553 | +- closed distilleries | |
| 1554 | +- limited editions | |
| 1555 | +- single casks | |
| 1556 | +- numbered releases | |
| 1557 | + | |
| 1558 | +## 54. RUM | |
| 1559 | + | |
| 1560 | +Track: | |
| 1561 | + | |
| 1562 | +- vintage rum | |
| 1563 | +- closed distilleries | |
| 1564 | +- limited editions | |
| 1565 | +- single casks | |
| 1566 | +- historic bottlings | |
| 1567 | + | |
| 1568 | +## 55. COGNAC | |
| 1569 | + | |
| 1570 | +Track: | |
| 1571 | + | |
| 1572 | +- vintage Cognac | |
| 1573 | +- rare houses | |
| 1574 | +- limited editions | |
| 1575 | +- historic bottles | |
| 1576 | + | |
| 1577 | +## 56. PERFUME | |
| 1578 | + | |
| 1579 | +Track: | |
| 1580 | + | |
| 1581 | +- vintage bottles | |
| 1582 | +- discontinued fragrances | |
| 1583 | +- limited editions | |
| 1584 | +- rare formulations | |
| 1585 | +- sealed bottles | |
| 1586 | +- Lalique bottles | |
| 1587 | +- Guerlain | |
| 1588 | +- Chanel | |
| 1589 | +- Dior | |
| 1590 | +- Hermès | |
| 1591 | + | |
| 1592 | +## 57. JEWELRY | |
| 1593 | + | |
| 1594 | +Track: | |
| 1595 | + | |
| 1596 | +- Cartier | |
| 1597 | +- Van Cleef & Arpels | |
| 1598 | +- Tiffany | |
| 1599 | +- Bulgari | |
| 1600 | +- Graff | |
| 1601 | +- Harry Winston | |
| 1602 | +- vintage jewelry | |
| 1603 | +- signed jewelry | |
| 1604 | +- Art Deco jewelry | |
| 1605 | + | |
| 1606 | +## 58. GEMSTONES | |
| 1607 | + | |
| 1608 | +Track: | |
| 1609 | + | |
| 1610 | +- diamonds | |
| 1611 | +- colored diamonds | |
| 1612 | +- rubies | |
| 1613 | +- sapphires | |
| 1614 | +- emeralds | |
| 1615 | +- alexandrite | |
| 1616 | +- spinel | |
| 1617 | +- opal | |
| 1618 | +- jadeite | |
| 1619 | + | |
| 1620 | +Capture certification and provenance. | |
| 1621 | + | |
| 1622 | +## 59. MINERALS | |
| 1623 | + | |
| 1624 | +Track: | |
| 1625 | + | |
| 1626 | +- museum-quality specimens | |
| 1627 | +- crystals | |
| 1628 | +- rare minerals | |
| 1629 | +- type specimens | |
| 1630 | +- fluorescent minerals | |
| 1631 | +- historical specimens | |
| 1632 | + | |
| 1633 | +## 60. METEORITES | |
| 1634 | + | |
| 1635 | +Track: | |
| 1636 | + | |
| 1637 | +- lunar meteorites | |
| 1638 | +- Martian meteorites | |
| 1639 | +- iron meteorites | |
| 1640 | +- pallasites | |
| 1641 | +- chondrites | |
| 1642 | +- witnessed falls | |
| 1643 | +- historic meteorites | |
| 1644 | + | |
| 1645 | +Capture weight and classification. | |
| 1646 | + | |
| 1647 | +## 61. FOSSILS | |
| 1648 | + | |
| 1649 | +Track legally traded: | |
| 1650 | + | |
| 1651 | +- ammonites | |
| 1652 | +- trilobites | |
| 1653 | +- dinosaur fossils | |
| 1654 | +- dinosaur teeth | |
| 1655 | +- mammoth remains | |
| 1656 | +- shark teeth | |
| 1657 | +- fish fossils | |
| 1658 | +- plant fossils | |
| 1659 | + | |
| 1660 | +Include provenance and jurisdiction flags. | |
| 1661 | + | |
| 1662 | +## 62. ANTIQUES | |
| 1663 | + | |
| 1664 | +Categories: | |
| 1665 | + | |
| 1666 | +- furniture | |
| 1667 | +- clocks | |
| 1668 | +- mirrors | |
| 1669 | +- ceramics | |
| 1670 | +- porcelain | |
| 1671 | +- silverware | |
| 1672 | +- glass | |
| 1673 | +- lighting | |
| 1674 | +- decorative arts | |
| 1675 | +- scientific instruments | |
| 1676 | + | |
| 1677 | +## 63. PORCELAIN | |
| 1678 | + | |
| 1679 | +Brands: | |
| 1680 | + | |
| 1681 | +- Meissen | |
| 1682 | +- Sèvres | |
| 1683 | +- Wedgwood | |
| 1684 | +- Royal Copenhagen | |
| 1685 | +- Royal Worcester | |
| 1686 | +- Limoges | |
| 1687 | +- Herend | |
| 1688 | + | |
| 1689 | +## 64. GLASS & CRYSTAL | |
| 1690 | + | |
| 1691 | +Track: | |
| 1692 | + | |
| 1693 | +- Baccarat | |
| 1694 | +- Lalique | |
| 1695 | +- Murano | |
| 1696 | +- Daum | |
| 1697 | +- Steuben | |
| 1698 | +- Waterford | |
| 1699 | +- antique glass | |
| 1700 | + | |
| 1701 | +## 65. SILVER | |
| 1702 | + | |
| 1703 | +Track: | |
| 1704 | + | |
| 1705 | +- Tiffany | |
| 1706 | +- Christofle | |
| 1707 | +- Georg Jensen | |
| 1708 | +- sterling objects | |
| 1709 | +- antique silver | |
| 1710 | +- tea services | |
| 1711 | +- flatware | |
| 1712 | + | |
| 1713 | +## 66. CLOCKS | |
| 1714 | + | |
| 1715 | +Track: | |
| 1716 | + | |
| 1717 | +- mantel clocks | |
| 1718 | +- carriage clocks | |
| 1719 | +- marine chronometers | |
| 1720 | +- astronomical clocks | |
| 1721 | +- grandfather clocks | |
| 1722 | +- industrial clocks | |
| 1723 | +- railway clocks | |
| 1724 | + | |
| 1725 | +## 67. PENS | |
| 1726 | + | |
| 1727 | +Track: | |
| 1728 | + | |
| 1729 | +- Montblanc | |
| 1730 | +- Namiki | |
| 1731 | +- Pelikan | |
| 1732 | +- Parker | |
| 1733 | +- Waterman | |
| 1734 | +- Sailor | |
| 1735 | +- Aurora | |
| 1736 | +- limited editions | |
| 1737 | +- vintage fountain pens | |
| 1738 | + | |
| 1739 | +## 68. LIGHTERS | |
| 1740 | + | |
| 1741 | +Track: | |
| 1742 | + | |
| 1743 | +- Zippo | |
| 1744 | +- S.T. Dupont | |
| 1745 | +- Dunhill | |
| 1746 | +- Cartier | |
| 1747 | +- vintage advertising lighters | |
| 1748 | + | |
| 1749 | +## 69. ADVERTISING COLLECTIBLES | |
| 1750 | + | |
| 1751 | +Track: | |
| 1752 | + | |
| 1753 | +- Coca-Cola | |
| 1754 | +- Pepsi | |
| 1755 | +- Michelin | |
| 1756 | +- Texaco | |
| 1757 | +- Shell | |
| 1758 | +- Esso | |
| 1759 | +- automotive brands | |
| 1760 | +- tobacco historical advertising | |
| 1761 | +- neon signs | |
| 1762 | +- enamel signs | |
| 1763 | +- posters | |
| 1764 | +- clocks | |
| 1765 | +- vending machines | |
| 1766 | + | |
| 1767 | +## 70. DISNEY COLLECTIBLES | |
| 1768 | + | |
| 1769 | +Track: | |
| 1770 | + | |
| 1771 | +- pins | |
| 1772 | +- park exclusives | |
| 1773 | +- animation art | |
| 1774 | +- figurines | |
| 1775 | +- costumes | |
| 1776 | +- props | |
| 1777 | +- attraction memorabilia | |
| 1778 | +- vintage toys | |
| 1779 | +- limited editions | |
| 1780 | + | |
| 1781 | +## 71. SANRIO | |
| 1782 | + | |
| 1783 | +Track: | |
| 1784 | + | |
| 1785 | +- Hello Kitty | |
| 1786 | +- My Melody | |
| 1787 | +- Kuromi | |
| 1788 | +- Cinnamoroll | |
| 1789 | +- rare collaborations | |
| 1790 | +- vintage items | |
| 1791 | +- Japanese exclusives | |
| 1792 | + | |
| 1793 | +## 72. STAR WARS | |
| 1794 | + | |
| 1795 | +Track virtually everything collectible: | |
| 1796 | + | |
| 1797 | +- toys | |
| 1798 | +- cards | |
| 1799 | +- comics | |
| 1800 | +- props | |
| 1801 | +- costumes | |
| 1802 | +- posters | |
| 1803 | +- LEGO | |
| 1804 | +- games | |
| 1805 | +- books | |
| 1806 | +- autographs | |
| 1807 | +- production memorabilia | |
| 1808 | + | |
| 1809 | +## 73. MARVEL | |
| 1810 | + | |
| 1811 | +Track: | |
| 1812 | + | |
| 1813 | +- comics | |
| 1814 | +- cards | |
| 1815 | +- toys | |
| 1816 | +- statues | |
| 1817 | +- posters | |
| 1818 | +- movie props | |
| 1819 | +- LEGO | |
| 1820 | +- autographs | |
| 1821 | + | |
| 1822 | +## 74. DC | |
| 1823 | + | |
| 1824 | +Same broad collectible structure. | |
| 1825 | + | |
| 1826 | +## 75. HARRY POTTER | |
| 1827 | + | |
| 1828 | +Track: | |
| 1829 | + | |
| 1830 | +- books | |
| 1831 | +- first editions | |
| 1832 | +- props | |
| 1833 | +- costumes | |
| 1834 | +- LEGO | |
| 1835 | +- cards | |
| 1836 | +- wands | |
| 1837 | +- signed memorabilia | |
| 1838 | + | |
| 1839 | +## 76. LORD OF THE RINGS | |
| 1840 | + | |
| 1841 | +Track: | |
| 1842 | + | |
| 1843 | +- books | |
| 1844 | +- first editions | |
| 1845 | +- props | |
| 1846 | +- miniatures | |
| 1847 | +- collectibles | |
| 1848 | +- autographs | |
| 1849 | +- LEGO | |
| 1850 | + | |
| 1851 | +## 77. WARHAMMER | |
| 1852 | + | |
| 1853 | +Track: | |
| 1854 | + | |
| 1855 | +- miniatures | |
| 1856 | +- discontinued models | |
| 1857 | +- boxed armies | |
| 1858 | +- limited editions | |
| 1859 | +- Forge World | |
| 1860 | +- painted armies | |
| 1861 | +- tournament-winning armies | |
| 1862 | +- books | |
| 1863 | +- rulebooks | |
| 1864 | +- vintage miniatures | |
| 1865 | + | |
| 1866 | +## 78. GUNDAM | |
| 1867 | + | |
| 1868 | +Track: | |
| 1869 | + | |
| 1870 | +- Gunpla | |
| 1871 | +- Perfect Grade | |
| 1872 | +- Master Grade | |
| 1873 | +- Real Grade | |
| 1874 | +- limited editions | |
| 1875 | +- event exclusives | |
| 1876 | +- Premium Bandai | |
| 1877 | +- vintage kits | |
| 1878 | + | |
| 1879 | +## 79. TRAVEL COLLECTIBLES | |
| 1880 | + | |
| 1881 | +Track: | |
| 1882 | + | |
| 1883 | +- postcards | |
| 1884 | +- magnets | |
| 1885 | +- hotel memorabilia | |
| 1886 | +- airline memorabilia | |
| 1887 | +- cruise memorabilia | |
| 1888 | +- travel posters | |
| 1889 | +- luggage labels | |
| 1890 | +- tickets | |
| 1891 | + | |
| 1892 | +## 80. AIRLINE COLLECTIBLES | |
| 1893 | + | |
| 1894 | +Track: | |
| 1895 | + | |
| 1896 | +- safety cards | |
| 1897 | +- menus | |
| 1898 | +- uniforms | |
| 1899 | +- aircraft models | |
| 1900 | +- amenity kits | |
| 1901 | +- china | |
| 1902 | +- silverware | |
| 1903 | +- seats | |
| 1904 | +- signs | |
| 1905 | +- retired airline memorabilia | |
| 1906 | + | |
| 1907 | +## 81. AVIATION | |
| 1908 | + | |
| 1909 | +Track: | |
| 1910 | + | |
| 1911 | +- aircraft parts | |
| 1912 | +- cockpit instruments | |
| 1913 | +- propellers | |
| 1914 | +- aircraft models | |
| 1915 | +- pilot equipment | |
| 1916 | +- military aviation memorabilia | |
| 1917 | +- historic documentation | |
| 1918 | + | |
| 1919 | +## 82. SPACE | |
| 1920 | + | |
| 1921 | +Track: | |
| 1922 | + | |
| 1923 | +- NASA memorabilia | |
| 1924 | +- mission patches | |
| 1925 | +- astronaut autographs | |
| 1926 | +- flown items | |
| 1927 | +- spacecraft components | |
| 1928 | +- mission documentation | |
| 1929 | +- Apollo memorabilia | |
| 1930 | +- Shuttle memorabilia | |
| 1931 | +- Soviet space memorabilia | |
| 1932 | + | |
| 1933 | +## 83. MILITARIA | |
| 1934 | + | |
| 1935 | +Track legal historical collectibles: | |
| 1936 | + | |
| 1937 | +- medals | |
| 1938 | +- uniforms | |
| 1939 | +- helmets | |
| 1940 | +- insignia | |
| 1941 | +- documents | |
| 1942 | +- patches | |
| 1943 | +- flags | |
| 1944 | +- equipment | |
| 1945 | +- trench art | |
| 1946 | + | |
| 1947 | +Compliance restrictions must be implemented. | |
| 1948 | + | |
| 1949 | +## 84. MEDALS | |
| 1950 | + | |
| 1951 | +Track: | |
| 1952 | + | |
| 1953 | +- military decorations | |
| 1954 | +- Olympic medals | |
| 1955 | +- sporting medals | |
| 1956 | +- civic medals | |
| 1957 | +- commemorative medals | |
| 1958 | + | |
| 1959 | +## 85. OLYMPIC COLLECTIBLES | |
| 1960 | + | |
| 1961 | +Track: | |
| 1962 | + | |
| 1963 | +- medals | |
| 1964 | +- torches | |
| 1965 | +- pins | |
| 1966 | +- tickets | |
| 1967 | +- posters | |
| 1968 | +- uniforms | |
| 1969 | +- mascots | |
| 1970 | +- signed memorabilia | |
| 1971 | + | |
| 1972 | +## 86. MAPS | |
| 1973 | + | |
| 1974 | +Track: | |
| 1975 | + | |
| 1976 | +- antique maps | |
| 1977 | +- atlases | |
| 1978 | +- globes | |
| 1979 | +- exploration maps | |
| 1980 | +- nautical charts | |
| 1981 | +- city plans | |
| 1982 | +- railway maps | |
| 1983 | + | |
| 1984 | +## 87. POSTCARDS | |
| 1985 | + | |
| 1986 | +Track: | |
| 1987 | + | |
| 1988 | +- real photo postcards | |
| 1989 | +- historic cities | |
| 1990 | +- disasters | |
| 1991 | +- transportation | |
| 1992 | +- military | |
| 1993 | +- exhibitions | |
| 1994 | +- world's fairs | |
| 1995 | + | |
| 1996 | +## 88. LICENSE PLATES | |
| 1997 | + | |
| 1998 | +Track: | |
| 1999 | + | |
| 2000 | +- antique plates | |
| 2001 | +- low numbers | |
| 2002 | +- vanity plates | |
| 2003 | +- diplomatic plates | |
| 2004 | +- historic jurisdictions | |
| 2005 | +- rare designs | |
| 2006 | + | |
| 2007 | +## 89. PIN COLLECTIONS | |
| 2008 | + | |
| 2009 | +Track: | |
| 2010 | + | |
| 2011 | +- Disney | |
| 2012 | +- Olympics | |
| 2013 | +- Hard Rock | |
| 2014 | +- political | |
| 2015 | +- corporate | |
| 2016 | +- travel | |
| 2017 | +- military | |
| 2018 | +- sports | |
| 2019 | +- conventions | |
| 2020 | + | |
| 2021 | +## 90. BOARD GAMES | |
| 2022 | + | |
| 2023 | +Track: | |
| 2024 | + | |
| 2025 | +- first editions | |
| 2026 | +- discontinued games | |
| 2027 | +- Kickstarter editions | |
| 2028 | +- prototypes | |
| 2029 | +- deluxe editions | |
| 2030 | +- signed editions | |
| 2031 | + | |
| 2032 | +## 91. CHESS | |
| 2033 | + | |
| 2034 | +Track: | |
| 2035 | + | |
| 2036 | +- antique chess sets | |
| 2037 | +- tournament sets | |
| 2038 | +- artist sets | |
| 2039 | +- luxury sets | |
| 2040 | +- signed boards | |
| 2041 | +- historic pieces | |
| 2042 | + | |
| 2043 | +## 92. PLAYING CARDS | |
| 2044 | + | |
| 2045 | +Track: | |
| 2046 | + | |
| 2047 | +- casino decks | |
| 2048 | +- designer decks | |
| 2049 | +- historical decks | |
| 2050 | +- rare printing variants | |
| 2051 | +- sealed decks | |
| 2052 | + | |
| 2053 | +## 93. CASINO MEMORABILIA | |
| 2054 | + | |
| 2055 | +Only where legally appropriate: | |
| 2056 | + | |
| 2057 | +- casino chips | |
| 2058 | +- tokens | |
| 2059 | +- playing cards | |
| 2060 | +- signs | |
| 2061 | +- historic casino items | |
| 2062 | + | |
| 2063 | +## 94. POLITICAL MEMORABILIA | |
| 2064 | + | |
| 2065 | +Track historically significant: | |
| 2066 | + | |
| 2067 | +- campaign buttons | |
| 2068 | +- posters | |
| 2069 | +- signs | |
| 2070 | +- signed documents | |
| 2071 | +- inauguration memorabilia | |
| 2072 | +- ballots | |
| 2073 | +- campaign literature | |
| 2074 | + | |
| 2075 | +Neutral presentation only. | |
| 2076 | + | |
| 2077 | +## 95. ROYAL MEMORABILIA | |
| 2078 | + | |
| 2079 | +Track: | |
| 2080 | + | |
| 2081 | +- coronation items | |
| 2082 | +- signed photographs | |
| 2083 | +- correspondence | |
| 2084 | +- porcelain | |
| 2085 | +- medals | |
| 2086 | +- royal warrants | |
| 2087 | +- ceremonial objects | |
| 2088 | + | |
| 2089 | +## 96. SCIENTIFIC INSTRUMENTS | |
| 2090 | + | |
| 2091 | +Track: | |
| 2092 | + | |
| 2093 | +- microscopes | |
| 2094 | +- telescopes | |
| 2095 | +- laboratory instruments | |
| 2096 | +- calculators | |
| 2097 | +- slide rules | |
| 2098 | +- surveying instruments | |
| 2099 | +- navigational instruments | |
| 2100 | + | |
| 2101 | +## 97. TYPEWRITERS | |
| 2102 | + | |
| 2103 | +Track: | |
| 2104 | + | |
| 2105 | +- Underwood | |
| 2106 | +- Olivetti | |
| 2107 | +- IBM | |
| 2108 | +- Royal | |
| 2109 | +- Hermes | |
| 2110 | +- rare models | |
| 2111 | +- author-owned machines | |
| 2112 | + | |
| 2113 | +## 98. VENDING MACHINES | |
| 2114 | + | |
| 2115 | +Track: | |
| 2116 | + | |
| 2117 | +- Coca-Cola | |
| 2118 | +- Pepsi | |
| 2119 | +- candy machines | |
| 2120 | +- cigarette machines | |
| 2121 | +- arcade vending | |
| 2122 | +- antique dispensers | |
| 2123 | + | |
| 2124 | +## 99. HISTORIC CORPORATE MEMORABILIA | |
| 2125 | + | |
| 2126 | +Track: | |
| 2127 | + | |
| 2128 | +- early company stock certificates | |
| 2129 | +- employee badges | |
| 2130 | +- promotional objects | |
| 2131 | +- prototypes | |
| 2132 | +- corporate gifts | |
| 2133 | +- early packaging | |
| 2134 | + | |
| 2135 | +## 100. DIGITAL COLLECTIBLES | |
| 2136 | + | |
| 2137 | +Potentially support separately: | |
| 2138 | + | |
| 2139 | +- NFTs | |
| 2140 | +- blockchain collectibles | |
| 2141 | +- tokenized physical assets | |
| 2142 | +- game skins | |
| 2143 | +- CS skins | |
| 2144 | +- digital trading cards | |
| 2145 | +- virtual items | |
| 2146 | + | |
| 2147 | +These markets require a separate valuation model due to extreme volatility. | |
| 2148 | + | |
| 2149 | +## 101. FUTURE CATEGORY DISCOVERY | |
| 2150 | + | |
| 2151 | +RareIndex must automatically discover new collectible categories. | |
| 2152 | + | |
| 2153 | +Create an AI workflow that: | |
| 2154 | + | |
| 2155 | +1. crawls marketplaces | |
| 2156 | +2. identifies recurring product clusters | |
| 2157 | +3. detects categories not represented in the taxonomy | |
| 2158 | +4. measures transaction volume | |
| 2159 | +5. proposes new taxonomy nodes | |
| 2160 | +6. sends proposed categories to an admin queue | |
| 2161 | +7. allows approval | |
| 2162 | +8. automatically generates source connectors and schemas | |
| 2163 | + | |
| 2164 | +The taxonomy must evolve continuously. | |
| 2165 | + | |
| 2166 | +## 102. CONNECTOR ARCHITECTURE | |
| 2167 | + | |
| 2168 | +RareIndex requires a professional connector framework. | |
| 2169 | + | |
| 2170 | +Every source must use a standardized connector interface. | |
| 2171 | + | |
| 2172 | +Example conceptual interface: | |
| 2173 | + | |
| 2174 | +```ts | |
| 2175 | +interface RareIndexConnector { | |
| 2176 | + id: string | |
| 2177 | + name: string | |
| 2178 | + category: string[] | |
| 2179 | + countries: string[] | |
| 2180 | + languages: string[] | |
| 2181 | + crawl(): Promise<RawRecord[]> | |
| 2182 | + normalize(records: RawRecord[]): Promise<NormalizedRecord[]> | |
| 2183 | + healthCheck(): Promise<ConnectorHealth> | |
| 2184 | +} | |
| 2185 | +``` | |
| 2186 | + | |
| 2187 | +## 103. FIRECRAWL | |
| 2188 | + | |
| 2189 | +Firecrawl should be the preferred connector engine for websites that can be reliably parsed using: | |
| 2190 | + | |
| 2191 | +- HTML | |
| 2192 | +- markdown extraction | |
| 2193 | +- structured data extraction | |
| 2194 | +- sitemap discovery | |
| 2195 | +- page crawling | |
| 2196 | +- search | |
| 2197 | +- dynamic rendering where supported | |
| 2198 | + | |
| 2199 | +Use Firecrawl for: | |
| 2200 | + | |
| 2201 | +- category pages | |
| 2202 | +- search results | |
| 2203 | +- public catalog pages | |
| 2204 | +- auction archives | |
| 2205 | +- sold-item databases | |
| 2206 | +- dealer inventory | |
| 2207 | +- pricing guides | |
| 2208 | +- manufacturer archives | |
| 2209 | +- grading information | |
| 2210 | +- collectible encyclopedias | |
| 2211 | +- editorial market data | |
| 2212 | + | |
| 2213 | +Firecrawl output should be converted into canonical JSON. | |
| 2214 | + | |
| 2215 | +## 104. SCRAPFLY | |
| 2216 | + | |
| 2217 | +Scrapfly should act as: | |
| 2218 | + | |
| 2219 | +1. secondary extraction engine | |
| 2220 | +2. difficult-site connector | |
| 2221 | +3. dynamic rendering layer | |
| 2222 | +4. proxy/geo routing layer | |
| 2223 | +5. anti-bot-compatible access layer where legally permitted | |
| 2224 | +6. fallback when ordinary extraction fails | |
| 2225 | + | |
| 2226 | +Routing logic: | |
| 2227 | + | |
| 2228 | +``` | |
| 2229 | +Direct API | |
| 2230 | + ↓ | |
| 2231 | +Structured Feed | |
| 2232 | + ↓ | |
| 2233 | +Firecrawl | |
| 2234 | + ↓ | |
| 2235 | +Scrapfly | |
| 2236 | + ↓ | |
| 2237 | +Browser Extraction | |
| 2238 | + ↓ | |
| 2239 | +Manual Review | |
| 2240 | +``` | |
| 2241 | + | |
| 2242 | +Do NOT attempt to circumvent authentication, paywalls, CAPTCHAs, access controls, or other security protections unlawfully. | |
| 2243 | + | |
| 2244 | +Respect: | |
| 2245 | + | |
| 2246 | +- applicable laws | |
| 2247 | +- source terms | |
| 2248 | +- robots policies where applicable | |
| 2249 | +- copyright | |
| 2250 | +- privacy | |
| 2251 | +- rate limits | |
| 2252 | +- authentication boundaries | |
| 2253 | + | |
| 2254 | +## 105. CONNECTOR FALLBACK ENGINE | |
| 2255 | + | |
| 2256 | +Every connector should produce health metrics: | |
| 2257 | + | |
| 2258 | +```json | |
| 2259 | +{ | |
| 2260 | + "connector": "example", | |
| 2261 | + "status": "healthy", | |
| 2262 | + "success_rate_24h": 0.982, | |
| 2263 | + "pages_attempted": 18752, | |
| 2264 | + "pages_success": 18414, | |
| 2265 | + "firecrawl_success_rate": 0.91, | |
| 2266 | + "scrapfly_fallback_rate": 0.07, | |
| 2267 | + "parse_failure_rate": 0.02, | |
| 2268 | + "last_success": "timestamp", | |
| 2269 | + "schema_version": "3.2" | |
| 2270 | +} | |
| 2271 | +``` | |
| 2272 | + | |
| 2273 | +Automatically detect: | |
| 2274 | + | |
| 2275 | +- page redesigns | |
| 2276 | +- selector failures | |
| 2277 | +- missing fields | |
| 2278 | +- duplicate explosion | |
| 2279 | +- abnormal price distributions | |
| 2280 | +- blocked requests | |
| 2281 | +- empty pages | |
| 2282 | +- unexpected redirects | |
| 2283 | +- currency parsing problems | |
| 2284 | + | |
| 2285 | +## 106. CONNECTOR REGISTRY | |
| 2286 | + | |
| 2287 | +Create: | |
| 2288 | + | |
| 2289 | +/connectors/registry.json | |
| 2290 | + | |
| 2291 | +Each connector: | |
| 2292 | + | |
| 2293 | +```json | |
| 2294 | +{ | |
| 2295 | + "id": "source-id", | |
| 2296 | + "displayName": "Source", | |
| 2297 | + "sourceType": "marketplace", | |
| 2298 | + "enginePriority": [ | |
| 2299 | + "api", | |
| 2300 | + "firecrawl", | |
| 2301 | + "scrapfly" | |
| 2302 | + ], | |
| 2303 | + "categories": [], | |
| 2304 | + "regions": [], | |
| 2305 | + "languages": [], | |
| 2306 | + "currency": [], | |
| 2307 | + "supportsListings": true, | |
| 2308 | + "supportsSold": true, | |
| 2309 | + "supportsAuctions": false, | |
| 2310 | + "supportsImages": true, | |
| 2311 | + "refreshFrequencyMinutes": 30 | |
| 2312 | +} | |
| 2313 | +``` | |
| 2314 | + | |
| 2315 | +## 107. SOURCE TYPES | |
| 2316 | + | |
| 2317 | +Support: | |
| 2318 | + | |
| 2319 | +- marketplace | |
| 2320 | +- auction_house | |
| 2321 | +- dealer | |
| 2322 | +- pricing_guide | |
| 2323 | +- grading_company | |
| 2324 | +- manufacturer | |
| 2325 | +- museum | |
| 2326 | +- archive | |
| 2327 | +- catalog | |
| 2328 | +- collector_database | |
| 2329 | +- community | |
| 2330 | +- forum | |
| 2331 | +- news | |
| 2332 | +- analytics_provider | |
| 2333 | +- registry | |
| 2334 | +- official_source | |
| 2335 | + | |
| 2336 | +## 108. RAW INGESTION LAYER | |
| 2337 | + | |
| 2338 | +Never directly write scraped records into final product tables. | |
| 2339 | + | |
| 2340 | +Pipeline: | |
| 2341 | + | |
| 2342 | +``` | |
| 2343 | +Source | |
| 2344 | + ↓ | |
| 2345 | +Raw HTML/API payload | |
| 2346 | + ↓ | |
| 2347 | +Extraction | |
| 2348 | + ↓ | |
| 2349 | +Raw JSON | |
| 2350 | + ↓ | |
| 2351 | +Normalization | |
| 2352 | + ↓ | |
| 2353 | +Entity Resolution | |
| 2354 | + ↓ | |
| 2355 | +Deduplication | |
| 2356 | + ↓ | |
| 2357 | +Price Validation | |
| 2358 | + ↓ | |
| 2359 | +Canonical Asset Match | |
| 2360 | + ↓ | |
| 2361 | +Sale/Listing Database | |
| 2362 | + ↓ | |
| 2363 | +Indices & Analytics | |
| 2364 | +``` | |
| 2365 | + | |
| 2366 | +Raw records should be immutable. | |
| 2367 | + | |
| 2368 | +## 109. CANONICAL ASSET MODEL | |
| 2369 | + | |
| 2370 | +Example: | |
| 2371 | + | |
| 2372 | +```json | |
| 2373 | +{ | |
| 2374 | + "asset_id": "rare_xxxxx", | |
| 2375 | + "category": "trading_cards", | |
| 2376 | + "subcategory": "pokemon", | |
| 2377 | + "brand": "Pokemon", | |
| 2378 | + "franchise": "Pokemon", | |
| 2379 | + "set": "Base Set", | |
| 2380 | + "name": "Charizard", | |
| 2381 | + "year": 1999, | |
| 2382 | + "number": "4/102", | |
| 2383 | + "variant": "1st Edition Holo", | |
| 2384 | + "language": "English", | |
| 2385 | + "grade": 10, | |
| 2386 | + "grader": "PSA", | |
| 2387 | + "certification_number": null, | |
| 2388 | + "population": null, | |
| 2389 | + "rarity": null, | |
| 2390 | + "images": [], | |
| 2391 | + "identifiers": {}, | |
| 2392 | + "metadata": {} | |
| 2393 | +} | |
| 2394 | +``` | |
| 2395 | + | |
| 2396 | +## 110. SALE MODEL | |
| 2397 | + | |
| 2398 | +```json | |
| 2399 | +{ | |
| 2400 | + "sale_id": "sale_xxxxx", | |
| 2401 | + "asset_id": "rare_xxxxx", | |
| 2402 | + "source": "source", | |
| 2403 | + "source_url": "", | |
| 2404 | + "sale_type": "auction", | |
| 2405 | + "sale_date": "", | |
| 2406 | + "sale_price": 0, | |
| 2407 | + "currency": "USD", | |
| 2408 | + "sale_price_usd": 0, | |
| 2409 | + "buyer_premium_included": false, | |
| 2410 | + "condition": "", | |
| 2411 | + "grade": "", | |
| 2412 | + "location": "", | |
| 2413 | + "image_urls": [], | |
| 2414 | + "raw_title": "", | |
| 2415 | + "confidence": 0.98 | |
| 2416 | +} | |
| 2417 | +``` | |
| 2418 | + | |
| 2419 | +## 111. LISTING MODEL | |
| 2420 | + | |
| 2421 | +Track: | |
| 2422 | + | |
| 2423 | +- asking price | |
| 2424 | +- seller | |
| 2425 | +- source | |
| 2426 | +- location | |
| 2427 | +- shipping | |
| 2428 | +- condition | |
| 2429 | +- grade | |
| 2430 | +- listing date | |
| 2431 | +- update date | |
| 2432 | +- availability | |
| 2433 | +- quantity | |
| 2434 | +- seller reputation where public | |
| 2435 | +- images | |
| 2436 | +- description | |
| 2437 | + | |
| 2438 | +Listing price MUST NOT automatically equal market value. | |
| 2439 | + | |
| 2440 | +## 112. ENTITY RESOLUTION | |
| 2441 | + | |
| 2442 | +This is one of the most important parts of RareIndex. | |
| 2443 | + | |
| 2444 | +Different sources may describe the same collectible differently. | |
| 2445 | + | |
| 2446 | +Example: | |
| 2447 | + | |
| 2448 | +``` | |
| 2449 | +1999 Pokemon Base Charizard 1st PSA 10 | |
| 2450 | + | |
| 2451 | +Pokémon 1999 First Edition Charizard Holo PSA GEM MT 10 | |
| 2452 | + | |
| 2453 | +1999 Pokemon Game Charizard-Holo #4 PSA 10 | |
| 2454 | +``` | |
| 2455 | + | |
| 2456 | +These must resolve to the same canonical asset variant. | |
| 2457 | + | |
| 2458 | +Use: | |
| 2459 | + | |
| 2460 | +- deterministic identifiers | |
| 2461 | +- manufacturer model numbers | |
| 2462 | +- card numbers | |
| 2463 | +- sets | |
| 2464 | +- release year | |
| 2465 | +- UPC | |
| 2466 | +- ISBN | |
| 2467 | +- SKU | |
| 2468 | +- certification | |
| 2469 | +- serial | |
| 2470 | +- visual similarity | |
| 2471 | +- text embeddings | |
| 2472 | +- multimodal embeddings | |
| 2473 | +- LLM verification | |
| 2474 | + | |
| 2475 | +## 113. IMAGE INTELLIGENCE | |
| 2476 | + | |
| 2477 | +Images are fundamental. | |
| 2478 | + | |
| 2479 | +Build image pipelines for: | |
| 2480 | + | |
| 2481 | +- duplicate detection | |
| 2482 | +- visual identification | |
| 2483 | +- edition recognition | |
| 2484 | +- card recognition | |
| 2485 | +- shoe identification | |
| 2486 | +- watch reference recognition | |
| 2487 | +- LEGO identification | |
| 2488 | +- comic issue recognition | |
| 2489 | +- coin recognition | |
| 2490 | +- autograph comparison | |
| 2491 | +- condition estimation | |
| 2492 | +- box/seal recognition | |
| 2493 | + | |
| 2494 | +Generate multimodal embeddings. | |
| 2495 | + | |
Diff truncated — file too large.