Published ·Updated ·v3.0·~5 min read

Every source, visible.

We don't blend. Every price response includes a sources[] array with each upstream feed as a separate row. You decide what to trust.

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.

SourceUsed forTier
Live spot oracleReal-time gold + silver spotBasic, Pro
Continuous spot referenceIndustry-standard spot, 13 currenciesFree, all tiers
Futures settlement reference (gold + silver + copper)Daily settlement, futures continuity, settlement-vs-spot differentialsBasic (gold), Pro (silver, copper)
ECB reference ratesFX triangulation for non-USD pricesAll tiers
Tokenized gold (PAXG, XAUT)24/7 informational signal during TradFi closureBasic, Pro (informational only)
FT Commodities + Mining.com (news)Curated commodity headlines, recency-weightedAll 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.

Forward view: two layers

/data/gold renders two independent forward-looking signals on one chart, all served by /v1/forward-view/{asset}. Each layer answers a different question; neither is ground truth. The breakdown below covers the math, sources, and refresh cadence per layer.

Futures curve

The next 5 forward COMEX gold contracts. Settle prices at this tier are ~15 minutes delayed via Yahoo Finance with Stooq as a fallback. We are not a CME Group market data licensee and do not redistribute real-time CME MDP data; that licensed feed is deferred until $5K MRR. The dashed line connects the 5 settle points; gaps appear when both Yahoo and Stooq fail for a contract. Open interest and volume are best-effort null at this tier and are not surfaced in the response.

Analyst consensus

Three publishers, all HTML-parsed with claude-sonnet-4-5 under fair use (≤200-char quote excerpts, no raw article text stored). The Reuters Poll quarterly median is the anchor; it already aggregates JPM, Goldman, BofA, Morgan Stanley, UBS, Citi, and HSBC, so showing the median plus the same banks would visually double-count. Yardeni Research contributes an independent point target; the World Gold Council contributes a scenario range (NOT a confidence interval; the chart legend calls this out explicitly). Pro tier only.

Data freshness

Futures settle prices fire weekdays at 20:30 UTC: a single year-round schedule, +2h post-CME-settle in EDT, +1h in EST, DST-stable. Analyst forecasts refresh monthly on day 1 with a 5-minute publisher stagger (12:00 Yardeni, 12:05 WGC, 12:10 Reuters Poll) plus a Reuters Poll safety check between quarterly publications. Per-source last_success_at is tracked in forecast_sources; observability cron pages Sentry when a source goes silent for >14 days.

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

VersionChange
v3.0Tightened 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.1Metals pivot. Added silver spot via XAG oracle and copper futures settlement.
v2.0Pivot to pass-through-per-source. Killed blended-median aggregation. Added live spot oracle, ECB FX, tokenized gold (informational).
v1.0Initial multi-source aggregation. Tier-1 weighted median (superseded).
Questions, corrections, challenges

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.