MetalAPI
XAU3997,89−1,54 %XAG53,936−1,51 %XPT1554,47−0,83 %XPD1047,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 %ETH2329,36−1,13 %
REST · JSON · v1

Documentación de la API

URL base https://metalapi.com/api/v1. Todas las respuestas son JSON sobre HTTPS. Las integraciones existentes de MetalAPI siguen funcionando sin cambios.

Inicio rápido

Crea una cuenta gratuita, copia tu clave API desde el panel y solicita los últimos precios del oro y la plata:

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

Autenticación

Cada solicitud necesita tu clave API. Envíala de una de estas tres formas (las opciones por cabecera mantienen las claves fuera de los logs):

Opciones de autenticación
# 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"

Las claves tienen el formato mk_live_… y solo se muestran una vez, al crearlas; nosotros guardamos un hash. En el panel puedes crear varias claves, ponerles nombre, rotarlas y restringirlas a los dominios de tu sitio web. Las solicitudes desde navegadores en otros dominios se rechazan con el error 107; las solicitudes de servidor a servidor siempre se permiten.

Formato de respuesta

Las cotizaciones se devuelven en ambas direcciones. Para la base USD y el símbolo XAU:

  • rates.USDXAU — precio de una onza troy de oro en USD (p. ej., 3997.89).
  • rates.XAU — onzas de oro que se compran con un USD (1 / 3997.89 = 0.00025013).

Cada respuesta incluye success y un bloque rate_limit con tu cuota mensual. Los errores devuelven success: false y un objeto error con code, type e info. Las marcas de tiempo son segundos Unix (UTC); las fechas tienen el formato 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.

