Ir al contenido

Campos de cliente

Guarda datos extra de tus clientes (grado, código de alumno, sede…) y envíalos en custom_fields.

Cada negocio define sus propios campos en el panel (Ajustes → Clientes → Campos) o por API. Los valores viajan en custom_fields del cliente: en POST/PATCH /customers, en el customer de un cobro o de una checkout session, en los imports y en los webhooks customer.* y payment.*.

Las definiciones son las mismas en modo prueba y producción; los valores viven en cada cliente. La key y el tipo de un campo no se pueden cambiar después de crearlo. Máximo 20 campos activos.

Tipos

TipoValor en custom_fieldsEjemplo
TEXTtexto"2026-00781"
NUMBERnúmero como texto"12.5"
DATEYYYY-MM-DD"2015-03-14"
HOURHH:mm"09:30"
BOOLEANtrue / false (acepta "sí"/"no")true
SELECTkey de la opción (acepta la etiqueta)"quinto"
MULTISELECTlista de keys (acepta texto separado por comas)["math", "robotics"]
EMAILcorreo"apoderado@example.com"
URLhttp(s)"https://drive.google.com/…"
PHONE_NUMBERE.164"+51987654321"

Endpoints

MétodoRutaQué hace
GET/customer-fieldsLista los campos por posición (?include_archived=true para ver archivados).
POST/customer-fieldsCrea un campo: key, label, type, options (SELECT/MULTISELECT), required, help_text.
PATCH/customer-fields/{id}Edita label, options, required, help_text. Las opciones no se quitan: se desactivan (active: false).
PUT/customer-fields/orderReordena: { field_ids: [...] }.
POST/customer-fields/{id}/archiveArchiva (deja de pedirse; los valores se conservan).
POST/customer-fields/{id}/restoreRestaura un campo archivado.
Crear un campo SELECTbash
curl -s https://api.kuti.pe/v1/customer-fields \
  -H 'Authorization: Bearer kuti_live_…' \
  -H 'Content-Type: application/json' \
  -d '{
    "key": "grade",
    "label": "Grado",
    "type": "SELECT",
    "options": [
      { "key": "quinto", "label": "5to grado" },
      { "key": "sexto", "label": "6to grado" }
    ],
    "required": true
  }'
Usarlo al crear un cobrobash
curl -s https://api.kuti.pe/v1/payment-intents \
  -H 'Authorization: Bearer kuti_live_…' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: pension-2026-03-45678912' \
  -d '{
    "amount": { "amount": "250.00", "currency": "PEN" },
    "payment_method_types": ["INTEROPERABLE_QR"],
    "description": "Pensión marzo",
    "customer": {
      "document": { "number": "45678912" },
      "custom_fields": { "grade": "quinto", "student_code": "2026-00781" }
    }
  }'

Reglas

  • Al editar un cliente solo cambian las keys enviadas; null borra ese valor.
  • Una key desconocida, un valor inválido o un campo archivado devuelve 422 con details[].field = custom_fields.<key>.
  • required se exige en el panel y en el checkout; la API no lo exige, para no romper integraciones cuando agregas un campo obligatorio.
  • ask_in_checkout: si el cobro se crea con requires_customer_info, el checkout también le pide al pagador los campos marcados así (GET /c/{code} los devuelve en checkout_customer_fields). Solo esos se aceptan desde el checkout.
  • El cobro congela los custom_fields del cliente al crearse (customer.custom_fields en GET /payment-intents/{id} y en payment.*).
  • Errores: CUSTOM_FIELD_KEY_TAKEN (409), CUSTOM_FIELD_LIMIT_REACHED (409), CUSTOM_FIELD_NOT_FOUND (404).