Search live hotel inventory and rates
curl --request POST \
--url https://api.example.com/v1/hotel_search \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"city_name": "Paris",
"country_code": "fr",
"checkin": "2026-09-01",
"checkout": "2026-09-04",
"adults": 2,
"currency": "USD"
}
'import requests
url = "https://api.example.com/v1/hotel_search"
payload = {
"city_name": "Paris",
"country_code": "fr",
"checkin": "2026-09-01",
"checkout": "2026-09-04",
"adults": 2,
"currency": "USD"
}
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({
city_name: 'Paris',
country_code: 'fr',
checkin: '2026-09-01',
checkout: '2026-09-04',
adults: 2,
currency: 'USD'
})
};
fetch('https://api.example.com/v1/hotel_search', 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/hotel_search",
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([
'city_name' => 'Paris',
'country_code' => 'fr',
'checkin' => '2026-09-01',
'checkout' => '2026-09-04',
'adults' => 2,
'currency' => 'USD'
]),
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/hotel_search"
payload := strings.NewReader("{\n \"city_name\": \"Paris\",\n \"country_code\": \"fr\",\n \"checkin\": \"2026-09-01\",\n \"checkout\": \"2026-09-04\",\n \"adults\": 2,\n \"currency\": \"USD\"\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/hotel_search")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"city_name\": \"Paris\",\n \"country_code\": \"fr\",\n \"checkin\": \"2026-09-01\",\n \"checkout\": \"2026-09-04\",\n \"adults\": 2,\n \"currency\": \"USD\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/hotel_search")
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 \"city_name\": \"Paris\",\n \"country_code\": \"fr\",\n \"checkin\": \"2026-09-01\",\n \"checkout\": \"2026-09-04\",\n \"adults\": 2,\n \"currency\": \"USD\"\n}"
response = http.request(request)
puts response.read_body{
"hotels": [
{
"hotel_id": "htl_8f21a9c0",
"name": "Hôtel Le Marais",
"address": "12 Rue de Rivoli",
"city": "Paris",
"country_code": "FR",
"star_rating": 4,
"rating": 8.6,
"review_count": 1243,
"images": [
"https://images.gojinko.com/hotels/htl_8f21a9c0/1.jpg"
],
"thumbnail_url": "https://images.gojinko.com/hotels/htl_8f21a9c0/thumb.jpg",
"rooms": [
null
]
}
],
"total": 87
}{
"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": "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_ERROR",
"message": "Upstream travel provider returned an error. Please retry.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}Hotels
hotel-search
Search live hotel inventory and rates
POST
/
v1
/
hotel_search
Search live hotel inventory and rates
curl --request POST \
--url https://api.example.com/v1/hotel_search \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"city_name": "Paris",
"country_code": "fr",
"checkin": "2026-09-01",
"checkout": "2026-09-04",
"adults": 2,
"currency": "USD"
}
'import requests
url = "https://api.example.com/v1/hotel_search"
payload = {
"city_name": "Paris",
"country_code": "fr",
"checkin": "2026-09-01",
"checkout": "2026-09-04",
"adults": 2,
"currency": "USD"
}
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({
city_name: 'Paris',
country_code: 'fr',
checkin: '2026-09-01',
checkout: '2026-09-04',
adults: 2,
currency: 'USD'
})
};
fetch('https://api.example.com/v1/hotel_search', 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/hotel_search",
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([
'city_name' => 'Paris',
'country_code' => 'fr',
'checkin' => '2026-09-01',
'checkout' => '2026-09-04',
'adults' => 2,
'currency' => 'USD'
]),
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/hotel_search"
payload := strings.NewReader("{\n \"city_name\": \"Paris\",\n \"country_code\": \"fr\",\n \"checkin\": \"2026-09-01\",\n \"checkout\": \"2026-09-04\",\n \"adults\": 2,\n \"currency\": \"USD\"\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/hotel_search")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"city_name\": \"Paris\",\n \"country_code\": \"fr\",\n \"checkin\": \"2026-09-01\",\n \"checkout\": \"2026-09-04\",\n \"adults\": 2,\n \"currency\": \"USD\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/hotel_search")
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 \"city_name\": \"Paris\",\n \"country_code\": \"fr\",\n \"checkin\": \"2026-09-01\",\n \"checkout\": \"2026-09-04\",\n \"adults\": 2,\n \"currency\": \"USD\"\n}"
response = http.request(request)
puts response.read_body{
"hotels": [
{
"hotel_id": "htl_8f21a9c0",
"name": "Hôtel Le Marais",
"address": "12 Rue de Rivoli",
"city": "Paris",
"country_code": "FR",
"star_rating": 4,
"rating": 8.6,
"review_count": 1243,
"images": [
"https://images.gojinko.com/hotels/htl_8f21a9c0/1.jpg"
],
"thumbnail_url": "https://images.gojinko.com/hotels/htl_8f21a9c0/thumb.jpg",
"rooms": [
null
]
}
],
"total": 87
}{
"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": "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_ERROR",
"message": "Upstream travel provider returned an error. Please retry.",
"doc_url": "https://docs.gojinko.com/concepts/errors"
}
}Search live hotel inventory and nightly rates for a destination and stay window. It handles requests like “three nights in Lisbon next weekend for two adults” or “family room in Rome with one child in August”. Each result includes an
htl_* offer token you can hand to the trip tool to start a booking.Authorizations
ApiKeyAuthBearerAuth
Body
application/json
Pattern:
^\d{4}-\d{2}-\d{2}$Pattern:
^\d{4}-\d{2}-\d{2}$Example:
"Paris"
Required string length:
2Required range:
0 < x <= 50Show child attributes
Show child attributes
Required range:
x >= 1Required range:
x >= 1Required string length:
2Required range:
1 <= x <= 5Required range:
1 <= x <= 5Required range:
1 <= x <= 5Page size — max hotels returned (the limit). Default 50.
Pagination offset — skip this many hotels at the upstream search. Default 0.
Required range:
x >= 0Show child attributes
Show child attributes
⌘I
