API para emitir desde tu sistema
Si ya tienes un software, mándanos cantidad y precio: nosotros calculamos el IGV, firmamos, enviamos a SUNAT y te devolvemos el CDR. Sin cambiar cómo vendes.
01 Lo básico
Antes de la primera llamada
- URL base
https://backend.misventas.pe/api/v2/public- Autenticación
Authorization: Bearer TU_CREDENCIAL- Permisos
comprobantes.emitir · productos.leer · …- Formato
application/json
Todas las rutas cuelgan de acá. Solo HTTPS.
La credencial se crea desde tu cuenta y ya dice de qué empresa es: no hay cabecera de negocio. Se revoca cuando quieras.
Cada credencial lleva solo los permisos que le des. Una integración que factura no necesita poder anular.
Peticiones y respuestas en JSON, con acentos en UTF-8.
La credencial emite comprobantes con tu RUC. Guárdala en el servidor, en una variable de entorno, y nunca en el código del navegador ni en un repositorio. Solo se muestra entera al crearla.
02 Un ejemplo
Emitir un comprobante
Mandas el cliente y los ítems con cantidad y precio. El IGV y los totales los calcula el servidor; el XML se firma, va a SUNAT y vuelve el resultado.
curl -X POST https://backend.misventas.pe/api/v2/public/comprobantes \
-H "Authorization: Bearer TU_CREDENCIAL" \
-H "Content-Type: application/json" \
-d '{
"tipo": "boleta",
"cliente": {
"tipo_documento": "1",
"numero_documento": "45678912",
"razon_social": "Rosa Quispe"
},
"items": [
{ "codigo_interno": "ARZ5", "cantidad": 2, "precio_unitario": 24.90 },
{ "codigo_interno": "ACE1", "cantidad": 1, "precio_unitario": 9.50 }
]
}'{
"success": true,
"data": {
"id": "a1b2c3d4-…",
"tipo": "boleta",
"numero_completo": "B001-4821",
"fecha_emision": "2026-09-15",
"moneda": "PEN",
"cliente": { "numero_documento": "45678912", "razon_social": "Rosa Quispe" },
"totales": { "gravado": 50.25, "igv": 9.05, "total": 59.30 },
"estado": "aceptado",
"sunat": { "enviado": true, "aceptado": true, "hash": "k9Lm…" },
"enlaces": {
"pdf": "https://…/pdf",
"xml": "https://…/xml",
"cdr": "https://…/cdr"
}
}
}precio_unitario es con IGV; si tienes el valor sin IGV mandavalor_unitario y te ahorras un redondeo. Sin seriese usa la del local. La respuesta trae el estado ante SUNAT y los enlaces al XML, el PDF y el CDR. El cuerpo completo de cada ruta está en la documentación.
03 Referencia
Endpoints disponibles
Todos cuelgan de https://backend.misventas.pe/api/v2/public. Cada ruta pide un permiso y la credencial tiene que tenerlo.
Empresa
Con quién estás hablando. Es la primera llamada de toda integración: si responde, la credencial sirve.
- GET
/empresaDatos de la empresa de la credencial. No pide permiso.
Catálogos
Lo que hace falta saber antes de emitir: qué series existen y qué códigos usa SUNAT.
- GET
/catalogos/seriesSeries por tipo de comprobante y local.catalogos.leer - GET
/catalogos/establecimientosLocales de la empresa.catalogos.leer - GET
/catalogos/tablasTipos de documento, unidades, afectaciones del IGV.catalogos.leer
Comprobantes
Facturas, boletas, notas de crédito y de débito. Mandas cantidad y precio; el IGV, las bases y los totales los calcula el servidor, y en la misma llamada se firma y se envía a SUNAT.
- GET
/comprobantesLista los comprobantes emitidos.comprobantes.leer - POST
/comprobantesEmite un comprobante y lo envía a SUNAT.comprobantes.emitir - GET
/comprobantes/{id}Uno en detalle, con su estado y sus enlaces.comprobantes.leer - POST
/comprobantes/{id}/reenviarVuelve a enviar a SUNAT uno que quedó pendiente.comprobantes.emitir - POST
/comprobantes/{id}/anularComunicación de baja. Permiso aparte: facturar no es anular.comprobantes.anular - GET
/comprobantes/{id}/anulacionCómo va la baja: SUNAT la procesa por ticket.comprobantes.leer
Notas de venta
Ventas internas que no van a SUNAT. Sirven para registrar primero y convertir en comprobante después.
- GET
/notas-ventaLista las notas de venta.notas-venta.leer - POST
/notas-ventaCrea una notas de venta.notas-venta.escribir - GET
/notas-venta/{id}Devuelve uno, con sus ítems.notas-venta.leer - POST
/notas-venta/{id}/anularLo anula.notas-venta.escribir
Cotizaciones
Presupuestos que todavía no son una venta, con la serie del local.
- GET
/cotizacionesLista las cotizaciones.cotizaciones.leer - POST
/cotizacionesCrea una cotizaciones.cotizaciones.escribir - GET
/cotizaciones/{id}Devuelve uno, con sus ítems.cotizaciones.leer - POST
/cotizaciones/{id}/anularLo anula.cotizaciones.escribir
Pedidos
Pedidos que reservan stock al tomarse y se facturan después sin descontar dos veces.
- GET
/pedidosLista los pedidos.pedidos.leer - POST
/pedidosCrea los pedidos.pedidos.escribir - GET
/pedidos/{id}Devuelve uno, con sus ítems.pedidos.leer - POST
/pedidos/{id}/anularLo anula.pedidos.escribir
Productos
El catálogo. Lo lees para armar la venta o lo mantienes desde tu sistema.
- GET
/productosLista el catálogo, con búsqueda.productos.leer - POST
/productosCrea un producto.productos.escribir - GET
/productos/{id}Uno en detalle.productos.leer - PUT
/productos/{id}Actualiza precio, nombre o código.productos.escribir
04 Cuando algo falla
Errores que vas a ver
- 401
Credencial inválida
La credencial no existe, se revocó o no se mandó. Revisa la cabecera Authorization.
- 403
Sin permiso
La credencial no tiene el permiso que pide esa ruta, o la empresa no tiene contratado el módulo API. El mensaje dice cuál de las dos.
- 422
Datos incompletos
Falta un campo obligatorio o tiene un formato que SUNAT no acepta. La respuesta dice cuál y en qué ítem.
- 429
Demasiadas peticiones
Superaste el límite por minuto de tu empresa. Espera y reintenta; el límite se ve en la cabecera de la respuesta.
¿Vas a integrar?
Crea la credencial desde tu cuenta y empieza con GET /empresa. El cuerpo exacto de cada ruta está en la documentación completa. Si te trabas, hablas con quien mantiene la API.