Mi API BCV uses standard HTTP status codes and consistent JSON error responses to communicate issues. This guide covers all possible error scenarios and how to handle them in your application.
Source: app/Http/Controllers/Api/ScraperController.php:30Endpoint: GET /When it occurs: When querying current rates before they’ve been scraped for today.
{ "message": "Tasas no disponibles aún"}
Translation: “Rates not yet available”
Common causes:
Requesting data too early in the morning before scraping runs
Scraping service hasn’t completed for today
Database is empty (fresh installation)
How to handle:
const response = await fetch('https://your-domain.com/api/');const data = await response.json();if (response.status === 404) { if (data.message === 'Tasas no disponibles aún') { // Rates not ready yet - retry later or show message to user console.log('Exchange rates not yet available for today'); // Consider retrying after a delay setTimeout(() => fetchRates(), 60000); // Retry in 1 minute }}
Source: app/Http/Controllers/Api/ScraperController.php:67Endpoint: GET /info/{date}/{source?}When it occurs: When no exchange rate data exists for the specified date or bank.
{ "message": "No se encontraron datos"}
Translation: “No data found”
Common causes:
Querying a date before the system started collecting data
Querying a weekend or holiday when banks don’t publish rates
Specifying a bank source that has no data for that date
Database doesn’t have historical data for the requested period
How to handle:
import requestsfrom datetime import datetime, timedeltadef fetch_rates_with_fallback(date): url = f"https://your-domain.com/api/info/{date}" response = requests.get(url) if response.status_code == 404: # Try previous day previous_date = (datetime.strptime(date, '%Y-%m-%d') - timedelta(days=1)).strftime('%Y-%m-%d') print(f"No data for {date}, trying {previous_date}") return fetch_rates_with_fallback(previous_date) return response.json()
Source: app/Http/Controllers/Api/ScraperController.php:50Endpoint: GET /info/{date}/{source?}When it occurs: When the date parameter cannot be parsed or is in the future.
{ "message": "Fecha inválida"}
Translation: “Invalid date”
Common causes:
Malformed date string (e.g., 2026-13-45, invalid-date)
function validateDate(dateString) { const date = new Date(dateString); const today = new Date(); // Check if date is valid if (isNaN(date.getTime())) { throw new Error('Invalid date format'); } // Check if date is not in the future if (date > today) { throw new Error('Date cannot be in the future'); } return dateString;}try { const date = validateDate('2026-03-04'); const response = await fetch(`https://your-domain.com/api/info/${date}`); const data = await response.json(); if (response.status === 400) { console.error('Server rejected date:', data.message); }} catch (error) { console.error('Client-side validation failed:', error.message);}
import timeimport requestsdef fetch_with_retry(url, max_retries=3, delay=60): """Retry fetching if rates aren't available yet.""" for attempt in range(max_retries): response = requests.get(url) if response.status_code == 200: return response.json() if response.status_code == 404: data = response.json() if data.get('message') == 'Tasas no disponibles aún': if attempt < max_retries - 1: print(f"Rates not ready, retrying in {delay}s...") time.sleep(delay) continue # Other errors or max retries reached response.raise_for_status() raise Exception('Max retries reached')