Documentación /

Referencia de la API

Resumen REST: autenticación, límites, campos de frescura, endpoints y errores.

Autenticación y límites

Los endpoints de datos aceptan evaluación anónima: 12 solicitudes por minuto y 100 por hora e IP. Una clave aplica la cuota mensual de tu cuenta.

bash · header
Authorization: Bearer YOUR_KEY
X-RateLimit-Remaining: 9999
X-RateLimit-Reset: 1788220800

Campos que explican la frescura

`source` indica la clase de fuente, `market_session` el estado del mercado y `data_updated_at` la hora de la observación contribuyente más antigua de la respuesta. Guarda los tres.

Endpoints

GET /v1/latest[/{BASE}]Tipos actuales, todos o filtrados por symbols.
GET /v1/{YYYY-MM-DD}[/{BASE}]Foto histórica de una fecha y una base.
GET /v1/convert/{FROM}/{TO}[/{AMOUNT}] · POST /v1/convertConvierte un importe; GET individual o POST por lotes.
GET /v1/rate/{slug}Cotización plana de un par por slug.
GET /v1/rangeSerie diaria con paginación y descargas.
GET /v1/currenciesLista de monedas compatibles; no acepta parámetros.
GET /v1/accountCuenta, plan, clave activa y consumo del mes.

Series intradía y cobertura

/v1/timeseries admite 1m, 5m, 15m, 1h, 4h y referencias diarias 1d; no hay 2h. Los cruces SGD sin USD no admiten 4h; USD/SGD y su inverso sí. La recopilación de mercado comenzó el 2026-09-14. Los datos 1m se conservan 30 días; los intervalos mayores no tienen caducidad programada. La retención no garantiza que ya exista toda esa profundidad.

Los cruces históricos requieren cierres reales del mismo intervalo UTC, separados como máximo 5 segundos. effective_at conserva la observación más antigua. No se rellenan huecos y el intervalo abierto puede cambiar. 1d usa referencias diarias de todo el catálogo. La tabla cuenta pares únicos; se admiten ambos sentidos.

intervalPares únicos
1m91
5m91
15m91
1h91
4h79
1d465
curl · EUR/JPY · 15m
curl "https://api.exchangerate.dev/v1/timeseries?base=EUR&symbols=JPY&interval=15m&from=2026-09-14T12:00:00Z&to=2026-09-14T13:00:00Z"

Una ventana admitida sin observaciones devuelve HTTP 200 con data: [], has_more: false y next_cursor: null. Un intervalo desconocido devuelve unsupported_interval; un par fuera de cobertura, unsupported_pair_interval y rejected_pairs (HTTP 400). Las solicitudes mixtas se rechazan completas.

AUD, CAD, CHF, EUR, GBP, JPY, MXN, NOK, NZD, PLN, SEK, SGD, USD, ZAR

Cobertura y límites detallados

API de tipos de cambio intradía

WebSocket en vivo

Conecta a wss://api.exchangerate.dev/v1/stream y envía auth en 10 segundos. Guarda la clave en el servidor, nunca en la URL ni en JavaScript público. No hay conexiones anónimas. Tras authenticated, envía subscribe. El stream usa las monedas de abajo; los cruces requieren observaciones recientes de ambas monedas, separadas como máximo 5 segundos. Pueden aparecer estados unavailable o stale. Cada conexión aceptada consume una unidad de cuota mensual.

La tabla muestra los límites de las cuentas nuevas. Las cuentas existentes conservan Free 1 × 5, Basic 3 × 25 o Pro 10 × 100 (conexiones × pares por conexión). El mensaje authenticated indica tus límites efectivos.

AUD, CAD, CHF, EUR, GBP, JPY, MXN, NOK, NZD, PLN, SEK, SGD, USD, ZAR

PlanConexiones simultáneasPares por conexión
Free00
Basic00
Pro00
Realtime10100
JSON · auth
{"action":"auth","api_key":"YOUR_KEY"}
JSON · subscribe
{"action":"subscribe","base":"EUR","symbols":["USD","JPY"]}

WebSocket en vivo

Errores

REST: Todos usan `{ result: "error", code, message }`. Un 429 añade `Retry-After`; no hay datos simulados cuando una fuente falla.

json · error
{
  "result": "error",
  "code": "missing_parameter",
  "message": "missing required parameter: symbols"
}

Referencia de la API →

Úsala con tu stack

La misma solicitud funciona con curl, Python y JavaScript. No necesitas una clave para evaluar la API.

Abrir la guía de inicio
curl -fsS --max-time 10 "https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP"
Respuesta de ejemplo
{
  "result": "success",
  "base": "USD",
  "source": "live",
  "sources": {
    "EUR": "live",
    "GBP": "live"
  },
  "market_session": "open",
  "timestamp": "2026-06-15T12:00:00Z",
  "data_updated_at": "2026-06-15T12:00:00Z",
  "effective_at": {
    "EUR": "2026-06-15T12:00:00Z",
    "GBP": "2026-06-15T12:00:00Z"
  },
  "rates": {
    "EUR": 0.86207,
    "GBP": 0.74627
  },
  "derived_symbols": [],
  "notice": "Indicative rates, not for settlement."
}

rates.EUR es la cantidad de EUR por 1 USD. effective_at.EUR es la hora de observación y sources.EUR identifica la fuente. Valores y fechas ilustrativos.

Abrir respuesta JSONReferencia de la API