Nubo Nubo API ← Volver a Nubo
Integración

Documentación de la API

Emite facturas, boletas, notas de crédito y débito, y anula comprobantes ante SUNAT desde tu propio sistema. Autentica con tu API_TOKEN y consume los endpoints REST. El token se genera dentro de tu cuenta en Integración API > Configuración.

Endpoints disponibles
Reemplaza tu-empresa.nubo.devex.pe por el dominio de tu cuenta.
Documents

Factura electrónica

Emite una factura usando codigo_tipo_documento = 01.

Notas
  • Para que un reintento tuyo no genere un comprobante duplicado, manda la cabecera Idempotency-Key con un valor unico por comprobante. Si nunca te llego la respuesta y reintentas con la misma clave, Nubo no emite de nuevo: te devuelve exactamente la respuesta del primer intento y agrega el header Idempotent-Replay: true. Si el primer intento todavia esta en curso, la API responde 409 con {"success": false, "status": "processing"}; en ese caso espera unos segundos y vuelve a llamar con la misma clave hasta obtener la respuesta definitiva. Si la emision fallo, la clave se libera sola para que puedas corregir y reintentar. Sin esta cabecera el comportamiento no cambia: cada llamada emite un comprobante nuevo.
  • Del cliente basta con codigo_tipo_documento_identidad y numero_documento: apellidos_y_nombres_o_razon_social es opcional y Nubo lo completa con el nombre ya registrado para ese documento o, si es la primera vez, consultandolo por DNI (1) o RUC (6). Con cualquier otro tipo de documento, o si la consulta no devuelve el nombre, la emision se rechaza pidiendote el campo: mandalo tu en esos casos.
  • Por defecto la factura se emite al contado. Para credito envia codigo_condicion_de_pago = 02 junto con el arreglo cuotas.
  • En credito la suma de los montos de cuotas debe igualar el monto neto pendiente de pago (totales.total_pendiente_pago: total de la venta menos detraccion o retencion, y menos anticipos si los hubiera). La API valida el cuadre antes de emitir y, si no coincide, responde success: false con el detalle sin crear el documento ni generar CDR; SUNAT tambien lo rechazaria si llegara descuadrado.
  • Cada cuota debe vencer despues de fecha_de_emision. El mismo dia de la emision tambien se rechaza, porque SUNAT responde el error 3267 ("Fecha del pago unico o de las cuotas no puede ser anterior a la fecha de emision del comprobante"). La API valida esto antes de firmar el XML para no quemar el correlativo con un rechazo.
  • Para una venta al credito con cuota inicial, el pago inicial se registra en el arreglo pagos y el saldo se reparte en cuotas. La API no descuenta pagos del monto esperado, asi que en ese caso es obligatorio enviar totales.total_pendiente_pago = total_venta - pago inicial; si lo omites, la API espera que las cuotas sumen el total completo y rechaza el request.
  • Reglas SUNAT de referencia: 3251 si la transaccion es al credito debe consignarse el monto neto pendiente de pago, 3265 ese monto debe ser menor o igual al importe total del comprobante, 3267 la fecha de las cuotas no puede ser anterior a la fecha de emision.
  • Los rechazos de estas validaciones son de la API, no de SUNAT: llegan con HTTP 500 y cuerpo {"success": false, "message": "...", "file": "...", "line": 0}, sin documento creado, sin XML y sin CDR, asi que el correlativo no se consume y puedes corregir y reintentar el mismo request. Los mensajes posibles son: Debe enviar el arreglo cuotas cuando la condicion de pago es credito (02); La cuota N debe tener fecha de vencimiento.; La cuota N vence el YYYY-MM-DD y la fecha de emision es YYYY-MM-DD: la fecha de cada cuota debe ser posterior a la de emision. SUNAT rechazaria el comprobante con el error 3267.; La cuota N debe tener un monto mayor a cero.; La cuota N: la fecha '...' tiene un formato invalido, se espera YYYY-MM-DD.; La cuota N: la fecha '...' no existe en el calendario.; y La suma de las cuotas (X) debe ser igual al monto neto pendiente de pago (Y): total de la venta menos detraccion, retencion y anticipos.
POST https://tu-empresa.nubo.devex.pe/api/integration/documents

Authorizations

Authorization string header required

Enviar como Bearer API_TOKEN. El token se configura por usuario en Integracion API > Configuracion o en la ventana de Usuarios.

X-Api-Token string header optional

Alternativa para emision externa: puedes enviar el mismo token en este header si no deseas usar Bearer.

Origin string header optional

Si se envia, debe coincidir con un dominio permitido. Si no se envia, la validacion usa la IP publica del cliente.

Idempotency-Key string header optional

Clave unica que generas tu por cada comprobante (por ejemplo un UUID). Sirve para que un reintento no emita dos veces: si repites la llamada con la misma clave, Nubo no vuelve a emitir y te devuelve la respuesta guardada del primer intento, con el header Idempotent-Replay: true. Si el primer intento todavia se esta procesando, responde 409 y debes reintentar con la misma clave en unos segundos. Si mandas la misma clave con un cuerpo distinto, responde 422. Entre 8 y 190 caracteres. Tambien se acepta como campo clave_idempotencia dentro del body.

Accept string header required

Usar application/json.

Content-Type string header required

Usar application/json para las APIs con body.

Body application/json

serie_documento string required

Serie habilitada para el establecimiento del usuario emisor. Ejemplos: F001, B001, FC01, FD01.

numero_documento string|number optional

Puede omitirse para factura y boleta. El backend asigna el correlativo automatico de la serie cuando llega vacio o como #.

fecha_de_emision date required

Fecha del comprobante en formato YYYY-MM-DD.

hora_de_emision time required

Hora del comprobante en formato HH:mm:ss.

fecha_de_vencimiento date optional

Fecha de vencimiento. Aplica sobre todo en credito; si no aplica puede igualarse a la fecha de emision.

codigo_condicion_de_pago enum<string> optional

Condicion de pago del comprobante: 01 contado, 02 credito. Si se omite se asume 01.

cuotas array<object> optional

Cronograma de pago. Obligatorio cuando codigo_condicion_de_pago = 02. La suma de los montos de las cuotas debe igualar el monto neto pendiente de pago (total de la venta menos detraccion o retencion, y menos anticipos si los hubiera). La API valida ese cuadre antes de generar y firmar el XML: si no coincide responde success: false con ambos montos y no crea el documento ni genera CDR (y SUNAT tambien lo rechazaria si llegara descuadrado). Cada cuota ademas debe vencer despues de la fecha de emision, ver cuotas[].fecha.

cuotas[].fecha date required

Fecha de vencimiento de la cuota en formato YYYY-MM-DD. Debe ser posterior a fecha_de_emision: el mismo dia de la emision tambien se rechaza. SUNAT devuelve el error 3267 ("Fecha del pago unico o de las cuotas no puede ser anterior a la fecha de emision del comprobante") e incluye el mismo dia en ese rechazo, asi que la API corta el envio antes de firmar el XML para no quemar el correlativo.

cuotas[].codigo_tipo_moneda string required

Moneda ISO de la cuota. Normalmente la misma del comprobante. Ejemplos: PEN, USD.

cuotas[].monto decimal required

Importe de la cuota. Las cuotas se numeran en el XML como Cuota001, Cuota002, siguiendo la fecha de vencimiento ascendente y no la posicion en el arreglo; si dos cuotas vencen el mismo dia desempata el orden de carga.

cuotas[].codigo_metodo_de_pago string optional

Metodo de pago previsto para la cuota cuando se desee registrarlo.

codigo_tipo_documento enum<string> required

01 factura, 03 boleta, 07 nota de credito, 08 nota de debito.

codigo_tipo_operacion string required

Tipo de operacion SUNAT. Para venta interna gravada normalmente se usa 0101.

codigo_tipo_moneda string required

Moneda ISO del comprobante. Ejemplos: PEN, USD.

factor_tipo_de_cambio decimal optional

Tipo de cambio cuando la moneda no es soles. Para PEN puede enviarse 1.

numero_orden_de_compra string optional

Orden de compra o referencia comercial del cliente.

datos_del_cliente_o_receptor object required

Objeto con los datos tributarios y de contacto del cliente receptor.

datos_del_cliente_o_receptor.codigo_tipo_documento_identidad string required

6 RUC, 1 DNI, 0 sin documento u otros codigos SUNAT validos. Siempre obligatorio, aunque omitas el nombre del cliente: junto con numero_documento es la llave con la que Nubo identifica al receptor.

datos_del_cliente_o_receptor.numero_documento string required

Numero del documento de identidad. Para factura debe ser RUC valido. Siempre obligatorio, aunque omitas el nombre del cliente.

