Ir al contenido

facturaBoEmitirFactura

Emite una factura electrónica de Bolivia con factura.bo (SIAT del SIN): valida los datos y la envía al SIAT. Admite 12 sectores (compra-venta, alquiler, exportación, turismo, tasa cero, educación, servicio básico, ICE, hotel, hospital…). Devuelve el CUF, el número, el estado y los enlaces al PDF, XML y ticket. Protege contra duplicados con la clave de idempotencia.

Forma parte del Hub Fiscal de Bolivia como alternativa a la conexión directa con el SIAT: factura.bo (SimplifyIT S.R.L.) es un proveedor que construye y firma el XML y lo envía al SIN. Nodo: «Emitir factura».

CampoTipoRequeridoDescripción
credentials_idcredentialsSíCredencial facturabo
document_sectorselectNoSector — Los datos propios de cada sector van en «Campos del sector». Obligatorios por sector → 1 Compra y venta · 2 Alquiler de bien inmueble (periodo_facturado) · 3 Exportación de bienes · 4 Exportación en libre consignación · 6 Turismo y hospedaje (Ley 292) (fecha_ingreso, cantidad_huespedes, cantidad_habitaciones) · 8 Tasa cero · 11 Educativo · 13 Servicio básico (mes, gestion, numero_medidor, domicilio_cliente, consumo_periodo) · 14 Alcanzada por el ICE · 16 Hotel (fecha_ingreso, cantidad_huespedes, cantidad_habitaciones) · 17 Hospital y clínica · 28 Exportación de servicios · 1, 2, 3, 4, 6, 8, 11, 13, 14, 16, 17, 28
branch_codenumberNoSucursal (código SIAT) — 0 = casa matriz. Vacío = la sucursal por defecto de la credencial
point_of_sale_codenumberNoPunto de venta (código SIAT) — 0 = punto principal. Vacío = el de la credencial
economic_activitytextNoActividad económica del emisor (CAEB) — Opcional si todas las líneas la traen o hay una por defecto
client_document_typeselectNoTipo de documento del cliente — 5, 1, 2, 3, 4
client_document_numbertextSíNúmero de documento — NIT de 7 a 15 dígitos (se aceptan puntos y guiones). 0 = consumidor final
client_business_nametextNoRazón social / nombre — Obligatoria con NIT
client_emailtextNoEmail del cliente — Si se indica, factura.bo le envía el PDF y el enlace público (en sandbox nunca se envían emails)
client_complementtextNoComplemento del CI — Solo con cédula de identidad
client_country_codenumberNoPaís del comprador (código SIAT) — Solo exportaciones (catálogo paises)
client_addresstextNoDirección del comprador — Solo exportaciones
payment_method_codenumberNoMétodo de pago (código SIAT) — 1 efectivo, 2/3 tarjeta, 7 transferencia (catálogo metodos_pago)
card_numbertextNoNúmero de tarjeta — Solo con método de pago 2 o 3. El servicio enmascara siempre los dígitos centrales
itemsjsonSíLíneas de la factura (JSON) — Array de líneas: descripcion, cantidad, precio_unitario y opcionales codigo_producto, codigo_sin, unidad_medida, descuento, actividad_economica. Acepta también description, quantity, priceUnit… Lo que falte se toma de los valores por defecto de abajo
default_codigo_sinnumberNoCódigo de producto SIN por defecto — Se aplica a las líneas que no traen codigo_sin (catálogo productos_servicios)
default_unit_measurenumberNoUnidad de medida por defecto — 58 = Servicio, 1 = Unidad (catálogo unidades_medida)
default_activitytextNoActividad económica por defecto (CAEB) — 6 o 7 dígitos. Se aplica a las líneas que no traen actividad_economica
sector_fieldsjsonNoCampos del sector (JSON) — Datos de cabecera propios del sector elegido, con los nombres de factura.bo. Se validan antes de enviar
additional_discountnumberNoDescuento adicional (Bs) — Descuento global; se suma a los descuentos de línea
currency_codenumberNoMoneda (código SIAT) — 1 = bolivianos, 2 = dólares
exchange_ratenumberNoTipo de cambio — Obligatorio con moneda distinta de bolivianos. Usa el nodo «Tipo de cambio»
exception_codeselectNoCódigo de excepción — "", 1
usertextNoUsuario / cajero — Se guarda para auditoría
legendtextNoLeyenda — Vacío = la vigente según la actividad económica
contingencybooleanNoEmitir en contingencia (offline) — Requiere un evento de contingencia registrado antes
cafctextNoCAFC — Solo con contingencia (obligatorio en eventos 5, 6 y 7)
invoice_numbernumberNoNúmero de factura manual — Solo para transcribir una factura de talonario, junto con su CAFC
issue_datetextNoFecha de emisión anterior — ISO 8601 en hora de Bolivia, hasta 48 h atrás, junto con contingencia
debugbooleanNoIncluir el XML del SIAT (diagnóstico)
idempotency_modeselectNoProtección contra duplicados — Con clave, un reintento tras un corte no duplica la factura: la API devuelve la ya emitida (las claves se recuerdan 30 días). Para dos facturas idénticas en un bucle usa una clave manual (p. ej. el id del pedido) · auto, manual, off
idempotency_keytextNoClave de idempotencia — 1–128 caracteres visibles, sin espacios. Recomendado: el id de la venta
include_pdfbooleanNoIncluir el PDF en base64
include_rawbooleanNoIncluir la respuesta cruda
output_keytextNoClave de salida — El resultado se añade a data[clave] sin perder el resto de datos

