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.
Why a checklist helps
Most precious metals price APIs look alike on their landing pages: real-time gold and silver, many currencies, JSON responses and a free tier. The differences that matter show up later, when a dashboard shows a stale price over a weekend, a customer asks why your gram price differs from a dealer's, the monthly quota runs out on the 20th, or your legal team asks whether you may show the data to customers at all.
This checklist collects twelve questions worth answering before you commit. They apply to any provider and work for a weekend project as well as a formal procurement review. Further down you will find a comparison template to copy and a short list of hands-on tests. Because this article is published by MetalAPI, the last section gives our own answers; everything before it is meant to be useful whichever provider you choose.
Data: sources, freshness and history
1. Where do the prices come from? Precious metal prices can come from several kinds of source: quotes from banks and liquidity providers in the over-the-counter spot market, exchange futures such as COMEX gold, official benchmarks such as the LBMA auction prices, or another aggregator. None of these is wrong, but they are different numbers. Ask which source feeds each symbol, whether several sources are combined and how, and how obviously bad ticks are filtered out. If a provider cannot say what its gold price represents (spot mid, futures or benchmark), you will not be able to explain it to your own users either.
2. How fresh is the data on the plan you will actually pay for? "Real-time" on a homepage often describes the top tier. Check the update interval of each plan, and check that every response carries the timestamp of the data itself, not only of your request. Ask what happens outside market hours: spot metals stop trading from Friday evening to Sunday evening, New York time, and a good API makes it clear that a weekend price is Friday's close.
3. How deep is the history, and what is it made of? Check the start date for each asset class, whether you get only daily closes or open, high, low and close, and how "close" is defined (which time zone, which source). Ask whether older history comes from a different source than today's prices, such as futures settlements before a certain date, because that can create small discontinuities in a long chart. Finally, check how many days a single range request may cover.
Fit: units, currencies and bid/ask
4. Which units and currencies are supported? Precious metals trade per troy ounce, but your users may think in grams or kilograms, and in their own currency. A unit parameter saves you from doing every conversion yourself; check how the API names units, because the troy ounce (31.103 g) and the avoirdupois ounce (28.35 g) differ by almost 10%. If you need cross rates, such as gold in Turkish lira or silver in yen, check that they are computed from one consistent snapshot. Jewellery use cases may also need prices by karat.
5. Do you need bid and ask, or is a mid price enough? Charts and valuations normally use the mid. Dealer storefronts, buy-back calculators and trading tools usually need both sides of the quote. Ask whether bid and ask are offered, for which symbols and on which plans, and whether they come from the same snapshot as the mid. If the terms are new to you, our explainer on spot, bid, ask and spread covers them.
Operations: reliability, limits and errors
6. How reliable is it, and how would you know? Look for a public status page that covers the data sources as well as the API, and for some history of incidents. Ask what happens when an upstream source fails: does the provider fall back to another source, mark the data as stale, or keep serving the last price without saying so? If uptime matters to you contractually, check which plans include a service level agreement and what exactly it covers.
7. What are the rate limits and quotas, and what counts? Most providers combine a monthly request quota with a per-minute or per-second limit. The details change the economics more than the headline numbers. Does a request for twenty symbols count as one call or twenty? Are failed requests billed? Are some endpoints free? What happens at the limit: a hard stop until the next period, automatic overage charges or throttling? Model your real usage against each plan; one request per minute, around the clock, is about 43,200 requests a month.
8. How are errors reported? A good API returns a meaningful HTTP status together with a machine-readable error code and a human-readable message, documents every code, and tells you when to retry, for example with a Retry-After header on rate limits. Check that the error format is the same across endpoints and that a machine-readable specification, such as OpenAPI, is available for generating clients and tests.
Commercials: pricing, security and terms
9. Does the pricing model fit your usage? Compare flat monthly tiers, pay-per-call pricing and custom contracts using your own expected volume, not the provider's examples. Check what the free tier really includes (update interval, endpoints), whether yearly billing changes the price, whether taxes are added and how cancellation works. Large jumps between tiers matter if your usage sits close to a boundary.
10. How are API keys protected? Ask whether keys can be sent in a header rather than only in the URL, since URLs end up in logs. Check whether you can hold several keys and rotate them without downtime, and whether the provider stores keys hashed. If you need prices in a browser, look for domain-restricted keys or an embeddable widget that avoids exposing a key at all: a key in public JavaScript can be copied by anyone.
11. What do the terms allow? Read the data licence before you build. May you display prices to your own customers? May you store history in your database? Is redistribution, such as offering the data through your own API, allowed, and if not, is a licence for it available? Is attribution required? Official benchmarks such as the LBMA prices are run by benchmark administrators and are generally licensed separately, so ask whether a feed contains benchmark data and what that means for you. Check the disclaimer too: price data is normally provided as information, not as an offer to trade.
Future-proofing: AI and MCP support
12. Can AI assistants and agents use it? More analysis now happens in chat assistants and coding agents. The Model Context Protocol (MCP) is an open standard for connecting them to tools and data, and a provider with an MCP server lets an assistant fetch real prices instead of guessing from its training data. Questions to ask:
- Is there a hosted MCP server, and which transports and clients does it support?
- How does it authenticate: OAuth sign-in for chat apps, an API key for developer tools, or both?
- Which tools are read-only, and do the ones that change something ask for confirmation first?
- Do assistant calls count against the same quota, and can the server ever charge you by itself?
- Is there documentation written for language models, such as an
llms.txtfile or an OpenAPI specification, so a coding assistant can write your integration correctly?
Even if you do not use AI tools today, the answers say something about how current and how well documented an API is.
A comparison template you can fill in
Copy this table into a spreadsheet or document and fill in one column per provider. Note where each answer came from (documentation page, support reply or your own test) so you can check it again later.
| # | Question | What to look for | Provider A | Provider B | Provider C |
|---|---|---|---|---|---|
| 1 | Data sources | Named sources per asset class; aggregation method; bad-tick filtering | |||
| 2 | Freshness | Update interval on your plan; data timestamp; weekend behaviour | |||
| 3 | History | Start dates; OHLC; definition of close; maximum range per request | |||
| 4 | Units and currencies | Troy ounce, gram, kilogram; base currencies; consistent cross rates | |||
| 5 | Bid/ask | Symbols and plans; same snapshot as the mid | |||
| 6 | Reliability | Status page; incident history; fallbacks; SLA | |||
| 7 | Limits and quotas | Monthly and per-minute limits; what counts; behaviour at the limit | |||
| 8 | Errors | HTTP status and codes; retry guidance; OpenAPI spec | |||
| 9 | Pricing | Cost at your volume; free tier; yearly billing; cancellation | |||
| 10 | Security | Header auth; multiple keys; rotation; domain restriction | |||
| 11 | Terms | Display rights; storage; redistribution; attribution | |||
| 12 | AI and MCP | Hosted MCP server; OAuth or key; read-only tools; docs for LLMs |
Answers on paper are a start, but a short hands-on test settles most of them. With a free or trial key for each candidate:
- Request the same symbols at the same moment from each provider and compare values, timestamps and units.
- Repeat the request on a Saturday and see how each API represents a closed market.
- Trigger errors on purpose (a wrong key, an unknown symbol, a future date) and check the status codes and messages.
- Request a year of daily history and look for gaps, spikes and a visible change in level where a source might have switched.
- Measure latency from where your servers run, not from your laptop.
This small script helps with the first and last points. Adjust the URL, the authentication header and the timestamp field to each provider's documentation, and remember that every call uses quota:
// Calls an endpoint a few times and records HTTP status, latency and data age.
const TARGET = process.env.PRICE_API_URL;
const HEADERS = { Authorization: "Bearer " + process.env.PRICE_API_KEY };
for (let i = 0; i < 5; i++) {
const started = Date.now();
const res = await fetch(TARGET, { headers: HEADERS });
const body = await res.json().catch(() => ({}));
const latencyMs = Date.now() - started;
// Many APIs return Unix seconds; adapt this line to the provider's field.
const dataTime = typeof body.timestamp === "number" ? body.timestamp * 1000 : null;
const dataAgeSeconds = dataTime ? Math.round((Date.now() - dataTime) / 1000) : "n/a";
console.log({ status: res.status, latencyMs, dataAgeSeconds });
await new Promise((resolve) => setTimeout(resolve, 2000));
}How MetalAPI answers these questions
For completeness, here are our own answers, limited to facts you can check in our documentation. Please hold us to the same standard as everyone else.
- Sources: spot precious metals and major currencies from interbank bid/ask feeds; industrial metals and energy from COMEX, NYMEX and ICE front-month futures; crypto from Kraken and Binance; European Central Bank reference rates for FX. Multiple sources are combined by median and checked for bad ticks.
- Freshness: daily on Free, every 30 minutes on Lite, 10 minutes on Standard, 1 minute on Advanced and Pro, 15 seconds on Ultra and Business and 5 seconds on Enterprise. Every response carries the
timestampof the data; over the weekend, metal, currency and futures prices stay at Friday's close. - History: daily open, high, low and close for currencies since 1999, metals and energy since 2000 and crypto since 2014. Metal history before October 2026 is based on front-month futures settlements. One range request covers up to 30 days on Free and 365 days on paid plans.
- Units and currencies: seven mass units from gram to short ton, 57 currencies and any symbol as the base, with cross rates from one snapshot. Gold prices by karat on paid plans.
- Bid/ask:
XAU-BIDandXAU-ASKstyle symbols on Standard and above, for precious metals and major currencies, from the same snapshot as the mid. - Reliability: a public status page showing data sources, latency and API volume, including when fallback sources are in use; an uptime SLA on the Business and Enterprise plans.
- Limits: a monthly quota plus a per-minute limit on every plan. A request counts once however many symbols it returns;
/symbolsand/usageare free; requests rejected for rate limits, plan restrictions, origin checks or server errors are not billed. At the quota, requests return error105until the 1st of the month (UTC) or an upgrade; there are no automatic overage fees. - Errors: an HTTP status plus a numeric
code, atypeand aninfomessage in JSON,Retry-Afteron rate limits, a documented list of codes and an OpenAPI 3.1 specification. - Pricing: flat plans from Free ($0, 100 requests a month) through Lite ($4.99), Standard ($11.99), Advanced ($24.99), Pro ($49.99), Ultra ($99.99) and Business ($149.99) to Enterprise ($299.99, 1.5 million requests), billed monthly or yearly and cancellable from the billing page. Details on the pricing page.
- Security: keys are stored only as hashes and can be sent in a header; depending on the plan you can hold several keys, roll or revoke them, and restrict them to your own domains. Embeddable widgets show prices without exposing a key.
- Terms: you may use the data in your own websites, apps, internal systems and reports, including showing prices to your users; redistributing the raw feed, for example as your own API, needs a separate written agreement. Data is provided for information and is not investment advice. See the terms.
- AI and MCP: a hosted MCP server at
https://metalapi.com/mcp(Streamable HTTP, OAuth 2.1 or API key) with 13 tools, 11 of them read-only; the two that change something ask first, and the server never charges anything. It is listed in the official MCP Registry, and llms.txt and the OpenAPI specification are published. See AI & MCP.
Whichever provider you choose, run the hands-on tests above with your own symbols and usage pattern. If MetalAPI is on your list, a free account is enough for most of them, and the API docs cover the rest.
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.
Gold Price API: The Complete Developer Guide
How to use a gold price API: get a key, call it from curl, JavaScript and Python, read the rates correctly, and handle history, errors, quotas and caching.
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.