VitrinaAPI

Clinic payment registrations

The Mercado Pago payments still to be recorded in the clinic's practice system: the task list, confirming which practice-system payment matches each one or closing it without a match, and which payment method stands for Mercado Pago.

Beta
This may change at any time, with a changelog entry and a notice to recent callers — see versioning.

Download the full API pública projection: openapi.json.

MethodPathWhat it does
GET/clinic/payment-registrationsMercado Pago payments to register in the practice system
GET/clinic/payment-registrations/{id}One Mercado Pago payment registration task
POST/clinic/payment-registrations/{id}/confirmConfirm which vendor pago records this payment
POST/clinic/payment-registrations/{id}/dismissClose a registration task without a match
GET/clinic/payment-registrations/settingsWhich vendor medio stands for Mercado Pago
PUT/clinic/payment-registrations/settingsChoose the Mercado Pago medio / the reminder delay

GET /clinic/payment-registrations

Mercado Pago payments to register in the practice system

The reception tasks: each Mercado Pago payment of a clinic whose Dentalink / Medilink / Reservo authors its money, pre-filled (patient and RUT, amount, medio, MP number, date, what it paid) and, once the mirror brings the pago in, its match. status=pending (default) = open + ambiguous (an ambiguous task lists its candidates). payments:read.

ParameterInTypeRequiredConstraints
statusquerypending \matched \closed \
contact_idqueryuuidno
limitqueryintegerno≥ 1, ≤ 200, por defecto 50
offsetqueryinteger | nullno≥ 0, por defecto 0
curl https://api.vitrinadev.com/api/v1/clinic/payment-registrations \
  -H "Authorization: Bearer $VITRINA_KEY"

Example response (200)

{
  "data": [
    {
      "id": "0199c3a0-1111-7000-8000-000000000001",
      "status": "matched",
      "vendor": "dentalink",
      "vendor_label": "Dentalink",
      "provider": "mercadopago",
      "provider_reference": "182050716739",
      "provider_payment_url": "https://www.mercadopago.cl/activities?q=182050716739",
      "customer_payment_id": "0199c3a0-2222-7000-8000-000000000002",
      "contact_id": "0199c3a0-3333-7000-8000-000000000003",
      "amount_clp": 30000,
      "paid_on": "2026-10-05",
      "patient": {
        "id": "0199c3a0-4444-7000-8000-000000000004",
        "name": "Ana Pérez",
        "rut": "11.111.111-1"
      },
      "concept": {
        "kind": "appointment_deposit",
        "label": "Abono cita",
        "appointment_starts_at": "2026-10-09T13:00:00.000Z"
      },
      "medio": {
        "code": "30",
        "label": "Mercado Pago"
      },
      "matched": {
        "mirror_payment_id": "0199c3a0-5555-7000-8000-000000000005",
        "vendor_reference": "88123",
        "received_on": "2026-10-05",
        "amount_clp": 30000,
        "medio": "Mercado Pago",
        "voided": false,
        "by": "auto_unique",
        "at": "2026-10-05T18:20:00.000Z"
      },
      "candidates": [],
      "dismissed_reason": null,
      "overdue": false,
      "reminded_at": null,
      "created_at": "2026-10-05T14:02:11.000Z"
    }
  ],
  "meta": {
    "total": 1,
    "limit": 50,
    "offset": 0
  }
}

Answers: 200 · 400 · 401 · 403 · 404 · 409 · 429

GET /clinic/payment-registrations/{id}

One Mercado Pago payment registration task

One task, as the list returns it. payments:read.

ParameterInTypeRequiredConstraints
idpathuuidyes
curl https://api.vitrinadev.com/api/v1/clinic/payment-registrations/<id> \
  -H "Authorization: Bearer $VITRINA_KEY"

Example response (200)

