The discipline you'd apply to one card, applied to every card, every hour.
You already know how to price a card. You'd pull the last fifteen sold BINs, throw out the obvious bad comp, weight the venue, sanity-check against a couple of asks, and watch the chatter. Cardpulse codifies that discipline — comp by comp, signal by signal — and runs it on a cron, with AI doing the reading you don't have time for.
A camera that knows it's looking at a card. And waits for the flip.
Open the scanner on your phone. Cardpulse runs a three-signal edge detector over the framing rect every ~180ms — inner-rect detail, inner-vs-outer luma contrast, and edge density along the rect's perimeter. When all three clear for ~1.2s of consecutive samples, the camera fires automatically. Hold a card in frame; the system does the timing.
For a stack of cards, switch to bulk mode. Capture front, flip (the camera re-arms with a 1.2s settling window so it doesn't fire on the residual scene), capture back, move on. When the stack is done, hit Match all — every captured pair runs through Claude vision and the catalog matcher in parallel. Concurrency is capped at three so a 50-card stack stays bounded on Anthropic spend.
getUserMedia + canvas downsample · no native app needed
hold steady…
inner detail
0.27
edge density
0.31
stability
ok
The cascade. Cert > canonical > trigram > eBay.
Vision extracts what it can read off the card: subject, set, number, parallel, grade, cert. Then the cascade fires every authoritative source that applies in parallel. PSA cert number? Resolved exactly. Magic card? Scryfall returns the canonical printing. Pokémon? pokemontcg.io. Marvel issue? ComicVine. Each source returns a confidence score so the UI can badge how it knows.
When trigram has nothing but the cascade is confident, Cardpulse materializes the catalog row on the spot — authoritative image, set code, rarity, language — and routes you straight to the "Add to inventory" flow. The contribute form only shows up for cards no API has ever heard of.
Adapters silent-skip when their key is missing. Failures fall through to the next layer.
PSA cert
perfect ID from cert number
Scryfall · pokemontcg · ComicVine
canonical card data, free APIs
trigram catalog
fuzzy match on what we already track
eBay listings
free-text title parse, last-resort
Where a price comes from, tick by tick.
Every variant on Cardpulse is a price-discovery surface, not a number. We pull the comp ladder ourselves — graded BINs, accepted offers, recent auction closes — and stamp every tick with its source, listing ID, and source URL. Click the price, see the comp.
Active asks live alongside sold ticks but never get mixed into the same number. The headline price is a sold-preferred-or-ask 30-day median. The chart shows both, separately, so a $4,500 ask never quietly becomes the price of a card that last traded at $3,000.
eBay Browse · PriceCharting · TimescaleDB hypertable · 7-day chunks
30-day median (sold-preferred)
$285n=22 clean
When direct comps don't exist, borrow honestly.
A 1/1 only sells once a lifetime. A /5 might sit untraded for a year. The standard comp ladder refuses on these — and most pricing tools either go silent or fabricate a number with vague methodology. We do neither.
Cardpulse's borrowing graph pulls comps from four explicit edges: prior-year siblings of the same insert, same-year cross-player comps adjusted by a learned player-tier multiplier, the player's broader 1/1 ceiling, and a pop-class anchor multiplied by a fitted scarcity ratio. Every edge runs through a tricube kernel weighted by recency, distance, and tick suspicion. The result lands at a posterior shrunk toward a product-line prior, with the band inflated by an explicit borrowing distance — a borrowed estimate is structurally wider than a direct-comp one and never claims otherwise.
The panel shows you exactly which edges fired, their weight share, and the comps each one used. Click through to inspect every comp the borrow leaned on. No black box.
cross-year ladder · cross-player tier · /1 ceiling capped 20% · pop × scarcity multiplier
Borrowed-strength comp
2003 Topps Heritage · TT-LB · /1 · Larry Bird
borrowed from 27 comps across 4 edges · borrow distance 0.58
- cross-year, same product42%n=7
- same-year, cross-player31%n=5
- /1 ceiling (capped)20%n=4
- pop × scarcity multiplier7%n=11
The bad comp never reaches the median.
You know the moves. The unverified buyer who paid 50% over comp because they're pumping a forum thread. The shill bid that closed on a buddy account. The mis-graded card that slipped through and anchored a Sunday night BIN you were never supposed to see.
Cardpulse runs a modified z-score across every variant's tick window — the same statistic forensic accountants use for messy real-world data, not the textbook 1.5×IQR fence that breaks on small n. Each tick gets scored. Anything past |3.5| is flagged and lifted out of the median, never silently dropped — the outlier still appears in the comp ladder so you can decide.
Iglewicz–Hoaglin modified z · |M|>3.5 floor · flag-don't-drop
The thirty-comp PSA 10 RC is not the same animal as a 1-of-1.
Modern serial-numbered prints, vintage 1-of-1s, and graded high-pop rookies all wear "a price" the same way on a screen — but you'd never weight them the same. We don't either.
Every variant gets a state, computed fresh on every refresh, that tells you exactly how much to trust the number above it. HOT means the comp ladder is thick, recent, and clean — committed median. WARM is a quantile range — enough to be directional but not a hammer. COLD is the comp-ladder estimate, anchored to peer variants when the card itself hasn't traded recently. DARK is the honest answer when no one really knows.
An EVENT-DRIVEN modifier amplifies any of these when the agent's read on the news cycle is loud enough to override the steady-state ladder — a postseason walk-off, a banlist drop, a Marvel theatrical announce.
State machine · computed per refresh · surfaced on every detail panel
The market moves on narrative, not just trades.
A clean comp ladder tells you what a card was worth yesterday. Cardpulse also reads what the market is about to feel about it today — the four-touchdown MNF, the pop-report drop, the rotation rotation that just put a Pokémon archetype back in tier-one, the MCU release date that resurfaces a Silver Age key.
The agent fans out across forums and news (Reddit, ESPN, X), pulls posts about the card's player or subject, scores each one on a -1 to +1 axis with a confidence weight, and aggregates them into the forecast — but not before they've been audited (next section).
Reddit + ESPN + X · sentiment scored by Claude Haiku · scoring is auditable per signal
A second model audits the first before any signal moves a price.
One model reading its own work has a known failure mode: it agrees with itself. So we don't let the same model be both classifier and judge.
A faster model reads each post and proposes a sentiment score. Whenever that score is loud — high magnitude or low confidence — a slower, more careful second model audits it: does the article actually justify that magnitude? Is the kind right? Is this a confident wrong answer? The auditor either passes, regenerates with corrected numbers, or rejects the signal so it never enters the price.
High-magnitude rejects are queued for human review rather than silently dropped. Nothing big and bullish ever moves a price without a paper trail.
Haiku classifier · Sonnet critic · no same-model self-affirmation
Classifier reads the article
Claude Haiku · ~400 tokens · 800ms
score +0.78 · confidence 0.82 · kind milestone
Gate trigger — score loud, confidence low
|score| > 0.20 OR confidence < 0.85
2 of 5 signals enter critic
Critic audits
Claude Sonnet · different model · 1.6s
3 verdicts: pass · regenerate · reject
Outcome
logged with FK to article
✓ pass: persist · ↻ regen: use suggested · ✕ reject: drop + queue
A Sonnet pass with one job. Tell us when to back off.
The rules pipeline has already produced a Buy / Hold / Sell. The reviewer sees the same evidence — the actual signal text, the card identity, the projection magnitude — and gets one permission: downgrade Buy/Sell to Hold when the evidence reads thin. It can never upgrade. Caution-only.
What this catches: a single ESPN injury squib for a known load-managed star. A trade rumor with no named counterparty. Modern news on a vintage HOF rookie that trades on legacy, not weekly availability. The reviewer's rationale replaces the formulaic one when it overrides — so you see "One missed practice doesn't move a PSA 10 base," not "30d trend projects -8%."
Skips when there's nothing to review (Hold candidates) or no sentiment was consulted
Candidate · 2007 Topps Chrome KD · PSA 10
1 signal: [injury] score=-0.10 conf=0.65 — KD missed practice with knee soreness
shrunk avg = -0.013 · projected -0.2% / 30d
“Single missed-practice signal on a vintage HOF rookie that trades on legacy. Hold.”
A buy / hold / sell with the receipt attached.
Where most pricing tools stop — at a single number — Cardpulse keeps going. Every variant gets a 30-day and 90-day forecast as a true 80% prediction band, not a fudged ±8%. Inside the band: a buy / hold / sell conviction and a one-sentence agent rationale.
Inside the rationale: the layered drivers. A 30-day regression baseline. A peer-borrow from comparable variants when the card itself is thin. A sentiment drift from the agent's signal aggregate. A grade-tier multiplier (top tiers amplify sentiment). A rookie premium (RCs trade on narrative arc). A rarity premium for short-print and 1-of-1 variants. A calendar bump when a postseason game or set release sits inside the window. Every layer carries its own contribution and confidence. No magic — just disciplined attribution.
Layered predictor · v2 · 7 drivers · auditable per layer
$322from $285
80% band: $280 — $368
Caleb Williams threw 4 TDs against KC on MNF; PSA 10 rookie tier amplifies the move 1.6×.
The ping you wish you'd had a week ago.
Most price alerts fire after the move — the trade tape already wrote the price you're being notified of. Cardpulse is built on the opposite premise: if the agent's forward signals are tilting hard before the trades catch up, you should hear about it before the move, not after.
Four rule kinds: market drift (the median crosses your threshold), ask-vs-market gap (your listing is mispriced for clear-by-weekend), anticipatory swing (sentiment net moves past a threshold), and 7-day-vs-prior-week sentiment shift (the narrative is cooling). A 24-hour debounce keeps a flapping price quiet. Every firing cites the underlying signal — you know why.
Hourly evaluation · per-rule debounce · receipt cites the signal
anticipatory swing
sentiment net crosses +0.6 with c≥0.75
fired before market drift
market drift
30d median crosses your threshold
after-the-fact
ask vs market
your listing is 5%+ off market
re-list early
weekly sentiment shift
7d Δ vs prior 7d > |0.25|
narrative cooling / heating
Discipline isn't what the system does. It's what the system refuses to do.
01
No black-box pricing.
Every number traces back to ticks. Every tick traces back to a source URL. If we can't show you where it came from, it's not on the page.
02
No false precision.
When the comp ladder is thin, the variant says so. DARK isn't a failure mode — it's the right answer when no one really knows.
03
No silent drops.
Outliers are flagged, not removed. Critic-rejected signals are logged, not buried. You can audit anything we did.
04
No hot/cold price color.
Your eye locks onto red and green. We don't use them. Direction lives in numbers and shape, not in a frame that punishes loss aversion.
05
No pumped sources.
Influencer-style language patterns get a confidence haircut. Forum velocity matters; one loud poster doesn't.
Add a card. Watch the discipline run.
Free for collectors. The catalog and forecast engine work on every card from the day you sign up — no waiting, no minimum, no card on file.