Guías por comprobante
Boleta de venta electrónica por API
JSON mínimo para emitir una boleta de venta electrónica por API, cuándo pedir el DNI del comprador y cómo la informa el resumen diario a SUNAT.
Actualizado el
La boleta (tipo 03) es para vender al consumidor final. A diferencia de la factura, no viaja sola a SUNAT: el
sistema la informa en el resumen diario. Por eso la respuesta trae
registrado y el estado cambia a aceptado cuando SUNAT procesa el resumen.
- Endpoint:
POST /comprobantes· alcancecomprobantes.emitir. - Serie: una de boleta de tu local (
B001…).
JSON mínimo
{
"serie_documento": "B001",
"numero_documento": "#",
"fecha_de_emision": "2026-11-04",
"hora_de_emision": "10:15:00",
"codigo_tipo_operacion": "0101",
"codigo_tipo_documento": "03",
"codigo_tipo_moneda": "PEN",
"datos_del_cliente_o_receptor": {
"codigo_tipo_documento_identidad": "1",
"numero_documento": "70123456",
"apellidos_y_nombres_o_razon_social": "Ana Pérez",
"codigo_pais": "PE"
},
"totales": {
"total_operaciones_gravadas": 50.85,
"total_igv": 9.15,
"total_impuestos": 9.15,
"total_valor": 50.85,
"total_venta": 60
},
"items": [{
"codigo_interno": "POLO-01",
"descripcion": "Polo azul talla M",
"unidad_de_medida": "NIU",
"cantidad": 2,
"valor_unitario": 25.42,
"codigo_tipo_precio": "01",
"precio_unitario": 30,
"codigo_tipo_afectacion_igv": "10",
"total_base_igv": 50.85,
"porcentaje_igv": 18,
"total_igv": 9.15,
"total_impuestos": 9.15,
"total_valor_item": 50.85,
"total_item": 60
}],
"pagos": [{ "codigo_metodo_pago": "01", "codigo_destino_pago": "cash", "monto": 60 }]
}
El paso a paso con cURL, PHP, Node.js y Python está en el inicio rápido.
El comprador
| Documento | codigo_tipo_documento_identidad |
|---|---|
| DNI | 1 |
| Carné de extranjería | 4 |
| RUC | 6 |
| Pasaporte | 7 |
| Otros (sin documento) | 0 |
- Si el total pasa de S/ 700, SUNAT exige identificar al comprador con su documento.
- Para una venta menor sin datos del comprador, usa el tipo
0y el mismo cliente genérico que usa tu empresa en la web. - Un DNI que no tiene 8 dígitos lo rechaza SUNAT (2801). Puedes validarlo antes con
GET /consultas/dni/{numero}.
Ticket o A4
El PDF sale en el formato que pidas: GET /comprobantes/{id}/pdf?formato=ticket, ticket_58, ticket_50, a5 o
a4 (el de siempre). La respuesta de la emisión ya trae enlaces.pdf_ticket.
Cuándo queda aceptada
- Emites:
registrado. - El sistema envía el resumen diario con las boletas de los días anteriores y consulta su ticket: el resumen queda
enviado. - SUNAT lo procesa: cada boleta pasa a
aceptado(orechazado) y te llegan los webhooksresumen.procesadoycomprobante.aceptado.
No necesitas llamar a nada para que esto pase. Si consultas una boleta con GET /comprobantes/{id} verás su estado al
momento.
Anular una boleta
POST /comprobantes/{id}/anular con un motivo: el sistema arma el resumen de anulación (no la comunicación de
baja, que es para facturas). Solo se anulan boletas aceptadas u observadas. Detalle en
Anular.