Facturación Electrónica para tu negocio
API REST unificada de Facturación Electrónica. Emite facturas, boletas, notas de crédito/débito y guías de remisión directamente a la SUNAT u OSE. Compatible con firmas digitales locales y planes gestionados.
Características Principales
Facturas y Boletas
Emisión directa en formato XML con firma digital local. Generación síncrona con CDR inmediato de SUNAT.
Guías de Remisión
Integrado con la nueva API REST de SUNAT (GRE). Generación rápida con firmas de autenticación.
Certificados Digitales PEM/PFX
Sube y administra múltiples certificados digitales de forma segura y con descarga cifrada.
Notas de Crédito y Débito
Emisión de notas de crédito (07) y débito (08) para anular o modificar comprobantes, con envío síncrono y CDR inmediato.
Comunicaciones de Baja
Anula comprobantes con comunicaciones de baja (09) enviadas a SUNAT, con seguimiento del estado de cada lote.
Resúmenes Diarios
Agrupa tus boletas del día en resúmenes de boletas (RC) para SUNAT y consulta el estado de cada envío.
Descarga Masiva RVE/RCE
Descarga automática de tus Registros Electrónicos de Ventas y Compras (SIRE) de SUNAT en formato ZIP, por mes o día específico.
Multiempresa
Administra múltiples empresas y RUC desde un solo panel, cada una con su certificado digital y sus credenciales SUNAT independientes.
Nuestros Planes de Servicio
Plan Free
Ideal para pruebas e integraciones iniciales de desarrollo.
- Límite de 100 comprobantes mensuales.
- Entorno de pruebas y producción.
- Consola interactiva de JSON y pruebas de envío.
Premium SUNAT
Comprobantes ilimitados directamente a SUNAT con firma digital local.
- Envíos ilimitados al mes.
- Firma local con certificado digital propio.
- Descarga segura de certificados cargados.
NubeFact Premium
Comprobantes ilimitados enrutados a la plataforma OSE/PSE NubeFact.
- Enrutamiento directo a la API de Nubefact.
- No requiere cargar certificado digital local.
- Ideal si ya posees cuenta de Nubefact activa.
Certificado Digital de Prueba Gratis
¿No tienes un certificado para realizar tus pruebas en entorno Beta? ¡No te preocupes! Al registrarte e iniciar sesión, dispones de una opción directa en el Menú Lateral ("Certificado de Prueba") para generar, vincular y descargar tu certificado digital auto-firmado (.pfx) al instante y de forma 100% gratuita.
Información de Pagos y Soporte
Para activar o renovar tu plan Premium, envía tu constancia de pago al correo karlorde@cmocsofts.com o al WhatsApp/Celular 902743480.
Lista de empresas
🏢
No hay empresas registradas aún.
| Código | RUC | Razón Social | Usuario SOL | Plan | Vencimiento | Entorno | Estado | Acciones |
|---|---|---|---|---|---|---|---|---|
| Cargando empresas... | ||||||||
Configuración Global de Facturación
Límites y Alertas Globales
Configura los límites y alertas globales del sistema.
Plazos de Envío SUNAT
La API bloquea o deriva comprobantes según estos plazos. Se verifican antes del envío a SUNAT.
Consulta RUC/DNI
Endpoint y token del servicio de consultas que usan los botones "🔍 Consultar" del registro y del formulario de empresa. El token se guarda en el servidor (tabla settings) y se inyecta vía el proxy local /consulta-ruc-dni; nunca se expone en el navegador.
connect-src del .htaccess.
Gestión de Usuarios
| Email / Usuario | Teléfono | Rol | Estado | Última Actividad | Fecha Registro | Acciones |
|---|---|---|---|---|---|---|
| Cargando usuarios... | ||||||
Registrar Empresa
Detalles de la Empresa
Mis Datos de la Empresa
Mi Cuenta
Certificado Digital de Prueba
Genera tu Certificado de Pruebas al Instante
Para enviar comprobantes al entorno Beta (Pruebas) de la SUNAT, necesitas un certificado digital. Desde aquí puedes generar uno auto-firmado de prueba para tu RUC totalmente gratis.
- Formato estándar PKCS#12 (archivo
.pfx). - Contraseña por defecto del certificado:
123456. - Se vincula automáticamente a tu empresa en el sistema para que puedas facturar inmediatamente.
Estado del Certificado Digital en el Sistema:
Consola de Pruebas
1. Estructura JSON de Prueba
2. Resultado de SUNAT
Esperando Envío de Prueba
Cargue una plantilla, elija la empresa en el selector y presione enviar.
Procesando con SUNAT...
Construyendo XML, firmando digitalmente y enviando al Web Service...
Constancia de Recepción CDR
La Factura número F001-1, ha sido aceptada.
Descargas directas (Pruebas)
Detalle del Error
Debe consignar el Total Precio de Venta
Revise la estructura del JSON y verifique que los montos e impuestos estén calculados correctamente.
// La respuesta JSON aparecerá aquí...
Guía de Integración con la API
Factura Básica (Estructura Estándar)
Utilízala para transacciones comerciales regulares que requieren facturación electrónica (tipoDoc: 01).
{
"tipoDoc": "01",
"serie": "F001",
"correlativo": "1",
"fechaEmision": "2026-07-15T08:00:00-05:00",
"moneda": "PEN",
"total": 118.00,
"totalGravado": 100.00,
"formaPago": "CONTADO",
"company": {
"ruc": "20123456789",
"razonSocial": "EMPRESA DE PRUEBA S.A.C.",
"nombreComercial": "EMPRESA DE PRUEBA",
"address": {
"ubigueo": "150135",
"departamento": "LIMA",
"provincia": "LIMA",
"distrito": "SAN MARTIN DE PORRES",
"direccion": "AV. JOSE GRANDA 2992"
}
},
"cliente": {
"tipoDoc": "6",
"numDoc": "20440970708",
"razonSocial": "CMOCSOFTS S.A.C."
},
"detalles": [
{
"codigo": "P001",
"descripcion": "SERVICIO DE DESARROLLO DE SOFTWARE",
"cantidad": 1,
"unidadMedida": "NIU",
"valorUnitario": 100.00,
"precioUnitario": 118.00,
"valorVenta": 100.00,
"tipoAfectacionIgv": "10",
"porcentajeIgv": 18,
"igv": 18.00
}
],
"leyendas": [
{
"codigo": "1000",
"valor": "SON CIENTO DIECIOCHO Y 00/100 SOLES"
}
]
}
📥 Respuesta de la API (200 OK)
{
"success": true,
"message": "Documento aceptado por SUNAT.",
"xml_base64": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4...",
"cdr_base64": "UEsDBBQAAAAIAIiWkF...",
"filename": "01-F001-1",
"qr_string": "20123456789|01|F001|1|18.00|118.00|2026-07-15|6|20440970708|...",
"qr_base64": "data:image/svg+xml;base64,...",
"pdf_base64": "...(PDF en base64)...",
"cdr": {
"code": "0",
"description": "La Factura numero F001-1, ha sido aceptada",
"notes": []
}
}
❌ Respuesta de Error — Validación fallida (400)
{
"success": false,
"error_code": "VALIDATION_ERROR",
"message": "Credenciales SOL no configuradas para el emisor RUC 20123456789."
}
⚠️ Respuesta de Error — Duplicado (409)
{
"success": false,
"error_code": "DUPLICATE",
"message": "El comprobante F001-1 ya fue aceptado previamente por SUNAT."
}
🔴 Respuesta de Error — SUNAT no disponible (502)
{
"success": false,
"error_code": "SUNAT_UNAVAILABLE",
"message": "Error al enviar a SUNAT.",
"error_message": "No se pudo conectar con el servidor de SUNAT.",
"retryable": true
}
Boleta Básica (Estructura Estándar)
Estructura JSON básica para la generación de Boletas de Venta Electrónicas para personas naturales (tipoDoc: 03).
{
"tipoDoc": "03",
"serie": "B001",
"correlativo": "1",
"fechaEmision": "2026-07-15T08:00:00-05:00",
"moneda": "PEN",
"total": 118.00,
"totalGravado": 100.00,
"formaPago": "CONTADO",
"company": {
"ruc": "20123456789",
"razonSocial": "EMPRESA DE PRUEBA S.A.C.",
"nombreComercial": "EMPRESA DE PRUEBA",
"address": {
"ubigueo": "150135",
"departamento": "LIMA",
"provincia": "LIMA",
"distrito": "SAN MARTIN DE PORRES",
"direccion": "AV. JOSE GRANDA 2992"
}
},
"cliente": {
"tipoDoc": "1",
"numDoc": "44556677",
"razonSocial": "JUAN PEREZ"
},
"detalles": [
{
"codigo": "P001",
"descripcion": "SERVICIO DE DESARROLLO DE SOFTWARE",
"cantidad": 1,
"unidadMedida": "NIU",
"valorUnitario": 100.00,
"precioUnitario": 118.00,
"valorVenta": 100.00,
"tipoAfectacionIgv": "10",
"porcentajeIgv": 18,
"igv": 18.00
}
],
"leyendas": [
{
"codigo": "1000",
"valor": "SON CIENTO DIECIOCHO Y 00/100 SOLES"
}
]
}
📥 Respuesta de la API (200 OK)
{
"success": true,
"message": "Documento aceptado por SUNAT.",
"xml_base64": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4...",
"cdr_base64": "UEsDBBQAAAAIAIiWkF...",
"filename": "03-B001-1",
"qr_string": "20123456789|03|B001|1|18.00|118.00|2026-07-15|1|44556677|...",
"qr_base64": "data:image/svg+xml;base64,...",
"pdf_base64": "...(PDF en base64)...",
"cdr": {
"code": "0",
"description": "La Boleta numero B001-1, ha sido aceptada",
"notes": []
}
}
❌ Respuesta de Error — Validación fallida (400)
{
"success": false,
"error_code": "PLAZO_VENCIDO",
"message": "La fecha de emisión excede el plazo permitido para envío directo. Use Resumen Diario (RC)."
}
⚠️ Respuesta de Error — Duplicado (409)
{
"success": false,
"error_code": "DUPLICATE",
"message": "El comprobante B001-1 ya fue aceptado previamente por SUNAT."
}
🔴 Respuesta de Error — SUNAT no disponible (502)
{
"success": false,
"error_code": "SUNAT_UNAVAILABLE",
"message": "Error al enviar a SUNAT.",
"error_message": "No se pudo conectar con el servidor de SUNAT.",
"retryable": true
}
Factura Compleja (Gravados, Inafectos, Exonerados, ISC)
Utilízala para comprobantes mixtos que incluyan productos con IGV (gravados), libros u otros productos exonerados, servicios inafectos o bebidas/tabacos con Impuesto Selectivo al Consumo (ISC).
{
"tipoDoc": "01",
"serie": "F001",
"correlativo": "1",
"fechaEmision": "2026-07-15T08:00:00-05:00",
"moneda": "PEN",
"total": 301.84,
"totalGravado": 180.00,
"totalExonerado": 50.00,
"totalInafecto": 30.00,
"totalIsc": 8.00,
"totalIgv": 33.84,
"formaPago": "CONTADO",
"company": {
"ruc": "20123456789",
"razonSocial": "EMPRESA DE PRUEBA S.A.C.",
"nombreComercial": "EMPRESA DE PRUEBA",
"address": {
"ubigueo": "150135",
"departamento": "LIMA",
"provincia": "LIMA",
"distrito": "SAN MARTIN DE PORRES",
"direccion": "AV. JOSE GRANDA 2992"
}
},
"cliente": {
"tipoDoc": "6",
"numDoc": "20440970708",
"razonSocial": "CMOCSOFTS S.A.C."
},
"detalles": [
{
"codigo": "P001",
"descripcion": "DESARROLLO DE SOFTWARE (GRAVADO)",
"cantidad": 1,
"unidadMedida": "NIU",
"valorUnitario": 100.00,
"precioUnitario": 118.00,
"valorVenta": 100.00,
"tipoAfectacionIgv": "10",
"porcentajeIgv": 18,
"igv": 18.00
},
{
"codigo": "P002",
"descripcion": "LIBROS ACADEMICOS (EXONERADO)",
"cantidad": 1,
"unidadMedida": "NIU",
"valorUnitario": 50.00,
"precioUnitario": 50.00,
"valorVenta": 50.00,
"tipoAfectacionIgv": "20",
"porcentajeIgv": 0,
"igv": 0.00
},
{
"codigo": "P003",
"descripcion": "AGUA MINERAL SIN EMBALAR (INAFECTO)",
"cantidad": 1,
"unidadMedida": "NIU",
"valorUnitario": 30.00,
"precioUnitario": 30.00,
"valorVenta": 30.00,
"tipoAfectacionIgv": "30",
"porcentajeIgv": 0,
"igv": 0.00
},
{
"codigo": "P004",
"descripcion": "CERVEZA ARTESANAL (CON ISC 10%)",
"cantidad": 1,
"unidadMedida": "NIU",
"valorUnitario": 80.00,
"precioUnitario": 103.84,
"valorVenta": 80.00,
"tipoAfectacionIgv": "10",
"isc": 8.00,
"tipoSistemaIsc": "01",
"porcentajeIgv": 18,
"igv": 15.84
}
],
"leyendas": [
{
"codigo": "1000",
"valor": "SON TRESCIENTOS UN Y 84/100 SOLES"
}
]
}
📥 Respuesta de la API (200 OK)
{
"success": true,
"message": "Documento aceptado por SUNAT.",
"xml_base64": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4...",
"cdr_base64": "UEsDBBQAAAAIAIiWkF...",
"filename": "01-F001-1",
"qr_string": "20123456789|01|F001|1|33.84|301.84|2026-07-15|6|20440970708|...",
"qr_base64": "data:image/svg+xml;base64,...",
"pdf_base64": "...(PDF en base64)...",
"cdr": {
"code": "0",
"description": "La Factura numero F001-1, ha sido aceptada",
"notes": []
}
}
❌ Respuesta de Error — Validación fallida (400)
{
"success": false,
"error_code": "RUC_MISMATCH",
"message": "El RUC del emisor en el JSON (20123456789) no coincide con el RUC de tu cuenta."
}
⚠️ Respuesta de Error — Duplicado (409)
{
"success": false,
"error_code": "DUPLICATE",
"message": "El comprobante F001-1 ya fue aceptado previamente por SUNAT."
}
🔴 Respuesta de Error — SUNAT no disponible (502)
{
"success": false,
"error_code": "SUNAT_UNAVAILABLE",
"message": "Error al enviar a SUNAT.",
"error_message": "No se pudo conectar con el servidor de SUNAT.",
"retryable": true
}
Boleta Compleja (Mixta)
Comprobante de tipo boleta de venta (03) que incluye productos afectos, exonerados, inafectos e ISC.
{
"tipoDoc": "03",
"serie": "B001",
"correlativo": "1",
"fechaEmision": "2026-07-15T08:00:00-05:00",
"moneda": "PEN",
"total": 301.84,
"totalGravado": 180.00,
"totalExonerado": 50.00,
"totalInafecto": 30.00,
"totalIsc": 8.00,
"totalIgv": 33.84,
"formaPago": "CONTADO",
"company": {
"ruc": "20123456789",
"razonSocial": "EMPRESA DE PRUEBA S.A.C.",
"nombreComercial": "EMPRESA DE PRUEBA",
"address": {
"ubigueo": "150135",
"departamento": "LIMA",
"provincia": "LIMA",
"distrito": "SAN MARTIN DE PORRES",
"direccion": "AV. JOSE GRANDA 2992"
}
},
"cliente": {
"tipoDoc": "1",
"numDoc": "44556677",
"razonSocial": "JUAN PEREZ"
},
"detalles": [
{
"codigo": "P001",
"descripcion": "DESARROLLO DE SOFTWARE (GRAVADO)",
"cantidad": 1,
"unidadMedida": "NIU",
"valorUnitario": 100.00,
"precioUnitario": 118.00,
"valorVenta": 100.00,
"tipoAfectacionIgv": "10",
"porcentajeIgv": 18,
"igv": 18.00
},
{
"codigo": "P002",
"descripcion": "LIBROS ACADEMICOS (EXONERADO)",
"cantidad": 1,
"unidadMedida": "NIU",
"valorUnitario": 50.00,
"precioUnitario": 50.00,
"valorVenta": 50.00,
"tipoAfectacionIgv": "20",
"porcentajeIgv": 0,
"igv": 0.00
},
{
"codigo": "P003",
"descripcion": "AGUA MINERAL SIN EMBALAR (INAFECTO)",
"cantidad": 1,
"unidadMedida": "NIU",
"valorUnitario": 30.00,
"precioUnitario": 30.00,
"valorVenta": 30.00,
"tipoAfectacionIgv": "30",
"porcentajeIgv": 0,
"igv": 0.00
},
{
"codigo": "P004",
"descripcion": "CERVEZA ARTESANAL (CON ISC 10%)",
"cantidad": 1,
"unidadMedida": "NIU",
"valorUnitario": 80.00,
"precioUnitario": 103.84,
"valorVenta": 80.00,
"tipoAfectacionIgv": "10",
"isc": 8.00,
"tipoSistemaIsc": "01",
"porcentajeIgv": 18,
"igv": 15.84
}
],
"leyendas": [
{
"codigo": "1000",
"valor": "SON TRESCIENTOS UN Y 84/100 SOLES"
}
]
}
📥 Respuesta de la API (200 OK)
{
"success": true,
"message": "Documento aceptado por SUNAT.",
"xml_base64": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4...",
"cdr_base64": "UEsDBBQAAAAIAIiWkF...",
"filename": "03-B001-1",
"qr_string": "20123456789|03|B001|1|33.84|301.84|2026-07-15|1|44556677|...",
"qr_base64": "data:image/svg+xml;base64,...",
"pdf_base64": "...(PDF en base64)...",
"cdr": {
"code": "0",
"description": "La Boleta numero B001-1, ha sido aceptada",
"notes": []
}
}
❌ Respuesta de Error — Validación fallida (400)
{
"success": false,
"error_code": "VALIDATION_ERROR",
"message": "El campo 'descripcion' es obligatorio en cada ítem del detalle."
}
⚠️ Respuesta de Error — Duplicado (409)
{
"success": false,
"error_code": "DUPLICATE",
"message": "El comprobante B001-1 ya fue aceptado previamente por SUNAT."
}
🔴 Respuesta de Error — SUNAT no disponible (502)
{
"success": false,
"error_code": "SUNAT_UNAVAILABLE",
"message": "Error al enviar a SUNAT.",
"error_message": "No se pudo conectar con el servidor de SUNAT.",
"retryable": true
}
Guía de Remisión Electrónica Remitente (GRE)
Utilízala para sustentar el traslado de mercancías por vía terrestre dentro del territorio nacional (tipoDoc: 09). Cumple con el formato XML Guía de SUNAT (versión 2022).
{
"tipoDoc": "09",
"serie": "T001",
"correlativo": "1",
"fechaEmision": "2026-07-15T08:00:00-05:00",
"company": {
"ruc": "20123456789",
"razonSocial": "EMPRESA DE PRUEBA S.A.C.",
"nombreComercial": "EMPRESA DE PRUEBA",
"address": {
"ubigueo": "150135",
"departamento": "LIMA",
"provincia": "LIMA",
"distrito": "SAN MARTIN DE PORRES",
"direccion": "AV. JOSE GRANDA 2992"
}
},
"destinatario": {
"tipoDoc": "6",
"numDoc": "20440970708",
"razonSocial": "CMOCSOFTS S.A.C."
},
"envio": {
"motivoTraslado": "01",
"modalidadTraslado": "02",
"fechaTraslado": "2026-07-16",
"pesoTotal": 50.00,
"unidadMedida": "KGM",
"partida": {
"ubigueo": "150101",
"direccion": "Av. Principal 123"
},
"llegada": {
"ubigueo": "150115",
"direccion": "Av. Destino 456"
},
"transportista": {
"tipoDoc": "6",
"numDoc": "20556677889",
"razonSocial": "TRANSPORTES LOGISTICOS S.A."
}
},
"detalles": [
{
"codigo": "P001",
"descripcion": "CAJA DE MERCADERIA",
"cantidad": 10,
"unidadMedida": "NIU"
}
]
}
📥 Respuesta de la API (200 OK — Asíncrona)
{
"success": true,
"message": "Guía de Remisión aceptada por API REST SUNAT.",
"xml_base64": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4...",
"filename": "09-T001-1",
"ticket": "9ca2f3b9-a292-491b-8395-e83c79a835a6",
"cdr": {
"code": "0",
"description": "La Guía de Remisión ha sido aceptada. Ticket obtenido: 9ca2f3b9-a292-491b-8395-e83c79a835a6",
"notes": ["Ticket: 9ca2f3b9-a292-491b-8395-e83c79a835a6"]
}
}
❌ Respuesta de Error — Validación fallida (400)
{
"success": false,
"error_code": "PLAZO_GUIA_VENCIDO",
"message": "La guía de remisión excede el plazo máximo de envío. La fecha de traslado ya pasó."
}
🔴 Respuesta de Error — SUNAT no disponible (502)
{
"success": false,
"error_code": "SUNAT_UNAVAILABLE",
"message": "Error al enviar Guía a la API REST de SUNAT.",
"error_message": "No se pudo conectar con el servidor de SUNAT.",
"retryable": true
}
Nota de Crédito Electrónica
Utilízala para anular comprobantes, corregir montos por error o aplicar descuentos comerciales sobre facturas o boletas emitidas previamente (tipoDoc: 07).
{
"tipoDoc": "07",
"serie": "FC01",
"correlativo": "1",
"fechaEmision": "2026-07-15T08:00:00-05:00",
"moneda": "PEN",
"total": 118.00,
"totalGravado": 100.00,
"totalIgv": 18.00,
"company": {
"ruc": "20123456789",
"razonSocial": "EMPRESA DE PRUEBA S.A.C.",
"nombreComercial": "EMPRESA DE PRUEBA",
"address": {
"ubigueo": "150135",
"departamento": "LIMA",
"provincia": "LIMA",
"distrito": "SAN MARTIN DE PORRES",
"direccion": "AV. JOSE GRANDA 2992"
}
},
"cliente": {
"tipoDoc": "6",
"numDoc": "20440970708",
"razonSocial": "CMOCSOFTS S.A.C."
},
"documentoModificado": {
"tipoDoc": "01",
"numDoc": "F001-1",
"tipoNota": "01",
"motivo": "ANULACION DE LA OPERACION"
},
"detalles": [
{
"codigo": "P001",
"descripcion": "SERVICIO DE DESARROLLO DE SOFTWARE",
"cantidad": 1,
"unidadMedida": "NIU",
"valorUnitario": 100.00,
"precioUnitario": 118.00,
"valorVenta": 100.00,
"tipoAfectacionIgv": "10",
"porcentajeIgv": 18,
"igv": 18.00
}
]
}
📥 Respuesta de la API (200 OK)
{
"success": true,
"message": "Documento aceptado por SUNAT.",
"xml_base64": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4...",
"cdr_base64": "UEsDBBQAAAAIAIiWkF...",
"filename": "07-FC01-1",
"qr_string": "20123456789|07|FC01|1|18.00|118.00|2026-07-15|6|20440970708|...",
"qr_base64": "data:image/svg+xml;base64,...",
"pdf_base64": "...(PDF en base64)...",
"cdr": {
"code": "0",
"description": "La Nota de Credito numero FC01-1, ha sido aceptada",
"notes": []
}
}
❌ Respuesta de Error — Validación fallida (400)
{
"success": false,
"error_code": "VALIDATION_ERROR",
"message": "El campo 'tipoDocAfectado' es obligatorio para Notas de Crédito."
}
⚠️ Respuesta de Error — Duplicado (409)
{
"success": false,
"error_code": "DUPLICATE",
"message": "El comprobante FC01-1 ya fue aceptado previamente por SUNAT."
}
🔴 Respuesta de Error — SUNAT no disponible (502)
{
"success": false,
"error_code": "SUNAT_UNAVAILABLE",
"message": "Error al enviar a SUNAT.",
"error_message": "No se pudo conectar con el servidor de SUNAT.",
"retryable": true
}
Nota de Débito Electrónica
Utilízala para cobrar penalidades, intereses por mora o ajustar diferencias de precio en facturas o boletas ya informadas a SUNAT (tipoDoc: 08).
{
"tipoDoc": "08",
"serie": "FD01",
"correlativo": "1",
"fechaEmision": "2026-07-15T08:00:00-05:00",
"moneda": "PEN",
"total": 11.80,
"totalGravado": 10.00,
"totalIgv": 1.80,
"company": {
"ruc": "20123456789",
"razonSocial": "EMPRESA DE PRUEBA S.A.C.",
"nombreComercial": "EMPRESA DE PRUEBA",
"address": {
"ubigueo": "150135",
"departamento": "LIMA",
"provincia": "LIMA",
"distrito": "SAN MARTIN DE PORRES",
"direccion": "AV. JOSE GRANDA 2992"
}
},
"cliente": {
"tipoDoc": "6",
"numDoc": "20440970708",
"razonSocial": "CMOCSOFTS S.A.C."
},
"documentoModificado": {
"tipoDoc": "01",
"numDoc": "F001-1",
"tipoNota": "01",
"motivo": "INTERES POR MORA"
},
"detalles": [
{
"codigo": "P001",
"descripcion": "SERVICIO DE DESARROLLO DE SOFTWARE",
"cantidad": 1,
"unidadMedida": "NIU",
"valorUnitario": 10.00,
"precioUnitario": 11.80,
"valorVenta": 10.00,
"tipoAfectacionIgv": "10",
"porcentajeIgv": 18,
"igv": 1.80
}
]
}
📥 Respuesta de la API (200 OK)
{
"success": true,
"message": "Documento aceptado por SUNAT.",
"xml_base64": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4...",
"cdr_base64": "UEsDBBQAAAAIAIiWkF...",
"filename": "08-FD01-1",
"qr_string": "20123456789|08|FD01|1|1.80|11.80|2026-07-15|6|20440970708|...",
"qr_base64": "data:image/svg+xml;base64,...",
"pdf_base64": "...(PDF en base64)...",
"cdr": {
"code": "0",
}
Resumen Diario de Boletas de Venta (RC)
El resumen diario sirve para enviar boletas y sus respectivas notas asociadas de forma masiva a fin de día (tipoDoc: RC).
{
"tipoDoc": "RC",
"fechaEmision": "2026-07-15",
"fechaReferencia": "2026-07-15",
"comprobantes": [
{
"tipoDoc": "03",
"serie": "B001",
"correlativo": "1",
"moneda": "PEN",
"total": 118.00,
"totalGravado": 100.00,
"totalIgv": 18.00,
"cliente": {
"tipoDoc": "1",
"numDoc": "44556677"
}
}
]
}
📥 Respuesta de la API (200 OK — Asíncrona)
{
"success": true,
"message": "El documento fue recibido por SUNAT y está en proceso. Consulte el ticket más tarde.",
"xml_base64": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4...",
"filename": "RC-20260715-1",
"ticket": "1784124681824",
"status": "PENDING"
}
❌ Respuesta de Error — Validación fallida (400)
{
"success": false,
"error_code": "PLAZO_VENCIDO",
"message": "El Resumen Diario excede el plazo máximo de envío (día siguiente a la emisión)."
}
🔴 Respuesta de Error — SUNAT no disponible (502)
{
"success": false,
"error_code": "SUNAT_UNAVAILABLE",
"message": "Error al enviar Resumen Diario a SUNAT.",
"error_message": "No se pudo conectar con el servidor de SUNAT.",
"retryable": true
}
Comunicación de Baja (Anulación de Facturas - RA)
Estructura JSON para anular Facturas o Notas de Crédito/Débito asociadas a facturas que no fueron cobradas o presentan errores (tipoDoc: RA).
{
"tipoDoc": "RA",
"fechaEmision": "2026-07-15",
"fechaReferencia": "2026-07-15",
"comprobantes": [
{
"tipoDoc": "01",
"serie": "F001",
"correlativo": "1",
"motivo": "ERROR DE DIGITACION"
}
]
}
📥 Respuesta de la API (200 OK — Asíncrona)
{
"success": true,
"message": "El documento fue recibido por SUNAT y está en proceso. Consulte el ticket más tarde.",
"xml_base64": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4...",
"filename": "RA-20260715-1",
"ticket": "1784124681825",
"status": "PENDING"
}
❌ Respuesta de Error — Validación fallida (400)
{
"success": false,
"error_code": "PLAZO_BAJA_VENCIDO",
"message": "La Comunicación de Baja excede el plazo máximo de envío (4 días hábiles)."
}
🔴 Respuesta de Error — SUNAT no disponible (502)
{
"success": false,
"error_code": "SUNAT_UNAVAILABLE",
"message": "Error al enviar Comunicación de Baja a SUNAT.",
"error_message": "No se pudo conectar con el servidor de SUNAT.",
"retryable": true
}
Endpoints de la API
La API de Facturación Electrónica proporciona los siguientes puntos de acceso. Todas las peticiones deben ser enviadas vía método HTTP POST con el payload JSON del comprobante.
1. Enviar Comprobante
Envía y firma el comprobante directamente a SUNAT sin guardar archivos locales en el servidor. Retorna las respuestas en formato Base64.
POST https://facturacionelectronica.cmocsofts.com/send
2. Generar y Descargar XML Firmado al Instante
Genera y firma localmente el archivo XML con el certificado digital de la empresa y lo retorna directamente como una descarga en la respuesta HTTP sin escribir archivos en disco.
POST https://facturacionelectronica.cmocsofts.com/get-signed-xml
3. Enviar y Descargar CDR (Respuesta SUNAT) al Instante
Envía el comprobante a SUNAT y retorna de forma directa el archivo ZIP del CDR de SUNAT como una descarga de archivo directo en la respuesta HTTP sin escribir archivos en disco.
POST https://facturacionelectronica.cmocsofts.com/get-cdr
4. Descarga Masiva RVE/RCE (Registros de Ventas y Compras)
Descarga directa de los archivos oficiales del SIRE de SUNAT por periodo (YYYYMM). Requiere tener configuradas las credenciales SOL de tu empresa en el panel. Si SUNAT aún está generando el archivo, la respuesta incluye un ticket para consultarlo con ticket-status y descargarlo luego con file.
GET https://facturacionelectronica.cmocsofts.com/rce/download?periodo=202607
GET https://facturacionelectronica.cmocsofts.com/rce/ticket-status?ticket=N&periodo=202607
GET https://facturacionelectronica.cmocsofts.com/rce/file?archivo=NOMBRE_ARCHIVO.ZIP
GET https://facturacionelectronica.cmocsofts.com/rce/periodos
* Usa /rve/… para el Registro de Ventas Electrónico y /rce/… para Compras. Parámetros opcionales: tipo=registro|propuesta|auto, salida=zip (descarga binaria directa) y fecha=YYYY-MM-DD como alternativa al periodo.
Llamada de Integración en el Sistema
Selecciona el lenguaje de programación de tu sistema de ventas para ver el código de ejemplo de conexión:
<?php
// 1. Enviar comprobante (recibe respuesta JSON con XML/CDR en Base64)
function enviarAAPI($jsonPayload, $tokenCliente) {
$url = "https://facturacionelectronica.cmocsofts.com/send";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonPayload);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer ' . $tokenCliente
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ['code' => $httpCode, 'data' => json_decode($response, true)];
}
// 2. Descargar XML Firmado (retorna flujo de archivo XML directamente)
function descargarXmlFirmado($jsonPayload, $tokenCliente, $outputPath) {
$url = "https://facturacionelectronica.cmocsofts.com/get-signed-xml";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonPayload);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer ' . $tokenCliente
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
file_put_contents($outputPath, $response);
return true;
}
return false;
}
// 3. Descargar CDR ZIP (retorna flujo de archivo ZIP de SUNAT directamente)
function descargarCdrZip($jsonPayload, $tokenCliente, $outputPath) {
$url = "https://facturacionelectronica.cmocsofts.com/get-cdr";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonPayload);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer ' . $tokenCliente
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
file_put_contents($outputPath, $response);
return true;
}
return false;
}
// 4. Descarga Masiva RVE/RCE (Registros de Ventas y Compras - SIRE)
// Requiere credenciales SOL configuradas en el panel. Con salida=zip
// retorna el ZIP binario directo (/rce/ compras, /rve/ ventas). Si
// SUNAT aun genera el archivo responde JSON con un "ticket": consultelo
// en GET /rce/ticket-status?ticket=N&periodo=YYYYMM y descargue luego
// con GET /rce/file?archivo=NOMBRE.ZIP
function descargarRce($periodo, $tokenCliente, $outputPath) {
$url = "https://facturacionelectronica.cmocsofts.com/rce/download?periodo=" . $periodo . "&salida=zip";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $tokenCliente
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
curl_close($ch);
if ($httpCode === 200 && strpos($contentType, 'application/json') === false) {
file_put_contents($outputPath, $response); // ZIP binario
return true;
}
// JSON de respuesta: revisar si trae "ticket" pendiente
return false;
}
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
class Program
{
private static readonly HttpClient client = new HttpClient();
static async Task Main(string[] args)
{
string token = "TU_TOKEN_API_DE_64_CARACTERES";
string json = "{ ... }"; // Tu JSON del comprobante
// 1. Enviar comprobante (Retorna JSON)
string sendUrl = "https://facturacionelectronica.cmocsofts.com/send";
var reqSend = new HttpRequestMessage(HttpMethod.Post, sendUrl);
reqSend.Headers.Add("Authorization", "Bearer " + token);
reqSend.Content = new StringContent(json, Encoding.UTF8, "application/json");
var resSend = await client.SendAsync(reqSend);
string resJson = await resSend.Content.ReadAsStringAsync();
Console.WriteLine("Response JSON: " + resJson);
// 2. Descargar XML Firmado (Escribe archivo .xml)
string xmlUrl = "https://facturacionelectronica.cmocsofts.com/get-signed-xml";
var reqXml = new HttpRequestMessage(HttpMethod.Post, xmlUrl);
reqXml.Headers.Add("Authorization", "Bearer " + token);
reqXml.Content = new StringContent(json, Encoding.UTF8, "application/json");
var resXml = await client.SendAsync(reqXml);
if (resXml.IsSuccessStatusCode) {
byte[] xmlBytes = await resXml.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("comprobante.xml", xmlBytes);
Console.WriteLine("XML descargado correctamente.");
}
// 3. Descargar CDR ZIP de SUNAT (Escribe archivo .zip)
string cdrUrl = "https://facturacionelectronica.cmocsofts.com/get-cdr";
var reqCdr = new HttpRequestMessage(HttpMethod.Post, cdrUrl);
reqCdr.Headers.Add("Authorization", "Bearer " + token);
reqCdr.Content = new StringContent(json, Encoding.UTF8, "application/json");
var resCdr = await client.SendAsync(reqCdr);
if (resCdr.IsSuccessStatusCode) {
byte[] zipBytes = await resCdr.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("R-comprobante.zip", zipBytes);
Console.WriteLine("CDR ZIP descargado correctamente.");
}
// 4. Descarga Masiva RVE/RCE (SIRE) - ZIP binario directo
// (/rce/ compras, /rve/ ventas). Si SUNAT aun genera el archivo,
// la respuesta es JSON con un "ticket" para consultar luego.
string rceUrl = "https://facturacionelectronica.cmocsofts.com/rce/download?periodo=202607&salida=zip";
var reqRce = new HttpRequestMessage(HttpMethod.Get, rceUrl);
reqRce.Headers.Add("Authorization", "Bearer " + token);
var resRce = await client.SendAsync(reqRce);
string rceType = resRce.Content.Headers.ContentType?.MediaType ?? "";
if (resRce.IsSuccessStatusCode && rceType != "application/json") {
byte[] rceZip = await resRce.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("RCE_202607.zip", rceZip);
Console.WriteLine("RCE ZIP descargado.");
} else {
Console.WriteLine(await resRce.Content.ReadAsStringAsync());
}
}
}
Imports System.IO
Imports System.Net.Http
Imports System.Text
Module Program
Private ReadOnly client As New HttpClient()
Sub Main()
EjecutarAPI().Wait()
End Sub
Async Function EjecutarAPI() As Task
Dim token As String = "TU_TOKEN_API_DE_64_CARACTERES"
Dim json As String = "{ ... }"
' 1. Enviar comprobante
Dim sendUrl As String = "https://facturacionelectronica.cmocsofts.com/send"
Dim reqSend As New HttpRequestMessage(HttpMethod.Post, sendUrl)
reqSend.Headers.Add("Authorization", "Bearer " & token)
reqSend.Content = New StringContent(json, Encoding.UTF8, "application/json")
Dim resSend As HttpResponseMessage = Await client.SendAsync(reqSend)
Dim resJson As String = Await resSend.Content.ReadAsStringAsync()
Console.WriteLine("Response JSON: " & resJson)
' 2. Descargar XML Firmado
Dim xmlUrl As String = "https://facturacionelectronica.cmocsofts.com/get-signed-xml"
Dim reqXml As New HttpRequestMessage(HttpMethod.Post, xmlUrl)
reqXml.Headers.Add("Authorization", "Bearer " & token)
reqXml.Content = New StringContent(json, Encoding.UTF8, "application/json")
Dim resXml As HttpResponseMessage = Await client.SendAsync(reqXml)
If resXml.IsSuccessStatusCode Then
Dim xmlBytes As Byte() = Await resXml.Content.ReadAsByteArrayAsync()
File.WriteAllBytes("comprobante.xml", xmlBytes)
Console.WriteLine("XML descargado.")
End If
' 3. Descargar CDR ZIP
Dim cdrUrl As String = "https://facturacionelectronica.cmocsofts.com/get-cdr"
Dim reqCdr As New HttpRequestMessage(HttpMethod.Post, cdrUrl)
reqCdr.Headers.Add("Authorization", "Bearer " & token)
reqCdr.Content = New StringContent(json, Encoding.UTF8, "application/json")
Dim resCdr As HttpResponseMessage = Await client.SendAsync(reqCdr)
If resCdr.IsSuccessStatusCode Then
Dim zipBytes As Byte() = Await resCdr.Content.ReadAsByteArrayAsync()
File.WriteAllBytes("R-comprobante.zip", zipBytes)
Console.WriteLine("CDR ZIP descargado.")
End If
' 4. Descarga Masiva RVE/RCE (SIRE) - ZIP binario directo
' (/rce/ compras, /rve/ ventas). Si SUNAT aun genera el archivo,
' la respuesta es JSON con un "ticket" para consultar luego.
Dim rceUrl As String = "https://facturacionelectronica.cmocsofts.com/rce/download?periodo=202607&salida=zip"
Dim reqRce As New HttpRequestMessage(HttpMethod.Get, rceUrl)
reqRce.Headers.Add("Authorization", "Bearer " & token)
Dim resRce As HttpResponseMessage = Await client.SendAsync(reqRce)
Dim rceType As String = If(resRce.Content.Headers.ContentType?.MediaType, "")
If resRce.IsSuccessStatusCode AndAlso rceType <> "application/json" Then
Dim rceZip As Byte() = Await resRce.Content.ReadAsByteArrayAsync()
File.WriteAllBytes("RCE_202607.zip", rceZip)
Console.WriteLine("RCE ZIP descargado.")
Else
Console.WriteLine(Await resRce.Content.ReadAsStringAsync())
End If
End Function
End Module
import java.io.FileOutputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
private static final HttpClient client = HttpClient.newHttpClient();
public static void main(String[] args) {
try {
String token = "TU_TOKEN_API_DE_64_CARACTERES";
String json = "{ ... }";
// 1. Enviar comprobante
String sendUrl = "https://facturacionelectronica.cmocsofts.com/send";
HttpRequest reqSend = HttpRequest.newBuilder()
.uri(URI.create(sendUrl))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer " + token)
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<String> resSend = client.send(reqSend, HttpResponse.BodyHandlers.ofString());
System.out.println("Response: " + resSend.body());
// 2. Descargar XML Firmado
String xmlUrl = "https://facturacionelectronica.cmocsofts.com/get-signed-xml";
HttpRequest reqXml = HttpRequest.newBuilder()
.uri(URI.create(xmlUrl))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer " + token)
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<byte[]> resXml = client.send(reqXml, HttpResponse.BodyHandlers.ofByteArray());
if (resXml.statusCode() == 200) {
try (FileOutputStream fos = new FileOutputStream("comprobante.xml")) {
fos.write(resXml.body());
}
System.out.println("XML guardado.");
}
// 3. Descargar CDR ZIP
String cdrUrl = "https://facturacionelectronica.cmocsofts.com/get-cdr";
HttpRequest reqCdr = HttpRequest.newBuilder()
.uri(URI.create(cdrUrl))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer " + token)
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<byte[]> resCdr = client.send(reqCdr, HttpResponse.BodyHandlers.ofByteArray());
if (resCdr.statusCode() == 200) {
try (FileOutputStream fos = new FileOutputStream("R-comprobante.zip")) {
fos.write(resCdr.body());
}
System.out.println("CDR ZIP guardado.");
}
// 4. Descarga Masiva RVE/RCE (SIRE) - ZIP binario directo
// (/rce/ compras, /rve/ ventas). Si SUNAT aun genera el
// archivo, la respuesta es JSON con un "ticket".
String rceUrl = "https://facturacionelectronica.cmocsofts.com/rce/download?periodo=202607&salida=zip";
HttpRequest reqRce = HttpRequest.newBuilder()
.uri(URI.create(rceUrl))
.header("Authorization", "Bearer " + token)
.GET()
.build();
HttpResponse<byte[]> resRce = client.send(reqRce, HttpResponse.BodyHandlers.ofByteArray());
String rceType = resRce.headers().firstValue("Content-Type").orElse("");
if (resRce.statusCode() == 200 && !rceType.contains("application/json")) {
try (FileOutputStream fos = new FileOutputStream("RCE_202607.zip")) {
fos.write(resRce.body());
}
System.out.println("RCE ZIP guardado.");
} else {
System.out.println(new String(resRce.body())); // JSON con ticket pendiente
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
🔐 Tutorial: Cómo Crear tu Usuario Secundario en SUNAT SOL
Por motivos de seguridad tributaria, la SUNAT exige utilizar un Usuario Secundario SOL (con permisos específicos para Facturación Electrónica CPE) para enviar comprobantes mediante la API. Sigue estos sencillos pasos para crearlo en el portal oficial de la SUNAT:
Ingresar a SUNAT Operaciones en Línea (SOL)
Ingresa al sitio oficial de la SUNAT (e-menu.sunat.gob.pe) e inicia sesión con el RUC, Usuario Principal y Clave SOL Principal de la empresa.
Acceder a Administración de Usuarios Secundarios
En la barra superior derecha, haz clic sobre el nombre del usuario o empresa y selecciona la opción "Administración de Usuarios Secundarios" ➔ "Crear Usuario".
Definir Usuario y Clave SOL
Ingresa el DNI/Documento de la persona autorizada, asigna un Nombre de Usuario (ejemplo: SISTEMAS o FACTURA) y define su Clave SOL.
Asignar Perfil / Permisos de Facturación (CPE)
Haz clic en el botón "Asignar Opciones" y despliega la ruta:
Marca todas las casillas: Emisión, Envío, Consulta y Anulación de Facturas, Boletas, Notas y Guías de Remisión. Haz clic en Grabar.
Ingresar Datos en la API
Ingresa a la sección "Panel Principal" de esta API, edita tu empresa y coloca el Usuario SOL Secundario (ej: SISTEMAS) y su Clave SOL. ¡Listo! La SUNAT autorizará tus envíos síncronos.