Este módulo requiere una credencial de tipo facturabo con los campos:

  • API key: se obtiene en app.factura.bo → Más → API Key
  • Entorno: pruebas (sandbox, SIAT piloto) o producción; la clave no lo delata, lo eliges tú
  • NIT y código de sistema del SIAT: para sincronizar CUIS/CUFD y catálogos
  • Sucursal y punto de venta por defecto: 0 = casa matriz / punto principal
  • Secreto de webhooks (whsec_…): para verificar la firma de los eventos
{
"success": true,
"sector": {
"code": 1,
"name": "Compra y venta",
"path": "/v1/facturas"
},
"invoice": {
"cuf": "2872F7294502332E637FABFBC3654EA82202AD48E0969F14EBEB8AF74",
"invoice_number": 12,
"state": "EMITIDA",
"issued_at": "2026-10-26T10:00:00",
"url_public": "https://api.factura.bo/f/2872F7294502332E637FABFBC3654EA82202AD48E0969F14EBEB8AF74",
"url_pdf": "https://…/pdf",
"url_xml": "https://…/xml",
"url_ticket": "https://…/ticket",
"siat_response": {
"codigoEstado": 908
}
},
"urls": {
"verify": "https://api.factura.bo/f/2872F7294502332E637FABFBC3654EA82202AD48E0969F14EBEB8AF74",
"pdf": "https://api.factura.bo/f/2872F7294502332E637FABFBC3654EA82202AD48E0969F14EBEB8AF74/pdf",
"ticket": "https://api.factura.bo/f/2872F7294502332E637FABFBC3654EA82202AD48E0969F14EBEB8AF74/ticket",
"xml": "https://api.factura.bo/f/2872F7294502332E637FABFBC3654EA82202AD48E0969F14EBEB8AF74/xml"
},
"idempotency": {
"key": "floogos-exec-1-node-1-3f9a…",
"mode": "auto"
},
"expected_total": 500,
"warnings": [],
"environment": "production"
}

La salida se guarda en la clave configurada (output_key, por defecto facturabo) y se conserva el resto de data. En error: error.message, error.type y, si aplica, status y siat_code.

{
"credentials_id": "cred-facturabo",
"document_sector": "1",
"client_document_number": "1023456789",
"client_business_name": "EMPRESA DEMO S.R.L.",
"items": [
{
"codigo_producto": "SERV-1",
"codigo_sin": 83141,
"descripcion": "Servicio de desarrollo",
"cantidad": 1,
"precio_unitario": 500,
"unidad_medida": 58
}
],
"output_key": "facturabo"
}
  • Cada sector tiene su propio endpoint (/v1/facturas, /alquiler, /exportacion, /turismo, /tasa-cero, /educacion, /servicio-basico, /ice, /hotel, /hospital…): el nodo elige el correcto y valida los campos propios del sector antes de enviar.
  • La clave de idempotencia (X-Idempotency-Key, 30 días) se genera sola: si el workflow se reintenta, la API devuelve la factura original en lugar de duplicarla. Para dos facturas idénticas en un bucle usa una clave manual (el id del pedido).
  • La clave de factura.bo no delata el entorno: lo elige la credencial (por defecto, sandbox). En sandbox nunca se envían emails.
  • Si el SIAT cae, emite con «contingencia» activada: la factura queda OFFLINE y no descuenta crédito hasta validar el paquete.
  • El rechazo del SIAT trae su código en error.siat_code y, para los habituales (123 CUFD vencido, 981, 984, 1040…), un consejo en el mensaje.
  • El PDF en base64 no se incluye por defecto (pesa): usa los enlaces públicos, que no caducan, o activa «Incluir el PDF».