ParámetroDescripción
api_keyobligatorioYour 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.
Solicitud
curl "https://metalapi.com/api/v1/latest?api_key=YOUR_API_KEY&base=USD&currencies=XAU,XAG,EUR"
Respuesta
{
  "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.

ParámetroDescripción
api_keyobligatorioYour 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.
Solicitud
curl "https://metalapi.com/api/v1/2024-01-15?api_key=YOUR_API_KEY&currencies=XAU,XAG"
Respuesta
{
  "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.

ParámetroDescripción
api_keyobligatorioYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
fromobligatorioSymbol to convert from.
toobligatorioSymbol to convert to.
amountobligatorioAmount 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.
Solicitud
curl "https://metalapi.com/api/v1/convert?api_key=YOUR_API_KEY&from=USD&to=XAU&amount=1000&unit=gram"
Respuesta
{
  "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.

ParámetroDescripción
api_keyobligatorioYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
start_dateobligatorioYYYY-MM-DD
end_dateobligatorioYYYY-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.
Solicitud
curl "https://metalapi.com/api/v1/timeframe?api_key=YOUR_API_KEY&start_date=2026-10-19&end_date=2026-10-23&currencies=XAU"
Respuesta
{
  "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.

ParámetroDescripción
api_keyobligatorioYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
start_dateobligatorioYYYY-MM-DD
end_dateobligatorioYYYY-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.
Solicitud
curl "https://metalapi.com/api/v1/change?api_key=YOUR_API_KEY&start_date=2026-01-02&end_date=2026-10-23&currencies=XAU"
Respuesta
{
  "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.

ParámetroDescripción
api_keyobligatorioYour 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.
Solicitud
curl "https://metalapi.com/api/v1/ohlc?api_key=YOUR_API_KEY&date=2026-10-23&currencies=XAU"
Respuesta
{
  "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.

ParámetroDescripción
api_keyobligatorioYour 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.
Solicitud
curl "https://metalapi.com/api/v1/carat?api_key=YOUR_API_KEY&carat=22&unit=gram&base=EUR"
Respuesta
{
  "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.

ParámetroDescripción
api_keyobligatorioYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
details1 to return an array with code, name, category, unit.
Solicitud
curl "https://metalapi.com/api/v1/symbols?api_key=YOUR_API_KEY"
Respuesta
{
  "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.

ParámetroDescripción
api_keyobligatorioYour API key. Alternatively send Authorization: Bearer <key> or X-API-Key: <key>.
Solicitud
curl "https://metalapi.com/api/v1/usage?api_key=YOUR_API_KEY"
Respuesta
{
  "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": { "...": "..." }
}

Stream en tiempo real (SSE)

GET/api/v1/streamPlan Pro o superior

Un stream de Server-Sent Events que envía eventos prices según el intervalo de actualización de tu plan (5–60 s), con los mismos parámetros base, currencies y unit que /latest. Cada 15 segundos se envía un comentario de heartbeat. Cada conexión cuesta una solicitud al abrirse y una solicitud por minuto mientras permanece abierta.

Navegador / 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));
Evento
event: prices
data: {"timestamp":1792834897,"base":"USD","rates":{"XAU":0.0002501,"USDXAU":3998.12,"XAG":0.01853,"USDXAG":53.97}}

Unidades y bid/ask

Los precios de los metales son por onza troy, salvo que indiques unit: gram, kilogram, ounce (avoirdupois), pound, metric_ton o short_ton. La unidad solo se aplica a los metales: se ignora para divisas, energía (barril, MMBtu, galón) y criptomonedas. También se aplica cuando un metal es la base.

En los planes Standard y superiores, solicita los precios de compra y venta añadiendo -BID / -ASK a un código, p. ej., currencies=XAU,XAU-BID,XAU-ASK. La respuesta incluye entonces XAU-BID y USDXAU-BID junto al precio medio.

Cuotas y límites de uso

Cada plan tiene una cuota mensual de solicitudes (se restablece el día 1 a las 00:00 UTC) y un límite por minuto. Ambos se indican en cada respuesta:

Cabeceras
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 y /usage son gratuitos.
  • Las solicitudes rechazadas por límites de uso, restricciones del plan, restricciones de dominio o errores del servidor no se facturan.
  • Los errores de validación (códigos 2xx) sí cuentan, así que valida los datos de entrada antes de reintentar en un bucle.

Tu plan también determina la frescura de los datos: Free ve el cierre del día anterior; Lite, datos cada 30 minutos; Standard, cada 10 minutos; Advanced/Pro, cada 60 segundos; Ultra/Business, cada 15 segundos, y Enterprise, cada 5 segundos. Compara los planes.

Errores

Respuesta de error
{
  "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", "...": "..." }
}
CódigoHTTPTipoSignificado
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

Las alertas de precio (panel → Alerts) pueden avisarte por correo electrónico o mediante un webhook HTTPS (plan Advanced o superior). Cada envío es un POST con un cuerpo JSON y se reintenta hasta tres veces si falla. Verifica la firma con el secreto del webhook que aparece en tu panel:

Verificar 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

Crea un widget en el panel y pega el código de inserción en cualquier página. Los widgets se actualizan automáticamente y nunca exponen tu clave API.

Código de inserción
<div id="metalapi-widget-w_abc123"></div>
<script src="https://metalapi.com/js/widget.js" data-widget="w_abc123" async></script>

Datos y horarios de mercado

  • Metales preciosos al contado y principales divisas: fuentes interbancarias de compra/venta, recopiladas cada ~5 segundos.
  • Metales industriales y energía: futuros del vencimiento más próximo de COMEX, NYMEX e ICE.
  • Otras divisas: cotizaciones de mercado, con los tipos de referencia del Banco Central Europeo como respaldo.
  • Criptomonedas: Kraken y Binance, 24/7.
  • Las distintas fuentes se combinan por mediana y se verifican para descartar cotizaciones erróneas antes de publicarse.
  • Los metales, las divisas y los futuros cotizan desde el domingo a las 17:00 hasta el viernes a las 17:00, hora de Nueva York. Durante el fin de semana, los precios se mantienen en el cierre del viernes.
  • El historial diario de los metales anterior a octubre de 2026 se basa en las liquidaciones de los futuros del vencimiento más próximo.

Los precios son indicativos y solo tienen fines informativos; no constituyen una oferta de negociación.

Endpoints heredados

Estos endpoints de la versión anterior siguen disponibles por compatibilidad:

  • /api/v1/rates/metals, /api/v1/rates/metal/{symbol} — precios en USD con metadatos.
  • /api/v1/rates/currencies, /api/v1/rates/currency/{code} — tipos de cambio de divisas por USD.
  • /api/v1/timeseries — alias de /timeframe; /api/v1/historical?date= — equivale a /{date}.
  • /api/v1/user — resumen de la cuenta (gratuito).