# Airbnb API scraper — search stays, listing details, host profile, guest reviews, prices and availability calendar (airbnb.com data, no account required)

> Search Airbnb stays by location and dates with full filters: price range, guests, place/property type, bedrooms/beds/baths, amenities, instant-book, Superhost, free cancellation and host language (≈26 cards/page, cursor-paginated).
> ReefAPI engine `airbnb` · 8 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/airbnb/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed or blocked calls are free.
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /airbnb/v1/stays.search — 2 credits
Search Airbnb stays by location and dates with full filters: price range, guests, place/property type, bedrooms/beds/baths, amenities, instant-book, Superhost, free cancellation and host language (≈26 cards/page, cursor-paginated).

**Parameters:**
- `query` (string, required) — Where to search — city/region free text ('Istanbul, Turkey', 'Paris, France', 'Malibu, CA').
- `checkin` (string, optional) — Check-in date (YYYY-MM-DD).
- `checkout` (string, optional) — Check-out date (YYYY-MM-DD).
- `adults` (integer, optional, default 1) — Number of adult guests.
- `children` (integer, optional) — Number of children (ages 2–12).
- `infants` (integer, optional) — Number of infants (under 2).
- `price_min` (integer, optional) — Minimum total price for the stay, in `currency`.
- `price_max` (integer, optional) — Maximum total price for the stay, in `currency`.
- `room_type` (string, optional) — Place type. One or more (comma-separated) of: entire_home, private_room, shared_room, hotel_room.
- `property_type` (string, optional) — Property type. One or more (comma-separated) of: house, apartment, guesthouse, hotel.
- `min_bedrooms` (integer, optional) — Minimum number of bedrooms (0 = studio, 1–8).
- `min_beds` (integer, optional) — Minimum number of beds (1–8).
- `min_bathrooms` (integer, optional) — Minimum number of bathrooms (1–8).
- `amenities` (string, optional) — Required amenities, comma-separated. Known values: wifi, kitchen, washer, dryer, air_conditioning, heating, pool, hot_tub, free_parking, ev_charger, tv, self_check_in, pets_allowed, gym, breakfast, dedicated_workspace, elevator, smoke_alarm, fireplace, bbq_grill, waterfront, beachfront.
- `host_languages` (string, optional) — Filter by host language(s), comma-separated (e.g. English, French, German, Spanish, Italian, Japanese).
- `instant_book` (boolean, optional) — Only listings that can be booked instantly (no host approval).
- `superhost` (boolean, optional) — Only Guest-favorite / Superhost listings.
- `free_cancellation` (boolean, optional) — Only listings offering free cancellation.
- `pets_allowed` (boolean, optional) — Only listings that allow pets.
- `cursor` (string, optional) — Next page: pass the previous response's meta.pagination.next_cursor (the 'Next' button does this automatically).
- `currency` (string, optional, default "EUR") — Price currency (ISO code: EUR, USD, GBP, TRY…).
- `locale` (string, optional, default "en") — Response language (en, de, tr, es…).
- `include_raw` (boolean, optional, default false) — Advanced: include the full raw response payload per listing card.

**Returns:** items[]{id, name, rating, rating_label, price, coordinate{lat, lng}, badges, subtitle} + unique_count + meta.pagination{has_more, next_cursor, cursor_count}

**Example request body:**
```json
{
  "query": "Istanbul, Turkey",
  "checkin": "2026-08-10",
  "checkout": "2026-08-15",
  "adults": 2
}
```

### POST /airbnb/v1/stays.detail — 3 credits
Full listing details: title, property/room type, guest capacity, the six category sub-ratings, host card, complete amenity list, photo URLs, sleeping arrangement, house rules, description and map location. Returns a clean `parsed` summary plus the raw PDP payload.

**Parameters:**
- `listing_id` (string, required) — Airbnb listing ID — the number in the listing URL (airbnb.com/rooms/<listing_id>) or `id` from stays.search.
- `currency` (string, optional, default "EUR") — Price currency (ISO code: EUR, USD, GBP, TRY…).
- `locale` (string, optional, default "en") — Response language (en, de, tr, es…).

**Returns:** parsed{listing_id, title, property_type, room_type, person_capacity, ratings{overall, review_count, accuracy, checkin, cleanliness, communication, location, value}, host{name, is_superhost, rating, review_count, years_hosting, highlights}, amenities[]{name, available}, photos[]{url, caption}, rooms[]{name, details}, house_rules[], description, location{city, lat, lng}} + raw (full PDP payload)

**Example request body:**
```json
{
  "listing_id": "1408102095235129361"
}
```

### POST /airbnb/v1/host.profile — 1 credit
Host profile for a listing: host name, Superhost/verified status, overall host rating, total reviews, years hosting, response rate and host highlights.

**Parameters:**
- `listing_id` (string, required) — Airbnb listing ID — the number in the listing URL (airbnb.com/rooms/<listing_id>) or `id` from stays.search.
- `locale` (string, optional, default "en") — Response language (en, de, tr, es…).

**Returns:** host{name, is_superhost, is_verified, rating, review_count, years_hosting, highlights[], details[], listing_id, listing_title}

**Example request body:**
```json
{
  "listing_id": "1408102095235129361"
}
```

