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

Liquidación de compra electrónica por API

JSON mínimo para emitir la liquidación de compra electrónica (04) por API cuando compras a una persona sin RUC: vendedor, lugar de la operación, ítems y totales.

Actualizado el

La liquidación de compra (tipo 04) la emites tú, el comprador, cuando le compras a una persona natural que no tiene RUC ni puede darte un comprobante (por ejemplo, un productor agrícola o un recolector). Sustenta tu compra y el crédito fiscal.

  • Endpoint: POST /liquidaciones-compra · alcance comprobantes.emitir · desde el Plan PRO.
  • Usa el mismo JSON de la API antigua (/api/purchase-settlements); el local sale de tu clave o de establecimiento.
  • Serie: la de liquidaciones de compra de tu local (GET /establecimientos, tipo 04). En el ejemplo, L001.

JSON mínimo

Compras 500 kg de papa a S/ 1,18 el kilo con IGV:

{
  "serie_documento": "L001",
  "numero_documento": "#",
  "fecha_de_emision": "2026-11-04",
  "hora_de_emision": "08:30:00",
  "codigo_tipo_operacion": "0101",
  "codigo_tipo_documento": "04",
  "codigo_tipo_moneda": "PEN",
  "datos_del_proveedor_o_receptor": {
    "codigo_tipo_documento_identidad": "1",
    "numero_documento": "41234567",
    "apellidos_y_nombres_o_razon_social": "Juan Mamani Quispe",
    "codigo_pais": "PE",
    "ubigeo": "080101",
    "direccion": "Comunidad San Jerónimo s/n"
  },
  "datos_de_la_operacion": {
    "codigo_pais": "PE",
    "ubigeo": "080101",
    "direccion": "Comunidad San Jerónimo s/n"
  },
  "totales": {
    "total_operaciones_gravadas": 500,
    "total_igv": 90,
    "total_impuestos": 90,
    "total_valor": 500,
    "subtotal_compra": 590,
    "total_compra": 590
  },
  "items": [{
    "codigo_interno": "PAPA-01",
    "descripcion": "Papa blanca",
    "unidad_de_medida": "KGM",
    "cantidad": 500,
    "valor_unitario": 1,
    "codigo_tipo_precio": "01",
    "precio_unitario": 1.18,
    "codigo_tipo_afectacion_igv": "10",
    "total_base_igv": 500,
    "porcentaje_igv": 18,
    "total_igv": 90,
    "total_impuestos": 90,
    "total_valor_item": 500,
    "total_item": 590
  }]
}
curl -X POST https://pruebas.sistemafacturacionperu.com/api/v1/liquidaciones-compra \
  -H "Authorization: Bearer $SFP_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: liquidacion-$(uuidgen)" \
  -d @liquidacion.json
<?php
$ch = curl_init('https://pruebas.sistemafacturacionperu.com/api/v1/liquidaciones-compra');
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('liquidacion.json'),
]);
$liquidacion = json_decode(curl_exec($ch), true)['data'];
const res = await fetch('https://pruebas.sistemafacturacionperu.com/api/v1/liquidaciones-compra', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SFP_API_KEY}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': randomUUID(),
  },
  body: await readFile('liquidacion.json', 'utf8'),
});
const { data: liquidacion } = await res.json();
r = requests.post(
    "https://pruebas.sistemafacturacionperu.com/api/v1/liquidaciones-compra",
    json=json.load(open("liquidacion.json", encoding="utf-8")),
    headers={"Authorization": f"Bearer {os.environ['SFP_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
    timeout=90,
)
liquidacion = r.json()["data"]

Campos clave

Campo Qué poner
datos_del_proveedor_o_receptor La persona que te vende: normalmente con DNI (1)
datos_de_la_operacion Dónde se hizo la compra: país, ubigeo y dirección
totales.subtotal_compra / total_compra El total de la compra (en las ventas se llaman subtotal_venta y total_venta)
items[].codigo_interno Obligatorio en cada línea

Si corresponde retener el impuesto a la renta, cada línea acepta codigo_tipo_afectacion_igv_impuesto_renta, porcentaje_retencion_renta y monto_retencion_renta.

La respuesta tiene la misma forma que la de la retención: número, estado, respuesta de SUNAT y enlaces públicos al PDF, XML y CDR.

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