Scrappa

Google Hotels Search

Search for hotels by location with comprehensive filtering options. Supports price range, star rating, free cancellation, and sorting options. Use the Google Hotels Autocomplete endpoint to get valid location suggestions and property tokens for this endpoint.

Endpoint

GET /api/google-hotels/search

Generate Code with AI

Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.

Parameters

q string Required

Location query for hotel search (e.g., "Paris, France", "Near Eiffel Tower")

check_in_date string Required

Check-in date in YYYY-MM-DD format (must be today or future date)

check_out_date string Required

Check-out date in YYYY-MM-DD format (must be after check-in date)

adults integer Optional

Number of adult guests (1-10)

children integer Optional

Number of children (0-6)

currency string Optional

3-letter currency code for prices (e.g., USD, EUR, GBP)

gl string Optional

2-letter country code for localization (e.g., us, gb, de, fr)

hl string Optional

2-letter language code for results (e.g., en, es, fr, de)

sort_by integer Optional

Sort order: 3 (price lowest first), 8 (rating highest first), 13 (most reviewed first)

min_price integer Optional

Minimum price per night filter

max_price integer Optional

Maximum price per night filter (must be greater than min_price)

hotel_class array Optional

Filter by hotel star rating IDs (comma-separated): 2, 3, 4, or 5

rating integer Optional

Minimum guest rating filter: 7 (3.5+), 8 (4.0+), 9 (4.5+)

amenities array Optional

Filter by amenity IDs (SerpAPI list, comma-separated). Example: 35 (Free Wi-Fi), 9 (Free breakfast), 15 (Bar)

free_cancellation boolean Optional

Filter for hotels with free cancellation (true/false)

children_ages array Optional

Comma-separated children ages (1-17 years old). Count must match children.

vacation_rentals boolean Optional

Filter for vacation rental properties only (Airbnb-style properties) instead of hotels

eco_certified boolean Optional

Filter for eco-certified/sustainable hotels only

special_offers boolean Optional

Filter for hotels with special offers/deals

property_types array Optional

Filter by property type IDs (SerpAPI list, comma-separated). Example: 12 (Beach hotels), 1 (Apartments)

brands array Optional

Filter by brand IDs (use brands[].id from response)

bedrooms integer Optional

Minimum number of bedrooms (1-20, vacation rentals only)

bathrooms integer Optional

Minimum number of bathrooms (1-20, vacation rentals only)

next_page_token string Optional

Pagination token from previous response

property_token string Optional

Property token for a specific hotel (from search results)

Request Examples

<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/google-hotels/search?q=Paris%2C+France&check_in_date=2025-08-15&check_out_date=2025-08-18&currency=EUR&gl=fr",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => [
        "x-api-key: YOUR_API_KEY_HERE"
    ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}
<?php

use Illuminate\Support\Facades\Http;

$response = Http::timeout(30)
    ->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
    ->get('https://scrappa.co/api/google-hotels/search?q=Paris%2C+France&check_in_date=2025-08-15&check_out_date=2025-08-18&currency=EUR&gl=fr');

if ($response->successful()) {
    echo $response->body();
} else {
    echo "Error: " . $response->status();
}
const options = {
    method: 'GET',
    headers: {
        'x-api-key': 'YOUR_API_KEY_HERE'
    }
};

fetch('https://scrappa.co/api/google-hotels/search?q=Paris%2C+France&check_in_date=2025-08-15&check_out_date=2025-08-18&currency=EUR&gl=fr', options)
    .then(response => {
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.text();
    })
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
const axios = require('axios');

const options = {
    method: 'GET',
    url: 'https://scrappa.co/api/google-hotels/search?q=Paris%2C+France&check_in_date=2025-08-15&check_out_date=2025-08-18&currency=EUR&gl=fr',
    headers: {
        x-api-key: 'YOUR_API_KEY_HERE',
    }
};

try {
    const response = await axios(options);
    console.log(response.data);
} catch (error) {
    console.error('Error:', error.message);
}
require 'net/http'
require 'uri'

uri = URI.parse("https://scrappa.co/api/google-hotels/search?q=Paris%2C+France&check_in_date=2025-08-15&check_out_date=2025-08-18&currency=EUR&gl=fr")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'

request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'

begin
    response = http.request(request)
    puts response.body
rescue => e
    puts "Error: #{e.message}"
end
import http.client
import json

conn = http.client.HTTPSConnection("scrappa.co")

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    conn.request("GET", "/api/google-hotels/search?q=Paris%2C+France&check_in_date=2025-08-15&check_out_date=2025-08-18&currency=EUR&gl=fr", headers=headers)
    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))
except Exception as e:
    print(f"Error: {e}")
finally:
    conn.close()
import requests

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    response = requests.get('https://scrappa.co/api/google-hotels/search?q=Paris%2C+France&check_in_date=2025-08-15&check_out_date=2025-08-18&currency=EUR&gl=fr', headers=headers)
    response.raise_for_status()
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;

public class ApiExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
            .url("https://scrappa.co/api/google-hotels/search?q=Paris%2C+France&check_in_date=2025-08-15&check_out_date=2025-08-18&currency=EUR&gl=fr")
        .addHeader("x-api-key", "YOUR_API_KEY_HERE")
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful()) {
                System.out.println(response.body().string());
            } else {
                System.out.println("Error: " + response.code());
            }
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "https://scrappa.co/api/google-hotels/search?q=Paris%2C+France&check_in_date=2025-08-15&check_out_date=2025-08-18&currency=EUR&gl=fr", nil)
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }
    req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")

    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error making request:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    fmt.Println(string(body))
}
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/google-hotels/search?q=Paris%2C+France&check_in_date=2025-08-15&check_out_date=2025-08-18&currency=EUR&gl=fr"
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var client = new HttpClient();
        client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");

        try
        {
            var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/google-hotels/search?q=Paris%2C+France&check_in_date=2025-08-15&check_out_date=2025-08-18&currency=EUR&gl=fr"));
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
import axios from 'axios';

async function run(): Promise<void> {
    try {
        const response = await axios({
            method: 'GET',
            url: 'https://scrappa.co/api/google-hotels/search?q=Paris%2C+France&check_in_date=2025-08-15&check_out_date=2025-08-18&currency=EUR&gl=fr',
            headers: {
        'x-api-key': 'YOUR_API_KEY_HERE',
            },
        });

        console.log(response.data);
    } catch (error) {
        console.error('Error:', error);
    }
}

void run();
use reqwest::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();

    let response = client
        .get("https://scrappa.co/api/google-hotels/search?q=Paris%2C+France&check_in_date=2025-08-15&check_out_date=2025-08-18&currency=EUR&gl=fr")
        .header("x-api-key", "YOUR_API_KEY_HERE")
        .send()
        .await?;

    println!("{}", response.text().await?);

    Ok(())
}

Response Schema

JSON Response
200 OK
{
    "properties": []
}

Try It Live

Test this endpoint in our interactive playground with real data.

Open in Playground