In this section
CUSTOM SETS
Define what you're chasing. Track completion.
A custom set is a goal — "every Bedard ," "one card of every 2025-26 Hurricane," "an autograph of each Cup-team goalie." Make it public and other collectors subscribe and chase the same set.
two kinds
CURATED DYNAMIC
you hand-pick entries you define a filter
each entry has a match mode auto-fills as the catalog grows
one set-wide match granularity
- Rainbow McDavid YG (exact) { "team": ["Hurricanes"],
- any Bedard FW (any_printing) "year": 2025 }
- Aho, any card (any_card) + dynamic_match: any_cardONE LADDER: WHAT COUNTS AS HAVING IT?
Every entry answers the same question — what must you own for this to be checked off? — somewhere on one strictness ladder. Each rung relaxes exactly one dimension:
the match ladder, strictest first
exact_serial this card, this serial number "/97 of 100, my jersey number" exact this card, this finish "the Gold /10, no substitute" any_printing this card, ANY finish "a Bedard Young Guns - any of them" any_card this PLAYER, any card "some card of Aho - whatever I pull"
A curated set picks a rung per entry — one set can hold all four at once. A dynamic set picks one rung set-wide (dynamic_match). Same ladder, same words, both places.
THE PLAYER SLOT (ANY_CARD)
The loosest rung changes what the entry is: the goal is a , not a card. Owning any card of them fills the slot. Up to three optional qualifiers narrow what card is acceptable — each one only tightens, never changes the goal:
seasonOnly cards from one season. A 2025-26 roster slot shouldn't be filled by a 2021-22 base sitting in your binder.teamOnly cards showing the player on that team. Aho's Team Finland Four Nations card doesn't fill an "Aho as a Hurricane" slot — and this follows the card's own printed team, so traded players resolve correctly.attributeOnly cards carrying an attribute — Autograph, Rookie, Memorabilia (the live list is GET /vocab).DYNAMIC: ONE FILTER, ONE GRANULARITY
A dynamic set is a saved filter, not a card list — the same CardFiltergrammar you'd POST to /cards/search. Every catalog card that matches is a member, so the set fills itself as new releases are ingested. dynamic_match then sets the granularity: exact makes every matching printing its own entry, any_printing collapses them to one entry per card slot, and any_card collapses all the way to one entry per player — filled by owning any card of them that matches the filter.
REAL CHASES, AND HOW TO SAY THEM
the roster chase"One card of every 2025-26 Hurricane." Dynamic, {"team": ["Hurricanes"], "year": 2025}, any_card. One slot per player, filled by whatever you pull — and when a deadline pickup gets his first Hurricanes card, he joins the set on his own.the team set"One of each 2025-26 Hurricanes card." Same filter, any_printing. One slot per card; base or any parallel checks it off. (~30 entries, not thousands.)the rainbow hunt"Every Bedard numbered parallel." Dynamic, {"subject": "Bedard", "is_numbered": true}, exact — each printing is its own trophy.the auto project"An autograph of every 2006 Cup-team Hurricane." Curated player slots, one per player, each qualified attribute: Autograph. Any auto of Brind'Amour counts; his base cards don't.the career binder"A Crosby card from every season." Curated player slots for the same player, one per season — same goal, different qualifier, so each year is its own checkbox.the mixed grail listA personal top-10 where #1 is an exact serial (exact_serial: /87 of 100), a few are specific printings (exact), and the rest are "any version" (any_printing) or "anything of this player" (any_card). One curated set holds all four rungs side by side.COMPLETION
Fetching a set returns per-entry ownership plus totals: entries, owned, completion %. owned_printing always tells you whatfilled an entry — for a card entry the printing ("Rainbow /99"), and for a player slot the exact card ("2025-26 Upper Deck Series 2 #279 · Base") — so a checked box is never a mystery. A curated set's target is fixed; a dynamic set's grows with the catalog, so its percentage shifts as new cards (or new players) match.
The entry list is paged (limit/offset); the totals never are. However big the set, completion and card_count always cover the whole thing — a set larger than one page shows total_cards greater than the entries returned, and you walk offset forward for the rest.
SHARE IT
Make any set public and other collectors subscribe — chasing the same goal, each tracking their own completion against it. The most-subscribed chases surface at /custom-sets/popular.