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 %
REST · JSON · v1

Documentation de l'API

URL de base https://metalapi.com/api/v1. Toutes les réponses sont en JSON via HTTPS. Les intégrations MetalAPI existantes continuent de fonctionner sans modification.

Démarrage rapide

Créez un compte gratuit, copiez votre clé API depuis le tableau de bord et demandez les derniers prix de l'or et de l'argent :

curl "https://metalapi.com/api/v1/latest?api_key=YOUR_API_KEY&base=USD&currencies=XAU,XAG,EUR"

Authentification

Chaque requête nécessite votre clé API. Envoyez-la de l'une des trois façons suivantes (les variantes par en-tête évitent que les clés apparaissent dans les logs) :

Options d'authentification
# Header (recommended)
curl -H "Authorization: Bearer YOUR_API_KEY" https://metalapi.com/api/v1/latest
curl -H "X-API-Key: YOUR_API_KEY" https://metalapi.com/api/v1/latest

# Query string
curl "https://metalapi.com/api/v1/latest?api_key=YOUR_API_KEY"

Les clés ont la forme mk_live_… et ne sont affichées qu'une seule fois, à leur création ; nous n'en conservons qu'un hash. Dans le tableau de bord, vous pouvez créer plusieurs clés, les nommer, les renouveler et les limiter aux domaines de votre site. Les requêtes émises par des navigateurs depuis d'autres domaines sont rejetées avec l'erreur 107 ; les requêtes de serveur à serveur sont toujours autorisées.

Format de réponse

Les taux sont renvoyés dans les deux sens. Pour la base USD et le symbole XAU :

  • rates.USDXAU — prix d'une once troy d'or en USD (par ex. 3997.89).
  • rates.XAU — nombre d'onces d'or qu'achète un USD (1 / 3997.89 = 0.00025013).

Chaque réponse contient success et un bloc rate_limit avec votre quota mensuel. En cas d'erreur, la réponse contient success: false et un objet error avec code, type et info. Les horodatages sont en secondes Unix (UTC) ; les dates au format YYYY-MM-DD (UTC).

Latest rates

GET/api/v1/latest

Current rates for every requested symbol. The data you receive is as fresh as your plan's update interval allows (daily on Free, down to 5 seconds on Enterprise).

Add XAU-BID / XAU-ASK to currencies for the book (Standard plan and above). Available for precious metals, major currencies and crypto; futures-based symbols (industrial metals, energy) have no bid/ask.

timestamp is the time of the data, not of the request.

ParamètreDescription
api_keyobligatoireYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
baseCurrency or symbol the rates are expressed in. Default USD. Any supported symbol works, e.g. EUR, TRY, XAU.
currenciesComma-separated symbols to return (alias: symbols). Default: all symbols. Unknown codes are ignored.
unitWeight unit for metals: troy_oz (default), gram, kilogram, ounce, pound, metric_ton, short_ton. Ignored for currencies, energy and crypto.
Requête
curl "https://metalapi.com/api/v1/latest?api_key=YOUR_API_KEY&base=USD&currencies=XAU,XAG,EUR"
Réponse
{
  "success": true,
  "timestamp": 1792834892,
  "date": "2026-10-24",
  "base": "USD",
  "rates": {
    "XAU": 0.0002501319,
    "USDXAU": 3997.89,
    "XAG": 0.0185392857,
    "USDXAG": 53.94,
    "EUR": 0.8925,
    "USDEUR": 1.1204
  },
  "rate_limit": { "limit": 10000, "remaining": 9875, "reset": 1793491200, "used": 125, "plan": "Standard", "reset_date": "2026-11-01T00:00:00.000Z" }
}

Historical rates

GET/api/v1/{YYYY-MM-DD}

Closing rates for a past day. Use /yesterday as a shortcut, or /historical?date=YYYY-MM-DD. For weekends and holidays the most recent trading day's close is returned.

History: currencies since 1999-01-04, metals and energy since 2000, crypto since 2014.

