← Volver a docs

GET /v1/fx/rates/:market/history

Devuelve el histórico de tasas de un market específico. Útil para reportes contables, auditoría, backfill de datos y análisis retrospectivo. El query string elige el modo, y la forma de la respuesta cambia en consecuencia:

  • ?date=YYYY-MM-DDun punto: la cotización vigente en esa fecha (devuelve 1 objeto).
  • sin parámetrostoda la serie dentro de la retención de tu plan (devuelve un array).
  • ?from=&to= → un rango de fechas (devuelve un array).

En modo punto, el endpoint busca el registro más cercano a esa fecha o anterior (no posterior). Esto es importante: en días no hábiles del BCV, el valor "vigente" es el último publicado.


Request

shell
GET /v1/fx/rates/:market/history?date=YYYY-MM-DD HTTP/1.1 Host: api.cotizave.com X-API-Key: ctz_live_aB3cD8fG2hJ5kL9mN1pQ4rS7tU0vWxYzA6bC3d

Path parameters

ParámetroTipoRequeridoValores aceptados
marketstringreference, parallel, binance, bybit, okx, bitget, mexc, bingx, coinex, saldo

Query parameters

ParámetroTipoRequeridoFormatoDescripción
datestringNoYYYY-MM-DDModo punto. Fecha de la cotización buscada (UTC). No puede estar en el futuro. Si se omite, el endpoint entra en modo colección.
fromstringNoYYYY-MM-DDModo colección. Inicio del rango (inclusive). Por defecto, el más antiguo que tu plan permite. No puede ser más viejo que la retención de tu plan.
tostringNoYYYY-MM-DDModo colección. Fin del rango (inclusive). Por defecto, hoy. Una fecha futura se ajusta a hoy.
granularitystringNodaily · rawModo colección. daily (default): un punto de cierre por día. raw: cada captura, hasta 5.000 puntos (luego truncated: true).

Ejemplos de request

Tasa BCV del 1 de marzo de 2026:

cURL
curl "https://api.cotizave.com/v1/fx/rates/reference/history?date=2026-03-01" \ -H "X-API-Key: $COTIZAVE_API_KEY"

Tasa Binance P2P del 15 de enero de 2026:

shell
curl "https://api.cotizave.com/v1/fx/rates/binance/history?date=2026-01-15" \ -H "X-API-Key: $COTIZAVE_API_KEY"

Toda la serie disponible (un punto diario por toda tu retención):

shell
curl "https://api.cotizave.com/v1/fx/rates/reference/history" \ -H "X-API-Key: $COTIZAVE_API_KEY"

Un rango de fechas (diario):

shell
curl "https://api.cotizave.com/v1/fx/rates/reference/history?from=2026-03-01&to=2026-03-31" \ -H "X-API-Key: $COTIZAVE_API_KEY"

Detalle intradía (cada captura, no solo el cierre): agrega granularity=raw. Para un solo día, usa el mismo valor en from y to:

shell
curl "https://api.cotizave.com/v1/fx/rates/binance/history?from=2026-03-15&to=2026-03-15&granularity=raw" \ -H "X-API-Key: $COTIZAVE_API_KEY"

Response

200 OK

json
{ "market": "reference", "date": "2026-03-01", "rate": 472.18, "updated_at": "2026-03-01T14:00:00Z", "captured_at": "2026-03-01T14:05:12Z" }

Schema de respuesta

CampoTipoDescripción
marketstringIdentificador del market consultado
datestringFecha pedida en el query (eco)
ratenumberCotización vigente (mid). VES por unidad de USD.
updated_atstring (ISO 8601)Cuándo se actualizó la fuente original (BCV, exchange, etc.)
captured_atstring (ISO 8601)Cuándo Cotizave persistió el snapshot

200 OK — modo colección

Cuando no envías date, la respuesta es un objeto con metadata del rango y un array points:

json
{ "market": "reference", "from": "2026-03-01", "to": "2026-03-31", "granularity": "daily", "count": 31, "points": [ { "date": "2026-03-01", "rate": 472.18, "updated_at": "2026-03-01T14:00:00Z", "captured_at": "2026-03-01T14:05:12Z" }, { "date": "2026-03-02", "rate": 473.05, "updated_at": "2026-03-02T14:00:00Z", "captured_at": "2026-03-02T14:04:58Z" } ] }
CampoTipoDescripción
from · tostringRango efectivo resuelto por el servidor (UTC)
granularitystringdaily o raw
countnumberCantidad de elementos en points
truncatedbooleanSolo en raw: true si se superó el tope de 5.000 puntos
points[]arrayCada punto: date, rate, updated_at, captured_at. Orden cronológico.

