---
title: "Preview the cost of cancelling a car rental booking"
method: POST
path: "/v1/car_cancel_preview"
tags: ["Cars"]
---

# Preview the cost of cancelling a car rental booking

`POST /v1/car_cancel_preview`

## Request

- Base URL: `https://api.gojinko.com`
- URL: `https://api.gojinko.com/v1/car_cancel_preview`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Quote what cancelling would cost right now: the fee in force and the refund it would leave. Nothing is cancelled. `fee_known: false` means the fee could not be established — render it as "we will confirm the fee", never as free cancellation. The returned `quote_id` is required by car_cancel_commit, and binds until `expires_at` where one is given. `cancellable: false` with `manual_required: true` means the cancellation cannot be completed online (fee unknown, rental changed after payment, fee in another currency or above the rental) and `refund_review_reason` says why: it is not a dead end — once the customer agrees, commit it with `manual_ok: true` and a Jinko agent completes it. `cancellable: false` without that flag is a rental that cannot be cancelled at all (already cancelled, or over), carrying the cancellation that stands where there is one. Guest-authenticated: booking_ref + last_name; a wrong pair returns 404 rather than confirming the booking's existence.

## Request body

- CarCancelPreviewRequest
  - `booking_ref` string, required: Jinko booking reference. Call get_booking first, then select its booked_item_id for servicing.
  - `booked_item_id` string: The booked item, from get_booking items[].booked_item_id. Preserved across exchanges. Omit only when the booking has exactly one item of the requested domain; otherwise a 409 returns items to choose from.
  - `last_name` string: Required for guest lookup. A credential that owns the booking may omit it; ownership is checked by the platform.
  - `intent` IntentInput
    - `user_intent` string, nullable: The user's natural-language intent: the Alpic PII-stripped paraphrase when available, else a best-effort fallback to the client-provided NL query.

## Response `200`

Cancellation quote

