Crear cobro
Crea un Payment Intent que representa un cobro único por un monto determinado. Puedes indicar qué métodos de pago estarán disponibles para el pagador. KUTI devuelve los datos necesarios para cada método habilitado y un único checkout_url.
POSThttps://api.kuti.pe/v1/payment-intents
Solo PEN · amount como string · en banca: institución KUTI. Preferí customer.id; si no, type + datos. Idempotency-Key recomendada.
Parámetros del body
Campo
Descripción
amountobjectrequerido
Monto a cobrar.
amountstringrequerido
Decimal como string.Ej:
50.00currencystringrequerido
Solo PEN por ahora.Ej:
PENpayment_method_typesarrayrequerido
INTEROPERABLE_QR (Yape/Plin/billeteras) y/o BANK_TRANSFER (pago de servicios → institución KUTI). YAPE (Yape afiliado) exige cliente; disponible en producción próximamente.Ej:
["INTEROPERABLE_QR", "BANK_TRANSFER"]customerobjectopcional
Cliente del cobro — misma forma que POST /customers. Orden: id (existente) → external_id → documento → correo → teléfono → crea uno nuevo. Así el mismo pagador no se duplica aunque solo envíes su correo. Si envías id, se ignora el resto (salvo custom_fields).
idstringopcional
Customer existente (cus_…). Si viene, se ignora el resto.Ej:
cus_01J8Z3K4M5N6P7Q8R9S0T1U2V3typestringopcional
INDIVIDUAL (persona) o COMPANY (empresa). Obligatorio al crear uno nuevo.Ej:
INDIVIDUALfirst_namestringopcional
Nombres. Requerido si type = INDIVIDUAL y el cliente no existe.Ej:
Maríalast_namestringopcional
Apellidos. Requerido si type = INDIVIDUAL y el cliente no existe.Ej:
Lópezcompany_namestringopcional
Razón social. Requerido si type = COMPANY y el cliente no existe.
emailstringopcional
Correo. Si ya tienes un cliente con ese correo, se reutiliza (no distingue mayúsculas).Ej:
maria@example.comphonestringopcional
Teléfono. Un celular peruano se guarda siempre como +51 y sus 9 dígitos, lo envíes como lo envíes (999111222, 51999111222 o +51 999 111 222 quedan como +51999111222). Si no hubo coincidencia por correo, se reutiliza el cliente con ese teléfono.Ej:
+51987654321external_idstringopcional
Id en tu sistema. Si ya existe un customer con ese external_id, se reutiliza.Ej:
cust_erp_4821documentobjectopcional
Documento: { type, number, country }. Si ya tienes un cliente con ese documento, se reutiliza (basta el número).
typestringopcional
DNI, RUC, CE, … Opcional: se deduce del número.Ej:
DNInumberstringrequerido
Número.Ej:
45678912countrystringopcional
ISO 3166-1 alpha-2. Por defecto PE.Ej:
PEcustom_fieldsobjectopcional
Campos personalizados que definiste en Ajustes → Clientes → Campos (ver Campos de cliente). Objeto { key: valor }: texto, número como texto ("12.5"), fecha "YYYY-MM-DD", hora "HH:mm", true/false, key de opción (SELECT; también acepta la etiqueta) o lista de keys (MULTISELECT). Se guardan en el cliente (nuevo o existente) y quedan congelados en el cobro. Una key desconocida o un valor inválido devuelve 422 con el detalle custom_fields.<key>.Ej:
{"grade": "quinto", "student_code": "2026-00781"}receivable_idstringopcional
Cuenta por cobrar (rcv_…) a la que se imputa este cobro.Ej:
rcv_01J8Z3K4M5N6P7Q8R9S0T1U2V3category_idstringopcional
Categoría de cobro opcional (collection-categories).
requires_customer_infobooleanopcional
Si true y no hay customer: el checkout pide nombre/correo al pagador antes de pagar. Default false.
send_viaarrayopcional
Por dónde se le envía el cobro al cliente al crearlo: "EMAIL", "WHATSAPP". Sin este campo = ["EMAIL"] (por correo si el cliente tiene email). [] = no enviar nada. WHATSAPP necesita teléfono del cliente (+51…), si no responde 422; consume 1 moneda de WhatsApp y, si el envío falla, el cobro igual se crea.Ej:
["EMAIL", "WHATSAPP"]saved_payment_methodsstringopcional
enabled = durante 30 minutos el enlace le muestra a tu cliente su Yape guardado para pagar con un toque. Úsalo solo si le envías el enlace a un canal suyo. Requiere cliente y YAPE en payment_method_types. Por defecto disabled. Ver Medios de pago guardados.
payment_methodstringopcional
Medio guardado del cliente a debitar (pm_…, de GET /customers/{id}/payment-methods). Se usa junto con confirm: true.Ej:
pm_01J8Z3K4M5N6P7Q8R9S0T1U2V3confirmbooleanopcional
true = crea el cobro y debita de inmediato el payment_method, sin tu cliente presente. El resultado viene en last_saved_method_payment. Si se deniega, el cobro queda abierto y su enlace sigue sirviendo.
descriptionstringopcional
Texto del cobro.Ej:
Pedido #1042external_referencestringopcional
Referencia en tu sistema.Ej:
order-1042expires_atstringopcional
Vencimiento del cobro (UTC ISO-8601).Ej:
2026-09-05T23:59:59Zmerchant_idstringopcional
Opcional. Debe coincidir con el merchant de la key.
metadataobjectopcional
Pares string→string libres.
Language
Credentials
Header
Authorization
Secret key de developer · ejemplos con SDK oficial
API Request
$ npm install @kuti-pe/node
import { KutiClient } from "@kuti-pe/node";
const kuti = new KutiClient({ secretKey: process.env.KUTI_SECRET_KEY! });
const intent = await kuti.paymentIntents.create(
{
amount: { amount: "50.00", currency: "PEN" },
paymentMethodTypes: ["INTEROPERABLE_QR","BANK_TRANSFER"],
customer: { id: "cus_01J8Z3K4M5N6P7Q8R9S0T1U2V3" },
// customer: { type: §§SLOT_6§§, firstName: §§SLOT_7§§, lastName: §§SLOT_8§§, email: §§SLOT_9§§, phone: §§SLOT_10§§, document: { type: §§SLOT_11§§, number: §§SLOT_12§§ } },
description: "Pedido #1042",
externalReference: "order-1042",
},
{ idempotencyKey: "550e8400-e29b-41d4-a716-446655440020" },
);
console.log(intent.checkoutUrl);SDK oficial · guía en /sdks
Response
Elige un ejemplo de respuesta:
application/json
201Created
{
"success": true,
"message": "Payment intent created",
"data": {
"id": "pi_01J8Z3K4M5N6P7Q8R9S0T1U2V3",
"merchant_id": "mer_01J8Z3K4M5N6P7Q8R9S0T1U2V3",
"livemode": true,
"customer": {
"id": "cus_01J8Z3K4M5N6P7Q8R9S0T1U2V3",
"type": "INDIVIDUAL",
"first_name": "María",
"last_name": "López",
"name": "María López",
"document": {
"type": "DNI",
"number": "45678912",
"country": "PE"
},
"email": "maria@example.com"
},
"amount": {
"amount": "50.00",
"currency": "PEN"
},
"status": "PENDING",
"payment_method_types": [
"INTEROPERABLE_QR",
"BANK_TRANSFER"
],
"payment_method": {
"qr": {
"type": "INTEROPERABLE_QR",
"payload": "00020101021226...",
"expires_at": "2026-09-05T23:59:59Z"
},
"payment_code": {
"type": "BANK_TRANSFER",
"code": "41041172",
"expires_at": "2026-09-05T23:59:59Z"
}
},
"checkout_url": "https://pay.kuti.pe/c/A3F9K2P7QM",
"client_secret": "pi_01J8…_secret_ab12cd34ef56gh78ij90kl12",
"description": "Pedido #1042",
"external_reference": "order-1042",
"fee_preview": {
"gross": {
"amount": "50.00",
"currency": "PEN"
},
"fee": {
"amount": "-1.77",
"currency": "PEN"
},
"fee_tax": {
"amount": "-0.27",
"currency": "PEN"
},
"net": {
"amount": "48.23",
"currency": "PEN"
},
"available_in_days": 2
},
"created_at": "2026-09-04T10:48:59.556906Z"
}
}