Metals API for live and historical metal prices
Gold, silver, platinum, palladium, copper and five more base metals as JSON: live spot prices, daily history back to 1966, and the exchange data most metals APIs don't carry. Start free with 200 requests a month, no card required.
- Every metal in one request, with bid, ask and 24-hour change
- Daily history back to 1966, intraday down to 15 minutes
- COMEX inventory, LBMA vaults, Shanghai premiums and CFTC positioning
- Commercial use on every plan, documented with OpenAPI 3.0
{
"success": true,
"data": {
"XAU": {
"symbol": "XAU",
"price": 4286.23637,
"bid": 4271.2345427049995,
"ask": 4301.238197295,
"change24h": -0.50336,
"changePercent24h": -0.0117,
"high24h": 4286.4489,
"low24h": 4284.85731,
"timestamp": "2026-09-26T18:12:50.484Z",
"exchange": "SPOT",
"marketType": "spot",
"stale": false
}
}
}1966
Gold and silver daily history starts
10
Metals with live spot prices
1,100+
Instruments in the catalogue
200
Free requests a month, no card
At a glance
The MetalCharts API in twelve facts
- Base URL
https://api.metalcharts.org- Authentication
- Bearer token in the header:
Authorization: Bearer mc_live_YOUR_KEY - Format
- REST over HTTPS, GET requests, JSON responses
- Specification
- OpenAPI 3.0 (JSON)
- Free tier
- 200 requests a month, 10 a minute, one key, no card. Public displays need a credit link.
- Prices
- Free $0, Starter $9/month, Basic $29/month, Pro $99/month, Ultimate $249/month. Paying yearly costs ten months.
- Rate limits
- Weight per minute on each key, plus a monthly allowance per account on Free, Starter and Basic
- Live prices
- Ten metals with 24-hour change, high, low and an indicative bid and ask; responses cached 30 seconds
- History
- Daily bars back to October 1966 for gold and silver, intraday from 15 minutes, up to 5,000 candles a request; from Starter
- Exchange data
- COMEX, LBMA, Shanghai, India MCX and CFTC from Pro; Guangzhou (GFEX) on Ultimate
- Commercial use
- Allowed on every plan, Free included
- Support
- [email protected]
Plans and limits
Exactly what each plan allows
| Plan | Per minuteweight, per API key | Per monthweight, all keys combined | API keys | History |
|---|---|---|---|---|
| Free$0 | 10 | 200200 spot calls | 1 | Live spot only |
| Starter$9/mo | 20 | 10,00010,000 spot calls or 5,000 history calls | 2 | 1 year |
| Basic$29/mo | 30 | 250,000250,000 spot calls or 125,000 history calls | 3 | 1 year |
| Pro$99/mo | 200 | No monthly cap | 10 | 5 years |
| Ultimate$249/mo | 1,000 | No monthly cap | 25 | Full, back to 1966 |
01
What a request costs
Every call costs weight. Spot prices, market status, instruments and most other endpoints cost 1. History and news cost 2. News search and sentiment cost 3. Checking your own usage at /v1/usage costs 0. Both limits are counted in weight, so a 10,000 allowance is 10,000 spot calls or 5,000 history calls.
02
The per-minute limit is per key
Each API key has its own per-minute limit, counted in fixed one-minute windows that reset at the start of every minute (UTC). Go over it and that key gets a 429 with a Retry-After header giving the seconds until the next minute. Your other keys are unaffected.
03
The monthly allowance is per account
On plans that have one, the monthly allowance is shared by all of your keys and counted per calendar month in UTC. It resets at 00:00 UTC on the 1st. Go over it and every request returns a 429 saying the monthly quota is exceeded, until the reset or until you upgrade.
04
What counts and what doesn't
Every request with a valid key for data your plan includes counts toward both limits, including requests refused with a 429. A request with a missing or invalid key (401), or for data your plan doesn't include (403), counts toward neither.
05
No surprise bills
Going over a limit never charges you and never upgrades your plan. You upgrade or downgrade yourself from the API console, and the new limits apply to your keys within 20 seconds.
06
Every response tells you where you stand
Responses carry X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used and X-RateLimit-Reset for the current minute. On plans with a monthly allowance they also carry X-RateLimit-Month-Limit, X-RateLimit-Month-Remaining, X-RateLimit-Month-Used and X-RateLimit-Month-Reset.
Quickstart
Call it from any language
Gold price API in cURL
curl -H "Authorization: Bearer mc_live_YOUR_KEY" \
"https://api.metalcharts.org/v1/prices"Every tracked metal comes back in one response; gold is under data.XAU.
Gold price API in Python
import requests
res = requests.get(
"https://api.metalcharts.org/v1/prices",
headers={"Authorization": "Bearer mc_live_YOUR_KEY"},
timeout=10,
)
res.raise_for_status()
price = res.json()["data"]["XAU"]["price"]
print(f"Gold: ${price}")Uses requests. raise_for_status turns a 401 or 429 into an exception rather than letting a bad payload through.
Gold price API in JavaScript
const res = await fetch(
"https://api.metalcharts.org/v1/prices",
{ headers: { Authorization: "Bearer mc_live_YOUR_KEY" } },
);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { data } = await res.json();
console.log(`Gold: ${data.XAU.price}`);Native fetch, so it runs in Node 18 and above. Keep the key on your server; proxy browser requests through it.
Gold price API in PHP
<?php
$ch = curl_init("https://api.metalcharts.org/v1/prices");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer mc_live_YOUR_KEY"],
CURLOPT_TIMEOUT => 10,
]);
$body = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($code !== 200) {
throw new RuntimeException("MetalCharts API returned $code");
}
$data = json_decode($body, true);
echo "Gold: " . $data["data"]["XAU"]["price"];Plain cURL with no dependencies. Check the status code, because a failed call still returns a parseable body.
Gold price API in Go
req, _ := http.NewRequest(
http.MethodGet, "https://api.metalcharts.org/v1/prices", nil,
)
req.Header.Set("Authorization", "Bearer mc_live_YOUR_KEY")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
var out struct {
Data map[string]struct {
Price float64 `json:"price"`
} `json:"data"`
}
if err := json.NewDecoder(resp.Body).Decode(&out); err != nil {
return err
}
fmt.Println("Gold:", out.Data["XAU"].Price)Decoding into a narrow struct keeps the compiler honest about the field you actually use.
Coverage
History depth you can check
| Metal | Symbol | Daily bars | Back to |
|---|---|---|---|
| Gold Price API | XAU | 14,425 | October 1966 |
| Silver Price API | XAG | 14,488 | October 1966 |
| Platinum Price API | XPT | 5,798 | January 2005 |
| Palladium Price API | XPD | 5,799 | January 2005 |
| Copper Price API | HG | 9,776 | July 1988 |
Aluminium, nickel, zinc, lead and tin are covered too, alongside crypto, ETFs, indices, energy and agricultural commodities and foreign exchange. /v1/instruments lists all 1,100 plus, free on every plan.
Beyond spot
Exchange data most metals APIs don't carry
COMEX
LBMA
Shanghai
India
Guangzhou
CFTC
Built to integrate
What working with it is like
One call, every metal
Commercial use on every plan
Stale data says so
One symbol catalogue
Limits you can see
No SDK to install
FAQ
Common questions
Is there a free metals price API?
Can I use the API commercially?
What metals does the API cover?
How is the API rate limited?
What is the best metals price API?
What makes this different from other metals APIs?
Do you offer historical data downloads?
Guides