datos_del_cliente_o_receptor.apellidos_y_nombres_o_razon_social string optional

Nombre completo o razon social del receptor. Es opcional: si no lo envias, Nubo lo resuelve solo en este orden. 1) Si el cliente ya existe en Nubo con el mismo tipo y numero de documento, se usa el nombre guardado y no se consulta nada afuera. 2) Si no existe, se consulta el padron por el documento y se autocompleta. 3) Si no se puede resolver, la emision se rechaza pidiendo este campo. Solo son consultables DNI (1) y RUC (6): con carnet de extranjeria (4), pasaporte (7), 0 u otros codigos del catalogo 06 tienes que enviar el nombre siempre. Tambien debes enviarlo cuando el documento no figura en el padron o la consulta externa falla o timeoutea: en esos casos la respuesta es success: false con el detalle y no se crea documento ni se consume correlativo. Si envias el campo, tu valor manda y se evita la consulta externa. Ojo: codigo_tipo_documento_identidad y numero_documento siguen siendo obligatorios en todos los casos.

datos_del_cliente_o_receptor.codigo_pais string optional

Codigo pais ISO. Para Peru usar PE.

datos_del_cliente_o_receptor.ubigeo string optional

Ubigeo del domicilio fiscal o comercial.

datos_del_cliente_o_receptor.direccion string optional

Direccion del cliente.

datos_del_cliente_o_receptor.correo_electronico string optional

Correo para envio del comprobante si la accion de email esta activa.

datos_del_cliente_o_receptor.telefono string optional

Telefono de contacto del receptor.

items array<object> required

Arreglo con una o mas lineas del comprobante. Cada objeto representa un producto o servicio.

items[].codigo_interno string optional

Codigo interno del producto o servicio en el sistema externo.

items[].codigo_producto_sunat string optional

Codigo de producto SUNAT cuando aplique.

items[].descripcion string required

Descripcion que se imprimira en el comprobante.

items[].unidad_de_medida string required

Unidad SUNAT. Para servicios o unidades comunes suele ser NIU.

items[].cantidad decimal required

Cantidad vendida.

items[].valor_unitario decimal required

Valor unitario sin IGV.

items[].codigo_tipo_precio string required

Codigo de tipo de precio. Normalmente 01 para precio unitario con IGV.

items[].precio_unitario decimal required

Precio unitario con impuestos incluidos.

items[].codigo_tipo_afectacion_igv string required

Afectacion IGV. Ejemplo 10 para gravado operacion onerosa.

items[].total_base_igv decimal required

Base imponible del IGV de la linea.

items[].porcentaje_igv decimal required

Porcentaje IGV aplicado. Normalmente 18.

items[].total_igv decimal required

Monto de IGV de la linea.

items[].total_impuestos decimal required

Suma de impuestos de la linea.

items[].total_valor_item decimal required

Valor total de la linea sin impuestos.

items[].total_item decimal required

Importe total de la linea con impuestos.

items[].modelo string optional

Modelo comercial del producto si se desea imprimir en el PDF.

items[].lote string optional

Lote del producto cuando aplique.

items[].series array<string> optional

Series individuales del producto cuando aplique.

totales object required

Objeto con los importes globales del comprobante.

totales.total_operaciones_gravadas decimal optional

Suma de operaciones gravadas sin IGV.

totales.total_operaciones_exoneradas decimal optional

Suma de operaciones exoneradas.

totales.total_operaciones_inafectas decimal optional

Suma de operaciones inafectas.

totales.total_igv decimal required

IGV total del comprobante.

totales.total_impuestos decimal required

Suma de impuestos globales.

totales.total_valor decimal required

Valor de venta sin impuestos.

totales.subtotal_venta decimal required

Subtotal con impuestos antes de redondeos o descuentos globales.

totales.total_venta decimal required

Total final a pagar.

totales.total_pendiente_pago decimal optional

Monto neto pendiente de pago: el total de la venta menos la detraccion o la retencion, y menos los anticipos si los hubiera. En credito es el valor contra el que debe cuadrar la suma de cuotas. Si lo envias con un valor mayor a cero se respeta tal cual; si lo omites, la API lo deriva como total_venta menos detraccion, retencion y anticipos. El arreglo pagos no se descuenta de forma automatica: cuando hay pago inicial debes enviar total_pendiente_pago = total_venta - pago inicial, porque si no la API va a esperar que las cuotas sumen el total completo y va a rechazar el request.

pagos array<object> optional

Pagos aplicados al momento de emitir. En una venta al credito es el lugar donde se registra la cuota inicial: el pago inicial va aca y el saldo restante se reparte en cuotas. Recuerda que la API no resta estos pagos del monto esperado, asi que ademas debes enviar totales.total_pendiente_pago ya descontado.

pagos[].codigo_metodo_pago string optional

Metodo de pago configurado. Ejemplo: 01 efectivo. Es el mismo catalogo de dos digitos de cuotas[].codigo_metodo_de_pago; ojo con la diferencia de nombre, aca la clave va sin el de intermedio.

pagos[].codigo_destino_pago string optional

Destino del pago configurado cuando el metodo lo requiera: cash para caja o el id numerico de una cuenta bancaria del tenant.

pagos[].referencia string optional

Referencia libre del pago: numero de operacion, voucher o deposito.

pagos[].monto decimal optional

Monto pagado. En una venta al credito es el importe de la cuota inicial.

pagos[].pago_recibido decimal optional

Importe entregado por el cliente cuando difiere del monto aplicado, por ejemplo para calcular el vuelto en efectivo.

acciones object optional

Objeto para controlar salidas posteriores a la emision.

acciones.enviar_xml_firmado boolean optional

Genera y firma XML cuando llega en true.

acciones.enviar_email boolean optional

Envia email al cliente si existe correo disponible.

acciones.formato_pdf string optional

Formato del PDF. Ejemplo: a4, ticket.

Factura electrónicacURL
curl --request POST \
  --url https://tu-empresa.nubo.devex.pe/api/integration/documents \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer API_TOKEN' \
  --data '{
    "serie_documento": "F001",
    "fecha_de_emision": "2026-06-03",
    "hora_de_emision": "10:30:00",
    "codigo_tipo_documento": "01",
    "codigo_tipo_operacion": "0101",
    "codigo_tipo_moneda": "PEN",
    "datos_del_cliente_o_receptor": {
      "codigo_tipo_documento_identidad": "6",
      "numero_documento": "20123456789",
      "apellidos_y_nombres_o_razon_social": "CLIENTE DEMO S.A.C.",
      "direccion": "Av. Demo 123"
    },
    "items": [{
      "descripcion": "Servicio de integracion",
      "unidad_de_medida": "NIU",
      "cantidad": 1,
      "valor_unitario": 100,
      "codigo_tipo_precio": "01",
      "precio_unitario": 118,
      "codigo_tipo_afectacion_igv": "10",
      "total_base_igv": 100,
      "porcentaje_igv": 18,
      "total_igv": 18,
      "total_impuestos": 18,
      "total_valor_item": 100,
      "total_item": 118
    }],
    "totales": {
      "total_operaciones_gravadas": 100,
      "total_igv": 18,
      "total_impuestos": 18,
      "total_valor": 100,
      "subtotal_venta": 118,
      "total_venta": 118
    }
  }'

# Factura al credito: las dos cuotas suman 118, igual al monto neto pendiente de pago
curl --request POST \
  --url https://tu-empresa.nubo.devex.pe/api/integration/documents \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer API_TOKEN' \
  --data '{
    "serie_documento": "F001",
    "fecha_de_emision": "2026-06-03",
    "hora_de_emision": "10:30:00",
    "fecha_de_vencimiento": "2026-08-03",
    "codigo_tipo_documento": "01",
    "codigo_tipo_operacion": "0101",
    "codigo_tipo_moneda": "PEN",
    "codigo_condicion_de_pago": "02",
    "cuotas": [
      { "fecha": "2026-07-03", "codigo_tipo_moneda": "PEN", "monto": 59 },
      { "fecha": "2026-08-03", "codigo_tipo_moneda": "PEN", "monto": 59 }
    ],
    "datos_del_cliente_o_receptor": {
      "codigo_tipo_documento_identidad": "6",
      "numero_documento": "20123456789",
      "apellidos_y_nombres_o_razon_social": "CLIENTE DEMO S.A.C.",
      "direccion": "Av. Demo 123"
    },
    "items": [{
      "codigo_interno": "P0121",
      "descripcion": "Inca Kola 250 ml",
      "unidad_de_medida": "NIU",
      "cantidad": 2,
      "valor_unitario": 50,
      "codigo_tipo_precio": "01",
      "precio_unitario": 59,
      "codigo_tipo_afectacion_igv": "10",
      "total_base_igv": 100,
      "porcentaje_igv": 18,
      "total_igv": 18,
      "total_impuestos": 18,
      "total_valor_item": 100,
      "total_item": 118
    }],
    "totales": {
      "total_operaciones_gravadas": 100,
      "total_igv": 18,
      "total_impuestos": 18,
      "total_valor": 100,
      "subtotal_venta": 118,
      "total_venta": 118,
      "total_pendiente_pago": 118
    }
  }'