ParamètreDescription
api_keyobligatoireYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
baseCurrency or symbol the rates are expressed in. Default USD. Any supported symbol works, e.g. EUR, TRY, XAU.
currenciesComma-separated symbols to return (alias: symbols). Default: all symbols. Unknown codes are ignored.
unitWeight unit for metals: troy_oz (default), gram, kilogram, ounce, pound, metric_ton, short_ton. Ignored for currencies, energy and crypto.
Requête
curl "https://metalapi.com/api/v1/2024-01-15?api_key=YOUR_API_KEY&currencies=XAU,XAG"
Réponse
{
  "success": true,
  "timestamp": 1705276800,
  "historical": true,
  "date": "2024-01-15",
  "base": "USD",
  "rates": {
    "XAU": 0.0004874244,
    "USDXAU": 2051.6,
    "XAG": 0.0431741646,
    "USDXAG": 23.162
  },
  "rate_limit": { "...": "..." }
}

Convert

GET/api/v1/convert

Convert an amount from one symbol to another, at the latest rate or on a given date.

ParamètreDescription
api_keyobligatoireYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
fromobligatoireSymbol to convert from.
toobligatoireSymbol to convert to.
amountobligatoireAmount to convert (decimal).
dateOptional YYYY-MM-DD for a historical conversion.
unitWeight unit for metals: troy_oz (default), gram, kilogram, ounce, pound, metric_ton, short_ton. Ignored for currencies, energy and crypto.
Requête
curl "https://metalapi.com/api/v1/convert?api_key=YOUR_API_KEY&from=USD&to=XAU&amount=1000&unit=gram"
Réponse
{
  "success": true,
  "query": { "from": "USD", "to": "XAU", "amount": 1000, "unit": "gram" },
  "info": { "timestamp": 1792834892, "rate": 0.0077799, "quote": 0.0077799 },
  "date": "2026-10-24",
  "result": 7.7799,
  "rate_limit": { "...": "..." }
}

Timeframe

GET/api/v1/timeframe

Daily closing rates between two dates (inclusive). /timeseries is an alias that returns "timeseries": true. Maximum range: 30 days on Free, 365 days on paid plans.

ParamètreDescription
api_keyobligatoireYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
start_dateobligatoireYYYY-MM-DD
end_dateobligatoireYYYY-MM-DD
baseCurrency or symbol the rates are expressed in. Default USD. Any supported symbol works, e.g. EUR, TRY, XAU.
currenciesComma-separated symbols to return (alias: symbols). Default: all symbols. Unknown codes are ignored.
unitWeight unit for metals: troy_oz (default), gram, kilogram, ounce, pound, metric_ton, short_ton. Ignored for currencies, energy and crypto.
Requête
curl "https://metalapi.com/api/v1/timeframe?api_key=YOUR_API_KEY&start_date=2026-10-19&end_date=2026-10-23&currencies=XAU"
Réponse
{
  "success": true,
  "timeframe": true,
  "start_date": "2026-10-19",
  "end_date": "2026-10-23",
  "base": "USD",
  "rates": {
    "2026-10-19": { "XAU": 0.0002403788, "USDXAU": 4160.1 },
    "2026-10-20": { "XAU": 0.0002413943, "USDXAU": 4142.6 },
    "2026-10-21": { "XAU": 0.0002409639, "USDXAU": 4150 },
    "2026-10-22": { "XAU": 0.0002462812, "USDXAU": 4060.4 },
    "2026-10-23": { "XAU": 0.0002495072, "USDXAU": 4007.9 }
  },
  "rate_limit": { "...": "..." }
}

Change

GET/api/v1/change

How each rate moved between two dates, as absolute and percentage change.

