Collectibles appraiser
Type a card name; the Worker tries four sources in a fixed priority order and returns whichever recognizes it — Scryfall for Magic, pokemontcg.io for Pokémon, YGOPRODeck for Yu-Gi-Oh!, and CardSight AI for sports cards and One Piece TCG.
Each source is its own module with pure, independently unit-tested request and transform logic, flattening into one shared result shape so the frontend renders any category without knowing which API answered.
Two real bugs, both found in production traffic
Pokémon lookups returned HTTP 500 from a Worker but succeeded from a browser. The keyless tier rate-limits per IP, and Cloudflare’s shared egress pool was already past the limit — invisible locally, deterministic in production.
“Charizard” resolved to “Mega Charizard Y ex.” The exact-match logic was correct; the candidate page was not. Twenty-plus sets have printed a card with “Charizard” in the name, and a newest-first page of twenty never reached the 1999 original. The documented exact-match operator turned out to 500 deterministically on the authenticated path, so the fix was a larger candidate page rather than a cleverer query.
What it will not do
Antiques, artwork, and general memorabilia were considered and declined. No real-time structured pricing source exists at that level of generality, and producing a confident number for “anything you type in” is exactly what this tool exists to avoid.