# Factura al credito con pago inicial: total 9598.72, se cobran 3000 al contado en "pagos"
# y las 3 cuotas suman 6598.72, que es el mismo valor enviado en total_pendiente_pago.
# Las cuotas vencen despues de la fecha de emision, nunca el mismo dia.
curl --request POST \
  --url https://tu-empresa.nubo.devex.pe/api/integration/documents \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer API_TOKEN' \
  --data '{
    "serie_documento": "F001",
    "fecha_de_emision": "2026-08-10",
    "hora_de_emision": "10:30:00",
    "fecha_de_vencimiento": "2026-11-10",
    "codigo_tipo_documento": "01",
    "codigo_tipo_operacion": "0101",
    "codigo_tipo_moneda": "PEN",
    "codigo_condicion_de_pago": "02",
    "cuotas": [
      { "fecha": "2026-09-10", "codigo_tipo_moneda": "PEN", "monto": 2199.57, "codigo_metodo_de_pago": "01" },
      { "fecha": "2026-10-10", "codigo_tipo_moneda": "PEN", "monto": 2199.57, "codigo_metodo_de_pago": "01" },
      { "fecha": "2026-11-10", "codigo_tipo_moneda": "PEN", "monto": 2199.58, "codigo_metodo_de_pago": "01" }
    ],
    "pagos": [
      { "codigo_metodo_pago": "01", "codigo_destino_pago": "cash", "referencia": "Cuota inicial", "monto": 3000 }
    ],
    "datos_del_cliente_o_receptor": {
      "codigo_tipo_documento_identidad": "6",
      "numero_documento": "20123456789",
      "apellidos_y_nombres_o_razon_social": "CLIENTE DEMO S.A.C.",
      "direccion": "Av. Demo 123"
    },
    "items": [{
      "codigo_interno": "P0450",
      "descripcion": "Equipo industrial",
      "unidad_de_medida": "NIU",
      "cantidad": 1,
      "valor_unitario": 7499,
      "codigo_tipo_precio": "01",
      "precio_unitario": 8848.82,
      "codigo_tipo_afectacion_igv": "10",
      "total_base_igv": 7499,
      "porcentaje_igv": 18,
      "total_igv": 1349.82,
      "total_impuestos": 1349.82,
      "total_valor_item": 7499,
      "total_item": 8848.82
    }, {
      "descripcion": "Interes por financiamiento",
      "unidad_de_medida": "NIU",
      "cantidad": 1,
      "valor_unitario": 749.9,
      "codigo_tipo_precio": "01",
      "precio_unitario": 749.9,
      "codigo_tipo_afectacion_igv": "20",
      "total_base_igv": 749.9,
      "porcentaje_igv": 0,
      "total_igv": 0,
      "total_impuestos": 0,
      "total_valor_item": 749.9,
      "total_item": 749.9
    }],
    "totales": {
      "total_operaciones_gravadas": 7499,
      "total_operaciones_exoneradas": 749.9,
      "total_igv": 1349.82,
      "total_impuestos": 1349.82,
      "total_valor": 8248.9,
      "subtotal_venta": 9598.72,
      "total_venta": 9598.72,
      "total_pendiente_pago": 6598.72
    }
  }'
Responseapplication/json
{
  "success": true,
  "data": {
    "number": "F001-8",
    "external_id": "uuid",
    "state_type_description": "Aceptado",
    "id": 123
  },
  "links": {
    "xml": "https://tu-empresa.nubo.devex.pe/downloads/document/xml/uuid",
    "pdf": "https://tu-empresa.nubo.devex.pe/downloads/document/pdf/uuid",
    "cdr": "https://tu-empresa.nubo.devex.pe/downloads/document/cdr/uuid"
  }
}
Documents

Boleta electrónica

Emite una boleta usando codigo_tipo_documento = 03.

POST https://tu-empresa.nubo.devex.pe/api/integration/documents

Authorizations

Authorization string header required

Enviar como Bearer API_TOKEN. El token se configura por usuario en Integracion API > Configuracion o en la ventana de Usuarios.

X-Api-Token string header optional

Alternativa para emision externa: puedes enviar el mismo token en este header si no deseas usar Bearer.

Origin string header optional

Si se envia, debe coincidir con un dominio permitido. Si no se envia, la validacion usa la IP publica del cliente.

Idempotency-Key string header optional

Clave unica que generas tu por cada comprobante (por ejemplo un UUID). Sirve para que un reintento no emita dos veces: si repites la llamada con la misma clave, Nubo no vuelve a emitir y te devuelve la respuesta guardada del primer intento, con el header Idempotent-Replay: true. Si el primer intento todavia se esta procesando, responde 409 y debes reintentar con la misma clave en unos segundos. Si mandas la misma clave con un cuerpo distinto, responde 422. Entre 8 y 190 caracteres. Tambien se acepta como campo clave_idempotencia dentro del body.

Accept string header required

Usar application/json.

Content-Type string header required

Usar application/json para las APIs con body.

Body application/json

serie_documento string required

Serie habilitada para el establecimiento del usuario emisor. Ejemplos: F001, B001, FC01, FD01.

numero_documento string|number optional

Puede omitirse para factura y boleta. El backend asigna el correlativo automatico de la serie cuando llega vacio o como #.

fecha_de_emision date required

Fecha del comprobante en formato YYYY-MM-DD.

hora_de_emision time required

Hora del comprobante en formato HH:mm:ss.

fecha_de_vencimiento date optional

Fecha de vencimiento. Aplica sobre todo en credito; si no aplica puede igualarse a la fecha de emision.

codigo_condicion_de_pago enum<string> optional

Condicion de pago del comprobante: 01 contado, 02 credito. Si se omite se asume 01.

cuotas array<object> optional

Cronograma de pago. Obligatorio cuando codigo_condicion_de_pago = 02. La suma de los montos de las cuotas debe igualar el monto neto pendiente de pago (total de la venta menos detraccion o retencion, y menos anticipos si los hubiera). La API valida ese cuadre antes de generar y firmar el XML: si no coincide responde success: false con ambos montos y no crea el documento ni genera CDR (y SUNAT tambien lo rechazaria si llegara descuadrado). Cada cuota ademas debe vencer despues de la fecha de emision, ver cuotas[].fecha.

cuotas[].fecha date required

Fecha de vencimiento de la cuota en formato YYYY-MM-DD. Debe ser posterior a fecha_de_emision: el mismo dia de la emision tambien se rechaza. SUNAT devuelve el error 3267 ("Fecha del pago unico o de las cuotas no puede ser anterior a la fecha de emision del comprobante") e incluye el mismo dia en ese rechazo, asi que la API corta el envio antes de firmar el XML para no quemar el correlativo.

cuotas[].codigo_tipo_moneda string required

Moneda ISO de la cuota. Normalmente la misma del comprobante. Ejemplos: PEN, USD.

cuotas[].monto decimal required

Importe de la cuota. Las cuotas se numeran en el XML como Cuota001, Cuota002, siguiendo la fecha de vencimiento ascendente y no la posicion en el arreglo; si dos cuotas vencen el mismo dia desempata el orden de carga.

cuotas[].codigo_metodo_de_pago string optional

Metodo de pago previsto para la cuota cuando se desee registrarlo.

codigo_tipo_documento enum<string> required

01 factura, 03 boleta, 07 nota de credito, 08 nota de debito.

codigo_tipo_operacion string required

Tipo de operacion SUNAT. Para venta interna gravada normalmente se usa 0101.

codigo_tipo_moneda string required

Moneda ISO del comprobante. Ejemplos: PEN, USD.

factor_tipo_de_cambio decimal optional

Tipo de cambio cuando la moneda no es soles. Para PEN puede enviarse 1.

numero_orden_de_compra string optional

Orden de compra o referencia comercial del cliente.

datos_del_cliente_o_receptor object required

Objeto con los datos tributarios y de contacto del cliente receptor.

datos_del_cliente_o_receptor.codigo_tipo_documento_identidad string required

6 RUC, 1 DNI, 0 sin documento u otros codigos SUNAT validos. Siempre obligatorio, aunque omitas el nombre del cliente: junto con numero_documento es la llave con la que Nubo identifica al receptor.

datos_del_cliente_o_receptor.numero_documento string required

Numero del documento de identidad. Para factura debe ser RUC valido. Siempre obligatorio, aunque omitas el nombre del cliente.

