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

Every source, visible.

We don't blend. Add ?include=sources to any price response and get 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&include=sources

{
  "symbol": "XAU",
  "price": "4803.94",
  "is_stale": false,
  "computed_at": "2026-05-01T02:34:02Z",
  "sources": [
    { "source": "oracle.xau_usd", "display_name": "Live spot", "price": "4803.94", "fetched_at": "...", "source_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
Primary live spot feedLive gold, silver and copper spot pricesAll plans; Free 15 minutes late, paid live
Backup spot feedGold and silver spot only while the primary is unavailableAll plans; Free 15 minutes late, paid live
Futures settlement reference (gold + silver + copper)Daily settlement, futures continuity, settlement-vs-spot differentialsLegacy plans only
exchangerate.dev FXCurrency conversion for non-USD gold pricesAll tiers

Source identifiers, 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.

Non-USD prices on the currency pages are USD gold spot multiplied by live FX from exchangerate.dev, our sibling currency API. Non-USD spot rows use no stored FX fallback. If live FX stops, /v1/convert and /v1/carat use the newest stored rate up to 3 days old; non-USD spot rows retain a stale price.

Backup spot feed

Spot uses licensed primary market data. Bid/ask are paid-only and optional, requiring a coherent two-sided quote. If the primary stops, gold and silver switch to a licensed backup until it returns. The backup price can run up to about two minutes behind the market. While it is in use, responses have no bid or ask.

We do not use the backup when the metals market is closed: daily from 17:00 to 18:00 and from Friday 17:00 to Sunday 18:00, all in New York time. Copper has no backup. If its feed stops, the last copper price is marked stale.

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. divergence_flag stays false on XAU-USD-SPOT; non-USD gold uses USD spot × live exchangerate.dev FX. 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 always emits a top-level is_stale that flips true when the primary source falls behind its expected refresh window. Add ?include=sources and each row in sources[] carries its own source_timestamp so you can make your own freshness call on any source you prefer.

Forward view: futures curve

/data/gold renders the market-implied forward price path on one chart, served by /v1/forward-view/{asset}. The breakdown below covers the math, source, and refresh cadence.

Futures curve

The next 5 forward gold contracts. Settle prices are ~15 minutes delayed via our primary delayed-feed series with a secondary fallback. Futures values come from publicly available delayed feeds and are not licensed real-time data. The dashed line connects the 5 settle points; gaps appear when both our primary and fallback feeds fail for a contract. Open interest and volume are best-effort null and are not surfaced in the response.

Data freshness

Futures settle prices fire weekdays at 20:30 UTC: a single year-round schedule, +2h post-settle in EDT, +1h in EST, DST-stable.

What we don't do

  • LBMA fix. See above.
  • Tick-level L2 order books. We publish prices, not depth. Tick-level order books are outside this API's coverage.
  • Sub-second latency guarantees. We don't publish a numerical latency SLA.
  • Silent blending. The whole point of this page.

Methodology changelog

VersionChange
v3.2Copy corrected to match the API: Free delay, bid/ask availability, copper spot, source fields.
v3.1Added a backup spot feed for gold and silver. Retired the tokenized-gold fallback.
v3.0Tightened public methodology to source categories + divergence + staleness concepts. Per-source identifiers, refresh cadences, and aggregation specifics moved out of the public page.
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).

For API endpoint, tier, and product releases beyond methodology revisions, see the product changelog.

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.