### POST /airbnb/v1/stays.reviews — 1 credit
Listing reviews, paginated via offset/limit.

**Parameters:**
- `listing_id` (string, required) — Airbnb listing ID — the number in the listing URL (airbnb.com/rooms/<listing_id>) or `id` from stays.search.
- `limit` (integer, optional, default 24) — Reviews per call (1–50).
- `offset` (integer, optional, default 0) — Skip this many reviews (offset paging; or use `cursor` = the next offset).
- `cursor` (string, optional) — Next page: pass meta.pagination.next_cursor (= the next offset, handled automatically by 'Next').
- `locale` (string, optional, default "en") — Response language (en, de, tr, es…).

**Returns:** reviews[]{id, comments, language, createdAt, localizedDate, reviewer, reviewee, responder, reviewHighlight} + count + meta.pagination{page, has_more, next_cursor}

**Example request body:**
```json
{
  "listing_id": "1408102095235129361"
}
```

### POST /airbnb/v1/stays.availability_calendar — 2 credits
Availability calendar for a listing (up to 12 months ahead): per-day availability + min/max nights.

**Parameters:**
- `listing_id` (string, required) — Airbnb listing ID — the number in the listing URL (airbnb.com/rooms/<listing_id>) or `id` from stays.search.
- `month_count` (integer, optional, default 12) — How many months ahead (1–12).

**Returns:** months[]{month, days[{date, available, price}]} + day_count + blocked_vs_available + caps{requested_month_count, returned_month_count, calendar_cap_months}

**Example request body:**
```json
{
  "listing_id": "1408102095235129361",
  "month_count": 3
}
```

### POST /airbnb/v1/properties.search — 2 credits
Alias of stays.search.

**Parameters:**
- `query` (string, required) — Where to search — city/region free text ('Istanbul, Turkey', 'Paris, France', 'Malibu, CA').
- `checkin` (string, optional) — Check-in date (YYYY-MM-DD).
- `checkout` (string, optional) — Check-out date (YYYY-MM-DD).
- `adults` (integer, optional, default 1) — Number of adult guests.
- `children` (integer, optional) — Number of children (ages 2–12).
- `infants` (integer, optional) — Number of infants (under 2).
- `price_min` (integer, optional) — Minimum total price for the stay, in `currency`.
- `price_max` (integer, optional) — Maximum total price for the stay, in `currency`.
- `room_type` (string, optional) — Place type. One or more (comma-separated) of: entire_home, private_room, shared_room, hotel_room.
- `property_type` (string, optional) — Property type. One or more (comma-separated) of: house, apartment, guesthouse, hotel.
- `min_bedrooms` (integer, optional) — Minimum number of bedrooms (0 = studio, 1–8).
- `min_beds` (integer, optional) — Minimum number of beds (1–8).
- `min_bathrooms` (integer, optional) — Minimum number of bathrooms (1–8).
- `amenities` (string, optional) — Required amenities, comma-separated. Known values: wifi, kitchen, washer, dryer, air_conditioning, heating, pool, hot_tub, free_parking, ev_charger, tv, self_check_in, pets_allowed, gym, breakfast, dedicated_workspace, elevator, smoke_alarm, fireplace, bbq_grill, waterfront, beachfront.
- `host_languages` (string, optional) — Filter by host language(s), comma-separated (e.g. English, French, German, Spanish, Italian, Japanese).
- `instant_book` (boolean, optional) — Only listings that can be booked instantly (no host approval).
- `superhost` (boolean, optional) — Only Guest-favorite / Superhost listings.
- `free_cancellation` (boolean, optional) — Only listings offering free cancellation.
- `pets_allowed` (boolean, optional) — Only listings that allow pets.
- `cursor` (string, optional) — Next page: pass the previous response's meta.pagination.next_cursor (the 'Next' button does this automatically).
- `currency` (string, optional, default "EUR") — Price currency (ISO code: EUR, USD, GBP, TRY…).
- `locale` (string, optional, default "en") — Response language (en, de, tr, es…).
- `include_raw` (boolean, optional, default false) — Advanced: include the full raw response payload per listing card.

**Returns:** items[]{id, name, rating, rating_label, price, coordinate{lat, lng}, badges, subtitle} + unique_count + meta.pagination{has_more, next_cursor, cursor_count}

### POST /airbnb/v1/properties.detail — 3 credits
Alias of stays.detail.

**Parameters:**
- `listing_id` (string, required) — Airbnb listing ID — the number in the listing URL (airbnb.com/rooms/<listing_id>) or `id` from stays.search.
- `currency` (string, optional, default "EUR") — Price currency (ISO code: EUR, USD, GBP, TRY…).
- `locale` (string, optional, default "en") — Response language (en, de, tr, es…).

**Returns:** parsed{...} + raw (full PDP payload) — see stays.detail

### POST /airbnb/v1/autocomplete — 1 credit
Location autocomplete suggestions (raw passthrough).

**Parameters:**
- `query` (string, optional) — Location text to complete.

**Returns:** raw.data.presentation.autoSuggestions{...}

## More
- Try it live, no code: https://reefapi.com/playground?engine=airbnb
- Human docs page: https://reefapi.com/docs/airbnb
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