datos_del_cliente_o_receptor.apellidos_y_nombres_o_razon_social string optional

Nombre completo o razon social del receptor. Es opcional: si no lo envias, Nubo lo resuelve solo en este orden. 1) Si el cliente ya existe en Nubo con el mismo tipo y numero de documento, se usa el nombre guardado y no se consulta nada afuera. 2) Si no existe, se consulta el padron por el documento y se autocompleta. 3) Si no se puede resolver, la emision se rechaza pidiendo este campo. Solo son consultables DNI (1) y RUC (6): con carnet de extranjeria (4), pasaporte (7), 0 u otros codigos del catalogo 06 tienes que enviar el nombre siempre. Tambien debes enviarlo cuando el documento no figura en el padron o la consulta externa falla o timeoutea: en esos casos la respuesta es success: false con el detalle y no se crea documento ni se consume correlativo. Si envias el campo, tu valor manda y se evita la consulta externa. Ojo: codigo_tipo_documento_identidad y numero_documento siguen siendo obligatorios en todos los casos.

datos_del_cliente_o_receptor.codigo_pais string optional

Codigo pais ISO. Para Peru usar PE.

datos_del_cliente_o_receptor.ubigeo string optional

Ubigeo del domicilio fiscal o comercial.

datos_del_cliente_o_receptor.direccion string optional

Direccion del cliente.

datos_del_cliente_o_receptor.correo_electronico string optional

Correo para envio del comprobante si la accion de email esta activa.

datos_del_cliente_o_receptor.telefono string optional

Telefono de contacto del receptor.

items array<object> required

Arreglo con una o mas lineas del comprobante. Cada objeto representa un producto o servicio.

items[].codigo_interno string optional

Codigo interno del producto o servicio en el sistema externo.

items[].codigo_producto_sunat string optional

Codigo de producto SUNAT cuando aplique.

items[].descripcion string required

Descripcion que se imprimira en el comprobante.

items[].unidad_de_medida string required

Unidad SUNAT. Para servicios o unidades comunes suele ser NIU.

items[].cantidad decimal required

Cantidad vendida.

items[].valor_unitario decimal required

Valor unitario sin IGV.

items[].codigo_tipo_precio string required

Codigo de tipo de precio. Normalmente 01 para precio unitario con IGV.

items[].precio_unitario decimal required

Precio unitario con impuestos incluidos.

items[].codigo_tipo_afectacion_igv string required

Afectacion IGV. Ejemplo 10 para gravado operacion onerosa.

items[].total_base_igv decimal required

Base imponible del IGV de la linea.

items[].porcentaje_igv decimal required

Porcentaje IGV aplicado. Normalmente 18.

items[].total_igv decimal required

Monto de IGV de la linea.

items[].total_impuestos decimal required

Suma de impuestos de la linea.

items[].total_valor_item decimal required

Valor total de la linea sin impuestos.

items[].total_item decimal required

Importe total de la linea con impuestos.

items[].modelo string optional

Modelo comercial del producto si se desea imprimir en el PDF.

items[].lote string optional

Lote del producto cuando aplique.

items[].series array<string> optional

Series individuales del producto cuando aplique.

totales object required

Objeto con los importes globales del comprobante.

totales.total_operaciones_gravadas decimal optional

Suma de operaciones gravadas sin IGV.

totales.total_operaciones_exoneradas decimal optional

Suma de operaciones exoneradas.

totales.total_operaciones_inafectas decimal optional

Suma de operaciones inafectas.

totales.total_igv decimal required

IGV total del comprobante.

totales.total_impuestos decimal required

Suma de impuestos globales.

totales.total_valor decimal required

Valor de venta sin impuestos.

totales.subtotal_venta decimal required

Subtotal con impuestos antes de redondeos o descuentos globales.

totales.total_venta decimal required

Total final a pagar.

totales.total_pendiente_pago decimal optional

Monto neto pendiente de pago: el total de la venta menos la detraccion o la retencion, y menos los anticipos si los hubiera. En credito es el valor contra el que debe cuadrar la suma de cuotas. Si lo envias con un valor mayor a cero se respeta tal cual; si lo omites, la API lo deriva como total_venta menos detraccion, retencion y anticipos. El arreglo pagos no se descuenta de forma automatica: cuando hay pago inicial debes enviar total_pendiente_pago = total_venta - pago inicial, porque si no la API va a esperar que las cuotas sumen el total completo y va a rechazar el request.

pagos array<object> optional

Pagos aplicados al momento de emitir. En una venta al credito es el lugar donde se registra la cuota inicial: el pago inicial va aca y el saldo restante se reparte en cuotas. Recuerda que la API no resta estos pagos del monto esperado, asi que ademas debes enviar totales.total_pendiente_pago ya descontado.

pagos[].codigo_metodo_pago string optional

Metodo de pago configurado. Ejemplo: 01 efectivo. Es el mismo catalogo de dos digitos de cuotas[].codigo_metodo_de_pago; ojo con la diferencia de nombre, aca la clave va sin el de intermedio.

pagos[].codigo_destino_pago string optional

Destino del pago configurado cuando el metodo lo requiera: cash para caja o el id numerico de una cuenta bancaria del tenant.

pagos[].referencia string optional

Referencia libre del pago: numero de operacion, voucher o deposito.

pagos[].monto decimal optional

Monto pagado. En una venta al credito es el importe de la cuota inicial.

pagos[].pago_recibido decimal optional

Importe entregado por el cliente cuando difiere del monto aplicado, por ejemplo para calcular el vuelto en efectivo.

acciones object optional

Objeto para controlar salidas posteriores a la emision.

acciones.enviar_xml_firmado boolean optional

Genera y firma XML cuando llega en true.

acciones.enviar_email boolean optional

Envia email al cliente si existe correo disponible.

acciones.formato_pdf string optional

Formato del PDF. Ejemplo: a4, ticket.

Boleta electrónicacURL
curl --request POST \
  --url https://tu-empresa.nubo.devex.pe/api/integration/documents \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer API_TOKEN' \
  --data '{
    "serie_documento": "B001",
    "fecha_de_emision": "2026-06-03",
    "hora_de_emision": "10:30:00",
    "codigo_tipo_documento": "03",
    "codigo_tipo_operacion": "0101",
    "codigo_tipo_moneda": "PEN",
    "datos_del_cliente_o_receptor": {
      "codigo_tipo_documento_identidad": "1",
      "numero_documento": "12345678",
      "apellidos_y_nombres_o_razon_social": "CLIENTE BOLETA"
    },
    "items": [{
      "descripcion": "Producto demo",
      "unidad_de_medida": "NIU",
      "cantidad": 1,
      "valor_unitario": 50,
      "codigo_tipo_precio": "01",
      "precio_unitario": 59,
      "codigo_tipo_afectacion_igv": "10",
      "total_base_igv": 50,
      "porcentaje_igv": 18,
      "total_igv": 9,
      "total_impuestos": 9,
      "total_valor_item": 50,
      "total_item": 59
    }],
    "totales": {
      "total_operaciones_gravadas": 50,
      "total_igv": 9,
      "total_impuestos": 9,
      "total_valor": 50,
      "subtotal_venta": 59,
      "total_venta": 59
    }
  }'

# La misma boleta con el cliente en su forma corta: solo tipo y numero de
# documento. Al omitir apellidos_y_nombres_o_razon_social, Nubo usa el nombre
# ya registrado para ese DNI o lo consulta al padron. Si el documento no fuera
# consultable (o la consulta fallara) la API responde success: false pidiendo
# el nombre, asi que en esos casos hay que enviarlo.
curl --request POST \
  --url https://tu-empresa.nubo.devex.pe/api/integration/documents \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer API_TOKEN' \
  --data '{
    "serie_documento": "B001",
    "fecha_de_emision": "2026-06-03",
    "hora_de_emision": "10:30:00",
    "codigo_tipo_documento": "03",
    "codigo_tipo_operacion": "0101",
    "codigo_tipo_moneda": "PEN",
    "datos_del_cliente_o_receptor": {
      "codigo_tipo_documento_identidad": "1",
      "numero_documento": "12345678"
    },
    "items": [{
      "descripcion": "Producto demo",
      "unidad_de_medida": "NIU",
      "cantidad": 1,
      "valor_unitario": 50,
      "codigo_tipo_precio": "01",
      "precio_unitario": 59,
      "codigo_tipo_afectacion_igv": "10",
      "total_base_igv": 50,
      "porcentaje_igv": 18,
      "total_igv": 9,
      "total_impuestos": 9,
      "total_valor_item": 50,
      "total_item": 59
    }],
    "totales": {
      "total_operaciones_gravadas": 50,
      "total_igv": 9,
      "total_impuestos": 9,
      "total_valor": 50,
      "subtotal_venta": 59,
      "total_venta": 59
    }
  }'
