Pricing-as-API
The number the world cites — every field reproducible.
A bearer token gets you fair value, 95% confidence interval, sample size, attributed sources, and per-week velocity for any catalog card. Every response carries a methodology URL pointing at the formulas that produced it. We honestly say “insufficient” when we don’t know — there’s no fabricated number masquerading as a real one.
Use cases
Marketplaces
Anchor every listing to a third-party fair value. Show buyers the comparable spread without standing up your own pricing pipeline.
Insurance carriers
Issue policies against a 95% CI, not a single number. Auditable sample size + license URL on every quote.
Portfolio apps
Mark-to-market for collector portfolios with the same math VaultStore uses on its own portfolio ledger. One call per card.
Sample request
Fair value for a single catalog cardGET /api/v1/cards/{catalog_card_id}/price
Authorization: Bearer vsprice_<your-key>Sample response
Envelope version 1 — additive within major{
"version": "1",
"card_id": "9f4e…b3a1",
"name": "Charizard",
"set_code": "BASE",
"fair_price_cents": 38912,
"ci_lower_cents": 36420,
"ci_upper_cents": 41440,
"confidence": "high",
"sample_size": 24,
"window_days": 60,
"observed_at": "2026-05-08T19:14:11.000Z",
"last_sale_cents": 39500,
"velocity_per_week": 5.8,
"sources": ["VaultStore", "VaultStore TCG graph"],
"source_breakdown": { "vaultstore_sale": 8, "tcg_graph": 16 },
"currency": "USD",
"license": "https://vaultstore.com/legal/pricing-license",
"methodology_url": "https://vaultstore.com/pricing/methodology"
}Field contract
What every field means and when it’s null- version — pin this on every consumer. New fields are additive within a major version; field semantics never change without a version bump.
- fair_price_cents — trimmed median of weighted comparable sales over the last 30 days. Null when
confidence === "insufficient". - ci_lower_cents / ci_upper_cents— central 95% of the trimmed distribution. Student-t when n < 30, normal-approx 1.96·σ/√n when n ≥ 30. Null with insufficient data.
- confidence — one of
high,medium,low,insufficient. Gate UI onconfidence !== "insufficient"before rendering a headline number — that tier explicitly says “we don’t know”. - sample_size — comp count after trimming. Useful as a depth signal independent of the confidence tier.
- window_days — width of the comparable-sales window the trimmed median was computed from. The endpoint reports the window it actually used so consumers can reproduce the math without guessing.
- last_sale_cents — price of the most recent realized comp in the window. Null when none exists. Pair with
observed_atfor the freshness of that specific sale. - source_breakdown— per-source comp count over the window, keyed by source identifier. Useful for auditing which feeds drove the median. Don’t render these keys directly to end users — route through methodology labels when displaying.
- velocity_per_week — realized sales per week, averaged over the last 28 days. Null when no sale-typed events exist. A high-velocity card with a tight CI is liquid; low velocity with a wide CI is illiquid even if the median looks confident.
- sources — attributed source labels we hold an active license to cite. Filtered through
external_price_licenses; you can render this array verbatim. - observed_at — most recent comp timestamp in the window. Pair with
Cache-Control: s-maxageon the response to drive your own freshness display. - license — URL of the data-license terms covering this response. Show or link this when you republish the value.
- methodology_url — link to the public formula stack. Surface this alongside the price so end-users can audit your number without leaving your app.
One-line embed widget
No API key required · IP rate-limitedFor blogs, listing pages, and portfolio apps that just want to show a fair value inline without writing JavaScript: drop a script tag and a mount div. The widget calls a public, IP-rate-limited subset of the price endpoint and renders the same numbers — fair value, 95% CI, sample size, velocity, and a link back to the methodology page. No keys, no setup, no config.
<script src="https://vaultstore.com/embed/price.js" async></script> <div data-vs-price-card-id="9f4e…b3a1"></div>
- The widget injects inline-styled HTML into each matching
div. No shadow DOM, no global CSS, nothing to clash with the host page. - SPA hosts can re-scan after route changes by calling
window.VaultStorePriceEmbed.refresh(). - Rate limit: 60 requests / minute per origin IP. Caches at the edge for 5 minutes so a popular blog with N embeds renders all of them on first paint without throttling.
Caching & rate limits
- Responses ship with
Cache-Control: public, s-maxage=N, stale-while-revalidate=M.Ndefaults to 300 seconds and is brain-tunable per methodology. - Per-key rate limits and per-day cost caps are enforced via the standard
X-RateLimit-*response headers. Free tier is 1k calls/day; growth tiers raise the ceiling. - Errors use the standard envelope:
{ error: { code, message } }with HTTP status. Auth failures are always 401/403 with codescope_requiredortier_required.
Pricing
Per-call, billed monthlyDeveloper
$01,000 calls / month, free during preview
Growth
$0.01 / call100k calls / month, history endpoint, dashboard
Enterprise
contactVolume pricing, SLA, dedicated comp ledger
What you can’t buy from the alternatives
- Auditable provenance — every response carries
sample_size,observed_at,sources, and a link to the formula stack. A consumer disputing your number reads methodology and reproduces it. - An honest empty state — when comparables are missing, the API says
insufficientand returns null. No fabricated headline numbers, no quietly-wide CIs hiding the lack of signal. - Velocity — published alongside the price, not an afterthought. You learn liquidity at the same time you learn the median.
- A drift watchdog — every 24 hours we compare our published number against external comparables on the same cards. When the gap exceeds 5% across 50+ cards an action-tier insight reaches the methodology team. The number gets investigated before the next refresh ships.