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.