Responseapplication/json
{
  "success": true,
  "data": {
    "number": "B001-15",
    "external_id": "uuid",
    "state_type_description": "Aceptado"
  },
  "links": {
    "pdf": "https://tu-empresa.nubo.devex.pe/downloads/document/pdf/uuid"
  }
}
Documents

Nota de crédito

Emite una nota de credito usando codigo_tipo_documento = 07. Requiere tipo de nota, sustento, documento afectado, items y totales.

Notas
  • El backend exige codigo_tipo_nota y motivo_o_sustento_de_nota para 07.
  • Puedes referenciar el documento afectado por external_id o por serie, numero y tipo.
POST https://tu-empresa.nubo.devex.pe/api/integration/documents

Authorizations

Authorization string header required

Enviar como Bearer API_TOKEN. El token se configura por usuario en Integracion API > Configuracion o en la ventana de Usuarios.

X-Api-Token string header optional

Alternativa para emision externa: puedes enviar el mismo token en este header si no deseas usar Bearer.

Origin string header optional

Si se envia, debe coincidir con un dominio permitido. Si no se envia, la validacion usa la IP publica del cliente.

Idempotency-Key string header optional

Clave unica que generas tu por cada comprobante (por ejemplo un UUID). Sirve para que un reintento no emita dos veces: si repites la llamada con la misma clave, Nubo no vuelve a emitir y te devuelve la respuesta guardada del primer intento, con el header Idempotent-Replay: true. Si el primer intento todavia se esta procesando, responde 409 y debes reintentar con la misma clave en unos segundos. Si mandas la misma clave con un cuerpo distinto, responde 422. Entre 8 y 190 caracteres. Tambien se acepta como campo clave_idempotencia dentro del body.

Accept string header required

Usar application/json.

Content-Type string header required

Usar application/json para las APIs con body.

Body application/json

documento_afectado object required

Documento original que sera modificado por la nota.

documento_afectado.serie_documento string optional

Serie del comprobante afectado. Requerido si no envias documento_afectado.external_id.

documento_afectado.numero_documento string|number optional

Numero correlativo del comprobante afectado. Requerido si no envias documento_afectado.external_id.

documento_afectado.codigo_tipo_documento string optional

Tipo del comprobante afectado: 01 factura o 03 boleta. Requerido si no envias documento_afectado.external_id.

documento_afectado.external_id string optional

External ID del comprobante afectado. Si lo envias, el backend ubica el documento original y no necesitas serie, numero y tipo.

codigo_tipo_nota string required

Codigo SUNAT del motivo. Credito: 01 anulacion, 02 anulacion por error en RUC, 03 correccion descripcion, 04 descuento global, 05 descuento por item, 06 devolucion total, 07 devolucion por item, 08 bonificacion, 09 disminucion en valor, 10 otros. Debito: 01 intereses por mora, 02 aumento en valor, 03 penalidades/otros.

motivo_o_sustento_de_nota string required

Sustento visible del ajuste. Ejemplo: anulacion de operacion, descuento global, intereses por mora.

serie_documento string required

Serie habilitada para el establecimiento del usuario emisor. Ejemplos: F001, B001, FC01, FD01.

numero_documento string|number optional

Puede omitirse para factura y boleta. El backend asigna el correlativo automatico de la serie cuando llega vacio o como #.

fecha_de_emision date required

Fecha del comprobante en formato YYYY-MM-DD.

hora_de_emision time required

Hora del comprobante en formato HH:mm:ss.

fecha_de_vencimiento date optional

Fecha de vencimiento. Aplica sobre todo en credito; si no aplica puede igualarse a la fecha de emision.

codigo_condicion_de_pago enum<string> optional

Condicion de pago del comprobante: 01 contado, 02 credito. Si se omite se asume 01.

cuotas array<object> optional

Cronograma de pago. Obligatorio cuando codigo_condicion_de_pago = 02. La suma de los montos de las cuotas debe igualar el monto neto pendiente de pago (total de la venta menos detraccion o retencion, y menos anticipos si los hubiera). La API valida ese cuadre antes de generar y firmar el XML: si no coincide responde success: false con ambos montos y no crea el documento ni genera CDR (y SUNAT tambien lo rechazaria si llegara descuadrado). Cada cuota ademas debe vencer despues de la fecha de emision, ver cuotas[].fecha.

cuotas[].fecha date required

Fecha de vencimiento de la cuota en formato YYYY-MM-DD. Debe ser posterior a fecha_de_emision: el mismo dia de la emision tambien se rechaza. SUNAT devuelve el error 3267 ("Fecha del pago unico o de las cuotas no puede ser anterior a la fecha de emision del comprobante") e incluye el mismo dia en ese rechazo, asi que la API corta el envio antes de firmar el XML para no quemar el correlativo.

cuotas[].codigo_tipo_moneda string required

Moneda ISO de la cuota. Normalmente la misma del comprobante. Ejemplos: PEN, USD.

cuotas[].monto decimal required

Importe de la cuota. Las cuotas se numeran en el XML como Cuota001, Cuota002, siguiendo la fecha de vencimiento ascendente y no la posicion en el arreglo; si dos cuotas vencen el mismo dia desempata el orden de carga.

cuotas[].codigo_metodo_de_pago string optional

Metodo de pago previsto para la cuota cuando se desee registrarlo.

codigo_tipo_documento enum<string> required

01 factura, 03 boleta, 07 nota de credito, 08 nota de debito.

codigo_tipo_operacion string optional

Opcional para notas. En facturas y boletas representa el tipo de operacion SUNAT.

codigo_tipo_moneda string required

Moneda ISO del comprobante. Ejemplos: PEN, USD.

factor_tipo_de_cambio decimal optional

Tipo de cambio cuando la moneda no es soles. Para PEN puede enviarse 1.

numero_orden_de_compra string optional

Orden de compra o referencia comercial del cliente.

datos_del_cliente_o_receptor object required

Objeto con los datos tributarios y de contacto del cliente receptor.

datos_del_cliente_o_receptor.codigo_tipo_documento_identidad string required

6 RUC, 1 DNI, 0 sin documento u otros codigos SUNAT validos. Siempre obligatorio, aunque omitas el nombre del cliente: junto con numero_documento es la llave con la que Nubo identifica al receptor.

datos_del_cliente_o_receptor.numero_documento string required

Numero del documento de identidad. Para factura debe ser RUC valido. Siempre obligatorio, aunque omitas el nombre del cliente.

datos_del_cliente_o_receptor.apellidos_y_nombres_o_razon_social string optional

Nombre completo o razon social del receptor. Es opcional: si no lo envias, Nubo lo resuelve solo en este orden. 1) Si el cliente ya existe en Nubo con el mismo tipo y numero de documento, se usa el nombre guardado y no se consulta nada afuera. 2) Si no existe, se consulta el padron por el documento y se autocompleta. 3) Si no se puede resolver, la emision se rechaza pidiendo este campo. Solo son consultables DNI (1) y RUC (6): con carnet de extranjeria (4), pasaporte (7), 0 u otros codigos del catalogo 06 tienes que enviar el nombre siempre. Tambien debes enviarlo cuando el documento no figura en el padron o la consulta externa falla o timeoutea: en esos casos la respuesta es success: false con el detalle y no se crea documento ni se consume correlativo. Si envias el campo, tu valor manda y se evita la consulta externa. Ojo: codigo_tipo_documento_identidad y numero_documento siguen siendo obligatorios en todos los casos.

datos_del_cliente_o_receptor.codigo_pais string optional

Codigo pais ISO. Para Peru usar PE.

datos_del_cliente_o_receptor.ubigeo string optional

Ubigeo del domicilio fiscal o comercial.

datos_del_cliente_o_receptor.direccion string optional

Direccion del cliente.

datos_del_cliente_o_receptor.correo_electronico string optional

Correo para envio del comprobante si la accion de email esta activa.

datos_del_cliente_o_receptor.telefono string optional

Telefono de contacto del receptor.

items array<object> required

Arreglo con una o mas lineas del comprobante. Cada objeto representa un producto o servicio.

items[].codigo_interno string optional

Codigo interno del producto o servicio en el sistema externo.

items[].codigo_producto_sunat string optional

Codigo de producto SUNAT cuando aplique.

items[].descripcion string required

Descripcion que se imprimira en el comprobante.

items[].unidad_de_medida string required

Unidad SUNAT. Para servicios o unidades comunes suele ser NIU.

items[].cantidad decimal required

Cantidad vendida.

items[].valor_unitario decimal required

Valor unitario sin IGV.

items[].codigo_tipo_precio string required

Codigo de tipo de precio. Normalmente 01 para precio unitario con IGV.

