MetalAPI
XAU3,997.89−1.54%XAG53.936−1.51%XPT1,554.47−0.83%XPD1,047.03−0.44%XCU6.5080+2.29%WTI103.27+3.82%BRENT111.70−1.30%EUR1.120400−0.01%GBP1.337500−0.01%JPY0.0063761+0.14%CHF1.213445−0.25%TRY0.020125−0.12%BTC80,329.75−0.55%ETH2,329.36−1.13%
All articles
GoldJewelryTutorial

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.

By MetalAPI Team··9 min read

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:

KaratPurity (K ÷ 24)Gold contentFineness (parts per 1,000)
24K1.0000100%1000 (bars are 999 or 999.9)
23K0.958395.8%958.3
22K0.916791.7%916.7 (stamped 916)
21K0.875087.5%875
20K0.833383.3%833.3
18K0.750075.0%750
16K0.666766.7%666.7
14K0.583358.3%583.3 (stamped 585)
12K0.500050.0%500
10K0.416741.7%416.7 (stamped 417)
9K0.375037.5%375
8K0.333333.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):

  1. Price per gram of pure gold: 3,997.89 ÷ 31.1034768 = 128.5351 USD.
  2. Price per gram of 22K gold: 128.5351 × 22 ÷ 24 = 117.8239 USD.
  3. 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:

karat.mjs
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.1931

Start 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, 8 or all.
  • base: the currency of the prices, USD by default.
  • unit: troy_oz by default; gram is the usual choice for jewelry.
  • date: an optional YYYY-MM-DD for a past day's karat prices.
bash
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:

Example response
{
  "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:

Example response (carat=all, 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:

carat.mjs
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.

bash
# 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. /carat returns 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 timestamp field 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:

quote.py
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=all once 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 date for 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 /latest data works on every plan. /carat saves 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