VitrinaAPI

Dealership insights

The Comisiones export for the month-end close, as Excel or CSV: one row per seller and deal with the commission arithmetic visible, and a summary of what each person is owed.

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.

Read the deal figures explains this resource in prose, with runnable examples.

MethodPathWhat it does
GET/insights/resultadosWhat the AI did for the agenda (any vertical)
GET/insights/seller-performance/exportExportar comisiones — the month-end payroll file (Excel or CSV)

GET /insights/resultados

What the AI did for the agenda (any vertical)

The same facts as GET /clinic/insights/resultados, for any vertical, with the vertical's vocabulary (family: a dealer reads visits and test drives, clientes). Blocks with no data for the vertical come back applies: false (money, confirmation, reminders for a dealer) rather than as zeros. Aggregates only. Requires analytics:read; CLP figures additionally require clinic_money:read. Accepts from / to (bare YYYY-MM-DD, to inclusive; default the 90 days ending today) and location_id.

ParameterInTypeRequiredConstraints
fromquerystringnopatrón ^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
toquerystringnopatrón ^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
location_idqueryuuidno
curl https://api.vitrinadev.com/api/v1/insights/resultados \
  -H "Authorization: Bearer $VITRINA_KEY"

Example response (200)

{
  "data": {
    "from": "2026-07-01",
    "to": "2026-09-28",
    "timezone": "America/Santiago",
    "location_id": null,
    "family": "clinic",
    "previous_period": {
      "from": "2026-04-02",
      "to": "2026-06-30"
    },
    "bookings": {
      "ai": 286,
      "agenda_total": 2011,
      "share_pct": 14.2,
      "previous": {
        "ai": 240,
        "agenda_total": 1950,
        "share_pct": 12.3
      },
      "rule": "Citas del período (por la fecha de la cita) que agendó el asistente de Vitrina en una conversación, ÷ todas las citas del período."
    },
    "money": {
      "applies": true,
      "withheld": false,
      "booked_clp": 11400000,
      "booked_priced": 271,
      "booked_unpriced": 15,
      "agenda_clp": 96000000,
      "clp_share_pct": 11.9,
      "paid_clp": 7250000,
      "paid_patients": 164,
      "unlinked": 4,
      "regime": "mirror",
      "previous": {
        "booked_clp": 9800000,
        "paid_clp": 6100000
      },
      "rule_booked": "Valor de las citas que agendó Vitrina: el precio de sus prestaciones, o el del catálogo. Es lo agendado, no lo cobrado.",
      "rule_paid": "Pagos recibidos en el período por los pacientes que Vitrina agendó, desde el día en que los agendó."
    },
    "out_of_hours": {
      "configured": true,
      "count": 111,
      "pct": 38.8,
      "previous_pct": 36.1,
      "heatmap": [
        {
          "weekday": 1,
          "hour": 21,
          "count": 9
        },
        {
          "weekday": 6,
          "hour": 11,
          "count": 14
        }
      ],
      "rule": "Citas que Vitrina agendó mientras tu negocio estaba cerrado, según tu horario de atención (incluye feriados)."
    },
    "autonomy": {
      "no_human": 158,
      "pct": 56.6,
      "measured": 279,
      "unknown": 7,
      "previous_pct": 52,
      "rule": "Citas de Vitrina en las que nadie de tu equipo escribió en la conversación antes de agendar."
    },
    "time_to_book": {
      "median_seconds": 734,
      "p95_seconds": 80100,
      "p95_phrase": "5 de cada 100 personas tardan más de 22 h 15 min en quedar agendadas.",
      "measured": 279,
      "unknown": 7,
      "previous_median_seconds": 910,
      "rule": "Tiempo desde el primer mensaje del paciente hasta que su cita quedó agendada (la mediana)."
    },
    "hours_returned": {
      "minutes_per_booking": 10,
      "hours": 47.7,
      "rule": "Cada cita que agenda Vitrina ahorra 10 minutos de responder y agendar a mano."
    },
    "recovery": {
      "window_days": 30,
      "known_attendance": 1063,
      "unknown_attendance": 21,
      "no_show_pct": 10.2,
      "no_show": {
        "count": 108,
        "recovered": 37,
        "recovered_via_vitrina": 17,
        "recovered_pct": 34.6,
        "via_vitrina_pct": 15.9,
        "pending": 12,
        "unlinked": 1
      },
      "cancelled": {
        "count": 240,
        "recovered": 26,
        "recovered_via_vitrina": 11,
        "recovered_pct": 10.8,
        "via_vitrina_pct": 4.6,
        "pending": 18,
        "unlinked": 0
      },
      "rule_no_show": "Citas pasadas marcadas como «no asistió» ÷ citas con asistencia conocida (asistió + no asistió).",
      "rule_recovered": "Una cita perdida se recupera cuando el mismo paciente agenda otra dentro de 30 días."
    },
    "confirmation": {
      "applies": true,
      "confirmed_attendance_pct": 93.1,
      "unconfirmed_attendance_pct": 78.4,
      "confirmed_closed": 610,
      "unconfirmed_closed": 212,
      "rule": "Asistencia de las citas cuyo paciente confirmó el recordatorio, frente a las que nunca respondieron."
    },
    "ads": {
      "state": "active",
      "spend_clp": 1648000,
      "booked": 58,
      "attended": 41,
      "paid": 22,
      "cost_per_booked": 28414,
      "cost_per_attended": 40195,
      "cost_per_paid": 74909,
      "rule": "Inversión en anuncios del período ÷ citas agendadas, asistidas y pacientes de anuncios que pagaron, según Vitrina Ads para las mismas fechas."
    },
    "reminders": {
      "applies": true,
      "sent": 721,
      "failed": 120,
      "failed_pct": 14.3,
      "by_cause": [
        {
          "cause": "no_whatsapp",
          "count": 61
        },
        {
          "cause": "no_phone",
          "count": 38
        },
        {
          "cause": "meta_payment_block",
          "count": 21
        }
      ],
      "rule": "Recordatorios de citas del período que no salieron, agrupados por la causa que registró el envío."
    },
    "truncated": false
  }
}

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

GET /insights/seller-performance/export

Exportar comisiones — the month-end payroll file (Excel or CSV)

The same figures as the report above, rendered as an .xlsx workbook (default) or, with ?format=csv, a ;-separated UTF-8 CSV of the ledger, on the same export rail as GET /vehicles/export: sheet "Comisiones" is one row per seller per deal with the commission arithmetic visible (base × «Tasa %» → comisión; rates are percentages, never basis points; dates are dd-mm-aaaa hh:mm on the America/Santiago clock), sheet "Resumen" is what to pay each person. Same ?window= parameter and the same dealership_economics:read gate as the report — a file must not be pullable for a period or by a principal the screen refuses. Content-Disposition carries the generated filename (comisiones-<periodo>-<YYYY-MM-DD>.xlsx). Audited.

ParameterInTypeRequiredConstraints
windowquery24h \7d \30d \
monthquerystringnopatrón ^\d{4}-(0[1-9]|1[0-2])$
yearquerystringnopatrón ^\d{4}$
fromquerystringno
toquerystringno
formatqueryxlsx \csvno
curl https://api.vitrinadev.com/api/v1/insights/seller-performance/export \
  -H "Authorization: Bearer $VITRINA_KEY"

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

On this page