items[].precio_unitario decimal required

Precio unitario con impuestos incluidos.

items[].codigo_tipo_afectacion_igv string required

Afectacion IGV. Ejemplo 10 para gravado operacion onerosa.

items[].total_base_igv decimal required

Base imponible del IGV de la linea.

items[].porcentaje_igv decimal required

Porcentaje IGV aplicado. Normalmente 18.

items[].total_igv decimal required

Monto de IGV de la linea.

items[].total_impuestos decimal required

Suma de impuestos de la linea.

items[].total_valor_item decimal required

Valor total de la linea sin impuestos.

items[].total_item decimal required

Importe total de la linea con impuestos.

items[].modelo string optional

Modelo comercial del producto si se desea imprimir en el PDF.

items[].lote string optional

Lote del producto cuando aplique.

items[].series array<string> optional

Series individuales del producto cuando aplique.

totales object required

Objeto con los importes globales del comprobante.

totales.total_operaciones_gravadas decimal optional

Suma de operaciones gravadas sin IGV.

totales.total_operaciones_exoneradas decimal optional

Suma de operaciones exoneradas.

totales.total_operaciones_inafectas decimal optional

Suma de operaciones inafectas.

totales.total_igv decimal required

IGV total del comprobante.

totales.total_impuestos decimal required

Suma de impuestos globales.

totales.total_valor decimal required

Valor de venta sin impuestos.

totales.subtotal_venta decimal required

Subtotal con impuestos antes de redondeos o descuentos globales.

totales.total_venta decimal required

Total final a pagar.

totales.total_pendiente_pago decimal optional

Monto neto pendiente de pago: el total de la venta menos la detraccion o la retencion, y menos los anticipos si los hubiera. En credito es el valor contra el que debe cuadrar la suma de cuotas. Si lo envias con un valor mayor a cero se respeta tal cual; si lo omites, la API lo deriva como total_venta menos detraccion, retencion y anticipos. El arreglo pagos no se descuenta de forma automatica: cuando hay pago inicial debes enviar total_pendiente_pago = total_venta - pago inicial, porque si no la API va a esperar que las cuotas sumen el total completo y va a rechazar el request.

pagos array<object> optional

Pagos aplicados al momento de emitir. En una venta al credito es el lugar donde se registra la cuota inicial: el pago inicial va aca y el saldo restante se reparte en cuotas. Recuerda que la API no resta estos pagos del monto esperado, asi que ademas debes enviar totales.total_pendiente_pago ya descontado.

pagos[].codigo_metodo_pago string optional

Metodo de pago configurado. Ejemplo: 01 efectivo. Es el mismo catalogo de dos digitos de cuotas[].codigo_metodo_de_pago; ojo con la diferencia de nombre, aca la clave va sin el de intermedio.

pagos[].codigo_destino_pago string optional

Destino del pago configurado cuando el metodo lo requiera: cash para caja o el id numerico de una cuenta bancaria del tenant.

pagos[].referencia string optional

Referencia libre del pago: numero de operacion, voucher o deposito.

pagos[].monto decimal optional

Monto pagado. En una venta al credito es el importe de la cuota inicial.

pagos[].pago_recibido decimal optional

Importe entregado por el cliente cuando difiere del monto aplicado, por ejemplo para calcular el vuelto en efectivo.

acciones object optional

Objeto para controlar salidas posteriores a la emision.

acciones.enviar_xml_firmado boolean optional

Genera y firma XML cuando llega en true.

acciones.enviar_email boolean optional

Envia email al cliente si existe correo disponible.

acciones.formato_pdf string optional

Formato del PDF. Ejemplo: a4, ticket.

Nota de créditocURL
curl --request POST \
  --url https://tu-empresa.nubo.devex.pe/api/integration/documents \
  --header 'Authorization: Bearer API_TOKEN' \
  --data '{
    "serie_documento": "FC01",
    "fecha_de_emision": "2026-06-03",
    "codigo_tipo_documento": "07",
    "codigo_tipo_moneda": "PEN",
    "codigo_tipo_nota": "01",
    "motivo_o_sustento_de_nota": "Anulacion de la operacion",
    "documento_afectado": { "external_id": "external-id-afectado" },
    "datos_del_cliente_o_receptor": {
      "codigo_tipo_documento_identidad": "6",
      "numero_documento": "20123456789",
      "apellidos_y_nombres_o_razon_social": "CLIENTE DEMO S.A.C."
    },
    "items": [{ "descripcion": "Anulacion de servicio", "unidad_de_medida": "NIU", "cantidad": 1, "valor_unitario": 100, "codigo_tipo_precio": "01", "precio_unitario": 118, "codigo_tipo_afectacion_igv": "10", "total_base_igv": 100, "porcentaje_igv": 18, "total_igv": 18, "total_impuestos": 18, "total_valor_item": 100, "total_item": 118 }],
    "totales": { "total_operaciones_gravadas": 100, "total_igv": 18, "total_impuestos": 18, "total_valor": 100, "subtotal_venta": 118, "total_venta": 118 }
  }'
Responseapplication/json
{
  "success": true,
  "data": { "number": "FC01-3", "external_id": "uuid", "state_type_description": "Aceptado" },
  "links": { "pdf": "https://tu-empresa.nubo.devex.pe/downloads/document/pdf/uuid" }
}
Documents

Nota de débito

Emite una nota de debito usando codigo_tipo_documento = 08. Sirve para aumentar valor, intereses o penalidades.

Notas
  • No es una anulacion. El backend exige codigo_tipo_nota y motivo_o_sustento_de_nota.
POST https://tu-empresa.nubo.devex.pe/api/integration/documents

Authorizations

Authorization string header required

Enviar como Bearer API_TOKEN. El token se configura por usuario en Integracion API > Configuracion o en la ventana de Usuarios.

X-Api-Token string header optional

Alternativa para emision externa: puedes enviar el mismo token en este header si no deseas usar Bearer.

Origin string header optional

Si se envia, debe coincidir con un dominio permitido. Si no se envia, la validacion usa la IP publica del cliente.

Idempotency-Key string header optional

Clave unica que generas tu por cada comprobante (por ejemplo un UUID). Sirve para que un reintento no emita dos veces: si repites la llamada con la misma clave, Nubo no vuelve a emitir y te devuelve la respuesta guardada del primer intento, con el header Idempotent-Replay: true. Si el primer intento todavia se esta procesando, responde 409 y debes reintentar con la misma clave en unos segundos. Si mandas la misma clave con un cuerpo distinto, responde 422. Entre 8 y 190 caracteres. Tambien se acepta como campo clave_idempotencia dentro del body.

Accept string header required

Usar application/json.

Content-Type string header required

Usar application/json para las APIs con body.

Body application/json

documento_afectado object required

Documento original que sera modificado por la nota.

documento_afectado.serie_documento string optional

Serie del comprobante afectado. Requerido si no envias documento_afectado.external_id.

documento_afectado.numero_documento string|number optional

Numero correlativo del comprobante afectado. Requerido si no envias documento_afectado.external_id.

documento_afectado.codigo_tipo_documento string optional

Tipo del comprobante afectado: 01 factura o 03 boleta. Requerido si no envias documento_afectado.external_id.

documento_afectado.external_id string optional

External ID del comprobante afectado. Si lo envias, el backend ubica el documento original y no necesitas serie, numero y tipo.

codigo_tipo_nota string required

Codigo SUNAT del motivo. Credito: 01 anulacion, 02 anulacion por error en RUC, 03 correccion descripcion, 04 descuento global, 05 descuento por item, 06 devolucion total, 07 devolucion por item, 08 bonificacion, 09 disminucion en valor, 10 otros. Debito: 01 intereses por mora, 02 aumento en valor, 03 penalidades/otros.

motivo_o_sustento_de_nota string required

Sustento visible del ajuste. Ejemplo: anulacion de operacion, descuento global, intereses por mora.

serie_documento string required

Serie habilitada para el establecimiento del usuario emisor. Ejemplos: F001, B001, FC01, FD01.

numero_documento string|number optional

Puede omitirse para factura y boleta. El backend asigna el correlativo automatico de la serie cuando llega vacio o como #.

fecha_de_emision date required

Fecha del comprobante en formato YYYY-MM-DD.

hora_de_emision time required

Hora del comprobante en formato HH:mm:ss.

fecha_de_vencimiento date optional

Fecha de vencimiento. Aplica sobre todo en credito; si no aplica puede igualarse a la fecha de emision.

codigo_condicion_de_pago enum<string> optional

Condicion de pago del comprobante: 01 contado, 02 credito. Si se omite se asume 01.

cuotas array<object> optional