{
  "data": {
    "id": "0199c3a0-1111-7000-8000-000000000001",
    "status": "matched",
    "vendor": "dentalink",
    "vendor_label": "Dentalink",
    "provider": "mercadopago",
    "provider_reference": "182050716739",
    "provider_payment_url": "https://www.mercadopago.cl/activities?q=182050716739",
    "customer_payment_id": "0199c3a0-2222-7000-8000-000000000002",
    "contact_id": "0199c3a0-3333-7000-8000-000000000003",
    "amount_clp": 30000,
    "paid_on": "2026-10-05",
    "patient": {
      "id": "0199c3a0-4444-7000-8000-000000000004",
      "name": "Ana Pérez",
      "rut": "11.111.111-1"
    },
    "concept": {
      "kind": "appointment_deposit",
      "label": "Abono cita",
      "appointment_starts_at": "2026-10-09T13:00:00.000Z"
    },
    "medio": {
      "code": "30",
      "label": "Mercado Pago"
    },
    "matched": {
      "mirror_payment_id": "0199c3a0-5555-7000-8000-000000000005",
      "vendor_reference": "88123",
      "received_on": "2026-10-05",
      "amount_clp": 30000,
      "medio": "Mercado Pago",
      "voided": false,
      "by": "auto_unique",
      "at": "2026-10-05T18:20:00.000Z"
    },
    "candidates": [],
    "dismissed_reason": null,
    "overdue": false,
    "reminded_at": null,
    "created_at": "2026-10-05T14:02:11.000Z"
  }
}

Answers: 200 · 400 · 401 · 403 · 404 · 409 · 429

POST /clinic/payment-registrations/{id}/confirm

Confirm which vendor pago records this payment

Staff match: the pago must be the same patient's, the same amount and inside the window (400 not_a_candidate), and not already record another payment (409 candidate_taken). 409 registration_not_pending once the task is closed. Closes the task and its notification. payments:write.

ParameterInTypeRequiredConstraints
idpathuuidyes

Body

FieldTypeRequiredConstraints
mirror_payment_iduuidyes
curl -X POST https://api.vitrinadev.com/api/v1/clinic/payment-registrations/<id>/confirm \
  -H "Authorization: Bearer $VITRINA_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "mirror_payment_id": "0199c3a0-5555-7000-8000-000000000005"
  }'

Example response (200)

{
  "data": {
    "id": "0199c3a0-1111-7000-8000-000000000001",
    "status": "matched",
    "vendor": "dentalink",
    "vendor_label": "Dentalink",
    "provider": "mercadopago",
    "provider_reference": "182050716739",
    "provider_payment_url": "https://www.mercadopago.cl/activities?q=182050716739",
    "customer_payment_id": "0199c3a0-2222-7000-8000-000000000002",
    "contact_id": "0199c3a0-3333-7000-8000-000000000003",
    "amount_clp": 30000,
    "paid_on": "2026-10-05",
    "patient": {
      "id": "0199c3a0-4444-7000-8000-000000000004",
      "name": "Ana Pérez",
      "rut": "11.111.111-1"
    },
    "concept": {
      "kind": "appointment_deposit",
      "label": "Abono cita",
      "appointment_starts_at": "2026-10-09T13:00:00.000Z"
    },
    "medio": {
      "code": "30",
      "label": "Mercado Pago"
    },
    "matched": {
      "mirror_payment_id": "0199c3a0-5555-7000-8000-000000000005",
      "vendor_reference": "88123",
      "received_on": "2026-10-05",
      "amount_clp": 30000,
      "medio": "Mercado Pago",
      "voided": false,
      "by": "auto_unique",
      "at": "2026-10-05T18:20:00.000Z"
    },
    "candidates": [],
    "dismissed_reason": null,
    "overdue": false,
    "reminded_at": null,
    "created_at": "2026-10-05T14:02:11.000Z"
  }
}

Answers: 200 · 400 · 401 · 403 · 404 · 409 · 429

POST /clinic/payment-registrations/{id}/dismiss

Close a registration task without a match

registered_elsewhere (reception registered it in a way Vitrina cannot match) or not_needed. 409 registration_not_pending once the task is closed. payments:write.

ParameterInTypeRequiredConstraints
idpathuuidyes

Body

