Factura electrónica
Emite una factura usando codigo_tipo_documento = 01.
- Para que un reintento tuyo no genere un comprobante duplicado, manda la cabecera
Idempotency-Keycon 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 headerIdempotent-Replay: true. Si el primer intento todavia esta en curso, la API responde409con{"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_identidadynumero_documento:apellidos_y_nombres_o_razon_sociales 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 = 02junto con el arreglocuotas. - En credito la suma de los montos de
cuotasdebe 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, respondesuccess: falsecon 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 error3267("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
pagosy el saldo se reparte encuotas. La API no descuentapagosdel monto esperado, asi que en ese caso es obligatorio enviartotales.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:
3251si la transaccion es al credito debe consignarse el monto neto pendiente de pago,3265ese monto debe ser menor o igual al importe total del comprobante,3267la 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
500y 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.; yLa suma de las cuotas (X) debe ser igual al monto neto pendiente de pago (Y): total de la venta menos detraccion, retencion y anticipos.
Authorizations
Enviar como Bearer API_TOKEN. El token se configura por usuario en Integracion API > Configuracion o en la ventana de Usuarios.
Alternativa para emision externa: puedes enviar el mismo token en este header si no deseas usar Bearer.
Si se envia, debe coincidir con un dominio permitido. Si no se envia, la validacion usa la IP publica del cliente.
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.
Usar application/json.
Usar application/json para las APIs con body.
Body application/json
Serie habilitada para el establecimiento del usuario emisor. Ejemplos: F001, B001, FC01, FD01.
Puede omitirse para factura y boleta. El backend asigna el correlativo automatico de la serie cuando llega vacio o como #.
Fecha del comprobante en formato YYYY-MM-DD.
Hora del comprobante en formato HH:mm:ss.
Fecha de vencimiento. Aplica sobre todo en credito; si no aplica puede igualarse a la fecha de emision.
Condicion de pago del comprobante: 01 contado, 02 credito. Si se omite se asume 01.
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.
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.
Moneda ISO de la cuota. Normalmente la misma del comprobante. Ejemplos: PEN, USD.
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.
Metodo de pago previsto para la cuota cuando se desee registrarlo.
01 factura, 03 boleta, 07 nota de credito, 08 nota de debito.
Tipo de operacion SUNAT. Para venta interna gravada normalmente se usa 0101.
Moneda ISO del comprobante. Ejemplos: PEN, USD.
Tipo de cambio cuando la moneda no es soles. Para PEN puede enviarse 1.
Orden de compra o referencia comercial del cliente.
Objeto con los datos tributarios y de contacto del cliente receptor.
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.
Numero del documento de identidad. Para factura debe ser RUC valido. Siempre obligatorio, aunque omitas el nombre del cliente.
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.
Codigo pais ISO. Para Peru usar PE.
Ubigeo del domicilio fiscal o comercial.
Direccion del cliente.
Correo para envio del comprobante si la accion de email esta activa.
Telefono de contacto del receptor.
Arreglo con una o mas lineas del comprobante. Cada objeto representa un producto o servicio.
Codigo interno del producto o servicio en el sistema externo.
Codigo de producto SUNAT cuando aplique.
Descripcion que se imprimira en el comprobante.
Unidad SUNAT. Para servicios o unidades comunes suele ser NIU.
Cantidad vendida.
Valor unitario sin IGV.
Codigo de tipo de precio. Normalmente 01 para precio unitario con IGV.
Precio unitario con impuestos incluidos.
Afectacion IGV. Ejemplo 10 para gravado operacion onerosa.
Base imponible del IGV de la linea.
Porcentaje IGV aplicado. Normalmente 18.
Monto de IGV de la linea.
Suma de impuestos de la linea.
Valor total de la linea sin impuestos.
Importe total de la linea con impuestos.
Modelo comercial del producto si se desea imprimir en el PDF.
Lote del producto cuando aplique.
Series individuales del producto cuando aplique.
Objeto con los importes globales del comprobante.
Suma de operaciones gravadas sin IGV.
Suma de operaciones exoneradas.
Suma de operaciones inafectas.
IGV total del comprobante.
Suma de impuestos globales.
Valor de venta sin impuestos.
Subtotal con impuestos antes de redondeos o descuentos globales.
Total final a pagar.
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 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.
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.
Destino del pago configurado cuando el metodo lo requiera: cash para caja o el id numerico de una cuenta bancaria del tenant.
Referencia libre del pago: numero de operacion, voucher o deposito.
Monto pagado. En una venta al credito es el importe de la cuota inicial.
Importe entregado por el cliente cuando difiere del monto aplicado, por ejemplo para calcular el vuelto en efectivo.
Objeto para controlar salidas posteriores a la emision.
Genera y firma XML cuando llega en true.
Envia email al cliente si existe correo disponible.
Formato del PDF. Ejemplo: a4, ticket.
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
}
}'
{
"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"
}
}