Cronograma de pago. Obligatorio cuando codigo_condicion_de_pago = 02. La suma de los montos de las cuotas debe igualar el monto neto pendiente de pago (total de la venta menos detraccion o retencion, y menos anticipos si los hubiera). La API valida ese cuadre antes de generar y firmar el XML: si no coincide responde success: false con ambos montos y no crea el documento ni genera CDR (y SUNAT tambien lo rechazaria si llegara descuadrado). Cada cuota ademas debe vencer despues de la fecha de emision, ver cuotas[].fecha.

cuotas[].fecha date required

Fecha de vencimiento de la cuota en formato YYYY-MM-DD. Debe ser posterior a fecha_de_emision: el mismo dia de la emision tambien se rechaza. SUNAT devuelve el error 3267 ("Fecha del pago unico o de las cuotas no puede ser anterior a la fecha de emision del comprobante") e incluye el mismo dia en ese rechazo, asi que la API corta el envio antes de firmar el XML para no quemar el correlativo.

cuotas[].codigo_tipo_moneda string required

Moneda ISO de la cuota. Normalmente la misma del comprobante. Ejemplos: PEN, USD.

cuotas[].monto decimal required

Importe de la cuota. Las cuotas se numeran en el XML como Cuota001, Cuota002, siguiendo la fecha de vencimiento ascendente y no la posicion en el arreglo; si dos cuotas vencen el mismo dia desempata el orden de carga.

cuotas[].codigo_metodo_de_pago string optional

Metodo de pago previsto para la cuota cuando se desee registrarlo.

codigo_tipo_documento enum<string> required

01 factura, 03 boleta, 07 nota de credito, 08 nota de debito.

codigo_tipo_operacion string optional

Opcional para notas. En facturas y boletas representa el tipo de operacion SUNAT.

codigo_tipo_moneda string required

Moneda ISO del comprobante. Ejemplos: PEN, USD.

factor_tipo_de_cambio decimal optional

Tipo de cambio cuando la moneda no es soles. Para PEN puede enviarse 1.

numero_orden_de_compra string optional

Orden de compra o referencia comercial del cliente.

datos_del_cliente_o_receptor object required

Objeto con los datos tributarios y de contacto del cliente receptor.

datos_del_cliente_o_receptor.codigo_tipo_documento_identidad string required

6 RUC, 1 DNI, 0 sin documento u otros codigos SUNAT validos. Siempre obligatorio, aunque omitas el nombre del cliente: junto con numero_documento es la llave con la que Nubo identifica al receptor.

datos_del_cliente_o_receptor.numero_documento string required

Numero del documento de identidad. Para factura debe ser RUC valido. Siempre obligatorio, aunque omitas el nombre del cliente.

datos_del_cliente_o_receptor.apellidos_y_nombres_o_razon_social string optional

Nombre completo o razon social del receptor. Es opcional: si no lo envias, Nubo lo resuelve solo en este orden. 1) Si el cliente ya existe en Nubo con el mismo tipo y numero de documento, se usa el nombre guardado y no se consulta nada afuera. 2) Si no existe, se consulta el padron por el documento y se autocompleta. 3) Si no se puede resolver, la emision se rechaza pidiendo este campo. Solo son consultables DNI (1) y RUC (6): con carnet de extranjeria (4), pasaporte (7), 0 u otros codigos del catalogo 06 tienes que enviar el nombre siempre. Tambien debes enviarlo cuando el documento no figura en el padron o la consulta externa falla o timeoutea: en esos casos la respuesta es success: false con el detalle y no se crea documento ni se consume correlativo. Si envias el campo, tu valor manda y se evita la consulta externa. Ojo: codigo_tipo_documento_identidad y numero_documento siguen siendo obligatorios en todos los casos.

datos_del_cliente_o_receptor.codigo_pais string optional

Codigo pais ISO. Para Peru usar PE.

datos_del_cliente_o_receptor.ubigeo string optional

Ubigeo del domicilio fiscal o comercial.

datos_del_cliente_o_receptor.direccion string optional

Direccion del cliente.

datos_del_cliente_o_receptor.correo_electronico string optional

Correo para envio del comprobante si la accion de email esta activa.

datos_del_cliente_o_receptor.telefono string optional

Telefono de contacto del receptor.

items array<object> required

Arreglo con una o mas lineas del comprobante. Cada objeto representa un producto o servicio.

items[].codigo_interno string optional

Codigo interno del producto o servicio en el sistema externo.

items[].codigo_producto_sunat string optional

Codigo de producto SUNAT cuando aplique.

items[].descripcion string required

Descripcion que se imprimira en el comprobante.

items[].unidad_de_medida string required

Unidad SUNAT. Para servicios o unidades comunes suele ser NIU.

items[].cantidad decimal required

Cantidad vendida.

items[].valor_unitario decimal required

Valor unitario sin IGV.

items[].codigo_tipo_precio string required

Codigo de tipo de precio. Normalmente 01 para precio unitario con IGV.

items[].precio_unitario decimal required

Precio unitario con impuestos incluidos.

items[].codigo_tipo_afectacion_igv string required

Afectacion IGV. Ejemplo 10 para gravado operacion onerosa.

items[].total_base_igv decimal required

Base imponible del IGV de la linea.

items[].porcentaje_igv decimal required

Porcentaje IGV aplicado. Normalmente 18.

items[].total_igv decimal required

Monto de IGV de la linea.

items[].total_impuestos decimal required

Suma de impuestos de la linea.

items[].total_valor_item decimal required

Valor total de la linea sin impuestos.

items[].total_item decimal required

Importe total de la linea con impuestos.

items[].modelo string optional

Modelo comercial del producto si se desea imprimir en el PDF.

items[].lote string optional

Lote del producto cuando aplique.

items[].series array<string> optional

Series individuales del producto cuando aplique.

totales object required

Objeto con los importes globales del comprobante.

totales.total_operaciones_gravadas decimal optional

Suma de operaciones gravadas sin IGV.

totales.total_operaciones_exoneradas decimal optional

Suma de operaciones exoneradas.

totales.total_operaciones_inafectas decimal optional

Suma de operaciones inafectas.

totales.total_igv decimal required

IGV total del comprobante.

totales.total_impuestos decimal required

Suma de impuestos globales.

totales.total_valor decimal required

Valor de venta sin impuestos.

totales.subtotal_venta decimal required

Subtotal con impuestos antes de redondeos o descuentos globales.

totales.total_venta decimal required

Total final a pagar.

totales.total_pendiente_pago decimal optional

Monto neto pendiente de pago: el total de la venta menos la detraccion o la retencion, y menos los anticipos si los hubiera. En credito es el valor contra el que debe cuadrar la suma de cuotas. Si lo envias con un valor mayor a cero se respeta tal cual; si lo omites, la API lo deriva como total_venta menos detraccion, retencion y anticipos. El arreglo pagos no se descuenta de forma automatica: cuando hay pago inicial debes enviar total_pendiente_pago = total_venta - pago inicial, porque si no la API va a esperar que las cuotas sumen el total completo y va a rechazar el request.

pagos array<object> optional

Pagos aplicados al momento de emitir. En una venta al credito es el lugar donde se registra la cuota inicial: el pago inicial va aca y el saldo restante se reparte en cuotas. Recuerda que la API no resta estos pagos del monto esperado, asi que ademas debes enviar totales.total_pendiente_pago ya descontado.

pagos[].codigo_metodo_pago string optional

Metodo de pago configurado. Ejemplo: 01 efectivo. Es el mismo catalogo de dos digitos de cuotas[].codigo_metodo_de_pago; ojo con la diferencia de nombre, aca la clave va sin el de intermedio.

pagos[].codigo_destino_pago string optional

Destino del pago configurado cuando el metodo lo requiera: cash para caja o el id numerico de una cuenta bancaria del tenant.

pagos[].referencia string optional

Referencia libre del pago: numero de operacion, voucher o deposito.

pagos[].monto decimal optional

Monto pagado. En una venta al credito es el importe de la cuota inicial.

pagos[].pago_recibido decimal optional

Importe entregado por el cliente cuando difiere del monto aplicado, por ejemplo para calcular el vuelto en efectivo.

acciones object optional

Objeto para controlar salidas posteriores a la emision.

acciones.enviar_xml_firmado boolean optional

Genera y firma XML cuando llega en true.

acciones.enviar_email boolean optional

Envia email al cliente si existe correo disponible.

acciones.formato_pdf string optional

Formato del PDF. Ejemplo: a4, ticket.

