Spot, Bid, Ask and Spread: How Precious Metal Prices Are Quoted
What spot, bid, ask, mid and spread mean for gold, silver, platinum and palladium, how dealers build quotes, and how to request and display bid/ask via API.
Why one ounce of gold has several prices
Look up the gold price on three websites at the same moment and you will often see three slightly different numbers. A coin dealer's site shows another two. None of them is necessarily wrong: they answer different questions. One shows the mid-market spot price, one a futures contract, one the price at which a dealer will sell you a bar and one the price at which it will buy it back.
If you build anything that displays or uses precious metal prices, such as a dealer storefront, a portfolio tracker, a jewellery calculator or an internal report, you need to know which of these numbers you are working with. This article explains the vocabulary (spot, bid, ask, mid and spread), shows how dealers turn wholesale quotes into retail prices, and walks through requesting and displaying bid and ask prices with the MetalAPI REST API.
This is an educational article about how prices are quoted. It is not investment or trading advice, and every number in the examples is illustrative.
Spot price: the reference for immediate delivery
The spot price is the price of a standard quantity of metal for immediate delivery, as opposed to delivery at a future date. In the wholesale gold market, which trades largely over the counter (OTC) and is centred on London, "spot" conventionally means settlement two business days after the trade.
Precious metals are quoted per troy ounce (31.1034768 grams), usually in US dollars, using ISO-style codes: XAU for gold, XAG for silver, XPT for platinum and XPD for palladium. XAU/USD therefore reads as "US dollars per troy ounce of gold", in the same way that EUR/USD reads as "US dollars per euro".
Because the spot market is OTC, there is no single exchange printing an official last trade. Banks and liquidity providers stream their own two-sided quotes, and the "spot price" you see on a website is a representative value derived from those quotes, most often the mid. A few related prices are easy to confuse with it:
- Futures prices, such as the COMEX gold contract, are for delivery in a future month. They usually differ from spot by the cost of carry: interest and storage until delivery.
- Benchmark prices, such as the LBMA Gold Price (set in auctions twice each London business day) and the LBMA Silver Price (set once a day), are single reference values used to settle contracts and value holdings. They are fixed at set times and do not move in between.
- Retail prices for coins and bars include premiums on top of spot. They are covered further down.
Bid, ask and mid
In a two-sided market every quote consists of two numbers:
- The bid is the highest price a market maker is currently willing to pay. It is the price at which you could sell.
- The ask, also called the offer, is the lowest price at which a market maker is willing to sell. It is the price at which you could buy.
The ask is always at or above the bid. The mid is their average, (bid + ask) / 2. Nobody trades at the mid as such; it is a neutral reference that sits between the two sides and favours neither buyer nor seller. That makes it the natural number for charts, portfolio valuations and "gold price today" headlines, and it is what most price APIs return by default.
| Term | Meaning | Typical use |
|---|---|---|
| Bid | Best price a buyer will pay | Valuing metal you would sell; reference for dealer buy-back prices |
| Ask (offer) | Best price a seller will accept | Cost of buying; reference for dealer selling prices |
| Mid | Average of bid and ask | Charts, valuations, headline prices |
| Spread | Ask minus bid | Measuring liquidity and the cost of a round trip |
A worked example with illustrative numbers. Suppose the wholesale gold quote is 3,997.62 bid and 3,998.16 ask, in US dollars per troy ounce:
bid = 3,997.62
ask = 3,998.16
mid = (3,997.62 + 3,998.16) / 2 = 3,997.89
spread = 3,998.16 - 3,997.62 = 0.54 USD
spread as % of mid = 0.54 / 3,997.89 ≈ 0.0135 % (about 1.35 basis points)Spreads in practice
The spread is the price of immediacy: what it would cost to buy and sell straight back again. Compare spreads in relative terms, as a percentage of the mid or in basis points (hundredths of a percent). An absolute spread of 0.50 means something very different on gold at several thousand dollars an ounce than on silver at a few tens of dollars.
Several factors widen or narrow it:
- Liquidity of the metal. Gold is the most heavily traded precious metal and usually has the tightest relative spread. Platinum and palladium trade in much smaller volumes, so their spreads are typically wider in percentage terms.
- Time of day. Spreads tend to be tightest when the main trading centres overlap and wider in quiet hours, such as around the daily New York close and the weekly reopening on Sunday evening, New York time.
- Volatility and news. Around major economic releases or during market stress, market makers widen their quotes to protect themselves.
- Size. A quoted spread applies to a standard trade size. Very large orders may be priced wider, and small retail purchases carry costs the wholesale spread does not include at all.
When you calculate spreads in code, use the unrounded numbers from the feed and measure the relative spread against the mid:
function spreadStats(bid, ask) {
const mid = (bid + ask) / 2;
const spread = ask - bid;
return {
mid,
spread,
spreadPct: (spread / mid) * 100,
spreadBps: (spread / mid) * 10000,
};
}
spreadStats(3997.62, 3998.16);
// mid ≈ 3997.89, spread ≈ 0.54, spreadPct ≈ 0.0135, spreadBps ≈ 1.35Wholesale and retail spreads are different things. The interbank spread on gold is a small fraction of a percent. The gap between a dealer's selling and buy-back prices for a one-ounce coin is much larger, because it also covers the product premium, distribution costs and the dealer's margin.
How dealers turn spot into a quote
A bullion dealer, jeweller or trading app rarely shows the wholesale quote as it is. Most start from a live reference, either the mid or the bid and ask, and apply their own terms to each side. A common structure looks like this:
- Selling price (what the customer pays) = reference ask × weight × purity + premium
- Buy-back price (what the customer receives) = reference bid × weight × purity − discount
The premium covers fabrication (minting a small coin costs more per ounce than casting a large bar), insurance, shipping, payment costs and margin. It may be a percentage over spot, a fixed amount per item or both, and it varies by product, size, dealer and demand.
Two conversions often sit in between. Prices for customers outside the United States are converted from US dollars into the local currency, which brings in an exchange rate and sometimes an FX spread of its own. And products sold by the gram or by karat, such as jewellery, are converted from troy ounces and scaled by purity: 22K gold is 22/24, about 91.67% pure, and 18K is 75% pure.
| Step (illustrative, 1 oz gold coin) | Selling side | Buy-back side |
|---|---|---|
| Wholesale reference, USD per troy ounce | Ask 3,998.16 | Bid 3,997.62 |
| Dealer adjustment (example only) | +3.0% premium | −1.0% discount |
| Customer price, USD | ≈ 4,118.10 | ≈ 3,957.64 |
The premium and discount in this table are invented for the example; real ones differ widely. The point is the structure: the customer-facing spread is the wholesale spread plus the dealer's adjustments on both sides, and the wholesale part is usually the smallest piece of it.
Requesting bid and ask with MetalAPI
By default, MetalAPI returns the mid price. For spot precious metals that mid is derived from interbank bid/ask feeds. On the Standard plan and above you can request the two sides as well, by adding -BID and -ASK to a symbol in currencies:
curl "https://metalapi.com/api/v1/latest?currencies=XAU,XAU-BID,XAU-ASK" \
-H "Authorization: Bearer YOUR_API_KEY"Each requested side appears in rates in both directions, exactly like the mid. USDXAU-BID is the bid in US dollars per troy ounce, and XAU-BID is its inverse:
{
"success": true,
"timestamp": 1792834892,
"date": "2026-10-24",
"base": "USD",
"rates": {
"XAU": 0.0002501319446,
"USDXAU": 3997.89,
"XAU-BID": 0.0002501488386,
"USDXAU-BID": 3997.62,
"XAU-ASK": 0.0002501150529,
"USDXAU-ASK": 3998.16
}
}A few details are worth knowing:
- Which symbols. Bid and ask are available for symbols quoted from interbank feeds: the precious metals and the major currencies. Futures-based symbols, such as copper or crude oil, are published as a single price. If a side is not available for a symbol, it is left out of
rates, so check that the key exists rather than assuming it does. - One snapshot. Bid, ask and mid come from the same snapshot, so they are consistent with each other. They refresh at your plan's interval: every 10 minutes on Standard, every minute on Advanced and Pro, every 15 seconds on Ultra and Business, and every 5 seconds on Enterprise.
- Other currencies and units.
baseandunitwork as usual, sobase=EUR&unit=gramreturns the gold bid and ask in euros per gram. The conversion into another base currency uses that currency's mid rate; if you need to apply an FX spread as well, add it yourself. - Plans. On Free and Lite, a request that includes
-BIDor-ASKsymbols returns error106(plan_restriction). Like other plan restrictions, that request is not billed. - History. Historical endpoints (daily closes, time series, OHLC) return mid prices. Bid and ask are part of the latest quote.
- AI assistants. The same suffixes work in the
symbolsargument of theget_latest_pricesMCP tool if you use MetalAPI from Claude or ChatGPT. See AI & MCP.
Displaying quotes correctly
Most mistakes with metal prices happen in the display layer rather than in the data. A short checklist:
- Say which price it is. Label mid prices as such ("spot" or "mid"). If you show both sides, label them from the customer's point of view: the customer buys at the ask and sells at the bid. Dealer sites often use "We buy" and "We sell", which is the dealer's point of view; mixing the two conventions on one page confuses people.
- Show the unit and currency. "$3,997.89" on its own is ambiguous. Write "USD per troy ounce" or "EUR per gram". Watch out for ounces: in MetalAPI's
unitparameter,ounceandozmean the avoirdupois ounce (28.35 g), while bullion is priced per troy ounce (troy_oz, the default). - Show when. Display the quote time from the response's
timestampfield, which is the time of the data, not of your request. On plans with delayed updates, say how often the price refreshes. - Handle market hours. Spot metals and major currencies trade from Sunday 17:00 to Friday 17:00 New York time. Over the weekend MetalAPI keeps returning Friday's closing prices, so show a "market closed" note rather than letting a frozen price look live.
- Round only for display. Keep full precision in calculations and round at the very end. A spread computed from rounded bid and ask values can be off by a large fraction of its own size.
- Guard against a crossed quote. If your own adjustments ever produce a selling price below the buy-back price, treat it as a bug and stop quoting until it is fixed.
- Be clear that prices are indicative. Prices from a data API are information, not an offer to trade. If you display them to customers, make clear that the binding price is the one confirmed at checkout or on a trade confirmation.
Putting this together, here is a small example that fetches the gold mid, bid and ask in euros per gram and prints them with labels and a timestamp:
const res = await fetch(
"https://metalapi.com/api/v1/latest?base=EUR&unit=gram¤cies=XAU,XAU-BID,XAU-ASK",
{ headers: { Authorization: "Bearer " + process.env.METALAPI_KEY } },
);
const data = await res.json();
if (!data.success) throw new Error(data.error.code + ": " + data.error.info);
const r = data.rates;
const eur = new Intl.NumberFormat("en-GB", { style: "currency", currency: "EUR" });
const asOf = new Date(data.timestamp * 1000).toISOString();
console.log("Gold, EUR per gram, as of " + asOf);
console.log("Mid:", eur.format(r.EURXAU));
if (r["EURXAU-BID"] !== undefined && r["EURXAU-ASK"] !== undefined) {
console.log("You sell at (bid):", eur.format(r["EURXAU-BID"]));
console.log("You buy at (ask):", eur.format(r["EURXAU-ASK"]));
}Quick reference
| Term | Definition |
|---|---|
| Spot | Price for immediate delivery; in the wholesale market, settlement two business days after the trade |
| Bid | Price at which the market will buy from you |
| Ask / offer | Price at which the market will sell to you |
| Mid | (bid + ask) / 2; the usual reference and default API price |
| Spread | Ask minus bid; often quoted as a percentage of the mid or in basis points |
| Basis point | 0.01%, one hundredth of a percent |
| Premium | A dealer's mark-up over the reference price for a physical product |
| Troy ounce | 31.1034768 grams; the unit precious metals are priced in |
To try it yourself, register for a free key to work with mid prices, and see pricing for the plans that include bid and ask. The API docs list every parameter, and the Data Formats & Units guide covers base currencies, mass units and the inverse rates in more detail.
Try it with your own data
Create a free account and make your first request in under two minutes. 100 requests a month, no credit card.
Keep reading
Connect Claude and ChatGPT to Live Gold Prices with MCP
Connect Claude, ChatGPT, Cursor and VS Code to live gold and metal prices with the MetalAPI MCP server: OAuth or API key setup, tools, safety and quotas.
Copper, Aluminium, Zinc and Oil Prices via API: A Developer's Guide
Get copper, aluminium, zinc, steel, crude oil and natural gas prices via API: natural units, normalisation, front-month futures, conversions and code samples.
How to Choose a Precious Metals Price API: 12 Questions to Ask
A vendor-neutral checklist for choosing a precious metals price API: sources, freshness, history, units, bid/ask, limits, pricing, security, terms and MCP.