Retención y percepción
Los emiten los agentes que SUNAT designa. El comprobante de retención (tipo 20) declara
lo que retuviste al pagar a un proveedor; el de percepción (tipo 40), lo que percibiste
al cobrar a un cliente. Declaras los pagos; Emitay calcula lo retenido o percibido, el neto y
los totales, siempre en soles.
Retención
Sección titulada «Retención»curl https://api.emitay.com/v1/retentions \ -H "Authorization: Bearer $EMITAY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "series": "R001", "issue_date": "2026-10-08", "supplier": { "document_number": "20601234565", "name": "COMERCIAL ANDINA S.A.C." }, "regime": { "code": "01" }, "documents": [ { "type": "01", "series": "F001", "number": 245, "issue_date": "2026-10-01", "total": "1180.00", "payment": { "date": "2026-10-07", "amount": "1180.00" } } ] }'$cabeceras = @{ Authorization = "Bearer $env:EMITAY_API_KEY"}$cuerpo = @'{ "series": "R001", "issue_date": "2026-10-08", "supplier": { "document_number": "20601234565", "name": "COMERCIAL ANDINA S.A.C." }, "regime": { "code": "01" }, "documents": [ { "type": "01", "series": "F001", "number": 245, "issue_date": "2026-10-01", "total": "1180.00", "payment": { "date": "2026-10-07", "amount": "1180.00" } } ]}'@Invoke-RestMethod -Method Post ` -Uri https://api.emitay.com/v1/retentions ` -Headers $cabeceras ` -ContentType "application/json; charset=utf-8" ` -Body $cuerpoimport { Emitay } from "emitay";
const emitay = new Emitay(); // toma la llave de EMITAY_API_KEY
const retencion = await emitay.retentions.create({ series: "R001", issue_date: "2026-10-08", supplier: { document_number: "20601234565", name: "COMERCIAL ANDINA S.A.C." }, regime: { code: "01" }, documents: [ { type: "01", series: "F001", number: 245, issue_date: "2026-10-01", total: "1180.00", payment: { date: "2026-10-07", amount: "1180.00" }, }, ],});-
supplieres el proveedor al que pagaste: siempre con RUC. -
regime.codees el régimen (catálogo 23). La tasa la fija el régimen: no se envía.Código Tasa 013 % 026 %, solo para comprobantes emitidos hasta el 2014-02-28 -
documentslleva una entrada por pago: el comprobante que pagaste (tipo, serie, número, fecha y total) y, enpayment, la fecha y el importe del pago.
La respuesta trae en total el importe retenido: 3 % de S/ 1,180.00 son S/ 35.40.
Percepción
Sección titulada «Percepción»curl https://api.emitay.com/v1/perceptions \ -H "Authorization: Bearer $EMITAY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "series": "P001", "issue_date": "2026-10-08", "customer": { "document_type": "6", "document_number": "20100066603", "name": "CLIENTE S.A." }, "regime": { "code": "01" }, "documents": [ { "type": "01", "series": "F001", "number": 310, "issue_date": "2026-10-02", "total": "1180.00", "collection": { "date": "2026-10-07", "amount": "1180.00" } } ] }'$cabeceras = @{ Authorization = "Bearer $env:EMITAY_API_KEY"}$cuerpo = @'{ "series": "P001", "issue_date": "2026-10-08", "customer": { "document_type": "6", "document_number": "20100066603", "name": "CLIENTE S.A." }, "regime": { "code": "01" }, "documents": [ { "type": "01", "series": "F001", "number": 310, "issue_date": "2026-10-02", "total": "1180.00", "collection": { "date": "2026-10-07", "amount": "1180.00" } } ]}'@Invoke-RestMethod -Method Post ` -Uri https://api.emitay.com/v1/perceptions ` -Headers $cabeceras ` -ContentType "application/json; charset=utf-8" ` -Body $cuerpoimport { Emitay } from "emitay";
const emitay = new Emitay(); // toma la llave de EMITAY_API_KEY
const percepcion = await emitay.perceptions.create({ series: "P001", issue_date: "2026-10-08", customer: { document_type: "6", document_number: "20100066603", name: "CLIENTE S.A.", }, regime: { code: "01" }, documents: [ { type: "01", series: "F001", number: 310, issue_date: "2026-10-02", total: "1180.00", collection: { date: "2026-10-07", amount: "1180.00" }, }, ],});-
customeres a quien cobraste; admite cualquier tipo de documento del catálogo 06. -
regime.codees del catálogo 22:Código Régimen Tasa 01Venta interna 2 % 02Adquisición de combustible 1 % 03Agente de percepción con tasa especial 0.5 % -
Cada entrada de
documentsllevacollection(el cobro) en lugar depayment.
Reglas de los pagos
Sección titulada «Reglas de los pagos»SUNAT valida estas reglas, y Emitay las comprueba antes de numerar. Un 422 nombra el campo
(documents.0.payment.date) y no consume número.
- Un comprobante cubre los pagos de un solo mes, el de su fecha de emisión. Un pago no puede ser posterior a la fecha de emisión ni anterior a la del comprobante que paga.
- Un comprobante pagado en partes se repite: una entrada por pago, con el mismo
comprobante y otro
payment.number(1, 2, 3…). Los pagos de un comprobante no pueden sumar más que su total. - En otra moneda, la entrada lleva
currencyyexchange_rate: soles por unidad de esa moneda el día del pago. En soles no se envía. - Una nota de crédito (
type: "07") solo se informa: va sin pago y no suma. - Qué comprobantes admite: la retención, facturas (
01), tickets (12) y notas de débito (08); la percepción, además, boletas (03).
Las fechas del ejemplo son de un mismo mes. Si omites issue_date, es hoy, y los pagos
deben ser de este mes.
Lo que aún no se ofrece
Sección titulada «Lo que aún no se ofrece»Referir un comprobante de retención o percepción revertido, la percepción excepcional y el domicilio de la contraparte en el XML.
Se anulan con la misma llamada que cualquier otro comprobante: ver Anular. Los campos están en la referencia: retención y percepción.