Facturación electrónica en Venezuela con la tasa BCV
Una de las preguntas más frecuentes que recibimos es cómo integrar Cotizave con sistemas de facturación electrónica venezolana. Esta guía cubre el caso de uso completo, con ejemplos de código y consideraciones importantes.
El problema
En Venezuela, la facturación electrónica debe usar la tasa oficial del Banco Central de Venezuela (BCV) publicada para el día de la transacción. Esta es la tasa que el SENIAT reconoce para:
- Cálculo del IVA
- Retenciones
- Declaraciones mensuales y anuales
- Reportes fiscales
- Libros contables
Obtener esta tasa implica:
- Consultar el sitio oficial del BCV (que cambia de formato periódicamente)
- Parsear HTML (frágil, se rompe con cada cambio)
- Manejar los casos cuando el BCV no publica (feriados, problemas técnicos)
- Mantener el código actualizado constantemente
Cotizave hace todo eso por ti. Un simple GET y tienes la tasa lista para usar en tu sistema de facturación.
La solución con Cotizave
Paso 1: Obtener la tasa BCV del día
curl https://api.cotizave.com/v1/fx/rates/reference \
-H "X-API-Key: nd-tu-api-key-aqui"Respuesta:
{
"country": "VE",
"currency": "VES",
"base": "USD",
"market": "reference",
"type": "reference",
"mid": 475.0083,
"updated_at": "2026-04-08T14:00:00Z",
"fetched_at": "2026-04-08T17:29:15Z"
}El valor mid (475.0083) es la tasa oficial publicada por el BCV para el día actual.
Paso 2: Calcular el monto en bolívares
Si tu factura es por $250 USD:
Monto VES = 250 × 475.0083 = 118751.08O usando el endpoint convert:
curl "https://api.cotizave.com/v1/fx/convert?from=USD&to=VES&amount=250&market=reference" \
-H "X-API-Key: nd-tu-api-key-aqui"Respuesta:
{
"from": { "currency": "USD", "amount": 250 },
"to": { "currency": "VES", "amount": 118752.08 },
"rate": {
"market": "reference",
"value": 475.0083,
"updated_at": "2026-04-08T14:00:00Z"
}
}Paso 3: Aplicar IVA (16%)
IVA = 118752.08 × 0.16 = 19000.33
Total con IVA = 118752.08 + 19000.33 = 137752.41Paso 4: Guardar la tasa usada
Importante: en tu base de datos, guarda siempre:
- El monto en USD original (o la moneda de origen)
- La tasa BCV usada al momento de emitir la factura
- El timestamp
updated_atde la tasa - El monto final en VES
Esto te permite:
- Reproducir el cálculo exacto ante una auditoría del SENIAT
- Demostrar que usaste la tasa oficial del día
- Hacer reportes históricos sin depender de la API
Nunca guardes solo el monto en VES. El contexto (tasa, timestamp) es parte de la información fiscal relevante.
Ejemplo completo en Node.js
// factura.js
const API_KEY = process.env.COTIZAVE_API_KEY
const BASE_URL = 'https://api.cotizave.com'
async function getTasaBCV() {
const response = await fetch(`${BASE_URL}/v1/fx/rates/reference`, {
headers: { 'X-API-Key': API_KEY }
})
if (!response.ok) {
throw new Error(`Error obteniendo tasa BCV: ${response.status}`)
}
return await response.json()
}
async function emitirFactura(cliente, conceptos) {
// 1. Obtener tasa BCV
const tasaInfo = await getTasaBCV()
const tasaBCV = tasaInfo.mid
// 2. Calcular totales
const subtotalUSD = conceptos.reduce((sum, c) => sum + c.precio * c.cantidad, 0)
const subtotalVES = subtotalUSD * tasaBCV
const iva = subtotalVES * 0.16
const totalVES = subtotalVES + iva
// 3. Crear factura en tu sistema
const factura = {
numero: generarNumeroFactura(),
fecha: new Date().toISOString(),
cliente,
conceptos,
tasa_bcv: {
valor: tasaBCV,
updated_at: tasaInfo.updated_at,
source: 'Banco Central de Venezuela via Cotizave'
},
montos: {
subtotal_usd: subtotalUSD,
subtotal_ves: subtotalVES,
iva_ves: iva,
total_ves: totalVES
}
}
// 4. Guardar en DB (no en memoria)
await db.facturas.insert(factura)
// 5. Generar XML/PDF para el SENIAT según su especificación
return factura
}
// Ejemplo de uso
const factura = await emitirFactura(
{ nombre: 'Empresa XYZ', rif: 'J-12345678-9' },
[
{ descripcion: 'Servicio de consultoría', precio: 250, cantidad: 1 }
]
)
console.log('Factura emitida:', factura)Consideraciones importantes
1. Manejo de errores
¿Qué pasa si no puedes obtener la tasa al momento de emitir una factura? Tres opciones:
Opción A: Fallar hasta resolver. La más conservadora. Si no hay tasa, no se emite la factura. El usuario debe reintentar.
try {
const tasaInfo = await getTasaBCV()
// Emitir factura normalmente
} catch (err) {
throw new Error('No se pudo obtener la tasa BCV. Intenta nuevamente en unos minutos.')
}Opción B: Usar la última tasa conocida. Guardas la última tasa BCV exitosa y la usas como fallback si la API está caída.
async function getTasaBCVConFallback() {
try {
const tasa = await getTasaBCV()
await db.set('ultima_tasa_bcv', tasa)
return tasa
} catch (err) {
const ultima = await db.get('ultima_tasa_bcv')
if (ultima) {
console.warn('Usando última tasa conocida debido a error en Cotizave')
return ultima
}
throw new Error('Sin tasa disponible')
}
}Opción C: Operación manual. Mostrar un formulario al operador para que ingrese la tasa manualmente si la API está caída. Útil en sistemas de emisión masiva donde no se puede pausar.
2. Zona horaria
El BCV publica tasas en horario venezolano (UTC-4). El campo updated_at está en UTC. Si tu sistema opera en horario venezolano:
function esTasaBCVDelDia(updatedAt) {
const tasaDate = new Date(updatedAt)
const hoy = new Date()
// Convertir ambos a fecha venezolana (UTC-4)
const tasaFechaVE = new Date(tasaDate.getTime() - 4 * 60 * 60 * 1000).toISOString().slice(0, 10)
const hoyFechaVE = new Date(hoy.getTime() - 4 * 60 * 60 * 1000).toISOString().slice(0, 10)
return tasaFechaVE === hoyFechaVE
}3. Días sin publicación
En algunos días hábiles el BCV puede no publicar (problemas técnicos, feriados no anunciados). En esos casos:
- Cotizave devuelve la última tasa publicada
- El
updated_atreflejará la fecha de la última publicación real - Consulta el sitio del SENIAT para confirmar qué tasa corresponde si hay dudas
Recomendación: si el updated_at tiene más de 48 horas y estás emitiendo facturas críticas, alerta al responsable fiscal para confirmar manualmente.
4. Auditoría fiscal
Si el SENIAT te audita y pregunta cuál tasa usaste en cada factura, deberías poder responder:
“Usamos la tasa oficial del BCV publicada el [fecha] con valor [valor], obtenida a través del proveedor de datos Cotizave, que la toma directamente del sitio oficial del Banco Central de Venezuela.”
Por eso es importante:
- Guardar la tasa, el timestamp y la fuente en cada factura
- Mantener logs de las llamadas a Cotizave con timestamps
- Poder cruzar tus facturas con la serie histórica de tasas BCV
Herramientas relacionadas
Para facturación electrónica formal en Venezuela probablemente también necesitas:
- Proveedores autorizados por el SENIAT para generar XML/PDF en el formato oficial
- Sistema de numeración secuencial según tu autorización
- Firma electrónica certificada si tu operación lo requiere
- Conexión con el SENIAT para reportes mensuales
Cotizave resuelve la pieza de obtener la tasa BCV. El resto depende de tu sistema de facturación específico.
Preguntas frecuentes
¿Cotizave está autorizado por el SENIAT?
Cotizave no es un proveedor de facturación electrónica autorizado. Somos un proveedor de datos. La tasa BCV que exponemos es la misma que el SENIAT reconoce porque la obtenemos directamente del sitio oficial del BCV. La responsabilidad de emitir la factura correctamente sigue siendo del facturador.
¿Qué pasa si el SENIAT cambia la metodología de tasa?
Si el SENIAT empieza a reconocer una tasa distinta a la del BCV (lo cual sería un cambio normativo importante), actualizaremos Cotizave para exponerla. Mantenemos el contrato de la API estable y notificamos cambios con anticipación.
¿Puedo usar el Plan Free para facturación electrónica?
Técnicamente sí, si tu volumen de facturación encaja dentro de la cuota mensual del Plan Free. Para uso comercial en producción recomendamos al menos el Plan Indie por el soporte por email y más keys.
¿Qué hago si el BCV publica una tasa que considero incorrecta?
No podemos corregir los datos de la fuente original. Si crees que el BCV publicó un error, consulta directamente con ellos. Cotizave refleja fielmente lo que publica el BCV.