In this section
COLLECTION
What you own, where it came from, how it's graded.
Collector → Break / CardCopy → Cost
Collector (you)
├─ Break a box/pack/case you opened
│ ├─ product → Set
│ ├─ total_cost $150.00 break_date 2025-06-15
│
└─ CardCopy one physical card
├─ card → Card (catalog) break → Break (NULL if bought)
├─ acquisition_type purchase acquired_price $40.00
├─ serial_number 54 (of /100) self_grade NM-MT
├─ grading_company PSA · grade 10 · cert #…
├─ status in_collection | for_trade | for_sale | sold
│
└─ CardCopyCost grading · shipping · … (amount + vendor)COPIES POINT STRAIGHT AT THE CATALOG
One CardCopy row per physical card. A is just a Card with a finish, so a parallel copy references it directly — no extra lookup, no parallel-specific tables.
WHERE A COPY CAME FROM
Every copy records how you got it: acquisition_type is purchase, pack_pull, trade, gift, or other, alongside acquired_price, acquired_date, and acquired_source. Buy a single card and that's the whole story.
Pull it from a Break instead — a box, pack, or case you opened — and its cost comes from the break, not you. The break carries one total_cost; every card you pull points back via break_uuid, and its acquisition cost is derived live: total_cost / cards pulled. Catalog more pulls and every card's share drops — no manual recalculation.
TWO GRADES, ONE COPY
A copy can carry both a self_grade (your call — a named rung like NM-MT on the shared 1–10 ladder) and a professional grade (company + grade + cert). The API returns grade_delta — pro grade minus your guess, on the same 1–10 ladder.
A COPY HAS A LIFECYCLE
status tracks where a copy sits: it starts in_collection, flips to for_trade or for_sale when you're moving it, and lands on sold once it's gone. Marking a copy sold records sale_price and sold_date, turning paper value into on the Financials page.