Reservas
La única de estas ocho que bloquea inventario: toma un cupo sobre una unidad, con un abono opcional y un plazo.
Descarga la proyección completa de la API pública: openapi.json.
Vender una unidad explica este recurso en prosa, con ejemplos ejecutables.
| Método | Ruta | Qué hace |
|---|---|---|
GET | /reservations | List reservations — the active-holds worklist |
POST | /reservations | Take a reservation |
GET | /reservations/{id} | Fetch one reservation, with its payments and totals |
PATCH | /reservations/{id} | Edit a live reservation |
POST | /reservations/{id}/abono-disposition | Dispose of the abono on a reservation |
POST | /reservations/{id}/convert | Convert a reservation into a nota de venta |
GET | /reservations/{id}/pdf | Print the comprobante de reserva (PDF) |
POST | /reservations/{id}/send | Send the comprobante de reserva to the customer |
POST | /reservations/{id}/void | Void a reservation |
GET | /reservations/transfer-cost-estimate | Estimate the transfer cost of a reserva |
GET /reservations
List reservations — the active-holds worklist
The dealership’s HOLD REGISTER, most urgent first: ordered by hold_expires_on ascending, then by folio descending. Every status is included by default — a voided or completed reserva keeps its folio and stays listable so "where is reserva R-47?" has an answer (ADR 0058 §10) — so pass status to narrow to the live ones.
Each row carries its money. total_pagos_clp is the sum of every ledger payment (customer_payment allocated via payment_allocation) recorded against the hold and payment_count is how many there are; a hold with no payments reports 0 / 0. Both come from one grouped join, so the list is one query rather than one per row.
The saldo is NOT returned, deliberately. It is agreed_price_clp - total_pagos_clp, and agreed_price_clp is nullable (null = "not recorded", which is not the same claim as 0). Compute it client-side and render "—" when the price is absent; a server-side number would have to invent one of the two.
salesperson_id is BR-312’s filter — "which holds are mine?". vehicle_id returns a unit’s hold HISTORY and answers nothing about whether that unit is available: vehicle.status via /vehicles is the only availability truth (ADR 0030).
Unknown query parameters are a 400, not a silent drop: a filter the caller believes is being applied, returning a full unfiltered list with a 200, is a worse answer than a refusal.
| Parámetro | En | Tipo | Obligatorio | Restricciones |
|---|---|---|---|---|
status | query | activa \ | completada \ | archivada \ |
salesperson_id | query | uuid | no | |
vehicle_id | query | uuid | no | |
holder_contact_id | query | uuid | no | |
limit | query | integer | no | ≥ 1, ≤ 200 |
curl https://api.vitrinadev.com/api/v1/reservations \
-H "Authorization: Bearer $VITRINA_KEY"Ejemplo de respuesta (200)
{
"data": [
{
"id": "d3d3d3d3-0000-4000-8000-000000000001",
"tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
"display_id": "R-18",
"display_seq": 18,
"vehicle_id": "e1e1e1e1-0000-4000-8000-000000000001",
"holder_contact_id": "22222222-0000-4000-8000-000000000002",
"salesperson_id": "11111111-0000-4000-8000-000000000001",
"agreed_price_clp": 11900000,
"abono_expected_clp": 300000,
"taken_at": "2026-09-18T16:40:00.000Z",
"hold_expires_on": "2026-09-25",
"keep_advertised": true,
"transfer_cost_clp": 217740,
"transfer_cost_lines": [
{
"kind": "transferencia_municipal",
"label": "Impuesto a la transferencia (1,5 %)",
"amount_clp": 178500,
"fee_effective_from": "1979-12-29"
},
{
"kind": "arancel_registro_civil",
"label": "Inscripción en el Registro Civil",
"amount_clp": 39240,
"fee_effective_from": "2026-04-01"
}
],
"status": "activa",
"abono_disposition": null,
"abono_disposition_reason": null,
"abono_disposition_at": null,
"abono_disposition_by": null,
"voided_at": null,
"void_reason": null,
"voided_by": null,
"created_at": "2026-09-18T16:40:00.000Z",
"updated_at": "2026-09-18T16:40:00.000Z"
}
],
"meta": {
"total": 1
}
}Responde: 200 · 400 · 401 · 403 · 404 · 409 · 429
POST /reservations
Take a reservation
Takes a hold on a unit — the ONLY thing on this wave that locks inventory (a cotización creates no hold). Born activa; there is no draft state and no status field to supply.
vehicle_id and holder_contact_id are required and must belong to the calling workspace; a foreign id and a nonexistent one answer identically (404), deliberately, because a difference between them is an existence oracle.
hold_expires_on is REQUIRED and has no default (BR-241, corrected): unlike a cotización, a reserva locks the unit and can take a non-refundable deposit, so every hold states its own term rather than inheriting a silent policy number. agreed_price_clp, omitted, copies the vehicle's current asking price (BR-242) — that is a real default, not zero. keep_advertised, omitted, keeps the column default true (the marketplace ads stay live); an explicit false is the per-reserva opt-out that retracts them through the existing cierre queue, and it is set-once — there is no endpoint to change it on a standing hold.
Exactly one ACTIVE hold per unit. A second take on a unit that already has one is a 409, enforced by a partial unique index so a race loses too. Unknown body keys are a 400. Answers 201.
Cuerpo
| Campo | Tipo | Obligatorio | Restricciones |
|---|---|---|---|
vehicle_id | uuid | sí | |
holder_contact_id | uuid | sí | |
salesperson_id | string | null | — | |
agreed_price_clp | integer | null | — | ≥ 0, ≤ 999999999999 |
taken_at | string | null | — | date-time |
hold_expires_on | string | sí | patrón ^\d{4}-\d{2}-\d{2}$ |
keep_advertised | boolean | — | |
transfer_cost_clp | integer | null | — | ≥ 0, ≤ 999999999999 |
transfer_cost_lines | array | null | — | |
abono_expected_clp | integer | null | — | ≥ 1, ≤ 999999999999 |
curl -X POST https://api.vitrinadev.com/api/v1/reservations \
-H "Authorization: Bearer $VITRINA_KEY" \
-H "Content-Type: application/json" \
-d '{
"vehicle_id": "e1e1e1e1-0000-4000-8000-000000000001",
"holder_contact_id": "22222222-0000-4000-8000-000000000002",
"salesperson_id": "11111111-0000-4000-8000-000000000001",
"agreed_price_clp": 11900000,
"hold_expires_on": "2026-09-25",
"keep_advertised": true
}'Ejemplo de respuesta (201)
{
"data": {
"id": "d3d3d3d3-0000-4000-8000-000000000001",
"tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
"display_id": "R-18",
"display_seq": 18,
"vehicle_id": "e1e1e1e1-0000-4000-8000-000000000001",
"holder_contact_id": "22222222-0000-4000-8000-000000000002",
"salesperson_id": "11111111-0000-4000-8000-000000000001",
"agreed_price_clp": 11900000,
"abono_expected_clp": 300000,
"taken_at": "2026-09-18T16:40:00.000Z",
"hold_expires_on": "2026-09-25",
"keep_advertised": true,
"transfer_cost_clp": 217740,
"transfer_cost_lines": [
{
"kind": "transferencia_municipal",
"label": "Impuesto a la transferencia (1,5 %)",
"amount_clp": 178500,
"fee_effective_from": "1979-12-29"
},
{
"kind": "arancel_registro_civil",
"label": "Inscripción en el Registro Civil",
"amount_clp": 39240,
"fee_effective_from": "2026-04-01"
}
],
"status": "activa",
"abono_disposition": null,
"abono_disposition_reason": null,
"abono_disposition_at": null,
"abono_disposition_by": null,
"voided_at": null,
"void_reason": null,
"voided_by": null,
"created_at": "2026-09-18T16:40:00.000Z",
"updated_at": "2026-09-18T16:40:00.000Z"
}
}Responde: 201 · 400 · 401 · 403 · 404 · 409 · 429
GET /reservations/{id}
Fetch one reservation, with its payments and totals
Accepts the UUID or the folio (R-12).
| Parámetro | En | Tipo | Obligatorio | Restricciones |
|---|---|---|---|---|
id | path | any | sí |
curl https://api.vitrinadev.com/api/v1/reservations/<id> \
-H "Authorization: Bearer $VITRINA_KEY"Ejemplo de respuesta (200)
{
"data": {
"id": "d3d3d3d3-0000-4000-8000-000000000001",
"tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
"display_id": "R-18",
"display_seq": 18,
"vehicle_id": "e1e1e1e1-0000-4000-8000-000000000001",
"holder_contact_id": "22222222-0000-4000-8000-000000000002",
"salesperson_id": "11111111-0000-4000-8000-000000000001",
"agreed_price_clp": 11900000,
"abono_expected_clp": 300000,
"taken_at": "2026-09-18T16:40:00.000Z",
"hold_expires_on": "2026-09-25",
"keep_advertised": true,
"transfer_cost_clp": 217740,
"transfer_cost_lines": [
{
"kind": "transferencia_municipal",
"label": "Impuesto a la transferencia (1,5 %)",
"amount_clp": 178500,
"fee_effective_from": "1979-12-29"
},
{
"kind": "arancel_registro_civil",
"label": "Inscripción en el Registro Civil",
"amount_clp": 39240,
"fee_effective_from": "2026-04-01"
}
],
"status": "activa",
"abono_disposition": null,
"abono_disposition_reason": null,
"abono_disposition_at": null,
"abono_disposition_by": null,
"voided_at": null,
"void_reason": null,
"voided_by": null,
"created_at": "2026-09-18T16:40:00.000Z",
"updated_at": "2026-09-18T16:40:00.000Z",
"payments": [
{
"id": "d6d6d6d6-0000-4000-8000-000000000001",
"tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
"reservation_id": "d3d3d3d3-0000-4000-8000-000000000001",
"sale_note_id": null,
"carried_from_reservation_id": null,
"instrument": "transferencia",
"amount_clp": 300000,
"paid_on": "2026-09-18",
"bank": "Banco Estado",
"account_number": null,
"document_number": null,
"note": "abono al tomar la reserva",
"card_fee_bps": null,
"card_surcharge_clp": null,
"card_surcharge_source": null,
"created_at": "2026-09-18T16:41:02.000Z"
}
],
"totals": {
"total_a_pagar_clp": 300000,
"total_pagos_clp": 300000,
"saldo_clp": 0,
"recargo_tarjeta_clp": 0,
"total_a_cobrar_clp": 300000,
"payment_count": 1,
"complete": true,
"gaps": []
},
"converted_to_sale_note": null,
"holder": {
"id": "22222222-0000-4000-8000-000000000002",
"name": "Ana Pérez Soto",
"tax_id": "19312475-5",
"email": "[email protected]",
"phone": "+56987654321",
"address_street": "Av. Ejemplo",
"address_number": "1234",
"address_unit": "Depto 56",
"comuna_code": "13123",
"comuna_name": "Providencia"
},
"sends": [
{
"channel": "email",
"to": "[email protected]",
"sent_at": "2026-09-18T16:45:10.000Z",
"by": "11111111-0000-4000-8000-000000000001"
}
]
}
}Responde: 200 · 400 · 401 · 403 · 404 · 409 · 429
PATCH /reservations/{id}
Edit a live reservation
Changes what a LIVE hold may change after it was taken: the transfer cost (transfer_cost_clp alone = a manual amount and clears the breakdown), the term (hold_expires_on, never a past day — it also moves the seña’s deadline), the advertising decision (keep_advertised, through the existing cierre queue) and the salesperson. Never the price, the holder or the unit. 409 once the hold is not activa. Unknown keys are a 400. Answers the same shape as GET /reservations/\{id\}.
| Parámetro | En | Tipo | Obligatorio | Restricciones |
|---|---|---|---|---|
id | path | any | sí |
Cuerpo
| Campo | Tipo | Obligatorio | Restricciones |
|---|---|---|---|
transfer_cost_clp | integer | null | — | ≥ 0, ≤ 999999999999 |
transfer_cost_lines | array | null | — | |
hold_expires_on | string | — | patrón ^\d{4}-\d{2}-\d{2}$ |
keep_advertised | boolean | — | |
salesperson_id | string | null | — |
curl -X PATCH https://api.vitrinadev.com/api/v1/reservations/<id> \
-H "Authorization: Bearer $VITRINA_KEY" \
-H "Content-Type: application/json" \
-d '{
"transfer_cost_clp": 250000,
"transfer_cost_lines": null,
"hold_expires_on": "2026-09-30"
}'Ejemplo de respuesta (200)
{
"data": {
"id": "d3d3d3d3-0000-4000-8000-000000000001",
"tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
"display_id": "R-18",
"display_seq": 18,
"vehicle_id": "e1e1e1e1-0000-4000-8000-000000000001",
"holder_contact_id": "22222222-0000-4000-8000-000000000002",
"salesperson_id": "11111111-0000-4000-8000-000000000001",
"agreed_price_clp": 11900000,
"abono_expected_clp": 300000,
"taken_at": "2026-09-18T16:40:00.000Z",
"hold_expires_on": "2026-09-25",
"keep_advertised": true,
"transfer_cost_clp": 217740,
"transfer_cost_lines": [
{
"kind": "transferencia_municipal",
"label": "Impuesto a la transferencia (1,5 %)",
"amount_clp": 178500,
"fee_effective_from": "1979-12-29"
},
{
"kind": "arancel_registro_civil",
"label": "Inscripción en el Registro Civil",
"amount_clp": 39240,
"fee_effective_from": "2026-04-01"
}
],
"status": "activa",
"abono_disposition": null,
"abono_disposition_reason": null,
"abono_disposition_at": null,
"abono_disposition_by": null,
"voided_at": null,
"void_reason": null,
"voided_by": null,
"created_at": "2026-09-18T16:40:00.000Z",
"updated_at": "2026-09-18T16:40:00.000Z",
"payments": [
{
"id": "d6d6d6d6-0000-4000-8000-000000000001",
"tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
"reservation_id": "d3d3d3d3-0000-4000-8000-000000000001",
"sale_note_id": null,
"carried_from_reservation_id": null,
"instrument": "transferencia",
"amount_clp": 300000,
"paid_on": "2026-09-18",
"bank": "Banco Estado",
"account_number": null,
"document_number": null,
"note": "abono al tomar la reserva",
"card_fee_bps": null,
"card_surcharge_clp": null,
"card_surcharge_source": null,
"created_at": "2026-09-18T16:41:02.000Z"
}
],
"totals": {
"total_a_pagar_clp": 300000,
"total_pagos_clp": 300000,
"saldo_clp": 0,
"recargo_tarjeta_clp": 0,
"total_a_cobrar_clp": 300000,
"payment_count": 1,
"complete": true,
"gaps": []
},
"converted_to_sale_note": null,
"holder": {
"id": "22222222-0000-4000-8000-000000000002",
"name": "Ana Pérez Soto",
"tax_id": "19312475-5",
"email": "[email protected]",
"phone": "+56987654321",
"address_street": "Av. Ejemplo",
"address_number": "1234",
"address_unit": "Depto 56",
"comuna_code": "13123",
"comuna_name": "Providencia"
},
"sends": [
{
"channel": "email",
"to": "[email protected]",
"sent_at": "2026-09-18T16:45:10.000Z",
"by": "11111111-0000-4000-8000-000000000001"
}
]
}
}Responde: 200 · 400 · 401 · 403 · 404 · 409 · 429
POST /reservations/{id}/abono-disposition
Dispose of the abono on a reservation
A FOURTH distinct scope, reservations:dispose_abono, not OR’d with :write/:void. May also close a still-activa hold in the same act.
| Parámetro | En | Tipo | Obligatorio | Restricciones |
|---|---|---|---|---|
id | path | any | sí |
Cuerpo
| Campo | Tipo | Obligatorio | Restricciones |
|---|---|---|---|
abono_disposition | aplicado \ | devuelto \ | perdido |
abono_disposition_reason | string | sí | máx. 2000 |
void_reason | string | null | — | máx. 2000 |
curl -X POST https://api.vitrinadev.com/api/v1/reservations/<id>/abono-disposition \
-H "Authorization: Bearer $VITRINA_KEY" \
-H "Content-Type: application/json" \
-d '{
"abono_disposition": "devuelto",
"abono_disposition_reason": "el cliente desistió; se devolvió el abono"
}'Ejemplo de respuesta (200)
{
"data": {
"id": "d3d3d3d3-0000-4000-8000-000000000001",
"tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
"display_id": "R-18",
"display_seq": 18,
"vehicle_id": "e1e1e1e1-0000-4000-8000-000000000001",
"holder_contact_id": "22222222-0000-4000-8000-000000000002",
"salesperson_id": "11111111-0000-4000-8000-000000000001",
"agreed_price_clp": 11900000,
"abono_expected_clp": 300000,
"taken_at": "2026-09-18T16:40:00.000Z",
"hold_expires_on": "2026-09-25",
"keep_advertised": true,
"transfer_cost_clp": 217740,
"transfer_cost_lines": [
{
"kind": "transferencia_municipal",
"label": "Impuesto a la transferencia (1,5 %)",
"amount_clp": 178500,
"fee_effective_from": "1979-12-29"
},
{
"kind": "arancel_registro_civil",
"label": "Inscripción en el Registro Civil",
"amount_clp": 39240,
"fee_effective_from": "2026-04-01"
}
],
"status": "anulada",
"abono_disposition": "devuelto",
"abono_disposition_reason": "el cliente desistió; se devolvió el abono",
"abono_disposition_at": "2026-09-21T09:00:00.000Z",
"abono_disposition_by": "11111111-0000-4000-8000-000000000001",
"voided_at": "2026-09-21T09:00:00.000Z",
"void_reason": "cierre por disposición del abono",
"voided_by": "11111111-0000-4000-8000-000000000001",
"created_at": "2026-09-18T16:40:00.000Z",
"updated_at": "2026-09-18T16:40:00.000Z"
}
}Responde: 200 · 400 · 401 · 403 · 404 · 409 · 429
POST /reservations/{id}/convert
Convert a reservation into a nota de venta
Produces a NEW sale-note document — 201, the same as POST /sale-notes. Scoped sale_notes:write, borrowed rather than a fifth reservations scope.
| Parámetro | En | Tipo | Obligatorio | Restricciones |
|---|---|---|---|---|
id | path | any | sí |
Cuerpo
| Campo | Tipo | Obligatorio | Restricciones |
|---|---|---|---|
seller_of_record | consignante \ | retoma \ | automotora |
tax_treatment | afecto \ | exento \ | no_gravado \ |
tax_clp | integer | null | — | ≥ 0, ≤ 999999999999 |
issued_at | string | null | — | date-time |
lead_id | any | — | |
carry_transfer_cost | boolean | — |
curl -X POST https://api.vitrinadev.com/api/v1/reservations/<id>/convert \
-H "Authorization: Bearer $VITRINA_KEY" \
-H "Content-Type: application/json" \
-d '{
"seller_of_record": "automotora",
"tax_treatment": "afecto",
"tax_clp": 1900000,
"issued_at": "2026-09-24T12:00:00.000Z"
}'Ejemplo de respuesta (201)
{
"data": {
"reservation": {
"id": "d3d3d3d3-0000-4000-8000-000000000001",
"tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
"display_id": "R-18",
"display_seq": 18,
"vehicle_id": "e1e1e1e1-0000-4000-8000-000000000001",
"holder_contact_id": "22222222-0000-4000-8000-000000000002",
"salesperson_id": "11111111-0000-4000-8000-000000000001",
"agreed_price_clp": 11900000,
"abono_expected_clp": 300000,
"taken_at": "2026-09-18T16:40:00.000Z",
"hold_expires_on": "2026-09-25",
"keep_advertised": true,
"transfer_cost_clp": 217740,
"transfer_cost_lines": [
{
"kind": "transferencia_municipal",
"label": "Impuesto a la transferencia (1,5 %)",
"amount_clp": 178500,
"fee_effective_from": "1979-12-29"
},
{
"kind": "arancel_registro_civil",
"label": "Inscripción en el Registro Civil",
"amount_clp": 39240,
"fee_effective_from": "2026-04-01"
}
],
"status": "completada",
"abono_disposition": "aplicado",
"abono_disposition_reason": null,
"abono_disposition_at": "2026-09-24T12:00:00.000Z",
"abono_disposition_by": "11111111-0000-4000-8000-000000000001",
"voided_at": null,
"void_reason": null,
"voided_by": null,
"created_at": "2026-09-18T16:40:00.000Z",
"updated_at": "2026-09-18T16:40:00.000Z"
},
"sale_note": {
"id": "d4d4d4d4-0000-4000-8000-000000000001",
"tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
"display_id": "V-118",
"display_seq": 118,
"vehicle_id": "e1e1e1e1-0000-4000-8000-000000000002",
"buyer_contact_id": "22222222-0000-4000-8000-000000000002",
"lead_id": null,
"converted_from_reservation_id": "d3d3d3d3-0000-4000-8000-000000000001",
"seller_of_record": "automotora",
"salesperson_id": "11111111-0000-4000-8000-000000000001",
"net_clp": 11900000,
"list_price_clp": 12490000,
"discount_clp": 590000,
"tax_clp": 1900000,
"tax_treatment": "afecto",
"status": "issued",
"issued_at": "2026-09-19T13:00:00.000Z",
"emitted_by": "11111111-0000-4000-8000-000000000001",
"approved_by": null,
"approved_at": null,
"voided_at": null,
"void_reason": null,
"voided_by": null,
"created_at": "2026-09-19T13:00:00.000Z",
"updated_at": "2026-09-19T13:00:00.000Z"
},
"carried_payments": [
{
"id": "d6d6d6d6-0000-4000-8000-000000000001",
"tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
"reservation_id": null,
"sale_note_id": "d4d4d4d4-0000-4000-8000-000000000001",
"carried_from_reservation_id": "d3d3d3d3-0000-4000-8000-000000000001",
"instrument": "transferencia",
"amount_clp": 300000,
"paid_on": "2026-09-18",
"bank": "Banco Estado",
"account_number": null,
"document_number": null,
"note": "abono al tomar la reserva",
"card_fee_bps": null,
"card_surcharge_clp": null,
"card_surcharge_source": null,
"created_at": "2026-09-18T16:41:02.000Z"
}
]
}
}Responde: 201 · 400 · 401 · 403 · 404 · 409 · 429
GET /reservations/{id}/pdf
Print the comprobante de reserva (PDF)
The workspace’s reservation template (else the platform starter) filled with the hold: folio, dates, dealership, holder (name, RUT, email, phone, address), unit, agreed price, abonos, saldo and transfer cost with its breakdown, signatures. RUT and domicilio print only for a caller that also holds contacts:read («—» otherwise). Never a 409: a fact not on record prints «—». Inline by default; ?download=1 answers as an attachment. Filename reserva-<PATENTE>-<marca-modelo>.pdf (e.g. reserva-JLGJ43-mini-countryman-s.pdf); the folio stands in for a missing plate, and reserva-<folio>.pdf when nothing is known.
| Parámetro | En | Tipo | Obligatorio | Restricciones |
|---|---|---|---|---|
id | path | any | sí | |
download | query | 0 \ | 1 \ | true \ |
curl https://api.vitrinadev.com/api/v1/reservations/<id>/pdf \
-H "Authorization: Bearer $VITRINA_KEY"Responde: 200 · 400 · 401 · 403 · 404 · 409 · 429
POST /reservations/{id}/send
Send the comprobante de reserva to the customer
Renders the current comprobante and sends it — always a person’s explicit act, never retried. email: the PDF attached, to the holder’s email or to. whatsapp (also needs messages:send): the PDF as a document in the holder’s WhatsApp conversation; 409 with details.reason = whatsapp_window_closed outside the 24 h window, no_whatsapp_thread, no_phone; no_email for email; Needs contacts:read too (the comprobante carries the holder’s RUT and address). delivery_unconfirmed when the provider errored (check the conversation before sending again). Each send is recorded and listed in GET /reservations/\{id\} → sends.
| Parámetro | En | Tipo | Obligatorio | Restricciones |
|---|---|---|---|---|
id | path | any | sí |
Cuerpo
| Campo | Tipo | Obligatorio | Restricciones |
|---|---|---|---|
channel | email \ | whatsapp | sí |
to | string | — | mín. 3, máx. 320 |
message | string | — | máx. 2000 |
acknowledge | string[] | — |
curl -X POST https://api.vitrinadev.com/api/v1/reservations/<id>/send \
-H "Authorization: Bearer $VITRINA_KEY" \
-H "Content-Type: application/json" \
-d '{
"channel": "email"
}'Ejemplo de respuesta (200)
{
"data": {
"channel": "email",
"to": "[email protected]",
"sent_at": "2026-09-18T16:45:10.000Z",
"message_id": null
}
}Responde: 200 · 400 · 401 · 403 · 404 · 409 · 429
POST /reservations/{id}/void
Void a reservation
A distinct reservations:void authority from reservations:write.
| Parámetro | En | Tipo | Obligatorio | Restricciones |
|---|---|---|---|---|
id | path | any | sí |
Cuerpo
| Campo | Tipo | Obligatorio | Restricciones |
|---|---|---|---|
void_reason | string | sí | máx. 2000 |
curl -X POST https://api.vitrinadev.com/api/v1/reservations/<id>/void \
-H "Authorization: Bearer $VITRINA_KEY" \
-H "Content-Type: application/json" \
-d '{
"void_reason": "el cliente no completó el pago del abono a tiempo"
}'Ejemplo de respuesta (200)
{
"data": {
"id": "d3d3d3d3-0000-4000-8000-000000000002",
"tenant_id": "a1a1a1a1-0000-4000-8000-000000000001",
"display_id": "R-22",
"display_seq": 22,
"vehicle_id": "e1e1e1e1-0000-4000-8000-000000000001",
"holder_contact_id": "22222222-0000-4000-8000-000000000002",
"salesperson_id": "11111111-0000-4000-8000-000000000001",
"agreed_price_clp": 11900000,
"abono_expected_clp": null,
"taken_at": "2026-09-18T16:40:00.000Z",
"hold_expires_on": "2026-09-25",
"keep_advertised": true,
"transfer_cost_clp": 217740,
"transfer_cost_lines": [
{
"kind": "transferencia_municipal",
"label": "Impuesto a la transferencia (1,5 %)",
"amount_clp": 178500,
"fee_effective_from": "1979-12-29"
},
{
"kind": "arancel_registro_civil",
"label": "Inscripción en el Registro Civil",
"amount_clp": 39240,
"fee_effective_from": "2026-04-01"
}
],
"status": "anulada",
"abono_disposition": null,
"abono_disposition_reason": null,
"abono_disposition_at": null,
"abono_disposition_by": null,
"voided_at": "2026-09-20T10:05:00.000Z",
"void_reason": "el cliente no completó el pago del abono a tiempo",
"voided_by": "11111111-0000-4000-8000-000000000001",
"created_at": "2026-09-18T16:40:00.000Z",
"updated_at": "2026-09-18T16:40:00.000Z"
}
}Responde: 200 · 400 · 401 · 403 · 404 · 409 · 429
GET /reservations/transfer-cost-estimate
Estimate the transfer cost of a reserva
What the buyer would pay for the transfer of this unit at this price, today: the 1,5 % impuesto de transferencia (base = max(precio, tasación fiscal); the agreed price when the SII has no tasación for the model) plus the Registro Civil arancel in force. Computed by the statutory add-on machinery (fee_schedule), never a second fee table. Notaría is not included (no platform figure exists); basis says so. agreed_price_clp omitted = the vehicle’s asking price. Read-only.
| Parámetro | En | Tipo | Obligatorio | Restricciones |
|---|---|---|---|---|
vehicle_id | query | uuid | sí | |
agreed_price_clp | query | integer | null | no | ≥ 0, ≤ 999999999999 |
curl https://api.vitrinadev.com/api/v1/reservations/transfer-cost-estimate \
-H "Authorization: Bearer $VITRINA_KEY"Ejemplo de respuesta (200)
{
"data": {
"total_clp": 217740,
"lines": [
{
"kind": "transferencia_municipal",
"label": "Impuesto a la transferencia (1,5 %)",
"amount_clp": 178500,
"fee_effective_from": "1979-12-29"
},
{
"kind": "arancel_registro_civil",
"label": "Inscripción en el Registro Civil",
"amount_clp": 39240,
"fee_effective_from": "2026-04-01"
}
],
"basis": "Estimado: 1,5 % sobre el mayor valor entre el precio acordado y la tasación fiscal + arancel vigente del Registro Civil. No incluye notaría; ajusta el monto si corresponde.",
"agreed_price_clp": 11900000
}
}Responde: 200 · 400 · 401 · 403 · 404 · 409 · 429