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.
| Source | Used for | Tier |
|---|---|---|
| Primary live spot feed | Live gold, silver and copper spot prices | All plans; Free 15 minutes late, paid live |
| Backup spot feed | Gold and silver spot only while the primary is unavailable | All plans; Free 15 minutes late, paid live |
| Futures settlement reference (gold + silver + copper) | Daily settlement, futures continuity, settlement-vs-spot differentials | Legacy plans only |
| exchangerate.dev FX | Currency conversion for non-USD gold prices | All 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
| Version | Change |
|---|---|
| v3.2 | Copy corrected to match the API: Free delay, bid/ask availability, copper spot, source fields. |
| v3.1 | Added a backup spot feed for gold and silver. Retired the tokenized-gold fallback. |
| 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. |
| 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). |
For API endpoint, tier, and product releases beyond methodology revisions, see the product changelog.
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.