Consulta por fecha
El histórico devuelve una serie entre dos fechas. La consulta por fecha responde una pregunta puntual: ¿a cuánto estaba esto en tal momento?
curl https://monedapi.ar/api/v2/date/2015-06-02/usd/blue{ "requestedAt": "2015-06-02T23:59:59.999-03:00", "currency": "USD", "name": "Dólar Blue", "origin": "BLUE", "valueType": "money", "buy": 12.55, "sell": 12.65, "quotedAt": "2015-06-02T18:00:00.000-03:00", "sameDay": true, "daysStale": 0, "ageSeconds": 21599}Los datos arrancan en 2010 para los pares más viejos, y cada par tiene su propia fecha de inicio
(desde cuándo hay datos). Una fecha anterior al primer dato
de un par lo responde con valores en null.
Las tres formas
Sección titulada «Las tres formas»| Ruta | Devuelve |
|---|---|
GET /api/v2/date/{fecha} |
Un array con todos los pares del catálogo |
GET /api/v2/date/{fecha}/{moneda} |
Un array con los pares de una moneda |
GET /api/v2/date/{fecha}/{moneda}/{origen} |
Un objeto con un solo par |
{fecha} va en formato YYYY-MM-DD y se interpreta en hora argentina. Los arrays siguen el orden
de la tabla de pares.
curl https://monedapi.ar/api/v2/date/2026-09-29/arg[ { "requestedAt": "2026-09-29T23:59:59.999-03:00", "currency": "ARG", "name": "Riesgo País", "origin": "RIESGO", "valueType": "points", "buy": 607, "sell": 607, "quotedAt": "2026-09-29T18:54:18.079-03:00", "sameDay": true, "daysStale": 0, "ageSeconds": 18341 }]El ejemplo está recortado: la respuesta trae también el CER y la UVA.
Parámetros
Sección titulada «Parámetros»| Parámetro | Tipo | Qué hace |
|---|---|---|
time |
HH:MM o HH:MM:SS |
Opcional. Hora argentina. Por defecto, el final del día (23:59:59.999). |
max_age |
entero | Opcional. Antigüedad máxima aceptada, en segundos. |
Campos de la respuesta
Sección titulada «Campos de la respuesta»| Campo | Qué es |
|---|---|
requestedAt |
El instante consultado, en hora argentina. |
currency, name, origin |
El par, como en las cotizaciones actuales. |
valueType |
money, points (Riesgo País) o coefficient (CER): cómo mostrar el número. |
buy, sell |
Los valores vigentes en ese instante, o null. |
quotedAt |
Cuándo se observó el valor devuelto. |
sameDay |
Si quotedAt cae en el mismo día argentino que requestedAt. |
daysStale |
Días calendario argentinos entre quotedAt y requestedAt. |
ageSeconds |
Segundos entre quotedAt y requestedAt. Sirve cuando pedís una hora. |
Los cuatro últimos existen porque en una misma respuesta conviven valores del momento pedido con otros que no cambian desde hace días. Sin ellos no se podrían distinguir.
La regla
Sección titulada «La regla»Hay una sola regla, y de ella salen todos los casos:
Se devuelve el último valor observado en el instante pedido o antes.
Una consulta sin time es una consulta al final del día. Si ese día el par no cambió, se
devuelve el último valor anterior; no es un caso aparte, es la misma regla.
El 30 de septiembre, a las 12:00, el blue seguía con el valor del día anterior:
curl "https://monedapi.ar/api/v2/date/2026-09-30/usd/blue?time=12:00"{ "requestedAt": "2026-09-30T12:00:00.000-03:00", "currency": "USD", "name": "Dólar Blue", "origin": "BLUE", "valueType": "money", "buy": 1540, "sell": 1560, "quotedAt": "2026-09-29T18:54:13.917-03:00", "sameDay": false, "daysStale": 1, "ageSeconds": 61546}quotedAt es del 29, y la respuesta lo dice con sameDay y daysStale.
Nunca un valor posterior
Sección titulada «Nunca un valor posterior»Aunque un valor posterior esté más cerca del instante pedido, no se devuelve.
El 30 de septiembre el dólar cripto cambió a 1.597,58 a las 18:18:24 y a 1.598,93 a las 18:23:24. Pidiendo las 18:22:
curl "https://monedapi.ar/api/v2/date/2026-09-30/usd/cripto?time=18:22"{ "requestedAt": "2026-09-30T18:22:00.000-03:00", "currency": "USD", "name": "Dólar Cripto", "origin": "CRIPTO", "valueType": "money", "buy": 1597.58, "sell": 1597.58, "quotedAt": "2026-09-30T18:18:24.575-03:00", "sameDay": true, "daysStale": 0, "ageSeconds": 215}Devuelve 1.597,58, el valor de las 18:18:24, aunque el de las 18:23:24 esté más cerca. A las 18:22 ese precio todavía no existía. Devolverlo metería información del futuro en la respuesta, y cualquier simulación armada sobre la API daría resultados imposibles de repetir en vivo.
Lo que MonedAPI conocía, no el precio de mercado
Sección titulada «Lo que MonedAPI conocía, no el precio de mercado»Los valores se observan cada 5 minutos. La consulta devuelve el último valor que MonedAPI había
observado en el instante pedido, no el precio exacto del mercado en ese segundo. quotedAt deja
la diferencia a la vista.
Cuándo viene null
Sección titulada «Cuándo viene null»buy y sell vuelven en null cuando no hay ningún valor observado antes del instante pedido,
por ejemplo en una fecha anterior al primer dato del par:
curl https://monedapi.ar/api/v2/date/2009-12-31/usd/blue{ "requestedAt": "2009-12-31T23:59:59.999-03:00", "currency": "USD", "name": "Dólar Blue", "origin": "BLUE", "valueType": "money", "buy": null, "sell": null, "quotedAt": null, "sameDay": false, "daysStale": null, "ageSeconds": null}En las formas que devuelven un array, el par no desaparece: la respuesta trae siempre una entrada por par, así que recorrerla no se rompe al consultar fechas viejas.
Antigüedad dispar y max_age
Sección titulada «Antigüedad dispar y max_age»Las fuentes no actualizan todas al mismo ritmo: hay dólares que cambian cada pocos minutos e índices que cambian una vez por día. La consulta del 30 de septiembre a las 12:00 devuelve, entre otros:
| Pares | quotedAt |
daysStale |
|---|---|---|
USD/OFICIAL, USD/CCL, USD/CRIPTO, USD/BOLSA, USD/FUTURO |
30/9, 11:47 | 0 |
ARG/RIESGO |
30/9, 10:53 | 0 |
ARG/CER, ARG/UVA |
30/9, 00:04 | 0 |
USD/BLUE, EUR/BNA |
29/9, 18:54 | 1 |
BRL/BNA |
6/7, 15:04 | 86 |
Si tu caso no tolera ese atraso, usá max_age, en segundos. Los pares que lo superan vuelven con
buy y sell en null, pero conservan quotedAt, sameDay, daysStale y ageSeconds, así que
siempre ves qué se descartó y por qué.
curl "https://monedapi.ar/api/v2/date/2026-09-30?time=12:00&max_age=3600"[ { "requestedAt": "2026-09-30T12:00:00.000-03:00", "currency": "USD", "name": "Dólar Banco Nación", "origin": "BNA", "valueType": "money", "buy": 1490, "sell": 1540, "quotedAt": "2026-09-30T11:17:58.536-03:00", "sameDay": true, "daysStale": 0, "ageSeconds": 2521 }, { "requestedAt": "2026-09-30T12:00:00.000-03:00", "currency": "USD", "name": "Dólar Blue", "origin": "BLUE", "valueType": "money", "buy": null, "sell": null, "quotedAt": "2026-09-29T18:54:13.917-03:00", "sameDay": false, "daysStale": 1, "ageSeconds": 61546 }]El ejemplo está recortado: la respuesta trae los 16 pares.
Pedir la fecha de hoy es válido, con o sin time, incluso con una hora que todavía no llegó:
responde el último valor conocido de cada par.
- Un instante de hace más de 24 horas no cambia más, y se sirve con
Cache-Control: public, max-age=86400. - Cualquier otro pedido tiene hasta 60 segundos de caché.
Errores y límites
Sección titulada «Errores y límites»| Caso | Respuesta |
|---|---|
| Fecha con otro formato o inexistente | 400 con {"error":"Fecha inválida. Formato esperado: YYYY-MM-DD."} |
| Fecha posterior a hoy en Argentina | 400 con {"error":"La fecha es posterior al día de hoy en Argentina."} |
time inválido |
400 con {"error":"Hora inválida. Formato esperado: HH:MM o HH:MM:SS."} |
max_age que no es un entero no negativo |
400 con {"error":"max_age inválido. Se espera un número entero de segundos."} |
| Moneda o par fuera del catálogo | 404 con {"error":"Cotización no encontrada"} |
| Par del catálogo sin valor antes del instante | 200 con buy y sell en null |
| Más de 20 pedidos en 10 segundos desde la misma IP | 429 en texto plano, con Retry-After: 10 |
| El almacenamiento del histórico no responde | 503 con {"error":"Servicio temporalmente no disponible"} y Retry-After: 30 |
curl "https://monedapi.ar/api/v2/date/2026-09-30/usd/blue?time=25:00"{ "error": "Hora inválida. Formato esperado: HH:MM o HH:MM:SS." }curl https://monedapi.ar/api/v2/date/2026-09-30/xxx/blue{ "error": "Cotización no encontrada" }El límite de 20 pedidos cada 10 segundos es por IP y se comparte con el histórico.