- CarCancelPreviewResponse
  - `quote_id` string: This preview’s quote. Pass it as `quote_id` to car_cancel_commit — it binds the commit to the fee quoted here. Treat as an opaque string; the format may evolve.
  - `cancellation_id` string: Deprecated: use `quote_id` instead. Same value.
  - `cancellable` boolean
  - `fee_known` boolean: false means the fee could not be established — UNKNOWN, not free. Render as "we will confirm the fee".
  - `fee_type` string
  - `fee` CarAmount
    - `value` integer: Integer amount in MINOR units, always paired with decimal_places — divide by 10 ** decimal_places to display. Example: value 15977 with decimal_places 2 is 159.77 USD. Rendering this field directly shows prices 100x too high for 2-decimal currencies.
    - `currency` string: ISO 4217 currency code.
    - `decimal_places` integer: Scale of the integer value/amount: display = integer / 10 ** decimal_places. Always sent alongside minor-unit amounts. Usually the ISO 4217 digits of the currency (2 for USD/EUR/GBP, 0 for JPY/KRW, 3 for BHD/JOD/KWD) but currency-converted prices can carry a different scale — ALWAYS use the decimal_places sent with the amount, never a hardcoded 2. Only if the field is genuinely absent on a value-shaped object, fall back to the ISO digits for the currency.
    - `display` string: The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. "USD 159.77". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is "JPY 15615.00"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.
  - `paid` object: What the customer originally paid.
    - `value` integer: Integer amount in MINOR units, always paired with decimal_places — divide by 10 ** decimal_places to display. Example: value 15977 with decimal_places 2 is 159.77 USD. Rendering this field directly shows prices 100x too high for 2-decimal currencies.
    - `currency` string: ISO 4217 currency code.
    - `decimal_places` integer: Scale of the integer value/amount: display = integer / 10 ** decimal_places. Always sent alongside minor-unit amounts. Usually the ISO 4217 digits of the currency (2 for USD/EUR/GBP, 0 for JPY/KRW, 3 for BHD/JOD/KWD) but currency-converted prices can carry a different scale — ALWAYS use the decimal_places sent with the amount, never a hardcoded 2. Only if the field is genuinely absent on a value-shaped object, fall back to the ISO digits for the currency.
    - `display` string: The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. "USD 159.77". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is "JPY 15615.00"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.
  - `refund_amount` object: paid minus fee. Absent whenever the fee is unknown — absent is not zero.
    - `value` integer: Integer amount in MINOR units, always paired with decimal_places — divide by 10 ** decimal_places to display. Example: value 15977 with decimal_places 2 is 159.77 USD. Rendering this field directly shows prices 100x too high for 2-decimal currencies.
    - `currency` string: ISO 4217 currency code.
    - `decimal_places` integer: Scale of the integer value/amount: display = integer / 10 ** decimal_places. Always sent alongside minor-unit amounts. Usually the ISO 4217 digits of the currency (2 for USD/EUR/GBP, 0 for JPY/KRW, 3 for BHD/JOD/KWD) but currency-converted prices can carry a different scale — ALWAYS use the decimal_places sent with the amount, never a hardcoded 2. Only if the field is genuinely absent on a value-shaped object, fall back to the ISO digits for the currency.
    - `display` string: The same figure as a string ready to show: the ISO 4217 code, a space, then the amount, e.g. "USD 159.77". With decimal_places it is written at exactly that scale (value 1561500, JPY, decimal_places 2 is "JPY 15615.00"); without, at the ISO digits of the currency. Show this; compute with the number. Absent when the figure is not money (a cancellation step expressed as a percent or a number of nights) or could not be read unambiguously.
  - `currency` string
  - `non_refundable` boolean
  - `refund_pending_review` boolean: true means the refund figure is right but will be issued by hand rather than automatically (the rental was changed after it was paid for). The cancellation itself still goes through online; not a failure.
  - `refund_review_reason` string: Why a person is involved, whenever `manual_required` or `refund_pending_review` is true, in words the customer can be shown. Where the reason would be the supplier’s own words — as on a `cancellable: false` preview of a rental that cannot be cancelled at all — it reads “This request needs manual handling by Jinko support.”
  - `manual_required` boolean: true means this cancellation cannot be completed online — the fee could not be established, the rental was changed after it was paid for, or the fee is in another currency or above the rental. `cancellable` is false, no refund figure is given and `refund_review_reason` says why. It is not a dead end: car_cancel_commit takes this `cancellation_id` with `manual_ok: true`, which records the cancellation for a Jinko agent to complete and answers `state: pending` with `refund_pending_review: true`. Without the flag such a commit is refused 409 `manual_required`, so a customer is never put in an agent queue unasked. Absent (or false) on every quote that can be committed online.
  - `expires_at` string: When this preview stops being committable (RFC 3339). A commit after it is refused 409 `QUOTE_EXPIRED`; preview again. Absent where the quote carries no deadline.

## Other responses

- `400`: Bad request
- `401`: Authentication required
- `402`: Payment required — organization balance exhausted
- `404`: Unknown booking_ref + last_name pair.
- `409`: An exchange or another cancellation is already in flight for this rental, so no quote can be given: `code` is `active_operation_exists`, as a sibling of `error`, and `active_operation` names the cancellation running where it is one. Wait for it to finish (car_cancel_status) and preview again. A 409 with no `code` beside `error` is not this case — the reference matched more than one booking.
- `410`: The resource this request names no longer exists
- `422`: Validation error
- `429`: Rate limit or quota exceeded
- `502`: The travel provider rejected the request, or an upstream call failed
- `503`: No travel provider can serve the request right now
- `504`: The travel provider did not answer in time

---

[API](https://skmtc.dev/gojinko/apis/jinko-public-api.md) - [All operations](https://skmtc.dev/gojinko/apis/jinko-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/gojinko/apis/jinko-public-api/revisions/ac5046767e4c?raw)
