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

ONE 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

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).
⚠️The bright line: qualifiers describe what the card must be — when, for which team, what kind — never where it lives. The moment you want a specific product, subset, or card number, you don't want a player slot. Pick the card itself with a card rung.

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.