Code Examples

Copy-paste examples in multiple languages.

Search for Property Token

First step: find the Google property token for your hotel.

cURL

curl -X POST "https://api.scrapercompany.com/v1/search" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Hilton San Francisco",
    "city": "San Francisco",
    "market": "US"
  }'

Python

import requests
import os

API_KEY = os.environ["SCRAPERCOMPANY_API_KEY"]
BASE_URL = "https://api.scrapercompany.com"

headers = {
    "x-api-key": API_KEY,
    "Content-Type": "application/json"
}

# Search for property
response = requests.post(
    f"${BASE_URL}/v1/search",
    headers=headers,
    json={"name": "Hilton San Francisco", "city": "San Francisco", "market": "US"}
)

data = response.json()
token = data["recommended_match"]["token"]
print(f"Property token: ${token}")

Get 90-Night Calendar

Retrieve a 90-night forward horizon in one request.

cURL

curl -X POST "https://api.scrapercompany.com/v1/calendar" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "token": "ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ",
    "days": 90,
    "currency": "USD",
    "market": "US"
  }'

Python

import requests
import os
from datetime import date, timedelta

API_KEY = os.environ["SCRAPERCOMPANY_API_KEY"]
BASE_URL = "https://api.scrapercompany.com"

def get_calendar(token, days=90, currency="USD", market="US"):
    headers = {
        "x-api-key": API_KEY,
        "Content-Type": "application/json"
    }
    
    payload = {
        "token": token,
        "days": days,
        "currency": currency,
        "market": market
    }
    
    response = requests.post(
        f"${BASE_URL}/v1/calendar",
        headers=headers,
        json=payload
    )
    
    return response.json()

# Get 90-night calendar
token = "ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ"
calendar = get_calendar(token)

# Find cheapest rate
cheapest = min(calendar["priced"], key=lambda x: x["rate_total"])
print(f"Cheapest: ${cheapest['stay_date']} at ${cheapest['rate_total']}")

Get Per-OTA Offers

Get rates from each major OTA (Booking, Hotels.com, Expedia, Agoda).

Python

import requests
import os

API_KEY = os.environ["SCRAPERCOMPANY_API_KEY"]
BASE_URL = "https://api.scrapercompany.com"

def get_ota_offers(token, check_in, nights=1):
    headers = {
        "x-api-key": API_KEY,
        "Content-Type": "application/json"
    }
    
    payload = {
        "token": token,
        "check_in": check_in,
        "nights": nights,
        "currency": "USD",
        "market": "US"
    }
    
    response = requests.post(
        f"${BASE_URL}/v1/offers",
        headers=headers,
        json=payload
    )
    
    return response.json()

# Get per-OTA breakdown
token = "ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ"
offers = get_ota_offers(token, "2026-11-15")

# Compare OTA rates
for offer in offers["offers"]:
    print(f"${offer['source']}: ${offer['rate_total']}")

Async Calendar Batch

Submit multiple properties as a durable PostgreSQL-backed job.

Python

import requests
import os
import time

API_KEY = os.environ["SCRAPERCOMPANY_API_KEY"]
BASE_URL = "https://api.scrapercompany.com"

def submit_calendar_batch(properties):
    headers = {
        "x-api-key": API_KEY,
        "Content-Type": "application/json",
        "Idempotency-Key": "batch-2026-11-15"
    }
    
    payload = {
        "items": properties,
        "priority": 5
    }
    
    response = requests.post(
        f"${BASE_URL}/v1/jobs",
        headers=headers,
        json=payload
    )
    
    return response.json()

def check_job_status(job_id):
    headers = {"x-api-key": API_KEY}
    
    response = requests.get(
        f"${BASE_URL}/v1/jobs/${job_id}?include_results=true",
        headers=headers
    )
    
    return response.json()

# Submit batch of 3 properties
properties = [
    {"token": "ChUI...", "label": "Competitor A", "days": 90, "currency": "USD"},
    {"token": "ChUI...", "label": "Competitor B", "days": 90, "currency": "USD"},
    {"token": "ChUI...", "label": "Competitor C", "days": 90, "currency": "USD"}
]

job = submit_calendar_batch(properties)
job_id = job["job_id"]
print(f"Job submitted: ${job_id}")

# Poll until complete
while True:
    status = check_job_status(job_id)
    print(f"Status: ${status['status']}")
    
    if status["status"] in ["succeeded", "partial", "failed"]:
        print(f"Complete! Results: ${len(status.get('items', []))} properties")
        break
    
    time.sleep(5)

Error Handling

Always handle errors gracefully in production code.

Python with Retry Logic

import requests
import os
import time

API_KEY = os.environ["SCRAPERCOMPANY_API_KEY"]
BASE_URL = "https://api.scrapercompany.com"

def search_with_retry(name, city, max_retries=3):
    headers = {
        "x-api-key": API_KEY,
        "Content-Type": "application/json"
    }
    
    payload = {"name": name, "city": city, "market": "US"}
    
    for attempt in range(max_retries):
        try:
            response = requests.post(
                f"${BASE_URL}/v1/search",
                headers=headers,
                json=payload,
                timeout=30
            )
            
            if response.status_code == 200:
                return response.json()
            elif response.status_code == 429:
                wait_time = 2 ** attempt
                print(f"Rate limited. Waiting ${wait_time}s...")
                time.sleep(wait_time)
                continue
            elif response.status_code == 401:
                raise ValueError("Invalid API key")
            elif response.status_code == 422:
                print(f"Validation error: ${response.json()}")
                break
            else:
                print(f"Error ${response.status_code}: ${response.json()}")
                continue
                
        except requests.exceptions.Timeout:
            print(f"Timeout on attempt ${attempt + 1}")
            if attempt < max_retries - 1:
                time.sleep(2 ** attempt)
    
    raise Exception("Max retries exceeded")

# Example with error handling
try:
    results = search_with_retry("Hilton Chicago", "Chicago")
    token = results["recommended_match"]["token"]
    print(f"Success! Token: ${token}")
except Exception as e:
    print(f"Failed: ${e}")

JavaScript (Node.js)

Complete example with async/await and error handling.

const axios = require('axios');

const API_KEY = process.env.SCRAPERCOMPANY_API_KEY;
const BASE_URL = 'https://api.scrapercompany.com';

const headers = {
  'x-api-key': API_KEY,
  'Content-Type': 'application/json'
};

// Search for property
async function searchProperty(name, city) {
  const response = await axios.post(`${BASE_URL}/v1/search`, {
    name,
    city,
    market: 'US'
  }, { headers });
  
  return response.data.recommended_match.token;
}

// Get calendar
async function getCalendar(token, days = 90) {
  const response = await axios.post(`${BASE_URL}/v1/calendar`, {
    token,
    days,
    currency: 'USD',
    market: 'US'
  }, { headers });
  
  return response.data;
}

// Example usage
(async () => {
  try {
    const token = await searchProperty('Hilton Chicago', 'Chicago');
    console.log(`Token: ${token}`);
    
    const calendar = await getCalendar(token);
    console.log(`Coverage: ${calendar.coverage_pct}%`);
  } catch (error) {
    console.error('Error:', error.response?.data || error.message);
  }
})();

Security Note: Always store your API key in environment variables. Never hardcode it or commit it to version control.