ParamètreDescription
api_keyobligatoireYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
start_dateobligatoireYYYY-MM-DD
end_dateobligatoireYYYY-MM-DD
baseCurrency or symbol the rates are expressed in. Default USD. Any supported symbol works, e.g. EUR, TRY, XAU.
currenciesComma-separated symbols to return (alias: symbols). Default: all symbols. Unknown codes are ignored.
Requête
curl "https://metalapi.com/api/v1/change?api_key=YOUR_API_KEY&start_date=2026-01-02&end_date=2026-10-23&currencies=XAU"
Réponse
{
  "success": true,
  "change": true,
  "start_date": "2026-01-02",
  "end_date": "2026-10-23",
  "base": "USD",
  "rates": {
    "XAU": { "start_rate": 0.0002309682, "end_rate": 0.0002495072, "change": 0.000018539, "change_pct": 8.02665 },
    "USDXAU": { "start_rate": 4329.6, "end_rate": 4007.9, "change": -321.7, "change_pct": -7.43025 }
  },
  "rate_limit": { "...": "..." }
}

Open / High / Low / Close

GET/api/v1/ohlc

Daily OHLC for a date (default: today, intraday so far). Both directions are returned: USDXAU in USD per unit and XAU as the inverse.

ParamètreDescription
api_keyobligatoireYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
dateYYYY-MM-DD or latest (default).
baseCurrency or symbol the rates are expressed in. Default USD. Any supported symbol works, e.g. EUR, TRY, XAU.
currenciesComma-separated symbols to return (alias: symbols). Default: all symbols. Unknown codes are ignored.
unitWeight unit for metals: troy_oz (default), gram, kilogram, ounce, pound, metric_ton, short_ton. Ignored for currencies, energy and crypto.
Requête
curl "https://metalapi.com/api/v1/ohlc?api_key=YOUR_API_KEY&date=2026-10-23&currencies=XAU"
Réponse
{
  "success": true,
  "ohlc": true,
  "date": "2026-10-23",
  "base": "USD",
  "rates": {
    "USDXAU": { "open": 4042.2, "high": 4050.2, "low": 3989.1, "close": 4007.9 },
    "XAU": { "open": 0.000247390, "high": 0.000250683, "low": 0.000246901, "close": 0.000249507 }
  },
  "rate_limit": { "...": "..." }
}

Gold by karat

GET/api/v1/carat

Gold price for jewellery karats (purity = karat / 24). Paid plans.

ParamètreDescription
api_keyobligatoireYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
carat24 (default), 23, 22, 21, 20, 18, 16, 14, 12, 10, 9, 8 or all.
baseCurrency or symbol the rates are expressed in. Default USD. Any supported symbol works, e.g. EUR, TRY, XAU.
unitWeight unit for metals: troy_oz (default), gram, kilogram, ounce, pound, metric_ton, short_ton. Ignored for currencies, energy and crypto.
dateOptional YYYY-MM-DD.
Requête
curl "https://metalapi.com/api/v1/carat?api_key=YOUR_API_KEY&carat=22&unit=gram&base=EUR"
Réponse
{
  "success": true,
  "carat": "22",
  "date": "2026-10-24",
  "base": "EUR",
  "timestamp": 1792834892,
  "rates": {
    "XAU22K": { "price": 105.5297, "unit": "gram", "carat": "22", "purity": 0.916667 }
  },
  "rate_limit": { "...": "..." }
}

Symbols

GET/api/v1/symbolsFree — does not count towards your quota.

Every supported symbol and its name. Add details=1 for category and unit.

ParamètreDescription
api_keyobligatoireYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
details1 to return an array with code, name, category, unit.
Requête
curl "https://metalapi.com/api/v1/symbols?api_key=YOUR_API_KEY"
Réponse
{
  "success": true,
  "symbols": {
    "XAU": "Gold",
    "XAG": "Silver",
    "XPT": "Platinum",
    "XPD": "Palladium",
    "XCU": "Copper",
    "USD": "US Dollar",
    "EUR": "Euro",
    "BTC": "Bitcoin"
  },
  "rate_limit": { "...": "..." }
}

Usage

GET/api/v1/usageFree — does not count towards your quota.

Your requests this month and what is left.

