The google_travel_hotels
data source is designed to retrieve Google Travel service's hotel search results.
To ensure optimal utilization of this service, include the "render": "html"
parameter in your request.
Request samples
In this example, we make a request to retrieve the 2
nd results page for hotel availability for 2
adult guests between 2023-10-01
and 2023-10-10
for 2
to 4
-star hotels in Paris from google.com
.
cURL Python Node.js HTTP PHP Golang C# Java JSON
Copy curl 'https://realtime.oxylabs.io/v1/queries' \
--user 'USERNAME:PASSWORD' \
-H 'Content-Type: application/json' \
-d '{
"source": "google_travel_hotels",
"domain": "com",
"start_page": 2,
"query": "hotels in Paris",
"render": "html",
"context": [
{"key": "adults", "value": 2},
{"key": "hotel_dates", "value": "2023-10-01,2023-10-10"},
{"key": "hotel_classes", "value": [2, 3, 4]}
]
}'
Copy import requests
from pprint import pprint
# Structure payload.
payload = {
'source' : 'google_travel_hotels' ,
'domain' : 'com' ,
'query' : 'hotels in Paris' ,
'start_page' : 2 ,
'render' : 'html' ,
'context' : [
{ 'key' : 'adults' , 'value' : 1 },
{ 'key' : 'hotel_dates' , 'value' : '2023-10-01,2023-10-10' },
{ 'key' : 'hotel_classes' , 'value' : [ 2 , 3 , 4 ] },
] ,
}
# Get response.
response = requests . request (
'POST' ,
'https://realtime.oxylabs.io/v1/queries' ,
auth = ( 'USERNAME' , 'PASSWORD' ),
json = payload,
)
# Print prettified response to stdout.
pprint (response. json ())
Copy const https = require ( "https" );
const username = "USERNAME" ;
const password = "PASSWORD" ;
const body = {
source : "google_travel_hotels" ,
domain : "com" ,
start_page : 2 ,
query : "hotels in Paris" ,
render : "html" ,
context : [
{ key : "adults" , value : 2 } ,
{ key : "hotel_dates" , value : "2023-10-01,2023-10-10" } ,
{ key : "hotel_classes" , value : [ 2 , 3 , 4 ] } ,
] ,
};
const options = {
hostname : "realtime.oxylabs.io" ,
path : "/v1/queries" ,
method : "POST" ,
headers : {
"Content-Type" : "application/json" ,
Authorization :
"Basic " + Buffer .from ( ` ${ username } : ${ password } ` ) .toString ( "base64" ) ,
} ,
};
const request = https .request (options , (response) => {
let data = "" ;
response .on ( "data" , (chunk) => {
data += chunk;
});
response .on ( "end" , () => {
const responseData = JSON .parse (data);
console .log ( JSON .stringify (responseData , null , 2 ));
});
});
request .on ( "error" , (error) => {
console .error ( "Error:" , error);
});
request .write ( JSON .stringify (body));
request .end ();
Copy https://realtime.oxylabs.io/v1/queries?source=google_travel_hotels&domain=com&query=hotels+in+Paris&start_page=3&render=html&context[0][key]=adults&context[0][value]=1&context[1][key]=hotel_dates&context[1][value]=2023-10-01,2023-10-10&context[2][key]=hotel_classes&context[2][value]=[2,3,4]&access_token=12345abcde
Copy <? php
$params = array (
'source' => 'google_travel_hotels' ,
'domain' => 'com' ,
'start_page' => 2 ,
'query' => 'hotels in Paris' ,
'render' => 'html' ,
'context' => [
[ 'key' => 'adults' , 'value' => 2 ] ,
[ 'key' => 'hotel_dates' , 'value' => '2023-10-01,2023-10-10' ] ,
[ 'key' => 'hotel_classes' , 'value' => [ 2 , 3 , 4 ]]
]
);
$ch = curl_init () ;
curl_setopt ( $ch , CURLOPT_URL , "https://realtime.oxylabs.io/v1/queries" ) ;
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 ) ;
curl_setopt ( $ch , CURLOPT_POSTFIELDS , json_encode ( $params )) ;
curl_setopt ( $ch , CURLOPT_POST , 1 ) ;
curl_setopt ( $ch , CURLOPT_USERPWD , "USERNAME" . ":" . "PASSWORD" ) ;
$headers = array ();
$headers[] = "Content-Type: application/json" ;
curl_setopt ( $ch , CURLOPT_HTTPHEADER , $headers ) ;
$result = curl_exec ( $ch ) ;
echo $result;
if ( curl_errno ( $ch ) ) {
echo 'Error:' . curl_error ( $ch ) ;
}
curl_close ( $ch ) ;
Copy package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main () {
const Username = "USERNAME"
const Password = "PASSWORD"
payload := map [ string ] interface {}{
"source" : "google_travel_hotels" ,
"domain" : "com" ,
"start_page" : 2 ,
"query" : "hotels in Paris" ,
"render" : "html" ,
"context" : [] map [ string ] interface {}{
{ "key" : "adults" , "value" : 2 },
{ "key" : "hotel_dates" , "value" : "2023-10-01,2023-10-10" },
{ "key" : "hotel_classes" , "value" : [] interface {}{ 2 , 3 , 4 }},
},
}
jsonValue, _ := json. Marshal (payload)
client := & http . Client {}
request, _ := http. NewRequest ( "POST" ,
"https://realtime.oxylabs.io/v1/queries" ,
bytes. NewBuffer (jsonValue),
)
request. SetBasicAuth (Username, Password)
response, _ := client. Do (request)
responseText, _ := ioutil. ReadAll (response.Body)
fmt. Println ( string (responseText))
}
Copy using System ;
using System . Collections . Generic ;
using System . Net . Http ;
using System . Net . Http . Json ;
using System . Threading . Tasks ;
namespace OxyApi
{
class Program
{
static async Task Main ()
{
const string Username = "USERNAME" ;
const string Password = "PASSWORD" ;
var parameters = new {
source = "google_travel_hotels" ,
domain = "com" ,
start_page = 2 ,
query = "hotels in Paris" ,
render = "html" ,
context = new dynamic [] {
new { key = "adults" , value = 2 } ,
new { key = "hotel_dates" , value = "2023-10-01,2023-10-10" } ,
new { key = "hotel_classes" , value = new int [] { 2 , 3 , 4 } }
}
};
var client = new HttpClient ();
Uri baseUri = new Uri ( "https://realtime.oxylabs.io" );
client . BaseAddress = baseUri;
var requestMessage = new HttpRequestMessage ( HttpMethod . Post , "/v1/queries" );
requestMessage . Content = JsonContent . Create (parameters);
var authenticationString = $"{Username}:{Password}" ;
var base64EncodedAuthenticationString = Convert.ToBase64String(System.Text.ASCIIEncoding.UTF8.GetBytes(authenticationString));
requestMessage . Headers . Add ( "Authorization" , "Basic " + base64EncodedAuthenticationString);
var response = await client . SendAsync (requestMessage);
var contents = await response . Content . ReadAsStringAsync ();
Console . WriteLine (contents);
}
}
}
Copy package org . example ;
import okhttp3 . * ;
import org . json . JSONArray ;
import org . json . JSONObject ;
import java . util . concurrent . TimeUnit ;
public class Main implements Runnable {
private static final String AUTHORIZATION_HEADER = "Authorization" ;
public static final String USERNAME = "USERNAME" ;
public static final String PASSWORD = "PASSWORD" ;
public void run () {
JSONObject jsonObject = new JSONObject() ;
jsonObject . put ( "source" , "google_travel_hotels" );
jsonObject . put ( "domain" , "com" );
jsonObject . put ( "start_page" , 2 );
jsonObject . put ( "query" , "hotels in Paris" );
jsonObject . put ( "render" , "html" );
jsonObject . put ( "context" , new JSONArray()
. put ( new JSONObject() . put ( "key" , "adults" ) . put ( "value" , 2 ))
. put ( new JSONObject() . put ( "key" , "hotel_dates" ) . put ( "value" , "2023-10-01,2023-10-10" ))
. put ( new JSONObject() . put ( "key" , "hotel_classes" ) . put ( "value" , new JSONArray() . put ( 2 ) . put ( 3 ) . put ( 4 )))
);
Authenticator authenticator = (route , response) -> {
String credential = Credentials . basic (USERNAME , PASSWORD);
return response
. request ()
. newBuilder ()
. header (AUTHORIZATION_HEADER , credential)
. build ();
};
var client = new OkHttpClient . Builder ()
. authenticator (authenticator)
. readTimeout ( 180 , TimeUnit . SECONDS )
. build ();
var mediaType = MediaType . parse ( "application/json; charset=utf-8" );
var body = RequestBody . create ( jsonObject . toString () , mediaType);
var request = new Request . Builder ()
. url ( "https://realtime.oxylabs.io/v1/queries" )
. post (body)
. build ();
try ( var response = client . newCall (request) . execute ()) {
if ( response . body () != null ) {
try ( var responseBody = response . body ()) {
System . out . println ( responseBody . string ());
}
}
} catch ( Exception exception) {
System . out . println ( "Error: " + exception . getMessage ());
}
System . exit ( 0 );
}
public static void main ( String [] args) {
new Thread( new Main()) . start ();
}
}
Copy {
"source" : "google_travel_hotels" ,
"domain" : "com" ,
"start_page" : 2 ,
"query" : "hotels in Paris" ,
"render" : "html" ,
"context" : [
{
"key" : "adults" ,
"value" : 2
} ,
{
"key" : "hotel_dates" ,
"value" : "2023-10-01,2023-10-10"
} ,
{
"key" : "hotel_classes" ,
"value" : [ 2 , 3 , 4 ]
}
]
}
We use synchronous Realtime integration method in our examples. If you would like to use Proxy Endpoint or asynchronous Push-Pull integration, refer to the integration methods section.
Request parameter values
Generic
Basic setup and customization options for scraping Google Travel: Hotels results.
Parameter Description Default Value UTF-encoded keyword.
"query": "hotels"
will result in a list of hotels in a given geo_location
.
"query": "hotels in <Location>"
will result in a list of hotels for <Location>
. For example, "query": "hotels in Paris"
will list hotels in Paris, regardless of the given geo_location
.
Enables JavaScript rendering when set to html
. More info .
Device type and browser. The full list can be found here .
- mandatory parameter
Localization
Adapt search results to specific geographical locations, domains, and languages.
Parameter Description Default Value The geographical location that the result should be adapted for. Using this parameter correctly is extremely important to get the right data. Please note that this source can accept a limited number of geo_location
values - please check this section to see geo_location
values that don't yield accurate results.
Domain localization for Google. The full list of available domains can be found here .
Accept-Language
header value which changes your Google search page web interface language. More info .
NOTE: "geo_location": "United States"
and other wide-area locations are not supported. Use city-level geo_location
, e.g., Seattle,Washington,United States
Controls for managing the pagination.
Parameter Description Default Value
Filtering
Advanced options for tailoring and refining the search context.
Parameter Description Default Value Number of children guests
Filter results by # of hotel stars. You may specify one or more values between 2
and 5
. Example: [3,4]
Dates for staying at the hotel, from - to. Example: 2023-07-12,2023-07-13
Context parameters
All context parameters should be added to the context
array as objects with key
and value
pairs, e.g.:
Copy ...
"context" : [
{
"key" : "filter" ,
"value" : "0"
}
]
...
Output example
Copy {
"results" : [
{
"content" : "<!doctype html>\n<html lang=\"en\">\n<head>
...
</script></body>\n</html>\n" ,
"created_at" : "2024-02-13 11:30:09" ,
"updated_at" : "2024-02-13 11:30:36" ,
"page" : 2 ,
"url": "https://www.google.com/travel/search?q=hotels%20in%20Paris&qs=OAA&hrf=OAI4AzgEWAGSAQIgAbABAA&ap=EgNDQXcwAGgA&ts=CAEaFhIUEhIKBwjnDxAKGAESBwjnDxAKGAo&uule=w%20CAIQICINdW5pdGVkIHN0YXRlcw&gl=us&hl=en&ved=0CAAQ5JsGahcKEwjIwci_m6iEAxUAAAAAHQAAAAAQew",
"job_id" : "7163132237108506625" ,
"status_code" : 200
}
]
}