Cancel a car rental booking
curl --request POST \
--url https://api.example.com/v1/car_cancel_commit \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"booking_ref": "JNK-8PT9VS",
"last_name": "Carrard",
"cancellation_id": "ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a"
}
'import requests
url = "https://api.example.com/v1/car_cancel_commit"
payload = {
"booking_ref": "JNK-8PT9VS",
"last_name": "Carrard",
"cancellation_id": "ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
booking_ref: 'JNK-8PT9VS',
last_name: 'Carrard',
cancellation_id: 'ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a'
})
};
fetch('https://api.example.com/v1/car_cancel_commit', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/car_cancel_commit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'booking_ref' => 'JNK-8PT9VS',
'last_name' => 'Carrard',
'cancellation_id' => 'ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/car_cancel_commit"
payload := strings.NewReader("{\n \"booking_ref\": \"JNK-8PT9VS\",\n \"last_name\": \"Carrard\",\n \"cancellation_id\": \"ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/car_cancel_commit")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"booking_ref\": \"JNK-8PT9VS\",\n \"last_name\": \"Carrard\",\n \"cancellation_id\": \"ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/car_cancel_commit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"booking_ref\": \"JNK-8PT9VS\",\n \"last_name\": \"Carrard\",\n \"cancellation_id\": \"ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a\"\n}"
response = http.request(request)
puts response.read_body{
"cancellation_id": "ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a",
"state": "confirmed",
"fee_known": true,
"fee": {
"value": 41250,
"currency": "EUR",
"decimal_places": 2
},
"paid": {
"value": 41250,
"currency": "EUR",
"decimal_places": 2
},
"refund_amount": {
"value": 41250,
"currency": "EUR",
"decimal_places": 2
},
"refund_pending_review": true,
"stripe_refund_id": "<string>",
"rejected_reason": "<string>",
"completed_at": "2026-08-20T15:18:00Z"
}{
"error": {
"code": "BAD_REQUEST",
"message": "Malformed JSON in request body.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "AUTH_REQUIRED",
"message": "Invalid or expired API key.",
"doc_url": "https://docs.gojinko.com/api-reference/authentication"
}
}{
"error": {
"code": "PAYMENT_REQUIRED",
"message": "Insufficient balance — this call costs $0.0150 and your organization has $0.0000 available. Top up at https://dashboard.gojinko.com/developers/billing/topup",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "booking not found"
}
}{
"error": {
"code": "CONFLICT",
"message": "an exchange is already in progress for this booking",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "origins: origins is required; trip_type: trip_type is required",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit or quota exceeded.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_REJECTED",
"message": "sabre-rest BargainFinderMaxRQ failed with status 400: 27131 - Number of connection locations exceeds maximum allowed",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "All flight providers are temporarily unable to serve this search. Please retry later. Provider reasons: sabre-rest: provider temporarily closed; travelfusion: quota exhausted",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_TIMEOUT",
"message": "sabre-rest BargainFinderMaxRQ timed out after 30s",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}Other endpoints
car-cancel-commit
Cancel a car rental booking
POST
/
v1
/
car_cancel_commit
Cancel a car rental booking
curl --request POST \
--url https://api.example.com/v1/car_cancel_commit \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"booking_ref": "JNK-8PT9VS",
"last_name": "Carrard",
"cancellation_id": "ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a"
}
'import requests
url = "https://api.example.com/v1/car_cancel_commit"
payload = {
"booking_ref": "JNK-8PT9VS",
"last_name": "Carrard",
"cancellation_id": "ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
booking_ref: 'JNK-8PT9VS',
last_name: 'Carrard',
cancellation_id: 'ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a'
})
};
fetch('https://api.example.com/v1/car_cancel_commit', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/car_cancel_commit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'booking_ref' => 'JNK-8PT9VS',
'last_name' => 'Carrard',
'cancellation_id' => 'ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/car_cancel_commit"
payload := strings.NewReader("{\n \"booking_ref\": \"JNK-8PT9VS\",\n \"last_name\": \"Carrard\",\n \"cancellation_id\": \"ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/car_cancel_commit")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"booking_ref\": \"JNK-8PT9VS\",\n \"last_name\": \"Carrard\",\n \"cancellation_id\": \"ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/car_cancel_commit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"booking_ref\": \"JNK-8PT9VS\",\n \"last_name\": \"Carrard\",\n \"cancellation_id\": \"ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a\"\n}"
response = http.request(request)
puts response.read_body{
"cancellation_id": "ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a",
"state": "confirmed",
"fee_known": true,
"fee": {
"value": 41250,
"currency": "EUR",
"decimal_places": 2
},
"paid": {
"value": 41250,
"currency": "EUR",
"decimal_places": 2
},
"refund_amount": {
"value": 41250,
"currency": "EUR",
"decimal_places": 2
},
"refund_pending_review": true,
"stripe_refund_id": "<string>",
"rejected_reason": "<string>",
"completed_at": "2026-08-20T15:18:00Z"
}{
"error": {
"code": "BAD_REQUEST",
"message": "Malformed JSON in request body.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "AUTH_REQUIRED",
"message": "Invalid or expired API key.",
"doc_url": "https://docs.gojinko.com/api-reference/authentication"
}
}{
"error": {
"code": "PAYMENT_REQUIRED",
"message": "Insufficient balance — this call costs $0.0150 and your organization has $0.0000 available. Top up at https://dashboard.gojinko.com/developers/billing/topup",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "booking not found"
}
}{
"error": {
"code": "CONFLICT",
"message": "an exchange is already in progress for this booking",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "origins: origins is required; trip_type: trip_type is required",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit or quota exceeded.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_REJECTED",
"message": "sabre-rest BargainFinderMaxRQ failed with status 400: 27131 - Number of connection locations exceeds maximum allowed",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "All flight providers are temporarily unable to serve this search. Please retry later. Provider reasons: sabre-rest: provider temporarily closed; travelfusion: quota exhausted",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_TIMEOUT",
"message": "sabre-rest BargainFinderMaxRQ timed out after 30s",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}Cancel the booking at the rental provider and refund the customer’s payment minus the cancellation fee. Requires the
cancellation_id from a preceding preview, binding the commit to the fee the customer saw. Safe to call twice, a committed cancellation is reported as it stands rather than repeated. refund_pending_review: true means the booking is cancelled but the refund needs manual review before it is issued.Authorizations
ApiKeyAuthBearerAuth
Body
application/json
Jinko booking reference from the confirmation email.
Minimum string length:
1Example:
"JNK-8PT9VS"
Lead traveler's last name, exactly as on the booking.
Minimum string length:
1Example:
"Carrard"
The "ccl_…" reference from a preceding car_cancel_preview. Binds the commit to the fee the customer saw.
Minimum string length:
1Example:
"ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a"
Show child attributes
Show child attributes
Optional free-text cancellation reason.
Example:
"Change of plans"
Response
Cancellation result
Example:
"ccl_2f7c9a4e8b1d4c6f9e3a5b7d1c2e4f6a"
Example:
"confirmed"
The only amount Jinko charges at checkout.
Show child attributes
Show child attributes
The only amount Jinko charges at checkout.
Show child attributes
Show child attributes
The only amount Jinko charges at checkout.
Show child attributes
Show child attributes
true means the booking IS cancelled but the refund needs manual review before it is issued.
Example:
"2026-08-20T15:18:00Z"