FieldTypeRequiredConstraints
reasonregistered_elsewhere \not_neededyes
curl -X POST https://api.vitrinadev.com/api/v1/clinic/payment-registrations/<id>/dismiss \
  -H "Authorization: Bearer $VITRINA_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "registered_elsewhere"
  }'

Example response (200)

{
  "data": {
    "id": "0199c3a0-1111-7000-8000-000000000001",
    "status": "matched",
    "vendor": "dentalink",
    "vendor_label": "Dentalink",
    "provider": "mercadopago",
    "provider_reference": "182050716739",
    "provider_payment_url": "https://www.mercadopago.cl/activities?q=182050716739",
    "customer_payment_id": "0199c3a0-2222-7000-8000-000000000002",
    "contact_id": "0199c3a0-3333-7000-8000-000000000003",
    "amount_clp": 30000,
    "paid_on": "2026-10-05",
    "patient": {
      "id": "0199c3a0-4444-7000-8000-000000000004",
      "name": "Ana Pérez",
      "rut": "11.111.111-1"
    },
    "concept": {
      "kind": "appointment_deposit",
      "label": "Abono cita",
      "appointment_starts_at": "2026-10-09T13:00:00.000Z"
    },
    "medio": {
      "code": "30",
      "label": "Mercado Pago"
    },
    "matched": {
      "mirror_payment_id": "0199c3a0-5555-7000-8000-000000000005",
      "vendor_reference": "88123",
      "received_on": "2026-10-05",
      "amount_clp": 30000,
      "medio": "Mercado Pago",
      "voided": false,
      "by": "auto_unique",
      "at": "2026-10-05T18:20:00.000Z"
    },
    "candidates": [],
    "dismissed_reason": null,
    "overdue": false,
    "reminded_at": null,
    "created_at": "2026-10-05T14:02:11.000Z"
  }
}

Answers: 200 · 400 · 401 · 403 · 404 · 409 · 429

GET /clinic/payment-registrations/settings

Which vendor medio stands for Mercado Pago

The practice system, its medios (the synced medio_pago catalog for Dentalink / Medilink, the fixed list for Reservo), the one chosen as Mercado Pago, a name-based suggestion, and after how many business days an unregistered payment reminds reception (default 2). payments:read.

curl https://api.vitrinadev.com/api/v1/clinic/payment-registrations/settings \
  -H "Authorization: Bearer $VITRINA_KEY"

Example response (200)

{
  "data": {
    "vendor": "dentalink",
    "vendor_label": "Dentalink",
    "mercadopago_medio": null,
    "suggested_medio": "30",
    "medios": [
      {
        "code": "2",
        "label": "Tarjeta de débito",
        "active": true
      },
      {
        "code": "30",
        "label": "Mercado Pago",
        "active": true
      }
    ],
    "reminder_business_days": 2
  }
}

Answers: 200 · 400 · 401 · 403 · 404 · 409 · 429

PUT /clinic/payment-registrations/settings

Choose the Mercado Pago medio / the reminder delay

Sets the vendor medio that stands for Mercado Pago (it must be one of the clinic's medios; 400 unknown_medio) and/or the reminder delay in business days (1–15). Re-runs the matcher: a chosen medio can settle an ambiguous task. clinic_admin:write.

Body

FieldTypeRequiredConstraints
mercadopago_mediostring | null—mín. 1, máx. 40
reminder_business_daysinteger—≥ 1, ≤ 15
curl -X PUT https://api.vitrinadev.com/api/v1/clinic/payment-registrations/settings \
  -H "Authorization: Bearer $VITRINA_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "mercadopago_medio": "30",
    "reminder_business_days": 2
  }'

Example response (200)

{
  "data": {
    "vendor": "dentalink",
    "vendor_label": "Dentalink",
    "mercadopago_medio": null,
    "suggested_medio": "30",
    "medios": [
      {
        "code": "2",
        "label": "Tarjeta de débito",
        "active": true
      },
      {
        "code": "30",
        "label": "Mercado Pago",
        "active": true
      }
    ],
    "reminder_business_days": 2
  }
}

Answers: 200 · 400 · 401 · 403 · 404 · 409 · 429

On this page