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¤cies=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) :
# 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
/api/v1/latestCurrent 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ètre | Description |
|---|---|
api_keyobligatoire | Your API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>. |
base | Currency or symbol the rates are expressed in. Default USD. Any supported symbol works, e.g. EUR, TRY, XAU. |
currencies | Comma-separated symbols to return (alias: symbols). Default: all symbols. Unknown codes are ignored. |
unit | Weight unit for metals: troy_oz (default), gram, kilogram, ounce, pound, metric_ton, short_ton. Ignored for currencies, energy and crypto. |
curl "https://metalapi.com/api/v1/latest?api_key=YOUR_API_KEY&base=USD¤cies=XAU,XAG,EUR"{
"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
/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ètre | Description |
|---|---|
api_keyobligatoire | Your API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>. |
base | Currency or symbol the rates are expressed in. Default USD. Any supported symbol works, e.g. EUR, TRY, XAU. |
currencies | Comma-separated symbols to return (alias: symbols). Default: all symbols. Unknown codes are ignored. |
unit | Weight unit for metals: troy_oz (default), gram, kilogram, ounce, pound, metric_ton, short_ton. Ignored for currencies, energy and crypto. |
curl "https://metalapi.com/api/v1/2024-01-15?api_key=YOUR_API_KEY¤cies=XAU,XAG"{
"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
/api/v1/convertConvert an amount from one symbol to another, at the latest rate or on a given date.
| Paramètre | Description |
|---|---|
api_keyobligatoire | Your API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>. |
fromobligatoire | Symbol to convert from. |
toobligatoire | Symbol to convert to. |
amountobligatoire | Amount to convert (decimal). |
date | Optional YYYY-MM-DD for a historical conversion. |
unit | Weight unit for metals: troy_oz (default), gram, kilogram, ounce, pound, metric_ton, short_ton. Ignored for currencies, energy and crypto. |
curl "https://metalapi.com/api/v1/convert?api_key=YOUR_API_KEY&from=USD&to=XAU&amount=1000&unit=gram"{
"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
/api/v1/timeframeDaily 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ètre | Description |
|---|---|
api_keyobligatoire | Your API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>. |
start_dateobligatoire | YYYY-MM-DD |
end_dateobligatoire | YYYY-MM-DD |
base | Currency or symbol the rates are expressed in. Default USD. Any supported symbol works, e.g. EUR, TRY, XAU. |
currencies | Comma-separated symbols to return (alias: symbols). Default: all symbols. Unknown codes are ignored. |
unit | Weight unit for metals: troy_oz (default), gram, kilogram, ounce, pound, metric_ton, short_ton. Ignored for currencies, energy and crypto. |
curl "https://metalapi.com/api/v1/timeframe?api_key=YOUR_API_KEY&start_date=2026-10-19&end_date=2026-10-23¤cies=XAU"{
"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
/api/v1/changeHow each rate moved between two dates, as absolute and percentage change.
| Paramètre | Description |
|---|---|
api_keyobligatoire | Your API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>. |
start_dateobligatoire | YYYY-MM-DD |
end_dateobligatoire | YYYY-MM-DD |
base | Currency or symbol the rates are expressed in. Default USD. Any supported symbol works, e.g. EUR, TRY, XAU. |
currencies | Comma-separated symbols to return (alias: symbols). Default: all symbols. Unknown codes are ignored. |
curl "https://metalapi.com/api/v1/change?api_key=YOUR_API_KEY&start_date=2026-01-02&end_date=2026-10-23¤cies=XAU"{
"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
/api/v1/ohlcDaily OHLC for a date (default: today, intraday so far). Both directions are returned: USDXAU in USD per unit and XAU as the inverse.
| Paramètre | Description |
|---|---|
api_keyobligatoire | Your API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>. |
date | YYYY-MM-DD or latest (default). |
base | Currency or symbol the rates are expressed in. Default USD. Any supported symbol works, e.g. EUR, TRY, XAU. |
currencies | Comma-separated symbols to return (alias: symbols). Default: all symbols. Unknown codes are ignored. |
unit | Weight unit for metals: troy_oz (default), gram, kilogram, ounce, pound, metric_ton, short_ton. Ignored for currencies, energy and crypto. |
curl "https://metalapi.com/api/v1/ohlc?api_key=YOUR_API_KEY&date=2026-10-23¤cies=XAU"{
"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
/api/v1/caratGold price for jewellery karats (purity = karat / 24). Paid plans.
| Paramètre | Description |
|---|---|
api_keyobligatoire | Your API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>. |
carat | 24 (default), 23, 22, 21, 20, 18, 16, 14, 12, 10, 9, 8 or all. |
base | Currency or symbol the rates are expressed in. Default USD. Any supported symbol works, e.g. EUR, TRY, XAU. |
unit | Weight unit for metals: troy_oz (default), gram, kilogram, ounce, pound, metric_ton, short_ton. Ignored for currencies, energy and crypto. |
date | Optional YYYY-MM-DD. |
curl "https://metalapi.com/api/v1/carat?api_key=YOUR_API_KEY&carat=22&unit=gram&base=EUR"{
"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
/api/v1/symbolsFree — does not count towards your quota.Every supported symbol and its name. Add details=1 for category and unit.
| Paramètre | Description |
|---|---|
api_keyobligatoire | Your API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>. |
details | 1 to return an array with code, name, category, unit. |
curl "https://metalapi.com/api/v1/symbols?api_key=YOUR_API_KEY"{
"success": true,
"symbols": {
"XAU": "Gold",
"XAG": "Silver",
"XPT": "Platinum",
"XPD": "Palladium",
"XCU": "Copper",
"USD": "US Dollar",
"EUR": "Euro",
"BTC": "Bitcoin"
},
"rate_limit": { "...": "..." }
}Usage
/api/v1/usageFree — does not count towards your quota.Your requests this month and what is left.
| Paramètre | Description |
|---|---|
api_keyobligatoire | Your API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>. |
curl "https://metalapi.com/api/v1/usage?api_key=YOUR_API_KEY"{
"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)
/api/v1/streamPlan Pro et supérieursUn 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.
const es = new EventSource(
"https://metalapi.com/api/v1/stream?api_key=YOUR_API_KEY¤cies=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));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 :
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/symbolset/usagesont 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
{
"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", "...": "..." }
}| Code | HTTP | Type | Signification |
|---|---|---|---|
| 101 | 401 | no_api_key | No API key was supplied. |
| 102 | 401 | invalid_api_key | The key does not exist or was revoked. |
| 103 | 403 | account_inactive | The account is suspended. Contact support. |
| 104 | 429 | too_many_requests | Per-minute rate limit exceeded. Retry after the Retry-After seconds. |
| 105 | 429 | quota_exceeded | Monthly quota used up. Resets on the 1st (UTC) or upgrade your plan. |
| 106 | 403 | plan_restriction | Endpoint or parameter not available on your plan. |
| 107 | 403 | origin_not_allowed | Browser request from a domain the key is not restricted to. |
| 201 | 400 | invalid_base | Unknown base. |
| 202 | 400 | invalid_from | Unknown from. |
| 203 | 400 | invalid_to | Missing or unknown to. |
| 204 | 400 | invalid_amount | Missing or non-numeric amount. |
| 205 | 400 | invalid_date | Not a valid YYYY-MM-DD date, or a future date. |
| 206 | 400 | invalid_timeframe | Missing dates or start_date after end_date. |
| 207 | 400 | timeframe_too_long | Range longer than your plan allows. |
| 208 | 400 | invalid_symbols | None of the requested currencies exist. |
| 209 | 400 | invalid_unit | Unknown unit. |
| 210 | 400 | invalid_carat | Unknown carat. |
| 300 | 404 | no_results | No data for this query (e.g. before history starts). |
| 404 | 404 | invalid_function | Unknown endpoint. |
| 500 | 500 | server_error | Unexpected error. The request is not billed; retry later. |
| 503 | 503 | service_unavailable | Price 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 :
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.
<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).