Public API

PFVI data is meant to be public.

No paywall, no secret client key, no fake black box. If PFVI used it to price the index, the API should make it inspectable: chart tape, accepted sales, rejected sales, source counters, and calculation knobs.

Base URL

https://pfviapi.tradeonliquid.xyz

Public GET + CORS enabled

All endpoints below are read-only and public. Responses are JSON. Public cache is short-lived, currently intended for live dashboards and third-party charting.

Health check

Tiny liveness check for monitors.

okservice

Current PFVI snapshot

Best endpoint for a simple price widget or settlement display.

index metadatatimestampdenominationvalueUsdcmedianUsdcmeanUsdcconfidenceacceptedSalesCountrejectedSalesCountlatestAcceptedSalecomponents

Historical PFVI tape

Best endpoint for charts. Returns the public PFVI time series, ordered oldest to newest.

timestampvalueUsdcconfidenceacceptedSalesCountrejectedSalesCount

Accepted sales corpus

Every sale currently accepted into the PFVI calculation window.

txSigmintactionmarketplacetimestamppriceUsdccurrencybuyersellercardrawzScore

Rejected sales log

Every sale seen but rejected from the current calculation, with the reason attached.

all sale fieldsaccepted=falserejectionReason

Methodology components

The machine-readable knobs behind the current PFVI calculation.

formulasourceminGradegradeCompanyminPriceUsdwindowSalesoutlierStddevacceptedActionscurrency

Source + index metadata

Crawler/source summary, index identity, and current calculation components in one light payload.

generatedAtsourceindexcomponents

Feed metadata

Operational counters for dashboards, crawlers, and watchdogs.

generatedAtlastWriteAthasCurrenthistoryCountacceptedSalesCountrejectedSalesCountsource

Full public dump

Everything public in one payload: current, full chart history, source summary, accepted sales, rejected sales, and latest methodology components.

generatedAtsourcecurrentcurrent.acceptedSalescurrent.rejectedSaleshistoryPointhistory
Payload shape

What third parties can build from it.

Charting

Use /api/pfvi/history for a clean time series, or /api/pfvi/dumpif you want the chart and the current sale corpus in one request.

fetch("https://pfviapi.tradeonliquid.xyz/api/pfvi/history")
  .then((r) => r.json())
  .then((points) => points.map((p) => ({
    time: p.timestamp,
    value: p.valueUsdc
  })));

Auditing

Compare /sales against /rejected. Rejections include the reason so anyone can see which prints were excluded before settlement.

const [accepted, rejected] = await Promise.all([
  fetch("https://pfviapi.tradeonliquid.xyz/api/pfvi/sales").then((r) => r.json()),
  fetch("https://pfviapi.tradeonliquid.xyz/api/pfvi/rejected").then((r) => r.json())
]);
Example/current
{
  "index": { "id": "PFVI", "ticker": "PFVI", "eligibility": "PSA 6+" },
  "timestamp": "2026-06-10T12:10:37.179Z",
  "denomination": "USDC",
  "valueUsdc": 51.7372,
  "medianUsdc": 46.8,
  "meanUsdc": 60.3784,
  "confidence": 82,
  "acceptedSalesCount": 942,
  "rejectedSalesCount": 1548,
  "components": { "formula": "10% trimmed mean...", "source": "Collector Crypt card-activity API" }
}
Examplesale object
{
  "txSig": "36Qr9e...DUmMNtqv",
  "mint": "8s8FGr...RH2RW",
  "action": "Offer Accepted",
  "marketplace": "COLLECTOR_CRYPT",
  "timestamp": "2026-06-10T06:59:13.000Z",
  "priceUsdc": 47.0988,
  "currency": "USDC",
  "buyer": "9qv5...mvaqJA",
  "seller": "HkUN...rKQ8Y",
  "accepted": true,
  "rejectionReason": null,
  "card": { "itemName": "2025 #109 N's Reshiram PSA 10...", "gradeNum": 10 },
  "raw": { "source": "COLLECTOR_CRYPT", "transactionUrl": "https://solscan.io/tx/..." }
}