api · Documentación
Iniciar sesión

Emisión de comprobantes electrónicos

Firma XMLDSig y envío directo a SUNAT (Factura, Boleta, Nota de Crédito, Nota de Débito y Guías de Remisión), sin depender de proveedores externos. Pensado para reemplazar servicios tipo "Facturalaya": tú generas el XML de tu comprobante (UBL 2.1), nosotros lo firmamos con tu certificado digital y lo enviamos a SUNAT — o, para la mayoría de casos, puedes saltarte el XML por completo y mandarnos solo los datos.

Este módulo usa una autenticación distinta al resto de la API: header X-Api-Key (no Authorization: Bearer). Es el token de tu cuenta, con el servicio "Emisión de Comprobantes" habilitado en tu plan.

Habilitar el servicio

Contáctanos para que activemos "Emisión de Comprobantes" en tu cuenta y te asignen un ambiente (Beta para pruebas, Producción cuando estés listo).

1. Subir tu certificado digital

POST/emision/certificado

Se hace una sola vez (o cada vez que renueves el certificado). Acepta .p12, .pfx, .pem o .cer.

NombreRequeridoDescripción
certificado_base64Contenido del archivo del certificado, en base64.
password_certificadoDependeContraseña del certificado (los .p12/.pfx normalmente la tienen).
tipo_certificadoOpcionalp12 (por defecto), pfx, pem o cer.
curl -X POST https://mblapirest.com/api/v1/emision/certificado \
  -H "X-Api-Key: TU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"certificado_base64":"MIIK...","password_certificado":"mi_clave"}'

Consultar el certificado vigente

GET/emision/certificado

{
  "tiene_certificado": true,
  "tipo": "p12",
  "valido": true,
  "dias_restantes": 340,
  "fecha_expira": "2027-01-15 00:00:00",
  "titular": {"cn": "...", "ou": "20123456789"}
}

2. La forma fácil: emitir sin armar XML

POST/emision/emitir-simple (Factura/Boleta/NC/ND) · POST/emision/emitir-guia-simple · POST/emision/emitir-guia-transportista-simple

Mándanos los datos del comprobante en JSON simple — nosotros armamos el XML, lo firmamos y lo enviamos a SUNAT, todo en una sola llamada. Elige tu caso en la lista de abajo: cada variante tiene su propia página con el ejemplo completo listo para copiar.

Campos comunes (Factura, Boleta, Nota de Crédito, Nota de Débito)

NombreRequeridoDescripción
id_tipodoc_electronico01 Factura, 03 Boleta, 07 Nota de Crédito, 08 Nota de Débito.
serie_comprobante / numero_comprobanteEj. F001 / 123.
fecha_emisionOpcionalFormato YYYY-MM-DD. Por defecto, hoy.
monedaOpcionalPEN (por defecto) o USD.
emisor_razon_socialOpcionalTu razón social tal como aparece en el comprobante. Si no la mandas, se usa tu RUC.
cliente_tipo_documentoOpcional1 DNI, 6 RUC (por defecto), 0 "Sin documento".
cliente_numero_documento / cliente_razon_socialSí*Documento y nombre/razón social del cliente. El número de documento no es obligatorio si cliente_tipo_documento es 0.
cliente_direccionOpcionalDirección del cliente, texto libre.
emisor_direccionOpcionalDirección del emisor. Requerida si mandas emisor_codigo_de_anexo.
tipo_afectacion_igvOpcional10 Gravado 18% (por defecto), 20 Exonerado, 30 Inafecto, 40 Exportación. Aplica a todo el comprobante (no se mezclan afectaciones distintas en el mismo documento).
itemsArray de {"descripcion", "cantidad", "precio_unitario", "unidad_medida"} (unidad_medida opcional, por defecto NIU).
forma_pagoOpcionalcontado (por defecto) o credito (requiere cuotas).
enviar_a_sunatOpcionaltrue (por defecto): firma y envía en el mismo paso. false: solo arma y firma, tú decides cuándo enviar con /emision/enviar.
cliente_email, monto_totalOpcionalIgual que en /emision/enviar — si los mandas, se notifica por correo al cliente al ser aceptado, con un link directo a su PDF y XML que no requiere token (se abre desde cualquier cliente de correo).

Factura

Boleta

