Your cart is empty
Browse CatalogYour sell cart is empty
Add cards from the buylist to get started
Polling discipline + change-detection.
If you're building a price-alert bot, a single-card watch surface, or a deck-tracker, you want per-card price observation without thrashing the API. This guide names the polite cadence + the change-detection primitive.
GET the card's universal-mirror representation. The `@content_hash` is the change-detection primitive: same hash = same card facts (no change worth re-rendering); different hash = something changed.
Run this
curl https://cambridgetcg.com/api/v1/universal/card/op-op01-001-ja
Expected response shape
{ "@content_hash": "sha256:...", "@retrieved_at": {...}, "price": { "magnitude": 5.40, "currency_token": "GBP", "magnitude_freshness": {...} }, ... }What to do with it
Store `@content_hash` + `price.magnitude` + `price.magnitude_freshness.iso8601`. These are your local cache key.
Schedule re-fetches at the freshness budget. For prices, that's 5 minutes (`price_current`). Faster polling returns the same response — wasted bandwidth. Set a maximum poll rate of 12 requests/hour per SKU.
Run this
# every 5 minutes: curl https://cambridgetcg.com/api/v1/universal/card/op-op01-001-ja
What to do with it
On each poll, compare the new `@content_hash` against your stored. If equal: nothing changed; reschedule. If different: extract the new magnitude, log to your time-series, possibly fire your alert. Substrate-honest about `magnitude_freshness.decimal_age_seconds` — the platform may report a price that was last observed hours ago.
If you want to backfill, hit the temporal endpoint — `/api/at/[YYYY-MM-DD]/card/[sku]`. Each historical day is immutable (returns `Cache-Control: immutable`). Pull once per day per SKU into your local series.
Run this
curl https://cambridgetcg.com/api/at/2026-03-15/card/op-op01-001-ja
What to do with it
Build your local time-series by iterating dates. The response's `@as_of` declares the queried date; the `@retrieved_at` declares when the response was produced. The price's `staleness_relative_to_as_of_days` tells you how stale the observation was on that historical day.
The storefront universal-mirror gives GBP prices (Cambridge TCG's retail offer, CC0). If you want the raw CardRush JPY observation history (90 days), you must be signed in and call /api/v1/cards/[sku]/cardrush-history. That endpoint declares `_meta.source_license: ['internal-only']` — non-bulk, non-redistributable.
We don't currently enforce per-SKU rate limits at the edge. The 5-minute number is the freshness budget — polling faster doesn't give you fresher data. We monitor for abuse patterns and may rate-limit unfriendly clients without warning.
The hash incorporates the price observation date, so a card without a price update still produces a fresh hash daily. If you want truly hash-based change detection without the daily noise, compare `price.magnitude` + `magnitude_freshness.iso8601` instead.
Next guide
Etiquette + identification + the contact channel.