Get Fair Market Value (FMV) for a Card
Get the Fair Market Value (FMV) for a card at a specific grade.
Requires a card_id. If you only have a card name/description, call match-card or card-search first to resolve it.
What FMV is
FMV is CardHedge's smoothed valuation for a card at a specific grade, computed by an underlying pricing service that:
- Looks for a direct price for this card+grade, and if found, replaces the raw latest_price with a Winsorized-median FMV computed over a 7/15/30/90-day window (the shortest window with enough daily prints wins). Winsorizing trims outlier sales so a single hot/cold day doesn't move the value.
- If no direct price exists, falls back through a cascade of related data: other grades of the same card → other graders → grade multipliers → segment baselines.
- If the chosen base price is stale, overlays a movement index to project it to today. The index is picked from the most specific level with enough sample density (card+grade → card → player → segment).
- Returns the price, a confidence score, and full metadata so callers can decide how much to trust the result.
Compared to price-estimate, the FMV response includes the smoothing window, sample counts, confidence grade, and a human-readable price_explanation.
FMV calculation methods (the method field)
The method field tells you which cascade step produced the price. There are 6 base methods plus an _indexed variant of each non-terminal method (10 indexed + 1 terminal = 11 possible values).
Base methods, in cascade priority:
| Method | Meaning |
|---|---|
| direct | Exact card+grade lookup. The 7/15/30/90-day Winsorized-median FMV is used when enough daily prints exist; otherwise raw latest_price is returned. See fmv_window_days / fmv_sample_count. |
| card_interpolation | No direct price; isotonic regression in log-space across the card's OTHER same-provider grades, interpolated/extrapolated to the target grade. Requires 2+ supporting grades. |
| cross_provider | No same-provider data; translates from another grader (e.g., BGS 9 → PSA 9) using a learned price ratio. |
| anchor_multiplier | One same-provider grade is the anchor; a within-provider grade multiplier projects it to the target. Variants: same-provider, chained (e.g., BGS 8.5 → BGS 9 → PSA 9), raw (Raw → graded). |
| segment_fallback | Last resort: uses the (set × year × category) segment baseline price and applies a grade multiplier. Lowest confidence — no card-specific data was used. |
| no_data | Terminal: nothing in the cascade produced a usable price. price and the range bounds are null. |
_indexed variants — direct_indexed, card_interpolation_indexed, cross_provider_indexed, anchor_multiplier_indexed, segment_fallback_indexed. The base method produced a stale price (older than the freshness threshold), so a movement index was overlaid to bring it to today. The index is chosen from a cascade of entities:
- index_level: "card_grade" — most specific: this card at this grade
- index_level: "card" — blended across all grades of this card
- index_level: "player" — player-level (all this player's cards)
- index_level: "segment" — (year × category) segment-level
- index_level: "none" — stale, but no index met the minimum sample threshold (an un_indexed_penalty was applied to confidence)
- index_level: null — fresh estimate, no adjustment was needed
Examine raw_price (pre-adjustment) vs price (post-adjustment) and index_pct_change to see exactly what the index changed. Filter low-signal adjustments by requiring index_sample_count >= 10.
Picking a method by use case
- Pricing UI for end users — Trust confidence_grade A/B; show price_explanation on a "How was this calculated?" tooltip. Hide or caveat C/D and no_data.
- Portfolio valuation — Use price directly; band it with price_low / price_high for uncertainty visualization.
- Sensitive financial decisions — On C-grade or any _indexed method, also show raw_price so the user can see what the movement index changed.
- Bulk analytics — Aggregate by method to see what % of cards have direct data vs are interpolated vs fall back to segments.
Response field reference
See the response schema (CardFMVResponse) for the full field-by-field description. Highlights:
- price / price_low / price_high — FMV and uncertainty band in USD.
- confidence (0-1) and bucketed confidence_grade (A/B/C/D) — single trust score folding in method, FMV quality, and index quality.
- raw_price — pre-adjustment price. Differs from price when a movement index was applied (_indexed), or shows the FMV value for direct when latest_price was replaced.
- fmv_window_days / fmv_sample_count — FMV smoothing window (7/15/30/90) and sample density.
- index_level / index_pct_change / index_sample_count / index_truncated / as_of_date — movement-index provenance.
- cross_grade_fmv_count — for cross-grade methods, how many source grades had their latest_price FMV-substituted before the cascade ran.
- price_explanation — plain-English derivation (debug/audit only).
Any additional fields the upstream returns are passed through unchanged.
Example curl:
curl -X POST -H "X-API-Key: your-api-key-here" \
-H "Content-Type: application/json" \
-d '{
"card_id": "1586812246197x228181943611293700",
"grade": "PSA 9"
}' \
"https://api.cardhedger.com/v1/cards/card-fmv"
Request
- Base URLhttps://api.cardhedger.com
- AuthAPI key in header X-API-Key
Request body
Response
Successful Response
Example response
{
"confidence": 0.3499,
"confidence_grade": "B",
"fmv_sample_count": 3,
"fmv_window_days": 7,
"freshness_days": 1,
"grade_label": "PSA 9",
"grade_value": 9,
"index_truncated": false,
"method": "direct",
"price": 416.25,
"price_explanation": "Used 7d FMV ($416.25, Winsorized median of 3 daily prints) in place of latest_price $416.25. Fresh (1d) — no movement adjustment applied.",
"price_high": 435.24,
"price_low": 397.26,
"provider": "PSA",
"raw_price": 416.25,
"support_grades": 1
}Changes
No recorded changes to this operation across all 14 revisions of this API.