ParamètreDescription
api_keyobligatoireYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
Requête
curl "https://metalapi.com/api/v1/usage?api_key=YOUR_API_KEY"
Réponse
{
  "success": true,
  "usage": {
    "requests_made": 125,
    "requests_quota": 10000,
    "requests_remaining": 9875,
    "plan": "standard",
    "period_start": "2026-10-01T00:00:00.000Z",
    "period_end": "2026-11-01T00:00:00.000Z"
  },
  "result": { "plan": "Standard", "used": 125, "total": 10000, "remaining": 9875 },
  "rate_limit": { "...": "..." }
}

Flux temps réel (SSE)

GET/api/v1/streamPlan Pro et supérieurs

Un flux Server-Sent Events qui envoie des événements prices à l'intervalle de mise à jour de votre plan (5 à 60 s), avec les mêmes paramètres base, currencies et unit que /latest. Un commentaire de type heartbeat est envoyé toutes les 15 secondes. Chaque connexion coûte une requête à son ouverture, puis une requête par minute tant qu'elle reste ouverte.

Navigateur / Node.js
const es = new EventSource(
  "https://metalapi.com/api/v1/stream?api_key=YOUR_API_KEY&currencies=XAU,XAG,EUR"
);
es.addEventListener("prices", (e) => {
  const { timestamp, rates } = JSON.parse(e.data);
  console.log(timestamp, rates.USDXAU);
});
es.addEventListener("error", (e) => console.warn("stream error", e));
Événement
event: prices
data: {"timestamp":1792834897,"base":"USD","rates":{"XAU":0.0002501,"USDXAU":3998.12,"XAG":0.01853,"USDXAG":53.97}}

Unités et bid/ask

Les prix des métaux sont exprimés par once troy, sauf si vous passez unit : gram, kilogram, ounce (avoirdupois), pound, metric_ton ou short_ton. L'unité s'applique uniquement aux métaux — elle est ignorée pour les devises, l'énergie (baril, MMBtu, gallon) et les cryptos. Elle s'applique aussi lorsqu'un métal est la base.

À partir du plan Standard, obtenez le carnet d'ordres en ajoutant -BID / -ASK à un code, par ex. currencies=XAU,XAU-BID,XAU-ASK. La réponse contient alors XAU-BID et USDXAU-BID en plus du prix moyen.

Quotas et limites de débit

Chaque plan dispose d'un quota mensuel de requêtes (réinitialisé le 1er à 00:00 UTC) et d'une limite par minute. Les deux sont indiqués dans chaque réponse :

En-têtes
X-RateLimit-Limit: 10000          # monthly quota
X-RateLimit-Remaining: 9875
X-RateLimit-Used: 125
X-RateLimit-Reset: 1793491200     # unix time of the next reset
X-RateLimit-Reset-Date: 2026-11-01T00:00:00.000Z
X-RateLimit-Plan: Standard
X-RateLimit-Minute-Limit: 60
X-RateLimit-Minute-Remaining: 58
Retry-After: 21                   # only on 429 responses
  • /symbols et /usage sont gratuits.
  • Les requêtes rejetées en raison des limites de débit, des restrictions de plan, des restrictions de domaine ou d'erreurs serveur ne sont pas facturées.
  • Les erreurs de validation (codes 2xx) sont décomptées : validez donc les entrées avant de relancer une requête en boucle.

Votre plan détermine aussi la fraîcheur des données : Free voit la clôture de la veille, Lite des données à 30 minutes, Standard à 10 minutes, Advanced/Pro à 60 secondes, Ultra/Business à 15 secondes et Enterprise à 5 secondes. Comparer les plans.

Erreurs

