# π± IntegraciΓ³n con DolarAPI - Tasa de Cambio en Tiempo Real
## π― DescripciΓ³n
El servidor MCP de MI PANA APP ahora integra **DolarAPI** para obtener la tasa de cambio oficial del **Banco Central de Venezuela (BCV)** en tiempo real.
## π API Utilizada
**Endpoint**: `https://ve.dolarapi.com/v1/dolares/oficial`
**DocumentaciΓ³n**: https://dolarapi.com/docs/venezuela/operations/get-dolar-oficial
**MΓ©todo**: GET (sin autenticaciΓ³n requerida)
---
## π Formato de Respuesta
```json
{
"fuente": "oficial",
"nombre": "Oficial",
"compra": null,
"venta": null,
"promedio": 301.37,
"fechaActualizacion": "2026-01-01T21:02:47.165Z"
}
```
El servidor utiliza el campo `promedio` como tasa de cambio oficial.
---
## βοΈ ImplementaciΓ³n
### 1. MΓ©todo `getUsdRate()` en FareCalculator
```javascript
async getUsdRate() {
const now = Date.now();
// Usar cachΓ© si estΓ‘ disponible y no ha expirado (1 hora)
if (this.usdRateCache && this.usdRateCacheTime &&
(now - this.usdRateCacheTime < this.CACHE_DURATION_MS)) {
return this.usdRateCache;
}
try {
const response = await fetch('https://ve.dolarapi.com/v1/dolares/oficial');
if (!response.ok) {
throw new Error(`DolarAPI error: ${response.status}`);
}
const data = await response.json();
const rate = data.promedio || data.venta || this.usdRate;
// Actualizar cachΓ©
this.usdRateCache = rate;
this.usdRateCacheTime = now;
return rate;
} catch (error) {
console.warn('Error obteniendo tasa de cambio de DolarAPI, usando fallback:', error.message);
return this.usdRate; // Fallback a la tasa configurada
}
}
```
### 2. ActualizaciΓ³n del MΓ©todo `calculate()`
Ahora es **asΓncrono** y obtiene la tasa en tiempo real cuando se solicita conversiΓ³n a USD:
```javascript
async calculate(distanceKm, durationMin, options = {}) {
// ... cΓ‘lculos de tarifa en BS ...
// Convertir a USD si se solicita
if (currency === 'USD') {
const currentRate = await this.getUsdRate();
result.amount_usd = parseFloat((fare / currentRate).toFixed(2));
result.currency = 'USD';
result.exchange_rate = currentRate;
result.exchange_rate_source = 'DolarAPI (BCV Oficial)';
}
return result;
}
```
---
## π CaracterΓsticas
### β
CachΓ© Inteligente
- **DuraciΓ³n**: 1 hora (3,600,000 ms)
- **PropΓ³sito**: Reducir llamadas innecesarias a la API
- **ActualizaciΓ³n**: AutomΓ‘tica despuΓ©s de expirar el cachΓ©
### β
Fallback Robusto
Si la API falla o no estΓ‘ disponible:
1. Se registra un warning en los logs
2. Se usa la tasa configurada en `USD_EXCHANGE_RATE` (variable de entorno)
3. El servicio continΓΊa funcionando sin interrupciones
### β
Respuesta Mejorada
Cuando se solicita conversiΓ³n a USD, la respuesta incluye:
```json
{
"success": true,
"tipo_servicio": "el_pana",
"distancia_km": 15,
"duracion_min": 45,
"tarifa": {
"amount_bs": 55.50,
"amount_usd": 0.18,
"currency": "USD",
"exchange_rate": 301.37,
"exchange_rate_source": "DolarAPI (BCV Oficial)",
"breakdown": {
"base_fare": 3,
"distance_charge": 30.00,
"time_charge": 22.50,
"surge_multiplier": 1.0,
"fuel_surcharge": 0
}
}
}
```
---
## π Ejemplos de Uso
### Ejemplo 1: Calcular Tarifa en BolΓvares (por defecto)
**Comando**:
```
"Calcula la tarifa para un viaje de 15 kilΓ³metros"
```
**Respuesta**:
```json
{
"success": true,
"tipo_servicio": "el_pana",
"distancia_km": 15,
"duracion_min": 45,
"tarifa": {
"amount_bs": 55.50,
"currency": "BS",
"breakdown": {
"base_fare": 3,
"distance_charge": 30.00,
"time_charge": 22.50,
"surge_multiplier": 1.0,
"fuel_surcharge": 0
}
}
}
```
### Ejemplo 2: Calcular Tarifa en DΓ³lares (con tasa en tiempo real)
**Comando**:
```
"Calcula la tarifa en dΓ³lares para un viaje de 15 kilΓ³metros"
```
**Respuesta**:
```json
{
"success": true,
"tipo_servicio": "el_pana",
"distancia_km": 15,
"duracion_min": 45,
"tarifa": {
"amount_bs": 55.50,
"amount_usd": 0.18,
"currency": "USD",
"exchange_rate": 301.37,
"exchange_rate_source": "DolarAPI (BCV Oficial)",
"breakdown": {
"base_fare": 3,
"distance_charge": 30.00,
"time_charge": 22.50,
"surge_multiplier": 1.0,
"fuel_surcharge": 0
}
}
}
```
---
## π§ ConfiguraciΓ³n
### Variables de Entorno
La tasa de cambio de fallback se configura en Vercel:
```
USD_EXCHANGE_RATE=45
```
Esta tasa se usa solo cuando:
- DolarAPI no estΓ‘ disponible
- Hay un error de red
- La respuesta de la API es invΓ‘lida
---
## π Ventajas de Esta IntegraciΓ³n
| CaracterΓstica | Beneficio |
|----------------|-----------|
| **Tasa Oficial BCV** | Datos confiables y actualizados |
| **Sin AutenticaciΓ³n** | API pΓΊblica, sin necesidad de API keys |
| **CachΓ© de 1 hora** | Reduce latencia y llamadas a la API |
| **Fallback Robusto** | Servicio continΓΊa funcionando si la API falla |
| **Transparencia** | La respuesta indica la fuente de la tasa |
| **ActualizaciΓ³n AutomΓ‘tica** | No requiere intervenciΓ³n manual |
---
## π‘οΈ Manejo de Errores
### Escenarios Cubiertos:
1. **API no disponible**: Usa tasa de fallback
2. **Timeout de red**: Usa tasa de fallback
3. **Respuesta invΓ‘lida**: Usa tasa de fallback
4. **Datos incompletos**: Prioriza `promedio`, luego `venta`, finalmente fallback
### Logs:
Cuando hay un error, se registra en los logs de Vercel:
```
β οΈ Error obteniendo tasa de cambio de DolarAPI, usando fallback: DolarAPI error: 503
```
---
## π Flujo de ActualizaciΓ³n
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Usuario solicita tarifa en USD β
ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ΒΏCachΓ© vΓ‘lido (< 1 hora)? β
ββββββββββββββ¬ββββββββββββββββββββ¬βββββββββββββββββββββ
β SΓ β NO
βΌ βΌ
ββββββββββββββββββ ββββββββββββββββββββββββ
β Usar cachΓ© β β Llamar a DolarAPI β
ββββββββββββββββββ ββββββββ¬ββββββββββββββββ
β
ββββββββββββ΄βββββββββββ
β ΒΏΓxito? β
ββββ¬ββββββββββββββββ¬βββ
β SΓ β NO
βΌ βΌ
ββββββββββββββββββ ββββββββββββββββ
β Actualizar β β Usar β
β cachΓ© β β fallback β
ββββββββββββββββββ ββββββββββββββββ
β β
βββββββββ¬ββββββββ
βΌ
ββββββββββββββββββββββββ
β Calcular tarifa USD β
ββββββββββββββββββββββββ
```
---
## π Ejemplo Real con Tasa Actual
**Tasa actual BCV**: Bs 301.37 por USD (01/01/2026)
**Viaje de 50 km**:
- Tarifa en BS: Bs 178.00
- Tarifa en USD: USD 0.59 (178.00 / 301.37)
**Viaje de 15 km**:
- Tarifa en BS: Bs 55.50
- Tarifa en USD: USD 0.18 (55.50 / 301.37)
---
## π Monitoreo
Para verificar que la integraciΓ³n funciona correctamente:
1. **Revisar logs en Vercel**: Buscar warnings de DolarAPI
2. **Verificar respuestas**: Comprobar que `exchange_rate_source` sea "DolarAPI (BCV Oficial)"
3. **Probar conversiΓ³n USD**: Solicitar tarifas en dΓ³lares y verificar la tasa
---
## π Referencias
- **DolarAPI Docs**: https://dolarapi.com/docs
- **BCV**: https://www.bcv.org.ve
- **GitHub DolarAPI**: https://github.com/enzonotario/dolarapi
---
## β¨ Mejoras Futuras (Opcional)
- [ ] Agregar soporte para otras tasas (paralelo, bitcoin)
- [ ] Configurar duraciΓ³n de cachΓ© mediante variable de entorno
- [ ] Implementar mΓ©tricas de uso de la API
- [ ] Agregar endpoint para consultar la tasa actual
---
**Actualizado**: 2026-01-01
**VersiΓ³n**: 1.1.0
**Autor**: Carlos Depool - MI PANA APP