v0.1.0 — First public release
🎉 Primera versión pública de tasa-bcv-api — la API REST pública y gratuita para el histórico oficial de tasas USD/VES y EUR/VES del Banco Central de Venezuela.
🟢 En producción
- API: https://tasa-bcv-api-production.up.railway.app
- Documentación interactiva (Scalar): https://tasa-bcv-api-production.up.railway.app/docs
- OpenAPI spec: https://tasa-bcv-api-production.up.railway.app/openapi.json
- Healthcheck: https://tasa-bcv-api-production.up.railway.app/health
📊 Datos disponibles
| Moneda | Histórico desde | Registros | Fuente |
|---|---|---|---|
| USD/VES | 2016-01-04 | 2500 días reales | 2_1_1_tdc.xlsx del BCV |
| EUR/VES | 2020-03-27 | 1419 días reales | 2_1_2*_otrasmonedas.xls del BCV |
Total cargado en la primera ingesta: 3913 filas reales + propagación a fines de semana y feriados para que toda fecha en el rango devuelva un valor.
⚙️ Funcionalidad
- 10 endpoints REST (
/v1/rates/*,/health,/docs,/openapi.json,/v1/admin/trigger-ingest). - Actualización diaria automática a las 00:00 Caracas (lun-vie) con retry a las 08:00 si la primera ingesta no captura la tasa del día.
- Propagación de fines de semana y feriados con flag
is_propagated: trueypropagated_fromapuntando al día origen. - Rate limit de 30 req/min por IP (X-Forwarded-For aware).
- OpenAPI 3.1 auto-generado desde los esquemas Zod de cada ruta.
- Validación robusta de fechas: 400 con códigos estables (
DATE_OUT_OF_RANGE,DATE_BEFORE_HISTORY,INVALID_RANGE,RANGE_TOO_LARGE,INVALID_DATE_FORMAT). - Endpoint admin protegido (Bearer token) para disparar ingest manualmente.
🛠️ Stack
TypeScript + Hono + Drizzle ORM + PostgreSQL 16, undici para HTTP (con SSL inválido tolerado), SheetJS para los XLS, cheerio para la homepage del BCV, node-cron para el scheduling, pino para logs estructurados. Deploy en Railway.
⚠️ Sobre la redenominación del bolívar
El 1 de octubre de 2021 el BCV redenominó el bolívar eliminando 6 ceros. La API devuelve el valor exacto que el BCV publicó en cada época, sin transformaciones:
- 2020-03-27: USD 73,830.16 / EUR 81,349.03 (Bs.S, antes de la reforma)
- 2026-05-14: USD 510.79 / EUR 598.12 (Bs.D, después de la reforma)
Para comparar entre escalas, divide los valores antiguos entre 1,000,000.
🤝 Cómo usarla
# Última tasa
curl https://tasa-bcv-api-production.up.railway.app/v1/rates/latest
# Fecha específica
curl https://tasa-bcv-api-production.up.railway.app/v1/rates/2026-05-14
# → USD 510.7873 / EUR 598.12171255
# Rango histórico
curl "https://tasa-bcv-api-production.up.railway.app/v1/rates/range?from=2026-05-01&to=2026-05-19¤cy=USD"
# Solo una moneda
curl https://tasa-bcv-api-production.up.railway.app/v1/rates/eur📜 Versión anterior
Este repo nació como un bot de Telegram en Python (@IntervencionBCVbot) que operó hasta agosto de 2025. El código del bot está preservado en el tag v0-legacy-python-bot, el branch legacy/python-bot y la carpeta legacy/python-bot/ en main.
🗺️ Próximos pasos
- API keys opcionales (más cuota por key registrada)
- Endpoint admin para disparar backfill (hoy solo trigger-ingest del daily)
- Migración de tests de DB a
testcontainers - Dominio propio cuando haya presupuesto
📄 Licencia
Distribuido bajo AGPL-3.0-or-later. Si despliegas una versión modificada como servicio público, debes publicar tus cambios.
No estamos afiliados al Banco Central de Venezuela. Las tasas son obtenidas de los datos oficiales que el BCV publica en su sitio web.