Si vives en Cuba, trabajas con dólares, euros o cualquier moneda convertible, ya sabes lo frustrante que es estar consultando cinco fuentes distintas para entender realmente cuánto vale tu dinero. ElToque, CADECA, el Banco Central, Binance P2P… cada uno con su propia actualización, su propia app, su propia hora de publicación. Y cuando necesitas hacer una transferencia, enviar una remesa o simplemente saber si conviene comprar hoy o esperar, el tiempo perdido se traduce en dinero perdido.
TASALO nació para resolver exactamente eso: unificar, automatizar y visualizar las tasas de cambio cubanas en un solo ecosistema. Y lo hace con un stack moderno, código abierto y arquitectura profesional.
TASALO es un sistema completo de seguimiento de tasas de cambio en tiempo real para Cuba. No es una app más. Es una arquitectura de cuatro componentes que trabajan en conjunto para recolectar, almacenar, procesar y distribuir información cambiaria desde múltiples fuentes oficiales y no oficiales.
El núcleo es taso-api, un backend en FastAPI + PostgreSQL que cada 5 minutos consulta automáticamente a:
ElToque (mercado informal)
CADECA (casa de cambio oficial)
BCC (Banco Central de Cuba)
Binance (P2P crypto)
Cubanomic (agregador multi-fuente, actualizado diariamente a las 00:01 UTC)
Toda esa información se almacena, se historiza y se expone a través de una API REST limpia, con indicadores de tendencia (🔺 / 🔻) y soporte para consultas de histórico de hasta 2 años.
Stack: FastAPI · Python 3.13 · SQLAlchemy 2.0 · Alembic · PostgreSQL (Supabase en producción)
Es el backend que todo lo alimenta. Sus responsabilidades son claras:
Scraping programado: 4 scrapers activos + 1 job diario para Cubanomic.
Persistencia: 12 tablas en PostgreSQL, con más de 10.000 snapshots almacenados y creciendo.
API REST pública: Endpoints versionados bajo /api/v1/* para consumir tasas combinadas o por fuente, historial, imágenes de ElToque, suscripciones y administración.
Auth por API Key: Los endpoints administrativos (/api/v1/admin/*) requieren X-API-Key, protegiendo operaciones sensibles como el refresh manual o la consulta de estado del scheduler.
Cache con Redis: Para Cubanomic, reduciendo la carga sobre APIs externas con TTLs configurables.
La arquitectura es 100% async/await, con httpx como cliente HTTP y un diseño de routers/schemas/services que facilita extender cualquier fuente nueva en minutos.
Stack: python-telegram-bot 21.x · APScheduler · Pillow · Python 3.12
Es la interfaz principal para el usuario final. El bot ofrece más de 13 comandos organizados en categorías:
Tasas de cambio
/tasalo — Vista combinada de ElToque, BCC y CADECA en una imagen generada dinámicamente.
/toque, /bcc, /cadeca — Tasas individuales con indicadores de cambio.
/fuel — Precio del combustible en el mercado informal.
/toqueimg — Imagen diaria de ElToque con alertas configurables por hora y formato.
Cripto y trading
/p — Precios detallados con ATH/ATL, supply y rotación automática de fuentes (CoinGecko + CoinMarketCap).
/ta y /graf — Análisis técnico y gráficos de velas con indicadores por temporalidad.
/spl y /tspl — Market spotlight con narrativa generada por IA (Groq), curado y en formato newsletter.
/news — Noticias cripto filtradas por moneda, tópico o texto libre (NewsData.io).
/alert — Alertas de precio configurables desde los mismos botones de /p, /ta y /graf.
Utilidades
/y — Progreso del año + frase motivacional del día, con sistema de suscripciones por hora UTC.
/start, /help, /ayuda — Onboarding contextual y ayuda por categorías.
/tkt — Sistema de tickets para reportar bugs o pedir promociones/anuncios.
Administración (admin only)
/refresh, /status, /health — Control total del backend.
/log — Logs centralizados de bot, API, web y gcg, entregados por Telegram sin necesidad de SSH.
/ads — Gestión de anuncios inyectados (crear/activar/desactivar/patrocinar/peso).
/ms — Difusión de mensajes o fotos a todos los usuarios con vista previa y confirmación.
El bot genera imágenes dinámicas con Pillow, usando tipografía profesional (JetBrains Mono + Space Grotesk), con escalado proporcional y fallback automático a texto si algo falla.
Stack: Flask · Jinja2 · Chart.js · Tailwind CSS · Python 3.12
Es el dashboard web que se abre directamente dentro de Telegram como Mini App. Sus características:
Vista consolidada: Todas las fuentes lado a lado, con indicadores visuales de tendencia.
Historial interactivo: Gráficos con Chart.js para rangos de 1 día a 2 años, en vista combinada o separada por moneda.
Tasas por provincia: Información desagregada por territorio cubano.
Configuración avanzada: Toggle de tema oscuro/claro, auto-refresh y selector de layout (vertical u horizontal).
Binance Ticker Tape: Ticker de criptomonedas en la parte superior, configurable en velocidad y monedas.
Grid 3 columnas (v0.11.0): Layout horizontal fijo que muestra todas las monedas simultáneamente en móvil, tablet y desktop.
Desplegado detrás de Caddy en tasalo.duckdns.org/miniapp, con soporte para Gunicorn, systemd y Docker.
Stack: python-telegram-bot 22.x · SQLite/WAL · APScheduler · curl_cffi
Es el bot que gestiona toda la infraestructura comunitaria de TASALO. Une en un solo proceso lo que antes requería dos bots independientes:
Moderación multi-chat:
22 módulos / 93 handlers: bans, warns, antiflood, locks, blacklist, filters, welcome, rules, reporting, approvals, federation, log_channel, join_requests y más.
Federación TASALO: Los chats marcados como es_oficial_tasalo=1 comparten bans sincronizados (/fban golpea todos a la vez) y son el target de /broadcast.
Protección de chats oficiales: Configuraciones críticas solo modificables por SUDO_USERS, no por admins locales.
RSS modernizado:
Migrado y mejorado desde BitBreadRSS.
Parseo con feedparser + BeautifulSoup, bypass de WAF con curl_cffi.
Distribución automática de noticias a los chats suscritos.
A diferencia de los demás componentes, usa SQLite en modo WAL (no Postgres), porque su dataset es pequeño y necesita comprobaciones por mensaje en milisegundos, sin overhead de infraestructura extra en el VPS.
taso-api (FastAPI + PostgreSQL)
↙ ↘
taso-bot taso-app
(Telegram) (Mini App)
↘ ↙
taso-gcg (Moderación + RSS)
Recolección: El scheduler de taso-api consulta las fuentes externas cada 5 minutos.
Persistencia: Los snapshots se guardan en PostgreSQL con timestamps precisos.
Procesamiento: Los endpoints agregan, filtran y calculan indicadores de cambio.
Distribución: taso-bot consume la API, genera imágenes y las envía a los usuarios. taso-app renderiza gráficos interactivos. taso-gcg modera las comunidades y distribuye noticias RSS.
No es un scraper cualquiera. Es una plataforma diseñada desde cero para producción:
Código async desde la base: No hay bloqueos. Todo el stack es asíncrono.
Histórico real: No se tiran los datos viejos. Cada 5 minutos se guarda un snapshot, permitiendo análisis de tendencias a 2 años.
Multi-formato, multi-canal: Mismo backend alimentando un bot de Telegram, una Mini App, una extensión de navegador y un sistema de moderación.
Observabilidad real: Logs estructurados, health checks, scheduler status y rotación automática de archivos.
Testeable: Suite de tests con pytest, fixtures in-memory, mocking de httpx y coverage report.
Desplegable: Systemd, Docker, Gunicorn, Railway, Render — funciona en cualquier lado.
Capa | taso-api | taso-bot | taso-app | taso-gcg |
|---|---|---|---|---|
Lenguaje | Python 3.13 | Python 3.12 | Python 3.12 | Python 3.11+ |
Framework | FastAPI | python-telegram-bot | Flask | python-telegram-bot |
Base de datos | PostgreSQL + SQLAlchemy + Alembic | — | — | SQLite/WAL + aiosqlite |
Scheduler | APScheduler | APScheduler | — | APScheduler |
HTTP | httpx | httpx | httpx | curl_cffi |
Imágenes | — | Pillow | — | — |
Gráficos | — | — | Chart.js | — |
Deploy | Uvicorn + systemd/Docker | systemd | Gunicorn + Caddy | systemd (venv/pip) |
El cubano que envía remesa y necesita saber si le conviene comprar USD hoy o mañana.
El trabajador por cuenta propia que cotiza en MLC y quiere seguir la evolución diaria.
El inversor cripto que recibe análisis técnico y noticias curadas por IA directamente en Telegram.
El administrador de comunidades que usa taso-gcg para moderar grupos oficiales de TASALO con bans sincronizados y distribución de noticias RSS.
El desarrollador que consume la API pública desde su propia app, extensión o dashboard.
5 fuentes de tasas agregadas.
12 tablas en producción con histórico acumulado.
10.000+ snapshots almacenados.
13+ comandos en el bot de Telegram.
344+ tests passing.
MIT License — código abierto, uso libre.
No necesitas correr nada para consumir los datos. TASALO API ya está desplegada:
http://tasalo.duckdns.org:8040
Los endpoints de lectura son públicos, sin API key, con CORS abierto.
git clone https://github.com/tasalo/taso-api.git
cd taso-api
uv venv && source .venv/bin/activate
uv pip install -r requirements.txt
cp .env.example .env
alembic upgrade head
uvicorn src.main:app --reload --host 0.0.0.0 --port 8040
Documentación interactiva disponible en http://localhost:8040/docs.
TASALO no es solo código, es una comunidad activa en Telegram. Únete a los canales y grupos oficiales:
Canal / Grupo | Descripción |
|---|---|
Informaciones y análisis relevantes sobre noticias del mercado crypto-financiero y sus movimientos, además de otros temas de interés general. | |
Grupo de soporte para consultas, ayuda y resolución de dudas sobre el proyecto. | |
Chat abierto de la comunidad para conversar, compartir ideas y participar en la evolución del proyecto. | |
Canal oficial del equipo con noticias técnicas, actualizaciones y anuncios del proyecto. |
TASALO no es "otro bot de tasas". Es una plataforma de datos financieros cubanos construida con los estándares de un producto de producción: arquitectura limpia, tests automatizados, despliegue continuo, monitoreo y código abierto.
Si en algún momento has tenido que abrir cinco apps para entender el precio del dólar en Cuba, TASALO es la respuesta. Y si eres desarrollador, la API está ahí para que la uses, la mejores y la hagas parte de tu propio stack.
El dinero es tiempo. TASALO te ahorra ambos.
Hecho con ❤️ para Cuba 🇨🇺
¿Preguntas o sugerencias? Escríbenos a [email protected], abre un issue en GitHub. o simplemente crea un ticket en @tasalobot usando el comando /tkt