cardpulse
How Cardpulse prices a card

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.

watch the full decision pipelineone card · nine decisions · scrolling walkthrough
Live: eBay · Goldin · Fanatics Collect · PriceCharting · Reddit · ESPNAuthoritative ID via PSA · Scryfall · pokemontcg.io · ComicVineAgent-reviewed conviction
§0 Capture

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

§0 Identity

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.

Cascade · top hit wins
1

PSA cert

perfect ID from cert number

100%
2

Scryfall · pokemontcg · ComicVine

canonical card data, free APIs

92–95%
3

trigram catalog

fuzzy match on what we already track

4

eBay listings

free-text title parse, last-resort

The comp ladder

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

2024 Topps Chrome · Caleb Williams · PSA 10last 8 ticks
Apr 24$282soldeBay BIN
Apr 22$278soldeBay auction
Apr 21$430soldeBay BIN
Apr 19$285soldeBay BIN
Apr 18$310askPriceCharting
Apr 17$292soldeBay BIN
Apr 14$280soldeBay BIN
Apr 12$305soldeBay auction

30-day median (sold-preferred)

$285n=22 clean

Borrowed-strength comp

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

$1,42080% band $980 – $2,150

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
borrowed-v1 · t1 (1/1) · prior shrunk · ci inflated by borrow distance
Outlier discipline

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

32-tick window · modified z2 flagged
clean tick (n=30)flagged outlier (n=2)
Liquidity, by tier

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

Confidence statesper variant
HOTThick, recent, cleann=22 · cv 0.11 · last 2d
WARMQuantile rangen=6 · cv 0.24 · last 11d
COLDComp-ladder estimaten=2 · stale 38d · peer-borrowed
DARKNo one really knowsn=0 · 1-of-1 · estimate only
event-driven modifiernews cycle override
The forward lever

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

5 signals · last 24hnet +0.43
milestone4-TD MNF performance+0.78 · c0.82
transactionQB rumor — trade desk floats name+0.34 · c0.61
forumr/footballcards thread velocity ↑22%+0.42 · c0.55
socialInfluencer: 'easy buy under $300'+0.55 · c0.40
injuryPractice report — limited−0.18 · c0.51
muted = critic flagged for influencer-pump pattern
Two passes, not one

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

Signal pipeline
01

Classifier reads the article

Claude Haiku · ~400 tokens · 800ms

score +0.78 · confidence 0.82 · kind milestone

02

Gate trigger — score loud, confidence low

|score| > 0.20 OR confidence < 0.85

2 of 5 signals enter critic

03

Critic audits

Claude Sonnet · different model · 1.6s

3 verdicts: pass · regenerate · reject

04

Outcome

logged with FK to article

✓ pass: persist · ↻ regen: use suggested · ✕ reject: drop + queue

§5b Agentic reviewer

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

rules: HOLDREVIEWER: KEEP

“Single missed-practice signal on a vintage HOF rookie that trades on legacy. Hold.”

The forecast

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

30d forecastBUY

$322from $285

80% band: $280 — $368

Caleb Williams threw 4 TDs against KC on MNF; PSA 10 rookie tier amplifies the move 1.6×.

baseline+4.2%
30d regression
peer-borrow+0.9%
thin → siblings
sentiment+3.6%
3 signals avg +0.58
grade-tier+2.2%
top-tier ×1.60
rookie+1.7%
RC premium ×1.30
rarity+1.2%
/99 short-print ×1.18
calendar+0.4%
playoff window
Anticipatory alerts

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

4 alert kinds24h debounce

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

The five things we deliberately won't do

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.

Get started

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.