updated_at vs captured_at

Los dos timestamps suelen ser distintos:

  • updated_at: cuándo el dato fue producido por la fuente original. Para BCV es la hora de publicación oficial; para P2P, la hora del último trade observado.
  • captured_at: cuándo Cotizave consumió e indexó ese dato. Suele estar dentro de los siguientes minutos.

Para auditoría contable normalmente importa updated_at. Para reproducir "qué sabíamos en ese momento", importa captured_at.

Comportamiento "closest-or-before"

El endpoint devuelve el registro más cercano a la fecha pedida, pero nunca posterior. Ejemplos:

  • Si pides BCV del domingo y BCV no publicó, recibes el valor del viernes previo.
  • Si pides una fecha previa al primer registro disponible, recibes 404 resource_not_found.
  • Si pides una fecha en el futuro, recibes 400 invalid_format.

Esto es a propósito: para reportes legales y contables el valor "vigente" en un día no hábil del BCV es el último publicado, no una proyección.

Errores posibles

Códigoerror.codeCausa
400missing_fieldFalta el path market
400invalid_formatdate/from/to no respeta YYYY-MM-DD, fecha futura, from posterior a to, o granularity inválida
403feature_not_in_plan · history_out_of_retentionTu plan no incluye histórico (Free/Hobby), o la fecha pedida es más vieja que la retención de tu plan
401invalid_api_keyAPI Key inválida o faltante
404resource_not_foundNo hay registros para ese market en esa fecha o anterior
429rate_limit_exceededCuota mensual agotada
503service_unavailableHistórico no disponible (configuración del entorno)

Casos de uso típicos

Reproducir una factura emitida en el pasado

Para auditar o reemitir una factura con la tasa BCV original:

javascript
async function tasaDelDia(fechaIso) { const res = await fetch( `https://api.cotizave.com/v1/fx/rates/reference/history?date=${fechaIso}`, { headers: { 'X-API-Key': process.env.COTIZAVE_API_KEY } } ) const { rate, updated_at } = await res.json() return { rate, publicadaEn: updated_at } } const { rate, publicadaEn } = await tasaDelDia('2026-02-14') // usar 'rate' como tasa de la factura del 14-feb

Backfill de series temporales

Para reconstruir tu propia tabla de tasas mensual:

javascript
const market = 'parallel' const dates = ['2026-01-31', '2026-02-28', '2026-03-31', '2026-04-30'] for (const date of dates) { const res = await fetch( `https://api.cotizave.com/v1/fx/rates/${market}/history?date=${date}`, { headers: { 'X-API-Key': key } } ) if (!res.ok) continue const data = await res.json() await db.insert('rate_history', { market, date, rate: data.rate }) }

Notas importantes

Zona horaria

El parámetro date se interpreta en UTC. Si tu negocio opera en huso horario VET (UTC-4), considera que "hoy" en VET puede ser "ayer" en UTC para algunas horas del día.

Profundidad histórica y retención por plan

Cuánto histórico puedes consultar depende de tu plan:

PlanRetención de histórico
Free · HobbySin acceso a histórico
Indie90 días
Pro1 año

El modo colección sin parámetros devuelve exactamente esa ventana.

Disponibilidad por market

La retención de tu plan define hasta dónde puedes consultar. Cada market además tiene su propia fecha de inicio de serie:

MarketHistórico disponible
reference · eur_referenceToda la retención de tu plan
yadioToda la retención de tu plan
parallelDesde febrero 2026
binance · bybit · okx · bitget · mexc · bingx · saldoDesde mayo 2026
paypal · zelleDesde agosto 2026
cash · cucuta · syklo · zoom · western_unionDesde agosto 2026

Si pides una fecha anterior al inicio de la serie de un market, recibes 404 resource_not_found. Si pides una anterior a la retención de tu plan, recibes 403 history_out_of_retention. No son lo mismo: el primero significa que el dato no existe; el segundo, que existe pero tu plan no alcanza.