Gold Karat Prices Explained: 24K, 22K, 18K and How to Calculate Them
What 24K, 22K and 18K mean, how fineness marks like 916 and 750 relate, how to calculate karat gold prices per gram and how to get them from a gold price API.
Karat, carat and purity
A karat measures the purity of gold, not its weight. Pure gold is 24 karat, so the gold content of an alloy is its karat number divided by 24. 18-karat gold is 18 parts gold and 6 parts other metals, such as silver, copper, zinc or palladium, which make the alloy harder, change its color and lower its cost.
Karat (K or kt) and carat (ct) are easy to mix up. In American English, karat is purity and carat is the 200-milligram unit used to weigh gemstones. British English often uses carat for both. The MetalAPI endpoint is called /carat, following the broader usage, but it returns gold prices by purity, not by gemstone weight.
The formula that ties a karat price to the gold market is short:
price per gram of K-karat gold = spot price per troy ounce ÷ 31.1034768 × K ÷ 24
This article explains each part of that formula, shows how to compute it yourself and how to get it from the API, and then looks at what separates a karat gold price from the price of a finished piece of jewelry.
Karat purity and millesimal fineness
Many countries mark gold with its millesimal fineness, parts of gold per thousand, instead of or next to the karat. The two scales map onto each other directly:
| Karat | Purity (K ÷ 24) | Gold content | Fineness (parts per 1,000) |
|---|---|---|---|
| 24K | 1.0000 | 100% | 1000 (bars are 999 or 999.9) |
| 23K | 0.9583 | 95.8% | 958.3 |
| 22K | 0.9167 | 91.7% | 916.7 (stamped 916) |
| 21K | 0.8750 | 87.5% | 875 |
| 20K | 0.8333 | 83.3% | 833.3 |
| 18K | 0.7500 | 75.0% | 750 |
| 16K | 0.6667 | 66.7% | 666.7 |
| 14K | 0.5833 | 58.3% | 583.3 (stamped 585) |
| 12K | 0.5000 | 50.0% | 500 |
| 10K | 0.4167 | 41.7% | 416.7 (stamped 417) |
| 9K | 0.3750 | 37.5% | 375 |
| 8K | 0.3333 | 33.3% | 333.3 (stamped 333) |
Two details matter when you turn this table into prices:
- Hallmarks are minimum standards. A 585 stamp means at least 58.5% gold, slightly more than 14 ÷ 24 = 58.33%. Each country sets its own standards and tolerances, so the actual fineness of a piece can sit a little above the karat fraction.
- Pure gold is not quite 1.0000. Investment bars are typically 999.9 or 999 fine. The 24K price in MetalAPI uses a purity of exactly 1, which makes it equal to the spot price.
Which karats matter depends on where you sell. 22K and 21K are traditional for jewelry in South Asia and much of the Middle East, 18K and 14K are widespread in Europe and North America, and 9K is common in the UK. Support whatever your customers actually buy.
Calculating karat prices yourself
Spot gold is quoted per troy ounce of pure gold. To get a karat price per gram, convert the unit and then scale by purity. With the example spot price from the MetalAPI docs, 3,997.89 USD per troy ounce (an illustration, not a live price):
- Price per gram of pure gold: 3,997.89 ÷ 31.1034768 = 128.5351 USD.
- Price per gram of 22K gold: 128.5351 × 22 ÷ 24 = 117.8239 USD.
- Price per gram of 18K gold: 128.5351 × 18 ÷ 24 = 96.4014 USD.
The same calculation in JavaScript, with a second function for pricing by fineness instead of by karat:
const GRAMS_PER_TROY_OZ = 31.1034768;
/** Price per gram of gold at a karat (24 = pure gold). */
export function karatPricePerGram(spotPerTroyOz, karat) {
return (spotPerTroyOz / GRAMS_PER_TROY_OZ) * (karat / 24);
}
/** Price per gram at a millesimal fineness, such as 585 or 916. */
export function finenessPricePerGram(spotPerTroyOz, fineness) {
return (spotPerTroyOz / GRAMS_PER_TROY_OZ) * (fineness / 1000);
}
const spot = 3997.89; // example price, USD per troy ounce
for (const k of [24, 22, 21, 18, 14, 10, 9]) {
console.log(`${k}K`, karatPricePerGram(spot, k).toFixed(4));
}
// 24K 128.5351, 22K 117.8239, 21K 112.4683, 18K 96.4014, 14K 74.9788, 10K 53.5563, 9K 48.2007
console.log("585", finenessPricePerGram(spot, 585).toFixed(4)); // 75.1931Start from a spot price that is already in your selling currency (base=EUR, base=INR and so on), so the gold price and the exchange rate come from the same moment. Converting a dollar gram price with an exchange rate fetched at another time adds an error that has nothing to do with gold.
If you price by hallmark rather than by karat, use the fineness function. The difference between 583.3 and 585 is about 0.3% of the metal value: small per gram, but visible on a heavy chain. Whichever you choose, use it consistently and document it.
Getting karat prices from the /carat endpoint
MetalAPI does this arithmetic for you in /carat, which is available on all paid plans, starting with Lite. It takes these parameters:
carat:24(default),23,22,21,20,18,16,14,12,10,9,8orall.base: the currency of the prices,USDby default.unit:troy_ozby default;gramis the usual choice for jewelry.date: an optionalYYYY-MM-DDfor a past day's karat prices.
curl "https://metalapi.com/api/v1/carat?carat=22&unit=gram&base=EUR" \
-H "X-API-Key: $METALAPI_KEY"The response, with the example values from the API reference:
{
"success": true,
"carat": "22",
"date": "2026-10-24",
"base": "EUR",
"timestamp": 1792834892,
"rates": {
"XAU22K": { "price": 105.5297, "unit": "gram", "carat": "22", "purity": 0.916667 }
}
}With carat=all you get every karat in one request, which costs the same as a single karat. Each entry is keyed XAU<karat>K and carries the price, the unit, the karat and the purity that was applied. This example is abbreviated:
{
"success": true,
"carat": "all",
"date": "2026-10-23",
"base": "USD",
"timestamp": 1792765800,
"rates": {
"XAU24K": { "price": 128.53515, "unit": "gram", "carat": "24", "purity": 1 },
"XAU22K": { "price": 117.82389, "unit": "gram", "carat": "22", "purity": 0.916667 },
"XAU18K": { "price": 96.401361, "unit": "gram", "carat": "18", "purity": 0.75 },
"XAU14K": { "price": 74.978836, "unit": "gram", "carat": "14", "purity": 0.583333 }
}
}Reading every karat in UAE dirhams per gram from Node.js 18 or later:
const params = new URLSearchParams({ carat: "all", unit: "gram", base: "AED" });
const res = await fetch(`https://metalapi.com/api/v1/carat?${params}`, {
headers: { "X-API-Key": process.env.METALAPI_KEY },
});
const data = await res.json();
if (!data.success) throw new Error(`${data.error.code} ${data.error.type}: ${data.error.info}`);
for (const row of Object.values(data.rates)) {
console.log(`${row.carat}K: ${row.price.toFixed(2)} ${data.base} per ${row.unit}`);
}On the Free plan, /carat returns error 106 (plan_restriction) together with an upgrade_url. An unsupported karat returns 210 (invalid_carat). On Free you can still apply the formula above to the gold price from /latest, at the Free plan's daily update interval.
Pricing in your local currency
Jewelry is bought and sold in local currency, so set base to the currency of the shop: INR for rupees, AED for dirhams, TRY for lira, GBP for pounds. All 57 supported currencies work, and because gold and the exchange rate come from one snapshot, the numbers are consistent with each other.
# Every karat in Indian rupees per gram
curl "https://metalapi.com/api/v1/carat?carat=all&unit=gram&base=INR" \
-H "X-API-Key: $METALAPI_KEY"
# 22K in Turkish lira per gram on a past day
curl "https://metalapi.com/api/v1/carat?carat=22&unit=gram&base=TRY&date=2026-10-01" \
-H "X-API-Key: $METALAPI_KEY"For markets that quote in tolas, multiply the price per gram by 11.6638038, or the price per troy ounce by 0.375. A 10-tola bar weighs 116.638 g. The unit conversion article has the exact factors for tolas, taels and pennyweights.
Three practical points:
- Freshness follows your plan.
/caratreturns prices as fresh as your plan allows: every 30 minutes on Lite, every 10 minutes on Standard, down to 5 seconds on Enterprise. A shop that updates its price board a few times a day doesn't need the fastest plan. - Show the timestamp. The
timestampfield tells customers and auditors when the price was taken. - Weekends. Spot gold stops trading on Friday at 17:00 New York time and reopens on Sunday at 17:00, so karat prices stay at Friday's last price over the weekend.
From karat price to jewelry price
The karat price is the value of the gold content. The price of a finished piece adds several components, and how they are calculated varies by country, trade custom and business. The usual building blocks are:
- Metal value: net gold weight × karat price per gram. Stones, pearls and other non-gold parts are weighed separately and excluded.
- Making charges: labor and design, charged per gram, as a percentage of the metal value or as a fixed amount per piece. Some markets also add a wastage allowance for metal lost in manufacturing.
- Stones and other materials: priced on their own terms.
- Hallmarking or certification fees where they apply.
- Tax: VAT, GST or sales tax. Rates and rules differ by country, and some countries treat investment gold differently from jewelry. In the EU, for example, investment gold falls under a special VAT exemption that does not cover jewelry.
Here is a minimal quote calculator that keeps those parts separate. It uses Decimal throughout, so the cents on the invoice add up:
from dataclasses import dataclass
from decimal import Decimal, ROUND_HALF_UP
CENT = Decimal("0.01")
@dataclass
class QuoteInput:
weight_g: Decimal # net gold weight, stones excluded
karat_price_per_g: Decimal # from /carat?unit=gram, in your currency
making_per_g: Decimal = Decimal("0") # fixed labour charge per gram
making_pct: Decimal = Decimal("0") # or a share of the metal value
stones: Decimal = Decimal("0") # priced separately
tax_rate: Decimal = Decimal("0") # VAT, GST or sales tax for your jurisdiction
def jewelry_quote(q: QuoteInput) -> dict:
metal = q.weight_g * q.karat_price_per_g
making = q.weight_g * q.making_per_g + metal * q.making_pct
subtotal = metal + making + q.stones
tax = subtotal * q.tax_rate
parts = {"metal": metal, "making": making, "stones": q.stones, "tax": tax, "total": subtotal + tax}
return {k: v.quantize(CENT, rounding=ROUND_HALF_UP) for k, v in parts.items()}
# Illustrative inputs only: 10 g of 22K at the example price of 117.8239 per gram,
# a 12% making charge and a 20% tax rate.
print(jewelry_quote(QuoteInput(
weight_g=Decimal("10"),
karat_price_per_g=Decimal("117.8239"),
making_pct=Decimal("0.12"),
tax_rate=Decimal("0.20"),
)))With those inputs it prints a metal value of 1178.24, making charges of 141.39, tax of 263.93 and a total of 1583.55. The making charge and tax rate are placeholders, not recommendations. Where tax applies, to which components and at what rate are questions for your accountant or tax adviser.
This article explains calculations. It is not investment, pricing or tax advice.
Buy-back and scrap values
Buying gold back from customers works the other way round. The starting point is the same metal value, but it should be based on the fineness actually measured rather than the karat stamped:
scrap value = weight in grams × fineness ÷ 1,000 × spot price per gram − refining and handling deductions
Buyers usually test the fineness, for example with XRF analysis or acid tests, because older pieces can fall short of their mark and the solder in chains lowers the average purity. Keep the deduction as an explicit, documented parameter in your code instead of hiding it in a lower spot price, so it shows up clearly in quotes and audits.
Use the 24K price per gram (or /latest with unit=gram) as the spot price here, and apply the measured fineness yourself. The karat prices from /carat assume the exact fraction K ÷ 24, which is right for pricing new items by karat but not for an assay result such as 912.
Implementation checklist
- Request
carat=allonce and cache it for your plan's update interval, instead of calling once per karat or per product. - Store the price, the timestamp and the purity used with every quote and order, so you can explain a number later.
- Use
datefor historical karat prices, for example when you recalculate an old invoice. Historical gold and silver prices via API covers longer ranges and local storage. - Round only at display time, using each currency's own decimals.
- Keep the API key on your server. To show a gold price board on a shop website without writing code, use an embeddable widget.
- If you only need a couple of karats, the formula on
/latestdata works on every plan./caratsaves the arithmetic and returns ready-made, consistent numbers on paid plans.
The API docs describe every parameter of /carat, the pricing page shows which plans include it, and the Gold price API guide covers keys, errors and caching in general. To try it with your own catalog, register for a key.
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
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.
How to Add a Live Gold Price Widget to Your Website
Add a live gold price widget to WordPress, Shopify or plain HTML: build it in the MetalAPI dashboard, choose symbols, layout and theme, then paste two lines.
Build a Jewelry Price Calculator with Live Gold Prices
Build a server-side jewelry price calculator in TypeScript and Python with live gold prices per gram, karat purity, making charges, VAT and quota-safe caching.