Skip to main content
POST
/
api
/
v1
/
invoices
curl -X POST https://sandbox.cucu.bo/api/v1/invoices \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{
    "documentSectorType": 1,
    "pointOfSaleId": "660e8400-e29b-41d4-a716-446655440004",
    "clientDocumentType": 5,
    "clientDocumentNumber": "99001",
    "clientBusinessName": "EMPRESA DEMO S.R.L.",
    "clientEmail": "demo@ejemplo.com",
    "paymentMethodCode": 1,
    "details": [
      {
        "activityEconomic": "620100",
        "codeProductSin": "83141",
        "description": "Servicio de desarrollo de software",
        "quantity": 1,
        "unitMeasure": 58,
        "priceUnit": 500.00
      }
    ]
  }'
const response = await fetch('https://sandbox.cucu.bo/api/v1/invoices', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-Key': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    documentSectorType: 1,
    pointOfSaleId: '660e8400-e29b-41d4-a716-446655440004',
    clientDocumentType: 5,
    clientDocumentNumber: '99001',
    clientBusinessName: 'EMPRESA DEMO S.R.L.',
    clientEmail: 'demo@ejemplo.com',
    paymentMethodCode: 1,
    details: [{
      activityEconomic: '620100',
      codeProductSin: '83141',
      description: 'Servicio de desarrollo de software',
      quantity: 1,
      unitMeasure: 58,
      priceUnit: 500.00
    }]
  })
});
const data = await response.json();
import requests

response = requests.post(
    'https://sandbox.cucu.bo/api/v1/invoices',
    headers={
        'Content-Type': 'application/json',
        'X-API-Key': 'YOUR_API_KEY'
    },
    json={
        'documentSectorType': 1,
        'pointOfSaleId': '660e8400-e29b-41d4-a716-446655440004',
        'clientDocumentType': 5,
        'clientDocumentNumber': '99001',
        'clientBusinessName': 'EMPRESA DEMO S.R.L.',
        'clientEmail': 'demo@ejemplo.com',
        'paymentMethodCode': 1,
        'details': [{
            'activityEconomic': '620100',
            'codeProductSin': '83141',
            'description': 'Servicio de desarrollo de software',
            'quantity': 1,
            'unitMeasure': 58,
            'priceUnit': 500.00
        }]
    }
)
print(response.json())
{
  "success": true,
  "message": "Factura emitida exitosamente",
  "data": {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "invoiceNumber": 1,
    "cuf": "2872F7294502332E637FABFBC3654EA82202AD48E0969F14EBEB8AF74",
    "state": "VALIDATED",
    "emissionType": "NORMAL",
    "clientBusinessName": "EMPRESA DEMO S.R.L.",
    "clientDocumentNumber": "99001",
    "amountSubtotal": 500.00,
    "amountDiscount": 0.00,
    "amountTotal": 500.00,
    "literal": "Quinientos 00/100 Bolivianos",
    "emissionDate": "2026-02-11T12:00:00",
    "pdfUrl": "https://sandbox.cucu.bo/api/v1/public/invoice/2872F...AF74/pdf",
    "xmlUrl": "https://sandbox.cucu.bo/api/v1/public/invoice/2872F...AF74/xml"
  },
  "timestamp": "2026-02-11T12:00:00"
}
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "details": "El campo clientBusinessName es requerido"
  },
  "timestamp": "2026-02-11T12:00:00"
}
Crea una nueva factura electronica, la firma digitalmente, la envia al SIAT para validacion, genera PDF (A4 y ticket), XML, y opcionalmente envia por email al cliente.

Headers

HeaderTipoReqDescripcion
X-API-KeystringSiTu API Key de sandbox (sk_test_) o produccion (sk_live_)
Content-TypestringSiapplication/json

Request Body

