Skip to content

Code Examples

cURL

bash
# Dates are optional — they default to 90/93 days from today
curl -H "X-API-KEY: your_api_key_here" \
  "{{API_BASE_URL}}/v1/accommodations?provider=booking&address=Paris"

JavaScript

javascript
const API_KEY = process.env.API22_API_KEY;
const BASE_URL = '{{API_BASE_URL}}/v1';

function formatDate(daysFromNow) {
  const date = new Date();
  date.setDate(date.getDate() + daysFromNow);
  const mm = String(date.getMonth() + 1).padStart(2, '0');
  const dd = String(date.getDate()).padStart(2, '0');
  const yyyy = date.getFullYear();
  return `${mm}/${dd}/${yyyy}`;
}

async function searchAccommodations(provider, address, checkin, checkout) {
  const params = new URLSearchParams({
    provider,
    address,
    checkin: checkin || formatDate(90),
    checkout: checkout || formatDate(93),
  });

  const response = await fetch(`${BASE_URL}/accommodations?${params}`, {
    headers: { 'X-API-KEY': API_KEY },
  });

  if (!response.ok) {
    throw new Error(`API error: ${response.status}`);
  }

  return (await response.json()).results;
}

// Dates default to 90/93 days from today if omitted
const results = await searchAccommodations('booking', 'Paris');

Python

python
import requests
import os
from datetime import datetime, timedelta

API_KEY = os.getenv('API22_API_KEY')
BASE_URL = '{{API_BASE_URL}}/v1'

def format_date(days_from_now):
    date = datetime.now() + timedelta(days=days_from_now)
    return date.strftime('%m/%d/%Y')

def search_accommodations(provider, address, checkin=None, checkout=None):
    response = requests.get(
        f'{BASE_URL}/accommodations',
        headers={'X-API-KEY': API_KEY},
        params={
            'provider': provider,
            'address': address,
            'checkin': checkin or format_date(90),
            'checkout': checkout or format_date(93),
        },
    )
    response.raise_for_status()
    return response.json()['results']

results = search_accommodations('booking', 'Paris')

Search by Coordinates

JavaScript

javascript
async function searchByLocation(provider, lat, lng) {
  const params = new URLSearchParams({
    provider,
    lat: lat.toString(),
    lng: lng.toString(),
  });

  const response = await fetch(`${BASE_URL}/accommodations?${params}`, {
    headers: { 'X-API-KEY': API_KEY },
  });

  return (await response.json()).results;
}

const results = await searchByLocation('booking', 48.8584, 2.2945);

Python

python
def search_by_location(provider, lat, lng):
    response = requests.get(
        f'{BASE_URL}/accommodations',
        headers={'X-API-KEY': API_KEY},
        params={'provider': provider, 'lat': lat, 'lng': lng},
    )
    response.raise_for_status()
    return response.json()['results']

results = search_by_location('booking', 48.8584, 2.2945)

Search by Bounding Box

Ideal for map-based UIs — pass the viewport corners to search a visible area.

cURL

bash
curl -H "X-API-KEY: your_api_key_here" \
  "{{API_BASE_URL}}/v1/accommodations?provider=booking&nelat=48.90&nelng=2.42&swlat=48.80&swlng=2.25"

JavaScript

javascript
async function searchByBoundingBox(provider, nelat, nelng, swlat, swlng) {
  const params = new URLSearchParams({
    provider,
    nelat: nelat.toString(),
    nelng: nelng.toString(),
    swlat: swlat.toString(),
    swlng: swlng.toString(),
  });

  const response = await fetch(`${BASE_URL}/accommodations?${params}`, {
    headers: { 'X-API-KEY': API_KEY },
  });

  return (await response.json()).results;
}

// Central Paris viewport
const results = await searchByBoundingBox('booking', 48.90, 2.42, 48.80, 2.25);

Python

python
def search_by_bounding_box(provider, nelat, nelng, swlat, swlng):
    response = requests.get(
        f'{BASE_URL}/accommodations',
        headers={'X-API-KEY': API_KEY},
        params={
            'provider': provider,
            'nelat': nelat,
            'nelng': nelng,
            'swlat': swlat,
            'swlng': swlng,
        },
    )
    response.raise_for_status()
    return response.json()['results']

# Central Paris viewport
results = search_by_bounding_box('booking', 48.90, 2.42, 48.80, 2.25)

Advanced Filters

JavaScript

javascript
const results = await searchAccommodations('booking', 'New York City');

// With filters
const params = new URLSearchParams({
  provider: 'booking',
  address: 'New York City',
  checkin: formatDate(90),
  checkout: formatDate(94),
  adults: '2',
  children: '1',
  minguestrating: '8.0',
  max: '200', // per-night price in USD
});

const response = await fetch(`${BASE_URL}/accommodations?${params}`, {
  headers: { 'X-API-KEY': API_KEY },
});
const data = await response.json();

Python

python
results = search_accommodations(
    'booking',
    address='New York City',
    checkin=format_date(90),
    checkout=format_date(94),
)

# With filters
response = requests.get(
    f'{BASE_URL}/accommodations',
    headers={'X-API-KEY': API_KEY},
    params={
        'provider': 'booking',
        'address': 'New York City',
        'adults': 2,
        'children': 1,
        'minguestrating': 8.0,
        'max': 200,  # per-night price in USD
    },
)

Error Handling and Retries

JavaScript

javascript
class API22Client {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.baseUrl = '{{API_BASE_URL}}/v1';
  }

  async request(endpoint, params = {}, maxRetries = 3) {
    const url = new URL(`${this.baseUrl}${endpoint}`);
    Object.entries(params).forEach(([key, value]) => {
      if (value !== undefined && value !== null) {
        url.searchParams.append(key, value.toString());
      }
    });

    for (let attempt = 0; attempt < maxRetries; attempt++) {
      const response = await fetch(url, {
        headers: { 'X-API-KEY': this.apiKey },
      });

      // Rate limit — back off and retry
      if (response.status === 429) {
        const waitTime = Math.pow(2, attempt) * 1000;
        await new Promise((r) => setTimeout(r, waitTime));
        continue;
      }

      if (!response.ok) {
        const error = await response.json();
        throw new Error(`${error.code}: ${error.message}`);
      }

      return await response.json();
    }

    throw new Error('Max retries exceeded');
  }

  async searchAccommodations(provider, params) {
    return this.request('/accommodations', { provider, ...params });
  }
}

const client = new API22Client(process.env.API22_API_KEY);
const results = await client.searchAccommodations('booking', { address: 'Paris' });

Python

python
import requests
import time

class API22Client:
    def __init__(self, api_key):
        self.base_url = '{{API_BASE_URL}}/v1'
        self.session = requests.Session()
        self.session.headers.update({'X-API-KEY': api_key})

    def request(self, endpoint, params=None, max_retries=3):
        url = f'{self.base_url}{endpoint}'

        for attempt in range(max_retries):
            response = self.session.get(url, params=params)

            # Rate limit — back off and retry
            if response.status_code == 429:
                time.sleep(2 ** attempt)
                continue

            if not response.ok:
                data = response.json()
                raise Exception(f'{data["code"]}: {data["message"]}')

            return response.json()

        raise Exception('Max retries exceeded')

    def search_accommodations(self, provider, **params):
        return self.request('/accommodations', {'provider': provider, **params})

client = API22Client(os.getenv('API22_API_KEY'))
results = client.search_accommodations('booking', address='Paris')