In this section

SEARCH & FILTERING

Every filter, facet, and sort the API supports.

All search endpoints take a JSON body (POST). Filters AND together. List fields OR within the list. Paginate with limit (default 50, max 200) and offset.

RUN FROM THE CLI

Find all rookie cards for a player

slab card search Bedard --rookie

All Maple Leafs cards from a specific year

slab card search --team "Maple Leafs" --year 2025

Rookie autographs across all brands

slab card search --rookie --auto

API ONLY

Numbered parallels /25 or less

POST /cards/search
{ "is_numbered": true, "numbered_max": 25, "limit": 50 }

Dual/combo cards featuring two specific players

POST /cards/search
{ "subject_all": ["McDavid", "Draisaitl"] }

All 1-of-1 cards in the catalog

POST /cards/search
{ "is_1of1": true }

What am I missing from a set?

POST /cards/search
{
  "set_slug": ["opc-platinum-2025-26"],
  "base_only": true,
  "collector": "<your-collector-uuid>",
  "owned": false
}

My graded cards from breaks, sorted by market value

POST /collectors/{uuid}/collection/search
{
  "graded": true,
  "has_break": true,
  "sort": "-fmv"
}

Everything I acquired this month

POST /collectors/{uuid}/collection/search
{
  "acquired_after": "2025-06-01",
  "acquired_before": "2025-06-30",
  "sort": "-acquired_date"
}

Search with facets — see how results break down

POST /cards/search
{
  "subject": "McDavid",
  "rookie": true,
  "facets": ["brand", "year", "finish"]
}

// Response includes:
// "facets": {
//   "brand": [{"value": "Upper Deck", "count": 12}, ...],
//   "year": [{"value": "2015", "count": 8}, ...],
//   "finish": [{"value": "Rainbow", "count": 4}, ...]
// }

ALL CARD FILTERS

Work on both catalog search and collection search.

Text & Player

qFree text — player name, set name, or card number
subjectPlayer name (substring match)
subject_exacttrue for exact name match
subject_allCard must feature ALL listed players
card_numberExact card number (e.g. YG-201)

Product

set_slugSet slug(s)
releaseSet UUID(s) — scopes to what was physically in a box
brandBrand name(s)
subsetSubset name(s)
yearExact season-start year
year_min / year_maxYear range
sportSport name(s)
leagueLeague name(s)

Team

teamTeam name(s) — the team shown on the card

Attributes

attributeAttribute name(s) — any match
attribute_allMust have ALL listed attributes
attribute_notExclude cards with any of these
rookie / auto / relicBoolean shortcuts

In the catalog today: Autograph Horizontal Inscription Memorabilia Printing Plate Rookie Short Print Super Short Print Vertical

Finish

finish name(s)
base_onlyOnly base cards
parallel_onlyOnly

Scarcity

numbered_min / numbered_maxPrint run range
is_numberedHas a serial print run
is_1of1One-of-one

CATALOG

Extra fields on POST /cards/search only.

collectorCollector UUID — annotates each card with owned_quantity
ownedWith collector: true = only cards you own, false = only missing
include_markettrue = annotate each result with a headline (market)

COLLECTION

Extra filters on collection search only.

statusin_collection, for_trade, for_sale, sold
gradedtrue = graded only, false = raw only
grading_companyGrading company name(s), e.g. PSA
self_gradeSelf-assessed grade rung(s)
has_breaktrue = from a break, false = purchased/traded
break_uuidCards from a specific break
acquisition_typepurchase, pack_pull, trade, gift, other
acquisition_cost_min / maxManually entered acquisition-cost range (break-derived cost isn't filtered)
acquired_after / beforeDate range
storage_locationStorage location (substring match)
serialSpecific serial number

SORT

Prefix with - for descending.

Catalog

brand card_number numbered set subject year

Collection

acquired_date acquisition_cost brand card_number fmv numbered roi set unrealized year

FACETS

Request facetsto get counts per dimension. Build filter UIs that show "12 Upper Deck, 5 SP Authentic" with live counts.

Catalog

brand year subset finish team attribute

Collection

status grading_company acquisition_type

💡Facets are computed against the full filtered set, before pagination. Add a filter and the counts update to reflect the narrowed results.