Consulta por fecha
Consultá a cuánto estaba cualquier cotización en una fecha (y opcionalmente una hora) determinada, con datos que llegan hasta 2010.
Autenticación requerida
Como el resto de los datos históricos, este endpoint necesita una API Key válida, en el header
Authorization: Bearer <TU_API_KEY> o en x-api-key. Obtenela en tu
cuenta.
Mientras que /api/v2/history/... devuelve una serie entre dos fechas, este endpoint responde
una pregunta puntual: ¿a cuánto estaba esto en tal momento?
curl -H "Authorization: Bearer $MONEDAPI_KEY" \
https://monedapi.ar/api/v2/date/2015-06-01/usd/blue{
"requestedAt": "2015-06-01T23:59:59.999-03:00",
"currency": "USD",
"name": "Dólar blue",
"origin": "BLUE",
"buy": 12.53,
"sell": 12.63,
"valueType": "money",
"quotedAt": "2015-06-01T18:00:00.000-03:00",
"sameDay": true,
"daysStale": 0,
"ageSeconds": 21599
}Las tres formas
| Endpoint | Devuelve |
|---|---|
GET /api/v2/date/{date} | Un array con todas las cotizaciones |
GET /api/v2/date/{date}/{currency} | Un array con todos los orígenes de una moneda |
GET /api/v2/date/{date}/{currency}/{origin} | Un objeto: una sola cotización |
{date} va en formato YYYY-MM-DD y se interpreta en hora argentina.
Query parameters
| Campo | Tipo | Descripción |
|---|---|---|
time | string | Opcional. Hora argentina, HH:MM o HH:MM:SS. Por defecto, el final del día (23:59:59). |
max_age | number | Opcional. Antigüedad máxima en segundos; lo más viejo vuelve con buy/sell en null. |
Campos de la respuesta
| Campo | Descripción |
|---|---|
requestedAt | El instante que se consultó, ya resuelto en hora argentina. |
buy / sell | Los valores de la cotización devuelta, o null (ver más abajo). |
valueType | money, points (Riesgo País) o coefficient (CER) — la unidad para formatear el número. |
quotedAt | Cuándo se registró realmente la cotización devuelta. |
sameDay | Si quotedAt cae en el mismo día calendario argentino que requestedAt. |
daysStale | Días calendario de atraso entre una y otra. |
ageSeconds | Lo mismo, en segundos — el útil cuando pedís una hora concreta. |
Los cuatro últimos existen por una razón concreta: en una misma respuesta conviven cotizaciones del día pedido con otras de hace semanas, y sin ellos serían indistinguibles. Ver Antigüedad dispar.
La regla: la última cotización anterior al instante pedido
Hay una sola regla, y de ella se derivan todos los comportamientos:
Se devuelve la última cotización registrada con fecha menor o igual al instante pedido.
Una consulta sin time es simplemente una consulta al final del día. Por eso, si ese día no hubo
cotización, se devuelve la anterior disponible — no es una regla aparte, es la misma.
El domingo 2026-08-02 el blue no cotizó:
GET /api/v2/date/2026-08-02/usd/blue{
"requestedAt": "2026-08-02T23:59:59.999-03:00",
"buy": 1540,
"sell": 1560,
"quotedAt": "2026-07-31T13:04:01.574-03:00",
"sameDay": false,
"daysStale": 2,
"ageSeconds": 212158
}Es la cotización del viernes 31, y la respuesta lo dice.
Nunca se devuelve una cotización posterior
Semántica as-of, no “la más cercana”
Aunque una cotización posterior esté más cerca en el tiempo, no se devuelve nunca.
El 2026-08-03 el dólar cripto tiene cotizaciones a las 14:26:01 (1575.41) y a las 14:32:02
(1574.72). Pidiendo las 14:30:
GET /api/v2/date/2026-08-03/usd/cripto?time=14:30devolvemos 1575.41, la de 14:26:01, aunque la de 14:32:02 esté a 2 minutos y la nuestra a casi 4.
El motivo es que 1574.72 es un precio que a las 14:30 todavía no existía. Devolverlo metería
información del futuro en la respuesta y arruinaría cualquier simulación histórica construida sobre
el endpoint: una estrategia backtesteada así daría resultados imposibles de reproducir en vivo.
Cuándo viene null
buy y sell vuelven en null cuando no hay ninguna cotización anterior al instante pedido,
normalmente porque el par todavía no existía. El item no desaparece del array: el largo de la
respuesta es siempre el mismo, así que iterarla no se rompe al consultar fechas viejas.
ARG/UVA arranca el 2016-03-31 y USD/CRIPTO el 2026-05-04, así que al 2015-06-01:
[
{ "currency": "USD", "origin": "BLUE", "buy": 12.53, "sell": 12.63, "daysStale": 0 },
{ "currency": "ARG", "origin": "UVA", "buy": null, "sell": null, "quotedAt": null, "daysStale": null },
{ "currency": "USD", "origin": "CRIPTO", "buy": null, "sell": null, "quotedAt": null, "daysStale": null }
]Un 404 significa que la moneda u origen no existen en MonedAPI. Un 200 con null significa
que existen pero todavía no cotizaban. No son lo mismo.
Antigüedad dispar
Las fuentes no actualizan todas al mismo ritmo, y alguna puede quedar congelada. Una sola consulta al domingo 2026-08-02 devuelve esto:
| Cotizaciones | quotedAt | daysStale |
|---|---|---|
USD/CCL, USD/CRIPTO, USD/MAYORISTA, ARG/CER | Dom 2 ago | 0 |
USD/FUTURO | Sáb 1 ago | 1 |
USD/BLUE, USD/OFICIAL, USD/BOLSA, EUR/BNA, ARG/RIESGO, ARG/UVA, CLP, UYU | Vie 31 jul | 2 |
USD/BNA, USD/TARJETA | Jue 30 jul | 3 |
BRL/BNA | Lun 6 jul | 27 |
Si tu caso de uso no tolera ese atraso, usá max_age (en segundos): las cotizaciones que lo superen
vuelven con buy y sell en null, pero conservan quotedAt, daysStale y ageSeconds, así
que siempre podés ver qué se descartó y por qué.
# Nada de más de 7 días
GET /api/v2/date/2026-08-02?max_age=604800Lo que el endpoint responde de verdad
No hay resolución intradiaria antes del 2026-05-04
El grueso de la historia previa a esa fecha se cargó una fila por día hábil, registrada al cierre (18:00 hora argentina). Pedir una hora anterior a las 18:00 en una fecha vieja devuelve, por lo tanto, el cierre del día hábil anterior.
GET /api/v2/date/2015-06-01/usd/blue?time=10:00devuelve 12.55 / 12.65 con quotedAt del viernes 29 de mayo, no del lunes 1 de junio: a las
10:00 de ese lunes, el último dato que MonedAPI conocía era el cierre del viernes.
Es correcto bajo la regla, pero conviene tener claro el encuadre general:
El endpoint devuelve el último valor que MonedAPI conocía en el instante consultado, no el precio de mercado de ese instante.
Con quotedAt en la respuesta, la diferencia siempre está a la vista.
Errores
| Caso | Respuesta |
|---|---|
| Sin API key, o inválida | 401 |
date o time mal formadas | 400 |
date posterior a hoy (hora argentina) | 400 |
| Moneda u origen inexistentes | 404 |
| Par existente, sin cotización previa al instante | 200 con buy/sell en null |
Pedir hoy sin time es válido: resuelve al final del día de hoy y devuelve la última cotización
conocida.