CampoTipoReqDescripcion
documentSectorTypeintegerNoCodigo del documento sector (ver Documentos Sector). Si se omite, se usa el sector por defecto del punto de venta. Default: 1 (Compra-Venta)
pointOfSaleIdstringSiUUID del punto de venta. Ejemplo: 660e8400-e29b-41d4-a716-446655440004
clientDocumentTypeintegerSiTipo de documento del cliente. Valores: 1 (CI), 2 (CEX), 3 (PAS), 4 (OD), 5 (NIT)
clientDocumentNumberstringSiNumero de documento del cliente (max 50 caracteres)
clientBusinessNamestringSiRazon social del cliente (max 255 caracteres)
clientEmailstringNoEmail del cliente. Si se proporciona, se envia automaticamente la factura por correo
clientComplementstringNoComplemento del documento de identidad
exceptionCodeintegerNoCódigo de excepción SIAT (codigoExcepcion). 0 = NIT validado (default), 1 = NIT no validable online. Solo aplica a clientDocumentType = 5 (NIT). Ver nota abajo
paymentMethodCodeintegerSiCodigo de metodo de pago del catalogo SIAT (1-308). Consultar catalogo sincronizado: GET /api/v1/siat/sync/catalogs/payment-methods. Ejemplos: 1 = Efectivo, 2 = Tarjeta credito, 5 = Transferencia, 27 = Gift-Card
cardNumberstringNoNumero de tarjeta (solo si paymentMethodCode = 2 o 3). Se ofusca automaticamente antes de guardar y emitir — ver nota de seguridad abajo
exchangeRatenumberNoTipo de cambio (solo si la factura es en moneda extranjera)
descuentoAdicionalnumberNoDescuento global sobre el total de la factura. Default: 0. El SIAT valida: montoTotal = Σ(subTotal) - descuentoAdicional
montoGiftCardnumberNoMonto pagado con gift card. Default: 0. Requiere paymentMethodCode de tipo gift card (ej: 27, 35). Error SIAT [1050] si el metodo de pago no corresponde
observationsstringNoObservaciones o notas (max 500 caracteres). Aparece en el PDF A4 y ticket
isTicketbooleanNoSi true, adjunta tambien el formato ticket (80mm) en el email. Default: false
detailsarraySiLista de items de la factura (minimo 1). Ver tabla siguiente

Items del detalle (details[])

CampoTipoReqDescripcion
activityEconomicstringSiCodigo de actividad economica (CAEB)
codeProductSinstringSiCodigo de producto/servicio del SIN
codeProductstringNoCodigo interno de tu producto
descriptionstringSiDescripcion del producto/servicio (max 500 caracteres)
quantitynumberSiCantidad (mayor a 0.00001)
unitMeasureintegerSiUnidad de medida. 58 = Servicio, 1 = Unidad, 57 = Pieza, etc.
priceUnitnumberSiPrecio unitario (mayor a 0.00001)
amountDiscountnumberNoMonto de descuento por item. Default: 0
serialNumberstringNoNumero de serie del producto
imeiNumberstringNoNumero IMEI (solo para telecomunicaciones)
exceptionCode (código de excepción NIT). Indica al SIAT si el NIT del cliente se pudo validar contra el padrón del SIN: 0 = validado (normal), 1 = no validable online (NIT nuevo / no registrado). Reglas:
  • Solo válido con clientDocumentType = 5 (NIT). Con CI/pasaporte/otros siempre es 0; enviar 1 con otro tipo de documento devuelve 400.
  • En contingencia (emisión offline) con NIT, la API lo fuerza a 1 automáticamente — no hace falta enviarlo. En emisión online normal, déjalo en 0 (default).
Seguridad — ofuscacion de tarjeta. Si envias cardNumber, la API conserva solo los 4 primeros y 4 ultimos digitos y reemplaza el resto por ceros antes de persistir y emitir el XML SIAT (ej: 41111111111111114111000000001111). El numero completo (PAN) nunca se guarda en la base de datos ni viaja al SIAT. Numeros de 8 digitos o menos se dejan tal cual (ej: enviar solo los ultimos 4 sigue siendo valido).

Response

