curl --request POST \
--url https://api.gojinko.com/v1/checkout \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"trip_id": "trip_1048576",
"intent": {
"user_intent": "find a cheap flight to Tokyo"
}
}
'import requests
url = "https://api.gojinko.com/v1/checkout"
payload = {
"trip_id": "trip_1048576",
"intent": { "user_intent": "find a cheap flight to Tokyo" }
}
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({trip_id: 'trip_1048576', intent: {user_intent: 'find a cheap flight to Tokyo'}})
};
fetch('https://api.gojinko.com/v1/checkout', 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.gojinko.com/v1/checkout",
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([
'trip_id' => 'trip_1048576',
'intent' => [
'user_intent' => 'find a cheap flight to Tokyo'
]
]),
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.gojinko.com/v1/checkout"
payload := strings.NewReader("{\n \"trip_id\": \"trip_1048576\",\n \"intent\": {\n \"user_intent\": \"find a cheap flight to Tokyo\"\n }\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.gojinko.com/v1/checkout")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"trip_id\": \"trip_1048576\",\n \"intent\": {\n \"user_intent\": \"find a cheap flight to Tokyo\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gojinko.com/v1/checkout")
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 \"trip_id\": \"trip_1048576\",\n \"intent\": {\n \"user_intent\": \"find a cheap flight to Tokyo\"\n }\n}"
response = http.request(request)
puts response.read_body{
"quote_id": "2097152",
"quoted_cart_id": 123,
"accepted_payment_types": [
{
"type": "spt",
"requires": {
"headers": [
"<string>"
],
"fields": [
"<string>"
]
},
"authentication": "customer_handoff"
}
],
"session_id": "cs_1048576",
"checkout_url": "https://app.gojinko.com/checkout?t=<signed token>",
"status": "ready",
"expires_at": "2026-06-01T12:39:56Z",
"payment_type": "intent",
"total_amount": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"total_amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"items": [
{
"item_id": "itm_4b91c2",
"kind": "flight",
"offer_id": "htl_2d67a7441c60e5de",
"trip_item_token": "of_9c1d2e:FARE_ABC",
"hotel_id": "lp1f2c3",
"special_requests": [
"<string>"
],
"booking_scope": "room_bundle",
"num_rooms": 1,
"rooms": [
{
"occupancy_number": 1,
"occupancy": {
"adults": 2,
"children_ages": [
8
]
},
"room_id": "<string>",
"mapped_room_id": 123,
"room_name": "Superior Double",
"rate_id": "<string>",
"board_type": "BB",
"board_name": "Breakfast Included",
"max_occupancy": 123,
"taxes_and_fees": [
{
"amount": 164.49,
"currency": "EUR",
"amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"description": "19, VAT National taxes on accommodation",
"included": true,
"display": "EUR 164.49"
}
],
"policies": [
{
"type": "<string>",
"description": "<string>",
"fee_amount": 123,
"fee_currency": "<string>",
"fee_amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
}
}
],
"is_refundable": true,
"cancellation_policy": [
{
"cancel_time": "2026-08-18T10:00:00+02:00",
"amount": 606.13,
"currency": "EUR",
"type": "amount",
"display": "EUR 606.13",
"amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"percent": 50,
"nights": 1
}
],
"free_cancellation_until": "<string>",
"payment_types": [
"pay_now"
],
"remarks": "<string>"
}
],
"price": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"price_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"pax_count": 1,
"available_ancillaries": [
{
"offer_id": "anc_3f9a1c27e4b8d051",
"type": "bag",
"label": "bag&1 x large 55 x 40 x 20 cm&Includes Speedy Boarding",
"display_label": "bag, 1 x large 55 x 40 x 20 cm, Includes Speedy Boarding",
"description": "<string>",
"price_per_unit": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"price_per_unit_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"scope": "PER_PAX_PER_SEGMENT",
"segment_ref_ids": [
"seg_1"
],
"seat_map": {
"segment_ref_id": "seg_1",
"flight_number": "W62202",
"seats": [
{
"seat_number": "14A",
"available": true,
"chargeable": true,
"price": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"price_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"characteristics": [
"WINDOW"
]
}
]
},
"seat_map_status": "pending",
"per_pax": true,
"max_quantity": 2,
"paid_at": "now"
}
],
"selected_ancillaries": [
{
"offer_id": "anc_3f9a1c27e4b8d051",
"traveler_ref": "pax_1",
"pax_ref_id": "pax_1",
"quantity": 1,
"type": "seat",
"seat_number": "14A",
"segment_ref_ids": [
"seg_1"
],
"price": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"price_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"status": "pending",
"not_charged": true,
"failure_reason": "<string>"
}
],
"price_changed": true,
"original_price": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"original_price_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"price_change": {
"original": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"current": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"delta": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"original_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"current_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"delta_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
}
},
"required_attributes": {
"source": "provider",
"per_passenger": [
"PassportNumber",
"PassportExpiryDate",
"DateOfBirth"
],
"booking": [
"BillingAddress",
"PostCode"
],
"per_passenger_conditional": [
"Nationality"
],
"booking_conditional": [
"<string>"
]
},
"hotel_terms": {
"terms_as_of": "search",
"taxes_breakdown": [
{
"amount": 164.49,
"currency": "EUR",
"amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"description": "19, VAT National taxes on accommodation",
"included": true,
"display": "EUR 164.49"
}
],
"cancellation_schedule": [
{
"cancel_time": "2026-08-18T10:00:00+02:00",
"amount": 606.13,
"currency": "EUR",
"type": "amount",
"display": "EUR 606.13",
"amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"percent": 50,
"nights": 1
}
],
"free_cancellation_until": "2026-08-18T10:00:00+02:00",
"is_refundable": false,
"board_type": "RO",
"board_name": "Room Only",
"payment_types": [
"pay_now"
],
"room_name": "Superior Double",
"room_capacity": 2
}
}
],
"agent_spt_params": {
"max_amount": 259449,
"currency": "USD",
"max_amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"stripe_profile": "<string>",
"expires_at": "2026-06-10T13:04:56Z"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>",
"doc_url": "<string>",
"field": "selections[1].quantity"
}
}{
"error": {
"code": "AUTH_REQUIRED",
"message": "Invalid or expired API key.",
"doc_url": "https://docs.gojinko.com/authentication/api-keys"
}
}{
"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": "Resource not found.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "CONFLICT",
"message": "The checkout could not proceed against the current state of the trip.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "QUOTE_EXPIRED",
"message": "<string>",
"doc_url": "<string>"
},
"expires_at": "2026-09-04T12:39:56Z",
"quote_id": "2097152",
"quoted_cart_id": 2097152,
"reason": "travelers_changed"
}{
"error": {
"code": "MISSING_CUSTOMER_DETAILS",
"message": "the provider requires details this booking has not collected — flight: passport_number, passport_expiry, passport_country, nationality",
"doc_url": "https://docs.gojinko.com/concepts/errors"
},
"missing_fields": [
"nationality",
"passport_country",
"passport_expiry",
"passport_number"
],
"missing_by_domain": {
"flight": [
"passport_number",
"passport_expiry",
"passport_country",
"nationality"
]
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_REJECTED",
"message": "The request was declined for this offer. Try another offer.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>",
"doc_url": "<string>",
"field": "selections[1].quantity"
},
"retry_after_seconds": 1,
"quote_id": "2097152",
"quoted_cart_id": 123
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>",
"doc_url": "<string>",
"field": "selections[1].quantity"
}
}checkout
Checkout a trip, returns a checkout URL the user opens to pay, plus the Shared Payment Token params an agent can use to pay programmatically
curl --request POST \
--url https://api.gojinko.com/v1/checkout \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"trip_id": "trip_1048576",
"intent": {
"user_intent": "find a cheap flight to Tokyo"
}
}
'import requests
url = "https://api.gojinko.com/v1/checkout"
payload = {
"trip_id": "trip_1048576",
"intent": { "user_intent": "find a cheap flight to Tokyo" }
}
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({trip_id: 'trip_1048576', intent: {user_intent: 'find a cheap flight to Tokyo'}})
};
fetch('https://api.gojinko.com/v1/checkout', 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.gojinko.com/v1/checkout",
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([
'trip_id' => 'trip_1048576',
'intent' => [
'user_intent' => 'find a cheap flight to Tokyo'
]
]),
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.gojinko.com/v1/checkout"
payload := strings.NewReader("{\n \"trip_id\": \"trip_1048576\",\n \"intent\": {\n \"user_intent\": \"find a cheap flight to Tokyo\"\n }\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.gojinko.com/v1/checkout")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"trip_id\": \"trip_1048576\",\n \"intent\": {\n \"user_intent\": \"find a cheap flight to Tokyo\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gojinko.com/v1/checkout")
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 \"trip_id\": \"trip_1048576\",\n \"intent\": {\n \"user_intent\": \"find a cheap flight to Tokyo\"\n }\n}"
response = http.request(request)
puts response.read_body{
"quote_id": "2097152",
"quoted_cart_id": 123,
"accepted_payment_types": [
{
"type": "spt",
"requires": {
"headers": [
"<string>"
],
"fields": [
"<string>"
]
},
"authentication": "customer_handoff"
}
],
"session_id": "cs_1048576",
"checkout_url": "https://app.gojinko.com/checkout?t=<signed token>",
"status": "ready",
"expires_at": "2026-06-01T12:39:56Z",
"payment_type": "intent",
"total_amount": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"total_amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"items": [
{
"item_id": "itm_4b91c2",
"kind": "flight",
"offer_id": "htl_2d67a7441c60e5de",
"trip_item_token": "of_9c1d2e:FARE_ABC",
"hotel_id": "lp1f2c3",
"special_requests": [
"<string>"
],
"booking_scope": "room_bundle",
"num_rooms": 1,
"rooms": [
{
"occupancy_number": 1,
"occupancy": {
"adults": 2,
"children_ages": [
8
]
},
"room_id": "<string>",
"mapped_room_id": 123,
"room_name": "Superior Double",
"rate_id": "<string>",
"board_type": "BB",
"board_name": "Breakfast Included",
"max_occupancy": 123,
"taxes_and_fees": [
{
"amount": 164.49,
"currency": "EUR",
"amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"description": "19, VAT National taxes on accommodation",
"included": true,
"display": "EUR 164.49"
}
],
"policies": [
{
"type": "<string>",
"description": "<string>",
"fee_amount": 123,
"fee_currency": "<string>",
"fee_amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
}
}
],
"is_refundable": true,
"cancellation_policy": [
{
"cancel_time": "2026-08-18T10:00:00+02:00",
"amount": 606.13,
"currency": "EUR",
"type": "amount",
"display": "EUR 606.13",
"amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"percent": 50,
"nights": 1
}
],
"free_cancellation_until": "<string>",
"payment_types": [
"pay_now"
],
"remarks": "<string>"
}
],
"price": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"price_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"pax_count": 1,
"available_ancillaries": [
{
"offer_id": "anc_3f9a1c27e4b8d051",
"type": "bag",
"label": "bag&1 x large 55 x 40 x 20 cm&Includes Speedy Boarding",
"display_label": "bag, 1 x large 55 x 40 x 20 cm, Includes Speedy Boarding",
"description": "<string>",
"price_per_unit": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"price_per_unit_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"scope": "PER_PAX_PER_SEGMENT",
"segment_ref_ids": [
"seg_1"
],
"seat_map": {
"segment_ref_id": "seg_1",
"flight_number": "W62202",
"seats": [
{
"seat_number": "14A",
"available": true,
"chargeable": true,
"price": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"price_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"characteristics": [
"WINDOW"
]
}
]
},
"seat_map_status": "pending",
"per_pax": true,
"max_quantity": 2,
"paid_at": "now"
}
],
"selected_ancillaries": [
{
"offer_id": "anc_3f9a1c27e4b8d051",
"traveler_ref": "pax_1",
"pax_ref_id": "pax_1",
"quantity": 1,
"type": "seat",
"seat_number": "14A",
"segment_ref_ids": [
"seg_1"
],
"price": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"price_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"status": "pending",
"not_charged": true,
"failure_reason": "<string>"
}
],
"price_changed": true,
"original_price": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"original_price_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"price_change": {
"original": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"current": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"delta": {
"amount": 123,
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"original_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"current_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"delta_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
}
},
"required_attributes": {
"source": "provider",
"per_passenger": [
"PassportNumber",
"PassportExpiryDate",
"DateOfBirth"
],
"booking": [
"BillingAddress",
"PostCode"
],
"per_passenger_conditional": [
"Nationality"
],
"booking_conditional": [
"<string>"
]
},
"hotel_terms": {
"terms_as_of": "search",
"taxes_breakdown": [
{
"amount": 164.49,
"currency": "EUR",
"amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"description": "19, VAT National taxes on accommodation",
"included": true,
"display": "EUR 164.49"
}
],
"cancellation_schedule": [
{
"cancel_time": "2026-08-18T10:00:00+02:00",
"amount": 606.13,
"currency": "EUR",
"type": "amount",
"display": "EUR 606.13",
"amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"percent": 50,
"nights": 1
}
],
"free_cancellation_until": "2026-08-18T10:00:00+02:00",
"is_refundable": false,
"board_type": "RO",
"board_name": "Room Only",
"payment_types": [
"pay_now"
],
"room_name": "Superior Double",
"room_capacity": 2
}
}
],
"agent_spt_params": {
"max_amount": 259449,
"currency": "USD",
"max_amount_money": {
"value": 41250,
"currency": "USD",
"decimal_places": 2,
"display": "USD 412.50"
},
"stripe_profile": "<string>",
"expires_at": "2026-06-10T13:04:56Z"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>",
"doc_url": "<string>",
"field": "selections[1].quantity"
}
}{
"error": {
"code": "AUTH_REQUIRED",
"message": "Invalid or expired API key.",
"doc_url": "https://docs.gojinko.com/authentication/api-keys"
}
}{
"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": "Resource not found.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "CONFLICT",
"message": "The checkout could not proceed against the current state of the trip.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "QUOTE_EXPIRED",
"message": "<string>",
"doc_url": "<string>"
},
"expires_at": "2026-09-04T12:39:56Z",
"quote_id": "2097152",
"quoted_cart_id": 2097152,
"reason": "travelers_changed"
}{
"error": {
"code": "MISSING_CUSTOMER_DETAILS",
"message": "the provider requires details this booking has not collected — flight: passport_number, passport_expiry, passport_country, nationality",
"doc_url": "https://docs.gojinko.com/concepts/errors"
},
"missing_fields": [
"nationality",
"passport_country",
"passport_expiry",
"passport_number"
],
"missing_by_domain": {
"flight": [
"passport_number",
"passport_expiry",
"passport_country",
"nationality"
]
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Retry after the Retry-After delay.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "UPSTREAM_REJECTED",
"message": "The request was declined for this offer. Try another offer.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>",
"doc_url": "<string>",
"field": "selections[1].quantity"
},
"retry_after_seconds": 1,
"quote_id": "2097152",
"quoted_cart_id": 123
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>",
"doc_url": "<string>",
"field": "selections[1].quantity"
}
}reason: travelers_changed). Call checkout again to re-quote.Authorizations
Response
Checkout result: the priced trip and how to pay for it
The quote this checkout priced. Pass it as quote_id to the typed agent payment, or to the MCP submit_agent_payment, to pay exactly this quote.
"2097152"
Deprecated: use quote_id instead. The same quote as an integer.
Show child attributes
Show child attributes
The hosted payment page session behind checkout_url. Nothing on this API takes it; send the traveler to checkout_url.
"cs_1048576"
"https://app.gojinko.com/checkout?t=<signed token>"
Checkout state — "ready", "pending" or "failed".
"ready"
When the quote behind this checkout stops being payable (RFC 3339). At most one hour from the call, and earlier when an offer in the trip carries a shorter deadline of its own (some airline fares last twenty minutes from their search) — pay before it passes. It is NOT a price hold: the supplier guarantees neither the price nor availability for the window, so an offer can lapse inside it. Nor is it the lifetime of checkout_url, which stays openable longer. After this instant the platform REFUSES to take payment rather than charging a stale price: POST /v1/agent_payment/submit answers 410 QUOTE_EXPIRED and no payment object is created. To recover, call POST /v1/checkout again on the same trip — it re-quotes at the current price — and pay against the new expires_at. The hosted page cannot recover on its own: past this instant it shows the price as expired and the customer has to be sent a fresh checkout. The quote can also stop being payable before this instant if the trip's travelers change after pricing: payment is then refused with 410 QUOTE_EXPIRED and reason: travelers_changed.
"2026-06-01T12:39:56Z"
Which payment rail this trip is on. None of the values means payment has been collected: checkout only prices the trip, and you must still act to get it paid. intent — nothing has been charged or authorized yet; this is what a trip created through this API returns. Send the traveler to checkout_url to pay on the Jinko checkout page, or pay programmatically with POST /v1/agent_payment/submit using a type listed in accepted_payment_types. checkout — a payment page is already open for this trip; send the traveler to checkout_url to complete it. agent — a programmatic payment was already submitted for this quote through POST /v1/agent_payment/submit; check its outcome before submitting again. To choose how to pay, read accepted_payment_types and agent_spt_params, not this field.
intent, checkout, agent "intent"
Deprecated: use total_amount_money instead. The trip total in major currency units.
Show child attributes
Show child attributes
The trip total the checkout is priced at.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Parameters to scope a Shared Payment Token to, so an agent can pay programmatically instead of opening checkout_url: mint the token against these, then call POST /v1/agent_payment/submit with trip_id and the token. The currency is the trip currency: USD or EUR, depending on the partner's Stripe account binding. Absent when the partner does not accept SPT for this trip currency; use the returned accepted_payment_types to select an available payment method, or pay through checkout_url. The human checkout path ignores this object.
Show child attributes
Show child attributes
