§Pass-through, per source
Most metals APIs collect prices from several feeds, run a weighted median, throw away the inputs, and hand you one number. The blend is opaque. When prices disagree across exchanges (which happens daily around rollover, around settlement, around every market close), you can't tell whether the API's number reflects reality or the API's internal weighting.
We took the opposite position. The response for any symbol includes every source that contributed, as its own row, with its own timestamp. No hidden blend. No mystery weights. The aggregation logic, source weights, and divergence thresholds are operational choices we tune per release; the per-call proof of which sources fired is what your application sees.
GET /v1/prices?symbol=XAU-USD-SPOT
{
"symbol": "XAU",
"price": "4803.94",
"is_stale": false,
"computed_at": "2026-05-01T02:34:02Z",
"sources": [
{ "source": "oracle.xau_usd", "price": "4803.94", "timestamp": "..." },
{ "source": "spot_reference.usd", "price": "4803.42", "timestamp": "..." },
{ "source": "futures.gc_f", "price": "4802.80", "timestamp": "..." }
]
}§Sources we ingest
Source categories at each tier. Per-call proof of which feeds fired for any given price lives in your /v1/prices response.
| Source | Used for | Tier |
|---|---|---|
| Live spot oracle | Real-time gold + silver spot | Basic, Pro |
| Continuous spot reference | Industry-standard spot, 13 currencies | Free, all tiers |
| Futures settlement reference (gold + silver + copper) | Daily settlement, futures continuity, settlement-vs-spot differentials | Basic (gold), Pro (silver, copper) |
| ECB reference rates | FX triangulation for non-USD prices | All tiers |
| Tokenized gold (PAXG, XAUT) | 24/7 informational signal during TradFi closure | Basic, Pro (informational only) |
| Polymarket + Kalshi | Prediction-market view (forward distribution) | Pro+ |
| FT Commodities + Mining.com (news) | Curated commodity headlines, recency-weighted | All tiers |
Source identifiers, license rationale, refresh cadences, and upstream endpoint details are documented internally and evolve with each release. If you need this depth for legal evaluation, email hello@goldprice.dev with your use case and we'll respond.
§Cross-source divergence
With every primary source visible, the next question is obvious: how much do they actually disagree? Every response on a multi-source row carries a top-level divergence_bps integer — the spread between non-stale primary sources, in basis points relative to the mean.
Single-source rows omit the field rather than report a misleading zero. Tokenized PAXG / XAUT are tagged informational and feed a separate divergence_flag when they trade meaningfully off spot. The endpoint GET /v1/prices/divergence lists every symbol whose current spread exceeds a configurable threshold and is available on every tier — the spread itself is the trust signal.
§On the LBMA fix
§Staleness, per source
Because we pass every source through, staleness is per-source. The response emits a top-level is_stale that flips true when the primary source falls behind its expected refresh window. Each row in sources[] carries its own timestamp so you can make your own freshness call on any source you prefer.
A second field, value_stale, appears on rows whose upstream feed has stopped moving while we keep fetching it (a frozen partner feed, a daily-fix syndication being served as live, etc.). The two failure modes are distinct: is_stalemeans our scraper hasn't written; value_stale means upstream has stopped publishing actual change. Both surface honestly.
§Market probability distribution
Spot tells you where the price is right now. Futures tell you where the carry-neutral forward sits. Prediction markets tell you something neither can: the distribution of plausible expiry prices, collectively, across traders putting real money behind their views. Our /v1/prediction-market-view endpoint returns that distribution as five percentiles (p10, p25, p50, p75, p90) for one commodity at one expiry.
We consume Polymarket and Kalshi yes-prices on price-threshold and price-range market types. We exclude touch markets, binary-event markets, and competitive two-asset markets — they don't carry single-asset distribution information. The CDF construction is monotone-by-construction (no parametric assumption beyond what the data strictly requires) and the response includes metadata flags telling you when the distribution relied on tail extrapolation, single-venue data, or thin liquidity.
Two CDF methods are exposed via ?method=conviction|raw (default conviction): one is the academic standard with each market entering at equal weight; the other is our addition, weighting markets by where active capital actually sits rather than where decorative quotes happen to clear. Divergence between the two methods is itself a signal. The academic lineage is in the endpoint reference for readers who want the citation chain.
See it rendered live at /data/gold. Confidence tiers (low / medium / high) and the full flag reference live on the endpoint docs.
§News pipeline
Curated commodity-market news from a small set of direct-RSS sources at v1 (FT Commodities, Mining.com — more rolling out post-launch). Items are scored by source-quality weight × recency decay; the response is pre-ranked best-newest. RSS + JSON + MCP all served from the same pipeline. We do not scrape Google News. Reuters / Bloomberg defer to a post-launch licensing decision.
§What we don't do
- LBMA fix. See above.
- Tick-level L2 order books. We publish prices, not depth. If you need depth, license it from CME or LSEG.
- Sub-second latency guarantees.We don't publish a numerical latency SLA.
- Continuous copper spot. We ship copper futures settlement only. Front-month rotation if customer demand warrants the complexity.
- Silent blending. The whole point of this page.
§Methodology changelog
| Version | Change |
|---|---|
| v3.0 | Tightened public methodology to source categories + divergence + staleness concepts. Per-source identifiers, refresh cadences, and aggregation specifics moved out of the public page. News pipeline section added. |
| v2.2 | Added the market probability distribution section covering the /v1/prediction-market-view endpoint. Added the value_stale field documentation under staleness. |
| v2.1 | Metals pivot. Added silver spot via XAG oracle and copper futures settlement. |
| v2.0 | Pivot to pass-through-per-source. Killed blended-median aggregation. Added live spot oracle, ECB FX, tokenized gold (informational). |
| v1.0 | Initial multi-source aggregation. Tier-1 weighted median (superseded). |
Spot something off, or have a source we should consider? Email hello@goldprice.dev. We publish material corrections here.
Questions about the API? Read the docs.