# Airbnb Scraper (`trakk/airbnb-scraper`) Actor

Scrape Airbnb listings via location search or direct URLs. Three modes: search-fast (cards only), search-full (full details), urls (specific listings). HTTP-only, no browsers.

- **URL**: https://apify.com/trakk/airbnb-scraper.md
- **Developed by:** [Blynx](https://apify.com/trakk) (community)
- **Categories:** Travel, Developer tools, Automation
- **Stats:** 5 total users, 2 monthly users, 96.1% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Airbnb Scraper

Single Apify actor that combines three search modes for Airbnb listings:

- **`search-fast`** — fast scrape of listing cards from `/api/v3/StaysSearch` (price, rating, basic facts; no detail page hit).
- **`search-full`** — `search-fast` + full listing details merged in (`StaysPdpSections` per listing).
- **`urls`** — full details for an explicit list of `https://www.airbnb.com/rooms/<id>` URLs.

HTTP-only — no Playwright/Selenium/Puppeteer/nodriver in the production image. The actor talks to Airbnb's internal Niobe GraphQL persisted-query endpoint directly through `curl_cffi(impersonate="chrome")` so TLS/HTTP-2 fingerprints look like real Chrome.

### Modes

| Mode | Inputs | Output | Speed | Cost |
|---|---|---|---|---|
| `search-fast` | `locationQueries[]` | cards only | fastest | cheapest |
| `search-full` | `locationQueries[]` | cards + listing details | medium | per listing |
| `urls` | `startUrls[]` | listing details | medium | per listing |

If `mode` is omitted, it's auto-detected: `startUrls` present → `urls`, else `search-fast`.

### Quick start (Apify Console)

Default prefill runs out of the box and is sized to satisfy Apify's quality test:

```json
{
  "mode": "search-fast",
  "locationQueries": ["Prague"],
  "maxItemsPerQuery": 5,
  "currency": "USD",
  "locale": "en"
}
````

### Example: search-fast

```json
{
  "mode": "search-fast",
  "locationQueries": ["Prague", "Berlin"],
  "checkIn": "2026-06-01",
  "checkOut": "2026-06-07",
  "adults": 2,
  "minPrice": 50,
  "maxPrice": 250,
  "roomType": "Entire home/apt",
  "maxItemsPerQuery": 100,
  "currency": "USD",
  "locale": "en"
}
```

Returns one item per listing with: `id`, `url`, `name`, `coordinates`, `rating`, `bedrooms`/`beds`/`bathrooms`, `price` (for the requested dates, including original price and discounts), `images`, `badges`.

### Example: search-full

```json
{
  "mode": "search-full",
  "locationQueries": ["Prague"],
  "checkIn": "2026-06-01",
  "checkOut": "2026-06-07",
  "adults": 2,
  "maxItemsPerQuery": 30,
  "includeReviews": true,
  "includeCalendar": true,
  "currency": "USD",
  "locale": "en"
}
```

Same as `search-fast` plus from the listing detail: `propertyType`, `host` (Superhost status, years hosting, rating count, profile photo, cohosts), `amenities` (categorised), `highlights`, `description`, `sleepingArrangement`, `houseRules`, `safety`, full image set, and optionally `reviews` and `availabilityCalendar`.

### Example: urls

```json
{
  "mode": "urls",
  "startUrls": [
    { "url": "https://www.airbnb.com/rooms/53997462" },
    { "url": "https://www.airbnb.com/rooms/20277576?adults=2&check_in=2026-06-01&check_out=2026-06-07" }
  ],
  "adults": 2,
  "checkIn": "2026-06-01",
  "checkOut": "2026-06-07",
  "includeCalendar": true,
  "currency": "USD",
  "locale": "en"
}
```

### Output schema

Every item contains (`null` keys are dropped):

```jsonc
{
  "id": "53997462",
  "url": "https://www.airbnb.com/rooms/53997462",
  "name": "Cozy apartment at historical center",
  "propertyType": "Entire condo",                  // search-full / urls only
  "roomType": "Entire home/apt",                   // search-full / urls only
  "personCapacity": 2,                             // search-full / urls only
  "bedrooms": 1, "beds": 2, "bathrooms": 1,        // from search card
  "coordinates": { "lat": 40.6298, "lng": 22.9497 },
  "neighborhood": "Thessaloniki, Greece",          // search-full / urls only
  "rating": {
    "value": 4.95,
    "reviewsCount": 65,
    "categories": {                                // search-full / urls only
      "accuracy": 4.91, "checkin": 4.97, "cleanliness": 4.94,
      "communication": 5.0, "location": 4.98, "value": 4.95, "overall": 4.95
    }
  },
  "images": [{ "id": "...", "url": "https://a0.muscache.com/..." }],
  "imageCount": 46,                                // search-full / urls only
  "price": {
    "currency": "USD",
    "displayPrice": "$954",
    "originalPrice": "$1,400",
    "qualifier": "total",
    "breakdown": { /* full Airbnb price breakdown */ }
  },
  "badges": ["Superhost", "Guest favorite"],
  "amenities": [{ "category": "Bathroom", "items": [...] }],  // search-full / urls
  "highlights": [{ "type": "...", "headline": "...", "body": "..." }],
  "description": "...",                            // search-full / urls
  "descriptionLanguage": "en",
  "sleepingArrangement": [{ "title": "Bedroom", "subtitle": "1 queen bed" }],
  "houseRules": ["Check-in after 3:00 PM", "Checkout before 11:00 AM"],
  "safety": ["Carbon monoxide alarm", "Smoke alarm"],
  "host": {
    "name": "Alexia", "isSuperhost": true, "ratingCount": 65,
    "ratingAverage": 4.95, "yearsHosting": 4, "monthsHosting": 4,
    "profilePictureUrl": "...", "cohosts": [...]
  },
  "reviews": {                                     // only when includeReviews=true
    "total": 65,
    "fetched": 50,
    "reviews": [{ "id": "...", "rating": 5, "comments": "...", "createdAt": "...", "reviewer": {...} }],
    "tags": [...]
  },
  "availabilityCalendar": {                        // only when includeCalendar=true
    "constantMinNights": 2,
    "months": [{ "month": 6, "year": 2026, "days": [{ "date": "2026-06-01", "available": false, ... }] }]
  },
  "locale": "en",
  "currency": "USD",
  "sourceUrl": "https://www.airbnb.com/rooms/53997462"
}
```

Pass `"rawOutput": true` to embed the raw GraphQL responses under `_raw`.

### Notes & limits

- **Currency is restricted to `USD` and `EUR`.** Anything else falls back to `USD`. Rubles aren't supported on purpose — Airbnb left the Russian market in 2022.
- **Search ceiling is 270 listings per query** (Airbnb returns at most 15 pages of 18). Use multiple `locationQueries` to scrape more.
- **Empty input is handled gracefully:** the actor exits with code 1 and a readable status message instead of a stack trace.
- **Proxy:** The default is `{ "useApifyProxy": true }` (Apify picks an available group automatically). If your plan has DATACENTER access, set `apifyProxyGroups: ["DATACENTER"]` for the cheapest path -- it works fine for Airbnb because `curl_cffi(impersonate="chrome")` handles TLS fingerprinting. Otherwise use `["RESIDENTIAL"]`.

### Throughput & `maxConcurrency`

`maxConcurrency` is a **global** cap on parallel HTTP requests to Airbnb -- every operation (search, listing details, calendar, reviews, BookIt) shares the same budget. Every listing in `search-full` fans out into 1-4 HTTP calls depending on which enrich flags are on, and the global semaphore makes sure they don't all burst at once.

Measured on a clean machine with no proxy, hitting the live Airbnb API, with `search-full + includeReviews + includeCalendar` (3-4 requests per listing) and 25 listings per query:

| maxConcurrency | items/sec | notes |
|---|---|---|
| 3  | ~1.0 | safe even for fragile residential proxies |
| 5  | ~1.5 | good balance for typical residential plans |
| 10 | ~2.6 | comfortable for datacenter proxies |
| 20 | ~3.7 | aggressive; datacenter / no-proxy territory |
| 30 | ~4.4 | maxed out -- Airbnb's own latency dominates |
| 50 | ~4.9 | no extra gain beyond ~30 |

#### Picking the right value

| Your proxy | Recommended `maxConcurrency` |
|---|---|
| No proxy (`useApifyProxy: false`) | **20-30** |
| Apify **DATACENTER** | **10-20** |
| Apify **RESIDENTIAL** | **3-5** |

If the log starts spamming `network/proxy error (ProxyError / Timeout)` or `transient status=503` -- halve `maxConcurrency` and rerun. The actor has three independent retry budgets (`proxy_failures`, `captcha_failures`, `attempt`), so transient errors don't lose listings; they just slow the run down.

#### Expected wall time for a full run

A full 270-listing `search-full + reviews + calendar` query is ~810-1080 HTTP calls. At measured rates:

- DATACENTER, `maxConcurrency=15`: **~2 min**
- RESIDENTIAL, `maxConcurrency=5`: **~10-15 min**
- No proxy, `maxConcurrency=30`: **~1 min** (but the IP gets hot fast)

### Tech

- `apify >= 3.3, < 4` SDK, `crawlee >= 1.5, < 2`
- `curl_cffi >= 0.7.0` — Chrome TLS/HTTP-2 fingerprinting
- `pydantic >= 2.7` — input validation
- Default container: 512 MB RAM (HTTP-only — no browser needed)

# Actor input Schema

## `mode` (type: `string`):

search-fast: cards only (fastest). search-full: cards + full listing details. urls: scrape direct listing URLs.

## `locationQueries` (type: `array`):

Free-text locations or Airbnb slugs. Each entry yields up to maxItemsPerQuery listings.

## `startUrls` (type: `array`):

Direct Airbnb listing URLs (https://www.airbnb.com/rooms/<id>). Used only in 'urls' mode.

## `checkIn` (type: `string`):

YYYY-MM-DD. Required to get prices in search results.

## `checkOut` (type: `string`):

YYYY-MM-DD.

## `adults` (type: `integer`):

Number of adult guests for price/availability.

## `children` (type: `integer`):

Number of children (ages 2-12).

## `infants` (type: `integer`):

Number of infants (under 2).

## `pets` (type: `integer`):

Number of pets traveling with you.

## `minPrice` (type: `integer`):

In the chosen currency.

## `maxPrice` (type: `integer`):

In the chosen currency.

## `minBedrooms` (type: `integer`):

Filter out listings with fewer bedrooms than this.

## `minBathrooms` (type: `integer`):

Filter out listings with fewer bathrooms than this.

## `minBeds` (type: `integer`):

Filter out listings with fewer beds than this.

## `roomType` (type: `string`):

Filter listings by room type. Leave empty for any.

## `maxItemsPerQuery` (type: `integer`):

Cap on listings per locationQuery or per startUrl. Airbnb's natural ceiling is ~270 (15 pages x 18).

## `includeReviews` (type: `boolean`):

Fetch reviews via StaysPdpReviewsQuery. Only in search-full and urls modes.

## `includeCalendar` (type: `boolean`):

Fetch 12-month availability via PdpAvailabilityCalendar. Only in search-full and urls modes.

## `currency` (type: `string`):

Only USD or EUR. RUB is intentionally not supported.

## `locale` (type: `string`):

UI language for Airbnb responses (descriptions, host details, etc.).

## `proxy` (type: `object`):

Apify Proxy works out of the box. If your plan has DATACENTER access, set apifyProxyGroups=\['DATACENTER'] for the cheapest path; otherwise leave groups empty (Apify picks an available group for you) or use RESIDENTIAL.

## `maxConcurrency` (type: `integer`):

Global cap on parallel HTTP requests to Airbnb. This is the honest ceiling -- every Niobe call (search, details, calendar, reviews, BookIt) shares it. Pick by proxy type: residential 3-5, datacenter 10-20, no proxy 20-30. Higher than 30 yields no extra throughput because Airbnb's own latency dominates.

## `maxRetries` (type: `integer`):

How many times to retry transient errors (429, 5xx) per request before giving up.

## `rawOutput` (type: `boolean`):

Include the full Niobe GraphQL response under \_raw in each item.

## `debugLog` (type: `boolean`):

Enable verbose DEBUG-level logging.

## Actor input object example

```json
{
  "mode": "search-fast",
  "locationQueries": [
    "Prague"
  ],
  "startUrls": [],
  "adults": 2,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "roomType": "",
  "maxItemsPerQuery": 5,
  "includeReviews": false,
  "includeCalendar": false,
  "currency": "USD",
  "locale": "en",
  "proxy": {
    "useApifyProxy": true
  },
  "maxConcurrency": 10,
  "maxRetries": 5,
  "rawOutput": false,
  "debugLog": false
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "search-fast",
    "locationQueries": [
        "Prague"
    ],
    "maxItemsPerQuery": 5,
    "currency": "USD",
    "locale": "en",
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("trakk/airbnb-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "search-fast",
    "locationQueries": ["Prague"],
    "maxItemsPerQuery": 5,
    "currency": "USD",
    "locale": "en",
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("trakk/airbnb-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search-fast",
  "locationQueries": [
    "Prague"
  ],
  "maxItemsPerQuery": 5,
  "currency": "USD",
  "locale": "en",
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call trakk/airbnb-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=trakk/airbnb-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Airbnb Scraper",
        "description": "Scrape Airbnb listings via location search or direct URLs. Three modes: search-fast (cards only), search-full (full details), urls (specific listings). HTTP-only, no browsers.",
        "version": "0.1",
        "x-build-id": "UBh4tGcNK4tqN4pgV"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/trakk~airbnb-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-trakk-airbnb-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/trakk~airbnb-scraper/runs": {
            "post": {
                "operationId": "runs-sync-trakk-airbnb-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/trakk~airbnb-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-trakk-airbnb-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search-fast",
                            "search-full",
                            "urls"
                        ],
                        "type": "string",
                        "description": "search-fast: cards only (fastest). search-full: cards + full listing details. urls: scrape direct listing URLs.",
                        "default": "search-fast"
                    },
                    "locationQueries": {
                        "title": "Location queries",
                        "type": "array",
                        "description": "Free-text locations or Airbnb slugs. Each entry yields up to maxItemsPerQuery listings.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Direct Airbnb listing URLs (https://www.airbnb.com/rooms/<id>). Used only in 'urls' mode.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "checkIn": {
                        "title": "Check-in date",
                        "type": "string",
                        "description": "YYYY-MM-DD. Required to get prices in search results."
                    },
                    "checkOut": {
                        "title": "Check-out date",
                        "type": "string",
                        "description": "YYYY-MM-DD."
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "maximum": 16,
                        "type": "integer",
                        "description": "Number of adult guests for price/availability.",
                        "default": 2
                    },
                    "children": {
                        "title": "Children",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Number of children (ages 2-12).",
                        "default": 0
                    },
                    "infants": {
                        "title": "Infants",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Number of infants (under 2).",
                        "default": 0
                    },
                    "pets": {
                        "title": "Pets",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Number of pets traveling with you.",
                        "default": 0
                    },
                    "minPrice": {
                        "title": "Min price per night",
                        "minimum": 0,
                        "type": "integer",
                        "description": "In the chosen currency."
                    },
                    "maxPrice": {
                        "title": "Max price per night",
                        "minimum": 0,
                        "type": "integer",
                        "description": "In the chosen currency."
                    },
                    "minBedrooms": {
                        "title": "Min bedrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Filter out listings with fewer bedrooms than this."
                    },
                    "minBathrooms": {
                        "title": "Min bathrooms",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Filter out listings with fewer bathrooms than this."
                    },
                    "minBeds": {
                        "title": "Min beds",
                        "minimum": 0,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Filter out listings with fewer beds than this."
                    },
                    "roomType": {
                        "title": "Room type",
                        "enum": [
                            "",
                            "Entire home/apt",
                            "Private room",
                            "Shared room",
                            "Hotel room"
                        ],
                        "type": "string",
                        "description": "Filter listings by room type. Leave empty for any.",
                        "default": ""
                    },
                    "maxItemsPerQuery": {
                        "title": "Max items per query",
                        "minimum": 1,
                        "maximum": 270,
                        "type": "integer",
                        "description": "Cap on listings per locationQuery or per startUrl. Airbnb's natural ceiling is ~270 (15 pages x 18).",
                        "default": 50
                    },
                    "includeReviews": {
                        "title": "Include reviews",
                        "type": "boolean",
                        "description": "Fetch reviews via StaysPdpReviewsQuery. Only in search-full and urls modes.",
                        "default": false
                    },
                    "includeCalendar": {
                        "title": "Include availability calendar",
                        "type": "boolean",
                        "description": "Fetch 12-month availability via PdpAvailabilityCalendar. Only in search-full and urls modes.",
                        "default": false
                    },
                    "currency": {
                        "title": "Currency",
                        "enum": [
                            "USD",
                            "EUR"
                        ],
                        "type": "string",
                        "description": "Only USD or EUR. RUB is intentionally not supported.",
                        "default": "USD"
                    },
                    "locale": {
                        "title": "Locale",
                        "enum": [
                            "en",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "pt",
                            "nl",
                            "pl",
                            "ru"
                        ],
                        "type": "string",
                        "description": "UI language for Airbnb responses (descriptions, host details, etc.).",
                        "default": "en"
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy works out of the box. If your plan has DATACENTER access, set apifyProxyGroups=['DATACENTER'] for the cheapest path; otherwise leave groups empty (Apify picks an available group for you) or use RESIDENTIAL.",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "maxConcurrency": {
                        "title": "Max concurrent requests",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Global cap on parallel HTTP requests to Airbnb. This is the honest ceiling -- every Niobe call (search, details, calendar, reviews, BookIt) shares it. Pick by proxy type: residential 3-5, datacenter 10-20, no proxy 20-30. Higher than 30 yields no extra throughput because Airbnb's own latency dominates.",
                        "default": 10
                    },
                    "maxRetries": {
                        "title": "Max retries per item",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many times to retry transient errors (429, 5xx) per request before giving up.",
                        "default": 5
                    },
                    "rawOutput": {
                        "title": "Raw output",
                        "type": "boolean",
                        "description": "Include the full Niobe GraphQL response under _raw in each item.",
                        "default": false
                    },
                    "debugLog": {
                        "title": "Debug log",
                        "type": "boolean",
                        "description": "Enable verbose DEBUG-level logging.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
