Si tienes una tienda, un sistema administrativo o un punto de venta en Venezuela, tarde o temprano necesitas la tasa oficial del BCV dentro de tu código: para mostrar precios en bolívares, para facturar o para conciliar pagos móviles. El Banco Central no tiene una API, así que todo el mundo termina haciendo lo mismo: leer la página de bcv.org.ve.

Nosotros lo mantenemos en producción para cobrar todos los días. Estos son los detalles que no se ven en el primer intento y que, si los pasas por alto, te hacen cobrar con la tasa equivocada.

1. La tasa de mañana se publica hoy

El BCV publica la tasa por la tarde, y la publica con la Fecha Valor del siguiente día hábil. Si a las 6:00 pm consultas la página y guardas lo que ves con la fecha de hoy, acabas de guardar la tasa de mañana como si fuera la de hoy, y todo lo que cobres esa noche sale con la tasa equivocada.

La regla es simple: guarda cada tasa con su Fecha Valor, nunca con la fecha en que la leíste. En la página, la fecha está en el atributo content de un <span> debajo del bloque del dólar:

<span … content="2026-11-05T00:00:00-04:00">…</span> 

Usa el atributo (2026-11-05), no el texto en español.

2. Fines de semana y feriados

El viernes por la tarde sale la tasa del lunes. Entonces, ¿qué tasa vale un sábado? La de Fecha Valor más reciente que no sea posterior a ese día: la del viernes. Para cualquier fecha pasada, la tasa vigente es la de esa fecha o la anterior más cercana. Y para lo que se cobra hoy, decide tú si usas la vigente de hoy o la más reciente ya publicada (nosotros cobramos con la más reciente ya publicada), pero que sea una decisión, no un accidente.

3. Nunca uses float

0.1 + 0.2 // 0.30000000000000004 893.2173 * 25.5 // puede darte un céntimo de más o de menos al redondear 

Con montos pequeños no se nota; con cien facturas al día, sí, y el cuadre de caja nunca da. Multiplica con decimales exactos:

// PHP: bcmath $bolivares = bcadd(bcmul('25.50', '893.217300', 6), '0.005', 2); // 22777.04 
# Python: Decimal from decimal import Decimal, ROUND_HALF_UP (Decimal("25.50") * Decimal("893.217300")).quantize(Decimal("0.01"), ROUND_HALF_UP) # 22777.04 

En JavaScript, trabaja en enteros con BigInt (céntimos por millonésimas) o usa una librería de decimales. En la base de datos, columnas DECIMAL(18,6), nunca FLOAT.

4. La coma decimal y el punto de miles

La página muestra 1.234,56 (punto de miles, coma decimal). El error clásico es hacer parseFloat("893,21730000") y obtener 893. Primero quita los puntos y después cambia la coma:

$tasa = str_replace(',', '.', str_replace('.', '', '893,21730000')); // "893.21730000" 

5. El certificado TLS de bcv.org.ve

El navegador abre la página sin problema, pero curl y PHP fallan con un error de certificado. Al momento de escribir esto, el servidor del BCV envía un certificado intermedio que no corresponde: el navegador busca el correcto por su cuenta y tus scripts no.

La tentación es poner verify => false. No lo hagas: desactivas la protección justo en el dato que usas para cobrar. Descarga el intermedio correcto (Sectigo), guárdalo en tu proyecto y confía solo en él:

Http::withOptions(['verify' => base_path('certs/sectigo-intermedio.pem')])->get('https://www.bcv.org.ve/'); 
curl --cacert certs/sectigo-intermedio.pem https://www.bcv.org.ve/ 

Si el BCV cambia de certificado, la consulta va a fallar de forma visible, que es justo lo que quieres.

Y además: el diseño cambia sin aviso

Leer HTML ajeno se rompe cuando el BCV rediseña su página. Dos consejos:

  • Si no encuentras el bloque esperado, lanza un error; nunca guardes un 0 ni la tasa de ayer en silencio.
  • Consulta varias veces por la tarde (por ejemplo, cada hora de 5 a 10 pm) hasta que aparezca la de mañana, y no vuelvas a pedirla cuando ya la tienes.

Si prefieres no mantener esto

Todo lo anterior lo resolvimos en una API pequeña: la tasa del dólar y del euro con su Fecha Valor, la de mañana en cuanto el BCV la publica, consultas por fecha y un webhook opcional que te avisa cuando sale una tasa nueva. Cuesta $3 al mes y los primeros 14 días son gratis: API de la tasa BCV.

curl https://orbitave.com/api/v1/rates/usd-ves -H "Authorization: Bearer $BCV_API_KEY" 

Los ejemplos completos en PHP, Node y Python (consulta, conversión sin float y el receptor del webhook con su firma) están en GitHub, con licencia MIT, y te sirven aunque leas la tasa por tu cuenta: vdleon30/api-tasa-bcv.

¿Te topaste con otro detalle de la tasa BCV que no esté aquí? Cuéntalo en los comentarios.