Acceso a datos históricos
Consulta precios diarios desde 1999, obtén rangos de fechas, compara dos fechas, consigue barras OHLC y analiza las tendencias de los precios con MetalAPI.
Qué historial está disponible
MetalAPI almacena una barra diaria (apertura, máximo, mínimo y cierre) por símbolo y día:
- Divisas desde 1999
- Metales preciosos, metales industriales y energía desde 2000
- Criptomonedas desde 2014
Los precios de los metales anteriores a octubre de 2026 se derivan de los futuros del primer vencimiento, por lo que pueden diferir ligeramente del precio al contado del mismo día. Todos los planes pueden consultar el historial completo. Los planes solo se diferencian en cuántos días puede abarcar una única solicitud de rango.
Un solo día
Usa la fecha como ruta, el endpoint /historical con un parámetro date, o /yesterday. La respuesta contiene los precios de cierre de ese día (UTC). Para GET /api/v1/2026-10-01?currencies=XAU,XAG:
{
"success": true,
"timestamp": 1790812800,
"historical": true,
"date": "2026-10-01",
"base": "USD",
"rates": {
"XAU": 0.0002583044893,
"USDXAU": 3871.4,
"XAG": 0.02097315436,
"USDXAG": 47.68
}
}Rangos de fechas con /timeframe
/timeframe devuelve una entrada por día entre start_date y end_date, con la fecha como clave. Para GET /api/v1/timeframe?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.0002537298285, "USDXAU": 3941.2 },
"2026-10-20": { "XAU": 0.0002526049889, "USDXAU": 3958.75 },
"2026-10-21": { "XAU": 0.0002517369852, "USDXAU": 3972.4 },
"2026-10-22": { "XAU": 0.0002506642603, "USDXAU": 3989.4 },
"2026-10-23": { "XAU": 0.0002501319446, "USDXAU": 3997.89 }
}
}Los días sin precio de cierre, como los fines de semana o los festivos de mercado, pueden faltar. No supongas que hay una entrada por cada día del calendario. /timeseries es un alias que devuelve "timeseries": true en lugar de "timeframe": true.
Rangos más largos de lo que permite tu plan
Una sola solicitud puede abarcar hasta 30 días en Free y 365 días en los planes de pago. Los periodos más largos devuelven el error 207. Divide los rangos largos en bloques, de modo que cada bloque sea una solicitud:
const DAY = 86_400_000;
const MAX_DAYS = 365; // 30 en el plan Free
const iso = (d) => d.toISOString().slice(0, 10);
async function fetchRange(start, end, currencies) {
const rates = {};
let from = new Date(`${start}T00:00:00Z`);
const last = new Date(`${end}T00:00:00Z`);
while (from <= last) {
const to = new Date(Math.min(from.getTime() + MAX_DAYS * DAY, last.getTime()));
const params = new URLSearchParams({ start_date: iso(from), end_date: iso(to), currencies });
const res = await fetch(`https://metalapi.com/api/v1/timeframe?${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.info}`);
Object.assign(rates, data.rates);
from = new Date(to.getTime() + DAY);
}
return rates;
}
// Diez años de precios diarios del oro en 10 solicitudes
const gold = await fetchRange("2016-01-01", "2025-12-31", "XAU");Variaciones entre dos fechas
/change compara dos días directamente, así que no tienes que descargar el rango intermedio. Para GET /api/v1/change?start_date=2026-09-30&end_date=2026-10-23¤cies=XAU:
{
"success": true,
"change": true,
"start_date": "2026-09-30",
"end_date": "2026-10-23",
"base": "USD",
"rates": {
"XAU": { "start_rate": 0.0002591613539, "end_rate": 0.0002501319446, "change": -0.000009029409258, "change_pct": -3.48409 },
"USDXAU": { "start_rate": 3858.6, "end_rate": 3997.89, "change": 139.29, "change_pct": 3.60986 }
}
}Usa las claves con prefijo, como USDXAU, para las variaciones de precio. Las claves inversas se mueven en sentido contrario.
Barras OHLC diarias
/ohlc devuelve la apertura, el máximo, el mínimo y el cierre de un día, que es lo que necesitas para gráficos de velas y rangos diarios. Para GET /api/v1/ohlc?date=2026-10-22¤cies=XAU:
{
"success": true,
"ohlc": true,
"date": "2026-10-22",
"base": "USD",
"rates": {
"USDXAU": { "open": 3962.1, "high": 4012.75, "low": 3951.3, "close": 3989.4 },
"XAU": { "open": 0.0002523914086, "high": 0.0002530812644, "low": 0.000249205657, "close": 0.0002506642603 }
}
}Conversiones históricas
Añade date a /convert para convertir a un precio de cierre pasado. Por ejemplo, esto es lo que valían 10 onzas troy de plata en euros el 1 de octubre de 2026:
GET /api/v1/convert?api_key=YOUR_API_KEY&from=XAG&to=EUR&amount=10&date=2026-10-01Análisis de tendencias
La respuesta de /timeframe es fácil de convertir en una serie. Este ejemplo calcula una media móvil simple de 20 días del precio del oro:
// data = respuesta de /timeframe?currencies=XAU
const series = Object.entries(data.rates)
.sort(([a], [b]) => a.localeCompare(b))
.map(([date, rates]) => ({ date, price: rates.USDXAU }));
function movingAverage(points, period) {
return points.slice(period - 1).map((point, i) => ({
date: point.date,
sma: points.slice(i, i + period).reduce((sum, p) => sum + p.price, 0) / period,
}));
}
const sma20 = movingAverage(series, 20);Los precios de cierre de los días pasados nunca cambian, así que guárdalos de forma permanente en lugar de volver a solicitarlos. Solo la barra de hoy sigue cambiando.
Guías relacionadas
¿Listo para empezar a desarrollar?
Crea una cuenta gratuita para obtener tu clave API o explora todos los endpoints en la referencia de la API.