CampoTipoDescripcion
successbooleantrue si la factura fue emitida exitosamente
data.idstringUUID de la factura
data.invoiceNumberintegerNumero correlativo de factura
data.cufstringCodigo Unico de Factura (CUF). Identificador ante el SIN
data.statestringEstado SIAT: VALIDATED, REJECTED, PENDING
data.emissionTypestringNORMAL o CONTINGENCY
data.clientBusinessNamestringRazon social del cliente
data.amountTotalnumberMonto total de la factura
data.literalstringMonto en literal (requerido por SIAT)
data.emissionDatestringFecha y hora de emision
data.pdfUrlstringURL publica del PDF
data.xmlUrlstringURL publica del XML
curl -X POST https://sandbox.cucu.bo/api/v1/invoices \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{
    "documentSectorType": 1,
    "pointOfSaleId": "660e8400-e29b-41d4-a716-446655440004",
    "clientDocumentType": 5,
    "clientDocumentNumber": "99001",
    "clientBusinessName": "EMPRESA DEMO S.R.L.",
    "clientEmail": "demo@ejemplo.com",
    "paymentMethodCode": 1,
    "details": [
      {
        "activityEconomic": "620100",
        "codeProductSin": "83141",
        "description": "Servicio de desarrollo de software",
        "quantity": 1,
        "unitMeasure": 58,
        "priceUnit": 500.00
      }
    ]
  }'
const response = await fetch('https://sandbox.cucu.bo/api/v1/invoices', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-Key': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    documentSectorType: 1,
    pointOfSaleId: '660e8400-e29b-41d4-a716-446655440004',
    clientDocumentType: 5,
    clientDocumentNumber: '99001',
    clientBusinessName: 'EMPRESA DEMO S.R.L.',
    clientEmail: 'demo@ejemplo.com',
    paymentMethodCode: 1,
    details: [{
      activityEconomic: '620100',
      codeProductSin: '83141',
      description: 'Servicio de desarrollo de software',
      quantity: 1,
      unitMeasure: 58,
      priceUnit: 500.00
    }]
  })
});
const data = await response.json();
import requests

response = requests.post(
    'https://sandbox.cucu.bo/api/v1/invoices',
    headers={
        'Content-Type': 'application/json',
        'X-API-Key': 'YOUR_API_KEY'
    },
    json={
        'documentSectorType': 1,
        'pointOfSaleId': '660e8400-e29b-41d4-a716-446655440004',
        'clientDocumentType': 5,
        'clientDocumentNumber': '99001',
        'clientBusinessName': 'EMPRESA DEMO S.R.L.',
        'clientEmail': 'demo@ejemplo.com',
        'paymentMethodCode': 1,
        'details': [{
            'activityEconomic': '620100',
            'codeProductSin': '83141',
            'description': 'Servicio de desarrollo de software',
            'quantity': 1,
            'unitMeasure': 58,
            'priceUnit': 500.00
        }]
    }
)
print(response.json())
{
  "success": true,
  "message": "Factura emitida exitosamente",
  "data": {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "invoiceNumber": 1,
    "cuf": "2872F7294502332E637FABFBC3654EA82202AD48E0969F14EBEB8AF74",
    "state": "VALIDATED",
    "emissionType": "NORMAL",
    "clientBusinessName": "EMPRESA DEMO S.R.L.",
    "clientDocumentNumber": "99001",
    "amountSubtotal": 500.00,
    "amountDiscount": 0.00,
    "amountTotal": 500.00,
    "literal": "Quinientos 00/100 Bolivianos",
    "emissionDate": "2026-02-11T12:00:00",
    "pdfUrl": "https://sandbox.cucu.bo/api/v1/public/invoice/2872F...AF74/pdf",
    "xmlUrl": "https://sandbox.cucu.bo/api/v1/public/invoice/2872F...AF74/xml"
  },
  "timestamp": "2026-02-11T12:00:00"
}
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "details": "El campo clientBusinessName es requerido"
  },
  "timestamp": "2026-02-11T12:00:00"
}