Decidir si crear tu propia API de tipos de cambio o comprar una gestionada es una de las primeras decisiones de arquitectura reales que afronta cualquier equipo que maneje dinero en más de una moneda. Sobre el papel, construir parece barato: el Banco Central Europeo publica tipos de referencia gratis, los datos son solo un pequeño archivo XML, y ¿qué tan difícil puede ser parsear un feed y servirlo por HTTP? En la práctica, la distancia entre un prototipo de fin de semana y un servicio de tipos listo para producción es donde se esconde la mayor parte del coste. Esta guía desglosa las verdaderas concesiones de construir o comprar una API de tipos de cambio, con cifras de ingeniería honestas, para que elijas el camino que realmente encaja con tu equipo.
Construir o comprar de un vistazo
Aquí está la versión corta antes de entrar en detalle. La elección rara vez trata de si puedes construir un feed de tipos —casi cualquier ingeniero competente puede— sino de si el coste continuo de poseerlo vale la pena frente a pagar unos pocos dólares al mes.
| Factor | Construir (autoalojado) | Comprar (API gestionada) |
|---|---|---|
| Ingeniería inicial | Días a semanas | Minutos |
| Origen de los datos | Conectas feeds del BCE / bancos centrales | Incluido |
| Frecuencia de actualización | La que programes | Tiempo real o casi real |
| Datos históricos | Los construyes y almacenas | Disponibles bajo demanda |
| Responsabilidad de disponibilidad | Tuya | SLA del proveedor |
| Cobertura de monedas | Limitada por tus fuentes | Más de 170 de serie |
| Coste mensual | Servidor + tiempo de ingeniería | $0–$129 para la mayoría |
| Mantenimiento | Continuo, para siempre | Ninguno |
Qué implica realmente "construir lo tuyo"
La razón por la que construir o comprar confunde a la gente es que la demo es genuinamente fácil y el sistema en producción genuinamente no lo es. Veamos a qué te comprometes en realidad.
Obtener los datos en bruto
La fuente gratuita más común es el Banco Central Europeo, que publica tipos de referencia del euro una vez cada día hábil, normalmente alrededor de las 16:00 CET. Esa es la base detrás de muchos feeds de tipos "gratuitos", incluidos proyectos de código abierto como Frankfurter, que ahora combina datos de 84 bancos centrales en 201 monedas.
Dos cosas afectan de inmediato. Primero, el feed del BCE está basado en EUR y se actualiza solo una vez por día hábil: no hay actualizaciones de fin de semana, ni movimiento intradía, ni tipos en festivos TARGET. Si tus usuarios operan un domingo o esperan tipos que se mueven durante el día, un feed diario en EUR no será suficiente. Segundo, el BCE cubre unas 30 monedas. En cuanto necesites un par exótico, un metal o un tipo de cripto, vuelves a tener que obtener y reconciliar varios proveedores por tu cuenta.
Aquí está la parte "fácil" que todos ven: obtener y parsear el XML diario del BCE:
import requests
import xml.etree.ElementTree as ET
URL = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"
NS = {"x": "http://www.ecb.int/vocabulary/2002-08-01/eurofxref"}
resp = requests.get(URL, timeout=10)
root = ET.fromstring(resp.content)
rates = {"EUR": 1.0}
for cube in root.findall(".//x:Cube[@currency]", NS):
rates[cube.attrib["currency"]] = float(cube.attrib["rate"])
print(rates["USD"]) # EUR -> USD reference rateSon quizás 15 líneas. Parece terminado. No lo está.
Parsear, almacenar y servir
Un servicio real necesita más que la última instantánea. Tendrás que persistir los tipos de cada día para poder responder consultas históricas (piensa en facturas, reembolsos, contabilidad e informes fiscales que deben usar el tipo de una fecha concreta). Eso significa un esquema de base de datos, un trabajo de ingesta diario, lógica de reintentos para cuando el endpoint del BCE esté lento o caído, y matemática de conversión de moneda base para poder responder "USD a JPY" cuando tu fuente solo te da "EUR a todo".
La conversión de base a través de una moneda pivote es aritmética simple pero fácil de equivocar sutilmente:
def convert(rates, amount, base, quote):
# rates are all relative to EUR
if base != "EUR":
amount = amount / rates[base] # to EUR
return round(amount * rates[quote], 6)
convert(rates, 100, "USD", "JPY")Luego tienes que exponer esto a través de una API con caché, limitación de tasa, autenticación y CORS si los navegadores la llamarán. Nada de esto es difícil de forma aislada. Todo junto es un pequeño producto.
La carga de mantenimiento oculta
Esta es la parte que el prototipo nunca revela. Una vez que tu negocio depende del feed, asumes un conjunto de obligaciones recurrentes: monitorizar el trabajo de ingesta y alertar cuando falla en silencio; manejar los días en que el formato o la URL de la fuente cambia; rellenar huecos cuando se pierde una descarga; escalar el servicio a medida que crece el tráfico; y ser la persona avisada a las 2 de la madrugada cuando un flujo de pago se rompe porque los tipos quedaron obsoletos. Un feed de tipos no es una funcionalidad que entregas una vez. Es un sistema que operas indefinidamente.
El verdadero coste de construir
Los equipos lo subestiman habitualmente porque la partida que importa —el tiempo de ingeniería— no aparece en una factura. Un desglose conservador para un feed autoalojado listo para producción se ve así:
- Construcción inicial: ingesta, almacenamiento, conversión, capa de API, autenticación, pruebas: normalmente de una a tres semanas de trabajo de ingeniería enfocado.
- Infraestructura: un pequeño servidor o contenedor más una base de datos. Modesto en dólares, pero nunca cero.
- Mantenimiento continuo: de forma realista, unas pocas horas al mes en estado estable, con picos cada vez que una fuente se rompe o crecen los requisitos.
- Coste de oportunidad: cada hora dedicada a operar un feed de tipos genérico es una hora no dedicada al producto por el que tus clientes realmente pagan.
Pon una tarifa de ingeniería combinada frente a esas semanas y el feed "gratis" cuesta en silencio miles de dólares solo en su primer trimestre, antes de haber servido un solo tipo en tiempo real o una sola consulta histórica que tu fuente no proporciona. Compáralo con una API de divisas gratuita gestionada que empieza en cero dólares y un nivel de pago que, para la mayoría de los equipos, se sitúa bastante por debajo de $129 al mes.
Qué obtienes al comprar una API de divisas
Comprar reduce toda esa construcción a una petición HTTP. Un proveedor gestionado como Finexly se encarga del origen, la normalización, la conversión de base, el almacenamiento histórico y la disponibilidad, de modo que consumes una interfaz limpia y consistente. La misma tarea que arriba requería un esquema y un pipeline de ingesta se convierte en:
curl "https://api.finexly.com/v1/latest?base=USD&symbols=EUR,GBP,JPY&apikey=YOUR_API_KEY"{
"success": true,
"base": "USD",
"timestamp": 1760000000,
"rates": {
"EUR": 0.9241,
"GBP": 0.7886,
"JPY": 156.32
}
}Cualquier moneda base funciona en todos los niveles —sin restricción de solo EUR— y los datos históricos son un cambio de un parámetro en lugar de una base de datos que mantienes:
curl "https://api.finexly.com/v1/historical?base=USD&symbols=EUR&date=2026-01-15&apikey=YOUR_API_KEY"Lo que realmente compras son datos que no tienes que obtener, conversiones que no tienes que verificar y disponibilidad que no tienes que poseer. La cobertura de más de 170 monedas, respuestas por debajo de 50 ms y actualizaciones en tiempo real vienen de serie. El conjunto completo de endpoints está documentado en la documentación de la API de Finexly, y puedes comparar proveedores lado a lado con la herramienta de comparación.
Cuándo tiene sentido construir
Construir no siempre es la elección equivocada. El autoalojamiento tiene sentido genuino cuando:
- Tus necesidades son mínimas y estáticas. Un tipo de referencia diario en EUR para un panel interno sin requisitos históricos ni en tiempo real es una razón legítima para envolver el feed del BCE tú mismo.
- Tienes requisitos estrictos de residencia de datos o aislamiento. Si los tipos no pueden salir de tu infraestructura por motivos de cumplimiento, autoalojar un feed de código abierto como Frankfurter puede ser obligatorio.
- Los datos de tipos son tu producto principal. Si construyes una plataforma de trading de forex donde el motor de tipos es el diferenciador, poseerlo de extremo a extremo puede valer el coste.
Para todos los demás, construir un feed de tipos genérico es resolver un problema que ya se ha resuelto mejor.
Cuándo tiene sentido comprar
Comprar gana en el caso común, y las señales son fáciles de detectar:
- Necesitas cualquier moneda base, no solo EUR.
- Necesitas movimiento en tiempo real o intradía, no una sola instantánea diaria.
- Necesitas tipos históricos en fechas arbitrarias para facturación, contabilidad o informes.
- Necesitas amplia cobertura incluyendo exóticas, metales o cripto.
- Prefieres entregar funcionalidades de producto antes que operar infraestructura.
- Quieres que sea otro quien responda por la disponibilidad y un SLA.
Si marcaste dos o más de esos, las cuentas casi siempre favorecen comprar.
Un enfoque híbrido: compra los datos, cachéalos tú mismo
Las configuraciones de producción más inteligentes rara vez son puro construir o puro comprar. Compran los datos y los cachean localmente para controlar coste y latencia. Obtienes la cobertura y fiabilidad de un proveedor gestionado mientras mantienes bajo el volumen de peticiones —y tu factura—. Aquí tienes una capa de caché mínima en Node.js:
const cache = new Map();
const TTL_MS = 60 * 60 * 1000; // refresh hourly
async function getRates(base = "USD") {
const hit = cache.get(base);
if (hit && Date.now() - hit.time < TTL_MS) return hit.rates;
const url = `https://api.finexly.com/v1/latest?base=${base}&apikey=${process.env.FINEXLY_KEY}`;
const res = await fetch(url);
const data = await res.json();
cache.set(base, { rates: data.rates, time: Date.now() });
return data.rates;
}Este patrón te da lo mejor de ambos mundos: no operas un pipeline de ingesta, pero tampoco haces una llamada de red en cada visita de página. Para patrones más profundos, consulta nuestra guía sobre mejores prácticas de caché y manejo de errores. A medida que crece el volumen, los planes de precios escalan contigo en lugar de forzar una reconstrucción.
Una lista de comprobación rápida para decidir
Repasa estas preguntas con honestidad:
- ¿Necesito algo más que una instantánea diaria en EUR? Si es así, inclínate por comprar.
- ¿Necesitaré tipos históricos para fechas concretas? Si es así, inclínate por comprar.
- ¿Son los datos de tipos mi producto principal o una funcionalidad de apoyo? Si es de apoyo, inclínate por comprar.
- ¿Tengo un motivo de cumplimiento por el que los datos no pueden salir de mi infraestructura? Si es así, inclínate por construir (autoalojar).
- ¿Está mejor invertido el tiempo del equipo en el producto? Casi siempre sí: inclínate por comprar.
Para la gran mayoría de creadores fintech, plataformas SaaS y equipos de comercio electrónico, la respuesta apunta en la misma dirección: compra lo genérico, construye el diferenciador.
Preguntas frecuentes
¿Es más barato construir mi propia API de tipos de cambio? Solo si tus necesidades son triviales y nunca crecen. El origen de datos puede ser gratis vía el BCE, pero el tiempo de ingeniería para construir y mantener un feed de producción —ingesta, almacenamiento, conversión, disponibilidad, monitorización— suele costar más en el primer trimestre que años de suscripción a una API gestionada.
¿Puedo usar directamente el feed gratuito del BCE? Puedes, con dos grandes salvedades: está basado en EUR y se actualiza solo una vez por día hábil, sin tipos de fin de semana ni intradía. Para paneles internos está bien; para cualquier cosa de cara al usuario o transaccional, normalmente no.
¿Cuál es la diferencia entre Frankfurter y una API de pago como Finexly? Frankfurter es un excelente feed gratuito y de código abierto construido sobre tipos de referencia de bancos centrales, sin clave de API ni cuotas, ideal para uso de bajo riesgo o autoalojado. Una API de pago como Finexly añade conversión a cualquier base, actualizaciones en tiempo real, más de 170 monedas, disponibilidad/SLA garantizados y soporte: lo que necesitas cuando el dinero depende de los tipos.
¿Puedo combinar ambos enfoques? Sí, y la mayoría de los equipos maduros lo hacen. Compra los datos a una API gestionada por cobertura y fiabilidad, y luego cachéalos localmente con un TTL sensato para mantener baja la latencia y el volumen de peticiones —y el coste—.
¿Cómo migro de un feed propio a una API gestionada? Cambia la fuente de datos de tu función interna de tipos por una sola llamada a la API, conserva tu capa de caché existente y rellena cualquier necesidad histórica a través del endpoint histórico del proveedor. Suele ser unas pocas horas de trabajo, no una reescritura.
¿Listo para saltarte la construcción y entregar la funcionalidad en su lugar? Obtén tu clave gratuita de la API de Finexly: sin tarjeta de crédito. Empieza con 1.000 peticiones gratis al mes en más de 170 monedas, y mejora solo cuando tu tráfico realmente crezca.
Explore More
Vlado Grigirov
Senior Currency Markets Analyst & Financial Strategist
Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...
View full profile →