Saltar al contenido
Tarifa anual desde S/ 37 al mes + IGV. Pide tu demo sin costo. Reserva tu demo
Sistema Facturación Perú
Menú del portal

Guías por comprobante

Comprobante de percepción electrónico por API

JSON mínimo para emitir el comprobante de percepción (40) por API cuando eres agente de percepción: cliente, comprobantes cobrados e importes percibidos.

Actualizado el

El comprobante de percepción (tipo 40) lo emite el agente de percepción designado por SUNAT cuando cobra a sus clientes un porcentaje adicional al venderles ciertos bienes (por ejemplo, combustible o harina). Si SUNAT no te lo comunicó, no lo necesitas.

  • Endpoint: POST /percepciones · alcance comprobantes.emitir · desde el Plan PRO.
  • En la empresa: Configuración › Empresa › Datos y facturación SUNAT › «Soy agente de percepción».
  • Usa el mismo JSON de la API antigua (/api/perceptions); el local sale de tu clave o de establecimiento.

JSON mínimo

Cobras una factura de S/ 1.000 y percibes el 2 % (S/ 20):

{
  "serie_documento": "P001",
  "numero_documento": "#",
  "fecha_de_emision": "2026-11-04",
  "hora_de_emision": "11:30:00",
  "codigo_tipo_documento": "40",
  "datos_del_cliente_o_receptor": {
    "codigo_tipo_documento_identidad": "6",
    "numero_documento": "20601234567",
    "apellidos_y_nombres_o_razon_social": "BODEGA LIMA S.A.C.",
    "codigo_pais": "PE",
    "ubigeo": "150101",
    "direccion": "Av. Lima 1"
  },
  "codigo_tipo_percepcion": "01",
  "observaciones": "Percepción de la factura F001-121",
  "totales": {
    "total_percibido": 20,
    "total_pagado": 1020
  },
  "documentos": [{
    "codigo_tipo_documento": "01",
    "serie_documento": "F001",
    "numero_documento": "121",
    "fecha_de_emision": "2026-11-02",
    "codigo_tipo_moneda": "PEN",
    "total_documento": 1000,
    "pagos": [{ "fecha_de_pago": "2026-11-04", "total_pago": 1000, "codigo_tipo_moneda": "PEN" }],
    "fecha_de_percepcion": "2026-11-04",
    "total_percibido": 20,
    "total_a_pagar": 1020,
    "total_pagado": 1020
  }]
}

Se envía igual que la retención, a POST /percepciones:

curl -X POST https://pruebas.sistemafacturacionperu.com/api/v1/percepciones \
  -H "Authorization: Bearer $SFP_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: percepcion-$(uuidgen)" \
  -d @percepcion.json
<?php
$ch = curl_init('https://pruebas.sistemafacturacionperu.com/api/v1/percepciones');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_TIMEOUT => 90,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('SFP_API_KEY'),
        'Content-Type: application/json',
        'Idempotency-Key: ' . bin2hex(random_bytes(16)),
    ],
    CURLOPT_POSTFIELDS => file_get_contents('percepcion.json'),
]);
$percepcion = json_decode(curl_exec($ch), true)['data'];
const res = await fetch('https://pruebas.sistemafacturacionperu.com/api/v1/percepciones', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SFP_API_KEY}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': randomUUID(),
  },
  body: await readFile('percepcion.json', 'utf8'),
});
const { data: percepcion } = await res.json();
r = requests.post(
    "https://pruebas.sistemafacturacionperu.com/api/v1/percepciones",
    json=json.load(open("percepcion.json", encoding="utf-8")),
    headers={"Authorization": f"Bearer {os.environ['SFP_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
    timeout=90,
)
percepcion = r.json()["data"]

Tipos de percepción

codigo_tipo_percepcion Tasa Para qué
01 2 % Percepción venta interna
02 1 % Adquisición de combustible
03 0,5 % Agente de percepción con tasa especial

Son el catálogo 22 de SUNAT. La percepción siempre es en soles: si el comprobante cobrado es en dólares, agrega su tipo_de_cambio como en la retención.

Portal para desarrolladores · ¿Algo no está claro o te falta un ejemplo? Escríbenos y lo mejoramos.