VitrinaAPI

Cobrar y conciliar pagos

Registrar lo que alguien debe, lo que pagó y cómo se imputa.

GET /obligations responde lo que alguien debe y GET /payments lo que llegó. Una imputación dice qué pago cubre qué obligación, y de ahí salen el saldo, el estado y lo que una persona debe hoy. Ningún saldo se edita a mano.

curl "https://api.vitrinadev.com/api/v1/obligations?contact_id=$CONTACT" \
  -H "Authorization: Bearer $VITRINA_KEY"

Las lecturas piden payments:read y las escrituras payments:write. Revertir un pago tiene su propio permiso, payments:reverse, porque deshacer dinero recibido no equivale a recibirlo.

La obligación

{
  "data": {
    "id": "b44936d0-0000-4000-8000-000000000004",
    "contact_id": "1a73af9e-0000-4000-8000-000000000001",
    "kind": "service",
    "label": "Ortodoncia — primera cuota",
    "expected_clp": 112000,
    "allocated_clp": 0,
    "outstanding_clp": 112000,
    "state": "pending",
    "due_on": "2026-10-10"
  }
}

kind dice de qué nace, y ahí aparece la vertical:

vehicle_reservation_deposit es el abono de una reserva y sale_note lo que queda de una nota de venta. Las abre el flujo comercial: tomar una reserva ya deja su obligación.

Varias obligaciones que para la persona son una sola cosa, como las cuotas de un plan, comparten un group_id. GET /obligations/groups/{groupId} las lee juntas con su saldo.

Una obligación termina de tres maneras. Pagada: las imputaciones la cubren. Condonada (/waive, con motivo): la organización decide no cobrarla. Anulada (/cancel, con motivo y con qué pasó con lo ya pagado: aplicado, devuelto o perdido). Editar el monto esperado exige un reason en el cuerpo.

El pago

curl -X POST https://api.vitrinadev.com/api/v1/payments \
  -H "Authorization: Bearer $VITRINA_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pago-transferencia-884213" \
  -d '{
    "contact_id": "1a73af9e-0000-4000-8000-000000000001",
    "instrument": "transferencia",
    "amount_clp": 50000,
    "paid_on": "2026-09-24",
    "bank": "Banco de Chile",
    "document_number": "884213",
    "allocations": [
      { "obligation_id": "b44936d0-0000-4000-8000-000000000004", "amount_clp": 50000 }
    ]
  }'

instrument es cómo llegó: efectivo, transferencia, tarjeta, cheque, vale vista. paid_on es el día en que la persona pagó, que no siempre es hoy. allocations lo imputa de una vez. Si todavía no sabes a qué, el pago queda sin imputar y aparece en GET /payments?unapplied=true, que es un estado legítimo.

Un pago que llegó sin saber de quién es se registra igual, sin contact_id, y después POST /payments/{id}/assign-payer le pone dueño. POST /payments/{id}/allocations imputa más adelante y DELETE /payments/{id}/allocations/{allocationId} libera una imputación equivocada, siempre con motivo.

Un pago nunca se borra. POST /payments/{id}/reverse lo revierte con su razón y deja la reversa como una fila más.

El estado de cuenta de una persona

curl https://api.vitrinadev.com/api/v1/contacts/$CONTACT/ledger \
  -H "Authorization: Bearer $VITRINA_KEY"

Responde de una vez qué debe, qué pagó y qué quedó sin imputar. Es la lectura que conviene mostrar en pantalla, en vez de sumar obligaciones y pagos por tu cuenta y llegar a otro número.

Un cobro nombra a una persona, y qué ve de ella una aplicación conectada está en Datos personales.

En esta página