Nota de débitocURL
curl --request POST \
  --url https://tu-empresa.nubo.devex.pe/api/integration/documents \
  --header 'Authorization: Bearer API_TOKEN' \
  --data '{
    "serie_documento": "FD01",
    "fecha_de_emision": "2026-06-03",
    "codigo_tipo_documento": "08",
    "codigo_tipo_moneda": "PEN",
    "codigo_tipo_nota": "01",
    "motivo_o_sustento_de_nota": "Intereses por mora",
    "documento_afectado": { "external_id": "external-id-afectado" },
    "datos_del_cliente_o_receptor": { "codigo_tipo_documento_identidad": "6", "numero_documento": "20123456789", "apellidos_y_nombres_o_razon_social": "CLIENTE DEMO S.A.C." },
    "items": [{ "descripcion": "Interes por mora", "unidad_de_medida": "NIU", "cantidad": 1, "valor_unitario": 20, "codigo_tipo_precio": "01", "precio_unitario": 23.6, "codigo_tipo_afectacion_igv": "10", "total_base_igv": 20, "porcentaje_igv": 18, "total_igv": 3.6, "total_impuestos": 3.6, "total_valor_item": 20, "total_item": 23.6 }],
    "totales": { "total_operaciones_gravadas": 20, "total_igv": 3.6, "total_impuestos": 3.6, "total_valor": 20, "subtotal_venta": 23.6, "total_venta": 23.6 }
  }'
Responseapplication/json
{
  "success": true,
  "data": { "number": "FD01-2", "external_id": "uuid", "state_type_description": "Aceptado" },
  "links": { "pdf": "https://tu-empresa.nubo.devex.pe/downloads/document/pdf/uuid" }
}
Documents

Anular factura o nota

Genera una comunicacion de baja para documentos grupo 01 (facturas y notas asociadas a factura).

Notas
  • El backend valida que cada external_id exista y que la fecha coincida con fecha_de_emision_de_documentos.
  • Para consultar el resultado SUNAT usa /api/voided/status enviando el ticket.
POST https://tu-empresa.nubo.devex.pe/api/voided
POST https://tu-empresa.nubo.devex.pe/api/voided/status

Authorizations

Authorization string header required

Enviar como Bearer API_TOKEN. Esta ruta usa el guard auth:api del usuario tenant.

Accept string header required

Usar application/json.

Idempotency-Key string header optional

Clave unica que generas tu por cada comprobante (por ejemplo un UUID). Sirve para que un reintento no emita dos veces: si repites la llamada con la misma clave, Nubo no vuelve a emitir y te devuelve la respuesta guardada del primer intento, con el header Idempotent-Replay: true. Si el primer intento todavia se esta procesando, responde 409 y debes reintentar con la misma clave en unos segundos. Si mandas la misma clave con un cuerpo distinto, responde 422. Entre 8 y 190 caracteres. Tambien se acepta como campo clave_idempotencia dentro del body.

Content-Type string header required

Usar application/json para enviar el body.

Body application/json

fecha_de_emision_de_documentos date required

Fecha de emision de los documentos a anular. El backend busca los documentos por esta fecha y por external_id.

documentos array<object> required

Arreglo de documentos grupo 01: facturas y notas asociadas a factura.

documentos[].external_id string required

External ID del comprobante emitido. Debe existir y tener la misma fecha indicada.

documentos[].motivo_anulacion string required

Descripcion del motivo de anulacion.

Estado.ticket string optional

Ticket SUNAT devuelto por el primer POST. Envialo a /api/voided/status para consultar el estado.

Anular factura o notacURL
curl --request POST \
  --url https://tu-empresa.nubo.devex.pe/api/voided \
  --header 'Authorization: Bearer API_TOKEN' \
  --data '{
    "fecha_de_emision_de_documentos": "2026-06-03",
    "documentos": [{ "external_id": "external-id", "motivo_anulacion": "Error en la emision" }]
  }'

curl --request POST \
  --url https://tu-empresa.nubo.devex.pe/api/voided/status \
  --header 'Authorization: Bearer API_TOKEN' \
  --data '{ "ticket": "SUNAT_TICKET" }'
Responseapplication/json
{
  "success": true,
  "data": { "external_id": "uuid-baja", "ticket": "SUNAT_TICKET" }
}
Documents

Anular boleta

Genera un resumen de anulacion para documentos grupo 02 (boletas y notas asociadas a boleta).

Notas
  • Usa codigo_tipo_proceso = 3.
  • Para consultar el resultado SUNAT usa /api/summaries/status enviando el ticket.
POST https://tu-empresa.nubo.devex.pe/api/summaries
POST https://tu-empresa.nubo.devex.pe/api/summaries/status

Authorizations

Authorization string header required

Enviar como Bearer API_TOKEN. Esta ruta usa el guard auth:api del usuario tenant.

Accept string header required

Usar application/json.

Idempotency-Key string header optional

Clave unica que generas tu por cada comprobante (por ejemplo un UUID). Sirve para que un reintento no emita dos veces: si repites la llamada con la misma clave, Nubo no vuelve a emitir y te devuelve la respuesta guardada del primer intento, con el header Idempotent-Replay: true. Si el primer intento todavia se esta procesando, responde 409 y debes reintentar con la misma clave en unos segundos. Si mandas la misma clave con un cuerpo distinto, responde 422. Entre 8 y 190 caracteres. Tambien se acepta como campo clave_idempotencia dentro del body.

Content-Type string header required

Usar application/json para enviar el body.

Body application/json

fecha_de_emision_de_documentos date required

Fecha de emision de las boletas o notas asociadas a boleta que se anularan.

codigo_tipo_proceso string required

Para anulacion por resumen debe ser 3.

documentos array<object> required

Arreglo de documentos grupo 02: boletas y notas asociadas a boleta.

documentos[].external_id string required

External ID del comprobante. Debe existir con la fecha indicada y pertenecer al grupo boleta.

documentos[].motivo_anulacion string required

Descripcion del motivo de anulacion.

Estado.ticket string optional

Ticket SUNAT devuelto por el primer POST. Envialo a /api/summaries/status para consultar el estado.

Anular boletacURL
curl --request POST \
  --url https://tu-empresa.nubo.devex.pe/api/summaries \
  --header 'Authorization: Bearer API_TOKEN' \
  --data '{
    "fecha_de_emision_de_documentos": "2026-06-03",
    "codigo_tipo_proceso": "3",
    "documentos": [{ "external_id": "external-id-boleta", "motivo_anulacion": "Error en la emision" }]
  }'

curl --request POST \
  --url https://tu-empresa.nubo.devex.pe/api/summaries/status \
  --header 'Authorization: Bearer API_TOKEN' \
  --data '{ "ticket": "SUNAT_TICKET" }'
Responseapplication/json
{
  "success": true,
  "data": { "external_id": "uuid-resumen", "ticket": "SUNAT_TICKET" }
}
Documents

Listar comprobantes

Consulta comprobantes emitidos por el usuario autenticado. Sin rango retorna los ultimos 50.

GET https://tu-empresa.nubo.devex.pe/api/documents/lists
GET https://tu-empresa.nubo.devex.pe/api/documents/lists/{startDate}/{endDate}

Authorizations

Authorization string header required

Enviar como Bearer API_TOKEN. Esta ruta usa el guard auth:api del usuario tenant.

Accept string header required

Usar application/json.

Parametros y response application/json

startDate date path optional

Fecha inicial para la ruta con rango. Formato YYYY-MM-DD.

endDate date path optional

Fecha final para la ruta con rango. Formato YYYY-MM-DD.

Sin rango route path optional

Si se llama /api/documents/lists, retorna los ultimos 50 comprobantes del usuario.

Response[].id number optional

ID interno del comprobante.

Response[].external_id string optional

Identificador publico para descargar o imprimir el comprobante.

Response[].number string optional

Serie y correlativo del comprobante.

Response[].document_type_id string optional

01, 03, 07, 08, entre otros.

Response[].customer_name string optional

Nombre o razon social del cliente.

Response[].date_of_issue date optional

Fecha de emision del comprobante.

Response[].total decimal optional

Total del comprobante.

Response[].download_pdf url optional

URL publica para ver el PDF.

Response[].download_xml url optional

URL publica del XML.

Response[].download_cdr url optional

URL publica del CDR cuando exista.

Listar comprobantescURL
curl --request GET \
  --url https://tu-empresa.nubo.devex.pe/api/documents/lists \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer API_TOKEN'

curl --request GET \
  --url https://tu-empresa.nubo.devex.pe/api/documents/lists/{startDate}/{endDate} \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer API_TOKEN'
Responseapplication/json
{
  "data": [{
    "id": 123,
    "external_id": "uuid",
    "number": "F001-8",
    "document_type_id": "01",
    "date_of_issue": "2026-06-03",
    "customer_name": "CLIENTE DEMO S.A.C.",
    "total": "118.00",
    "state_type_description": "Aceptado",
    "download_pdf": "https://tu-empresa.nubo.devex.pe/downloads/document/pdf/uuid"
  }]
}