Free Metals Price API with no card and no trial clock
Live gold, silver, platinum, palladium and copper prices as JSON. The free tier allows 200 requests a month, roughly 7 a day, and it never turns into a trial.
The free plan
200 requests a month
- Price
- $0, no card, no expiry
- Per month
- 200 weight for the account (200 spot calls)
- Per minute
- 10 weight for the key
- API keys
- 1
- Data
- Live spot for ten metals, currency conversion, market status, instruments
- Credit link
- Required wherever the prices appear publicly
What you get
What the free tier includes, and what it doesn't
Included free
- Live spot prices for gold, silver, platinum, palladium and copper
- Aluminium, nickel, zinc, lead and tin
- 24-hour change, high and low on every quote, with an indicative bid and ask
- Currency conversion across major pairs
- Market status, so you know whether a venue is open
- The full instrument catalogue, 1,100 plus symbols
Needs a paid plan
- Historical prices and candles, which start on Starter ($9 a month)
- News, crypto, ETFs and indices
- COMEX, LBMA, Shanghai and India exchange data
- CFTC positioning, funding rates and bullion dealer premiums
Quickstart
Your first request
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.
Limits
Exactly how the free limits work
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.
When you outgrow it
Every plan, side by side
| 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 |
The one condition
Show a credit link where the prices are public
<a href="https://metalcharts.org" target="_blank" rel="noopener">Metal prices by MetalCharts</a>FAQ
Free API questions
Is the metals API really free?
How many requests does the free tier allow?
What happens when I reach 200 requests?
What is not included in the free tier?
Do I need a credit card for the free tier?
How does this compare to other free metals APIs?
Can I use the free tier commercially?
Guides