← 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

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/Starter), 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 · Hobby · StarterSin acceso a histórico
Indie90 días
Pro1 año

El modo colección sin parámetros devuelve exactamente esa ventana. Además, el histórico se persiste a partir de la incorporación de cada market al producto: si pides una fecha previa a esa incorporación, recibes resource_not_found. Para BCV (reference) la profundidad es la mayor del producto.