← Volver a docs

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:

Obtener esta tasa implica:

  1. Consultar el sitio oficial del BCV (que cambia de formato periódicamente)
  2. Parsear HTML (frágil, se rompe con cada cambio)
  3. Manejar los casos cuando el BCV no publica (feriados, problemas técnicos)
  4. 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.08

O 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.41

Paso 4: Guardar la tasa usada

Importante: en tu base de datos, guarda siempre:

Esto te permite:

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:

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:

Herramientas relacionadas

Para facturación electrónica formal en Venezuela probablemente también necesitas:

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.