Réponse d'erreur
{
  "success": false,
  "error": { "code": 105, "type": "quota_exceeded", "info": "User has reached or exceeded his subscription plan's monthly API request allowance" },
  "rate_limit": { "limit": 100, "remaining": 0, "used": 100, "plan": "Free", "...": "..." }
}
CodeHTTPTypeSignification
101401no_api_keyNo API key was supplied.
102401invalid_api_keyThe key does not exist or was revoked.
103403account_inactiveThe account is suspended. Contact support.
104429too_many_requestsPer-minute rate limit exceeded. Retry after the Retry-After seconds.
105429quota_exceededMonthly quota used up. Resets on the 1st (UTC) or upgrade your plan.
106403plan_restrictionEndpoint or parameter not available on your plan.
107403origin_not_allowedBrowser request from a domain the key is not restricted to.
201400invalid_baseUnknown base.
202400invalid_fromUnknown from.
203400invalid_toMissing or unknown to.
204400invalid_amountMissing or non-numeric amount.
205400invalid_dateNot a valid YYYY-MM-DD date, or a future date.
206400invalid_timeframeMissing dates or start_date after end_date.
207400timeframe_too_longRange longer than your plan allows.
208400invalid_symbolsNone of the requested currencies exist.
209400invalid_unitUnknown unit.
210400invalid_caratUnknown carat.
300404no_resultsNo data for this query (e.g. before history starts).
404404invalid_functionUnknown endpoint.
500500server_errorUnexpected error. The request is not billed; retry later.
503503service_unavailablePrice data temporarily unavailable.

Webhooks

Les alertes de prix (tableau de bord → Alerts) peuvent vous prévenir par e-mail ou par webhook HTTPS (plan Advanced et supérieurs). Chaque envoi est une requête POST avec un corps JSON, relancée jusqu'à trois fois en cas d'échec. Vérifiez la signature avec le secret du webhook affiché dans votre tableau de bord :

Vérifier X-MetalAPI-Signature (Node.js)
import crypto from "node:crypto";

// Express example: use the raw request body.
app.post("/metalapi-webhook", express.raw({ type: "application/json" }), (req, res) => {
  const header = req.get("X-MetalAPI-Signature") ?? "";        // "t=1792834892,v1=5f0c…"
  const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const expected = crypto
    .createHmac("sha256", process.env.METALAPI_WEBHOOK_SECRET)
    .update(`${t}.${req.body}`)
    .digest("hex");
  const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
  if (!fresh || !crypto.timingSafeEqual(Buffer.from(v1, "hex"), Buffer.from(expected, "hex"))) {
    return res.status(400).end();
  }
  const event = JSON.parse(req.body);              // { event: "alert.triggered", alert: {...}, price: 4012.5 }
  res.status(200).end();
});

Widgets

Créez un widget dans le tableau de bord et collez le code d'intégration dans n'importe quelle page. Les widgets se mettent à jour automatiquement et n'exposent jamais votre clé API.

Intégration
<div id="metalapi-widget-w_abc123"></div>
<script src="https://metalapi.com/js/widget.js" data-widget="w_abc123" async></script>

Données et horaires de marché

  • Métaux précieux au comptant et principales devises : flux interbancaires bid/ask, collectés toutes les 5 secondes environ.
  • Métaux industriels et énergie : contrats à terme de première échéance COMEX, NYMEX et ICE.
  • Autres devises : cotations de marché, avec les taux de référence de la Banque centrale européenne en secours.
  • Cryptos : Kraken et Binance, 24 h/24, 7 j/7.
  • Plusieurs sources sont combinées par médiane et contrôlées pour écarter les cotations aberrantes avant publication.
  • Les métaux, les devises et les contrats à terme se négocient du dimanche 17 h au vendredi 17 h, heure de New York. Le week-end, les prix restent figés à la clôture du vendredi.
  • Avant octobre 2026, l'historique quotidien des métaux repose sur les cours de règlement des contrats à terme de première échéance.

Les prix sont indicatifs et fournis à titre d'information uniquement ; ils ne constituent pas une offre de transaction.

Anciens endpoints

Ces endpoints de la version précédente restent disponibles pour assurer la compatibilité :

  • /api/v1/rates/metals, /api/v1/rates/metal/{symbol} — prix en USD avec métadonnées.
  • /api/v1/rates/currencies, /api/v1/rates/currency/{code} — taux de change par rapport à l'USD.
  • /api/v1/timeseries — alias de /timeframe ; /api/v1/historical?date= — identique à /{date}.
  • /api/v1/user — résumé du compte (gratuit).