Crear comprobante
/comprobantes/emitirscope: invoices.create + invoices.send_sunatCrea una factura o boleta y la envía a SUNAT en la misma llamada. Por defecto (webhook: false) espera la respuesta de SUNAT antes de responder — ver la nota sobre el flag webhook más abajo.
Parámetros del body
webhookSi es true, la respuesta es inmediata (EN_PROCESO) y el resultado llega a tu webhook configurado. Si es false (por defecto), la llamada espera la respuesta de SUNAT antes de responder.
documentoDatos del comprobante electrónico.
sunatTransaccionCódigo de tipo de operación SUNAT. Gravada: "0101" — ver la variante correspondiente para otros códigos.
tipoComprobante01 = factura, 03 = boleta.
serieSerie del comprobante. Facturas: F001–F999. Boletas: B001–B999.
monedaCódigo de moneda.
formaPagoCondición de pago.
fechaEmisionFecha de emisión.
fechaVencimientoRequerido si formaPago es CREDITO — fecha de la última cuota.
clienteDatos del cliente.
tipoDocumentoCatálogo SUNAT 06 (ej. "1" = DNI, "6" = RUC).
numeroDocumentoNúmero de documento del cliente.
denominacionNombre o razón social del cliente.
direccionDirección fiscal del cliente.
correoCorreo del cliente — Facto le reenvía el comprobante (opcional).
itemsÍtems del comprobante.
descripcionDescripción del ítem.
unidadMedidaUnidad de medida SUNAT (ej. NIU, ZZ).
cantidadCantidad.
precioUnitarioPrecio unitario, IGV incluido.
tipoIgvCódigo de afectación IGV — ver la tabla en Conceptos.
cuotasRequerido si formaPago es CREDITO — cronograma de pago. Facto asigna el número de cuota en la respuesta.
montoMonto de la cuota.
fechaVencimientoFecha de vencimiento de la cuota.
data.entorno confirma si la key usada era test (aquí, demo) o live — ver Autenticación. data.documento.estado es el estado SUNAT del comprobante (ACEPTADA, EN_PROCESO o RECHAZADA) — Estados de documento. Cuando es ACEPTADA, data.enlaces trae los enlaces de descarga (pdf, pdfTicket, xml, cdr) y data.hash/data.cadenaQr/data.codigoBarras para la representación impresa.
Cada ítem de la respuesta trae valorUnitario (precio sin IGV) junto al precioUnitario que enviaste (con IGV) — en el ejemplo, 500 × 1.18 = 590.
Pago a crédito (documento.cuotas[])
Si documento.formaPago es "CREDITO", agrega documento.fechaVencimiento (fecha de la última cuota) y documento.cuotas[] con el cronograma de pago. Cada cuota solo necesita monto y fechaVencimiento — Facto asigna el numero de cuota en la respuesta. Ver Factura al crédito para un ejemplo completo.
Si el envío a SUNAT falla después de crear
El comprobante puede quedar creado en Facto aunque la transmisión a SUNAT falle (por ejemplo, un problema al leer la respuesta de SUNAT). En ese caso la respuesta no sigue el envelope estándar de Errores — trae estos campos propios del escenario:
{
"success": false,
"code": "INVOICE_SEND_FAILED_AFTER_CREATE",
"message": "El comprobante se creó pero el envío a SUNAT falló.",
"error": "SUNAT send failed: extracting CDR from response: could not find applicationResponse or content node in the XML response",
"comprobante_id": "60f2c04c-61cc-4a9e-84fb-45db67c5fcb9",
"reintentar_en": "/invoices/60f2c04c-61cc-4a9e-84fb-45db67c5fcb9/send"
}| Campo | Descripción |
|---|---|
code | INVOICE_SEND_FAILED_AFTER_CREATE — el comprobante sí se creó. |
comprobante_id | Id del comprobante ya creado — no vuelvas a crearlo, reintenta el envío. |
error | Detalle técnico de la falla (para logs/soporte). |
message | Mensaje legible para mostrar al usuario. |
reintentar_en | Ruta para reintentar solo el envío, sin crear un comprobante nuevo. |
Reintenta con un POST a la ruta indicada en reintentar_en (/invoices/{id}/send) — reutiliza el mismo comprobante_id, evitando duplicar el correlativo.
Variantes de factura
El mismo endpoint cubre distintos escenarios de facturación — solo cambia el payload. Cada uno tiene su propia página con ejemplo en la barra lateral, bajo Facturas. Los marcados Pronto ahí todavía no tienen campos en la API — la página explica qué falta.
Notas de crédito y débito
/comprobantes/emitir — ver Documentos.