Nota de Crédito / Débito

Guías de Remisión

Otros

3. Firmar el comprobante (con tu propio XML)

POST/emision/firmar

Recibe el XML UBL 2.1 sin firmar (tú lo generas con los datos del comprobante), lo firma con tu certificado y arma el ZIP listo para SUNAT. Necesario para Guía de Remisión con XML propio, o si necesitas mezclar más de una afectación de IGV en el mismo comprobante.

¿No sabes qué estructura debe tener ese XML? Mira la guía completa de la estructura UBL exigida por SUNAT, con ejemplo completo listo para copiar.
NombreRequeridoDescripción
id_tipodoc_electronico01 Factura, 03 Boleta, 07 Nota de Crédito, 08 Nota de Débito, 09 Guía Remitente, 31 Guía Transportista.
serie_comprobanteEj. F001.
numero_comprobanteNúmero correlativo.
xml_sin_firmarXML UBL del comprobante, en base64.
curl -X POST https://mblapirest.com/api/v1/emision/firmar \
  -H "X-Api-Key: TU_TOKEN" -H "Content-Type: application/json" \
  -H "Idempotency-Key: factura-F001-123" \
  -d '{
    "id_tipodoc_electronico": "01",
    "serie_comprobante": "F001",
    "numero_comprobante": 123,
    "xml_sin_firmar": "PD94bWwgdmVyc2lvbj0i..."
  }'
{
  "nombre_zip": "20123456789-01-F001-123.zip",
  "zip_base64": "UEsDBBQA...",
  "xml_firmado_base64": "PD94bWwgdmVyc2lvbj0i...",
  "ambiente": "beta",
  "siguiente_paso": "POST /v1/emision/enviar para enviarlo a SUNAT."
}

4. Enviar a SUNAT

POST/emision/enviar

Envía el ZIP ya firmado (sendBill) y devuelve el resultado del CDR en la misma llamada.

Mismos parámetros id_tipodoc_electronico/serie_comprobante/numero_comprobante que /firmar.

{
  "estado": "aceptado",
  "codigo_sunat": "0",
  "descripcion": "La Factura numero F001-123, ha sido aceptada",
  "notas": []
}

estado puede ser aceptado o rechazado. Si necesitas reintentar el envío (por ejemplo tras un timeout), usa POST /emision/reenviar con los mismos parámetros — es la misma operación, segura de repetir.

Tip: manda el header Idempotency-Key (un valor único por comprobante) en /firmar y /enviar. Si repites la llamada con la misma clave, te devolvemos la respuesta original en vez de reprocesar — útil si tu sistema reintenta automáticamente ante un timeout de red.

Consultar el estado

POST/emision/consultar-sunat — punto único recomendado: detecta automáticamente si corresponde consultar el CDR oficial ante SUNAT o el estado en nuestra base de datos, y sincroniza.

Alternativas específicas:

  • POST/emision/cdr — CDR oficial, solo Factura/NC/ND con serie que empieza con "F" (Anexo 2 del Manual SUNAT).
  • POST/emision/estado — estado en nuestra base de datos (Boletas y demás casos).

Consultar el historial de un documento

MétodoEndpointDescripción
GET/emision/documentosLista tus documentos (filtros opcionales: ?estado=&tipo=&desde=&hasta=).
GET/emision/documentos/{tipo}/{serie}/{numero}Detalle de un documento.
GET/emision/documentos/{tipo}/{serie}/{numero}/historialLínea de tiempo de eventos (firmado, enviado, consultado...).
GET/emision/documentos/{tipo}/{serie}/{numero}/xmlDescarga el XML firmado.
GET/emision/documentos/{tipo}/{serie}/{numero}/cdrDescarga el CDR (ZIP) recibido de SUNAT.
GET/emision/documentos/{tipo}/{serie}/{numero}/pdfDescarga la representación impresa en PDF (solo Factura/Boleta/NC/ND).

El PDF se genera automáticamente la primera vez que lo pides (a partir del XML ya firmado) y se guarda en caché — no necesitas llamar a ningún otro endpoint antes, solo haber firmado el comprobante.

curl https://mblapirest.com/api/v1/emision/documentos/01/F001/123/historial \
  -H "X-Api-Key: TU_TOKEN"

Última actualización: 03/09/2026