{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Scraper — Listings, Prices & Host Data",
    "description": "Scrape Airbnb stays: price, ratings, amenities, host info, photos, GPS and full filters, with full-city coverage past the search cap and optional reviews. $0.40/1,000 listings on every plan from 28 Oct. Incremental mode tracks new and changed listings across scheduled runs.",
    "version": "0.1",
    "x-build-id": "lOuFxvgocVjVRedea"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~airbnb-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-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/blackfalcondata~airbnb-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-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/blackfalcondata~airbnb-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-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": [
              "listings",
              "reviews",
              "urls"
            ],
            "type": "string",
            "description": "Listings (default) returns full listing records. Reviews returns flat review rows for the resolved listings. URLs returns just the listing URLs (cheapest, for discovery).",
            "default": "listings"
          },
          "searchLocations": {
            "title": "📍 Locations",
            "type": "array",
            "description": "One or more places: a city, a neighborhood, or \"City, ST\" (e.g. \"New York, NY\"). Each is searched independently. Leave empty if you only use Start URLs.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "Paste Airbnb room URLs (e.g. https://www.airbnb.com/rooms/12345678) or search-result URLs. Room URLs target a specific listing (in every mode); search URLs read their location from the URL and the filters below still apply. With detail enrichment, a search URL's own check-in and check-out dates give each listing its cancellation policy when Check-in and Check-out are empty.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "💯 Max Results",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum records to return (0 = full coverage). Full coverage works even for very large cities.",
            "default": 100
          },
          "maxQueries": {
            "title": "🧮 Max Queries (cost guard)",
            "minimum": 1,
            "type": "integer",
            "description": "Optional hard ceiling on how much work full-coverage runs do. Leave empty for the default. Lower it to cap cost on very dense areas."
          },
          "priceMin": {
            "title": "💰 Min Price (USD / night)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum nightly price."
          },
          "priceMax": {
            "title": "💰 Max Price (USD / night)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum nightly price."
          },
          "roomTypes": {
            "title": "🏠 Room Types",
            "type": "array",
            "description": "Restrict to one or more room types. Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "Entire home/apt",
                "Private room",
                "Shared room",
                "Hotel room"
              ],
              "enumTitles": [
                "Entire home/apt",
                "Private room",
                "Shared room",
                "Hotel room"
              ]
            },
            "default": []
          },
          "minBedrooms": {
            "title": "🛏️ Min Bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of bedrooms."
          },
          "adults": {
            "title": "👥 Guests",
            "minimum": 1,
            "type": "integer",
            "description": "Number of guests (adults) to price for."
          },
          "checkin": {
            "title": "📅 Check-in",
            "type": "string",
            "description": "Optional stay start date (YYYY-MM-DD). Use with Check-out to price a specific stay and, with detail enrichment, to get the cancellation policy for it."
          },
          "checkout": {
            "title": "📅 Check-out",
            "type": "string",
            "description": "Optional stay end date (YYYY-MM-DD)."
          },
          "children": {
            "title": "🧒 Children",
            "minimum": 0,
            "type": "integer",
            "description": "Children (ages 2–12) travelling. They count toward the number of guests a place must sleep."
          },
          "infants": {
            "title": "👶 Infants",
            "minimum": 0,
            "type": "integer",
            "description": "Infants (under 2) travelling."
          },
          "pets": {
            "title": "🐾 Pets",
            "minimum": 0,
            "type": "integer",
            "description": "Pets travelling. Only places that allow pets are returned."
          },
          "minBeds": {
            "title": "🛏️ Min Beds",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of beds."
          },
          "minBathrooms": {
            "title": "🛁 Min Bathrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of bathrooms."
          },
          "propertyTypes": {
            "title": "🏘️ Property Types",
            "type": "array",
            "description": "Restrict to one or more property types. Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "House",
                "Apartment",
                "Guesthouse",
                "Hotel"
              ],
              "enumTitles": [
                "House",
                "Apartment",
                "Guesthouse",
                "Hotel"
              ]
            }
          },
          "amenities": {
            "title": "🧺 Amenities",
            "type": "array",
            "description": "Only places that have every amenity listed, including accessibility features (step-free access, grab bars, wide entrances) and Waterfront. Leave empty for any.",
            "items": {
              "type": "string",
              "enum": [
                "Wifi",
                "Kitchen",
                "Washer",
                "Dryer",
                "Air conditioning",
                "Heating",
                "Dedicated workspace",
                "TV",
                "Hair dryer",
                "Iron",
                "Pool",
                "Hot tub",
                "Free parking",
                "EV charger",
                "Crib",
                "King bed",
                "Gym",
                "BBQ grill",
                "Breakfast",
                "Indoor fireplace",
                "Smoking allowed",
                "Self check-in",
                "Smoke alarm",
                "Carbon monoxide alarm",
                "Step-free access",
                "Disabled parking spot",
                "Guest entrance wider than 32 inches",
                "Step-free bedroom access",
                "Bedroom entrance wider than 32 inches",
                "Step-free bathroom access",
                "Bathroom entrance wider than 32 inches",
                "Toilet grab bar",
                "Shower grab bar",
                "Step-free shower",
                "Shower or bath chair",
                "Ceiling or mobile hoist",
                "Waterfront"
              ],
              "enumTitles": [
                "Wifi",
                "Kitchen",
                "Washer",
                "Dryer",
                "Air conditioning",
                "Heating",
                "Dedicated workspace",
                "TV",
                "Hair dryer",
                "Iron",
                "Pool",
                "Hot tub",
                "Free parking",
                "EV charger",
                "Crib",
                "King bed",
                "Gym",
                "BBQ grill",
                "Breakfast",
                "Indoor fireplace",
                "Smoking allowed",
                "Self check-in",
                "Smoke alarm",
                "Carbon monoxide alarm",
                "Step-free access",
                "Disabled parking spot",
                "Guest entrance wider than 32 inches",
                "Step-free bedroom access",
                "Bedroom entrance wider than 32 inches",
                "Step-free bathroom access",
                "Bathroom entrance wider than 32 inches",
                "Toilet grab bar",
                "Shower grab bar",
                "Step-free shower",
                "Shower or bath chair",
                "Ceiling or mobile hoist",
                "Waterfront"
              ]
            }
          },
          "instantBook": {
            "title": "⚡ Instant Book only",
            "type": "boolean",
            "description": "Only places you can book without waiting for host approval."
          },
          "guestFavorite": {
            "title": "🏅 Guest favorites only",
            "type": "boolean",
            "description": "Only places Airbnb marks as a guest favorite."
          },
          "superhost": {
            "title": "⭐ Superhosts only",
            "type": "boolean",
            "description": "Only places hosted by a Superhost."
          },
          "luxe": {
            "title": "💎 Airbnb Luxe only",
            "type": "boolean",
            "description": "Only Airbnb Luxe places."
          },
          "hostLanguages": {
            "title": "🗣️ Host Languages",
            "type": "array",
            "description": "Only hosts who speak one of these languages. Two-letter codes (e.g. \"en\", \"fr\", \"es\") or language names.",
            "items": {
              "type": "string"
            }
          },
          "privateBathroom": {
            "title": "🚿 Private attached bathroom only",
            "type": "boolean",
            "description": "Only places where your bathroom is private and attached to your room (en-suite)."
          },
          "neighborhoods": {
            "title": "🏘️ Neighbourhoods",
            "type": "array",
            "description": "Only places in these neighbourhoods of the searched location, as Airbnb names them in its own filter (e.g. \"Zilker\", \"East Austin\"). An Airbnb neighbourhood id from a search URL works too. If a name is not offered for your location, the run stops and lists the names that are.",
            "items": {
              "type": "string"
            }
          },
          "currency": {
            "title": "💱 Currency",
            "pattern": "^([A-Za-z]{3})?$",
            "type": "string",
            "description": "Three-letter currency code prices are quoted in, such as EUR, GBP or JPY. Price filters use the same currency. Leave empty to use the currency a pasted Airbnb URL names (?currency=EUR), otherwise USD."
          },
          "locale": {
            "title": "🌐 Language",
            "pattern": "^([A-Za-z]{2}([-_][A-Za-z]{2,4})?)?$",
            "type": "string",
            "description": "Language for titles, labels and text, as an Airbnb language code such as de, fr, es or pt-BR. Leave empty to use the language a pasted Airbnb URL names (?locale=de), otherwise English."
          },
          "centerLat": {
            "title": "🧭 Center Latitude",
            "minimum": -90,
            "maximum": 90,
            "type": "number",
            "description": "Optional radius search — center latitude (decimal, e.g. 40.7128). With Center Longitude + Radius, searches that area on the map and keeps only listings within the radius. Works with or without a location."
          },
          "centerLng": {
            "title": "🧭 Center Longitude",
            "minimum": -180,
            "maximum": 180,
            "type": "number",
            "description": "Radius filter — center longitude (decimal, e.g. -74.0060)."
          },
          "radiusKm": {
            "title": "📏 Radius (km)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only listings within this many kilometres of the center point."
          },
          "includeDetails": {
            "title": "📋 Include Detail Enrichment",
            "type": "boolean",
            "description": "Fetch each listing's page to add the full description, amenities, house rules, safety notes and host profile (about, response rate and time). With Check-in and Check-out set, also adds the cancellation policy for those dates. Off by default (billed per enriched listing).",
            "default": false
          },
          "includeCalendar": {
            "title": "📅 Include Availability Calendar",
            "type": "boolean",
            "description": "Add each listing's availability for the next 12 months (one row per day: bookable or not, minimum and maximum stay), the number of free and taken nights in the next 30, 90 and 365 days, and an occupancy and revenue estimate (taken nights times the current nightly rate; an estimate, not reported earnings). One extra request per listing, so runs take a little longer. Off by default.",
            "default": false
          },
          "includeReviews": {
            "title": "💬 Attach Reviews",
            "type": "boolean",
            "description": "Attach the top reviews to each listing record (listings mode). Billed per review.",
            "default": false
          },
          "reviewsMaxPerListing": {
            "title": "🔢 Reviews Per Listing",
            "minimum": 0,
            "type": "integer",
            "description": "Cap the number of reviews fetched per listing (used by Attach Reviews and Reviews mode).",
            "default": 10
          },
          "reviewSort": {
            "title": "↕️ Review Order",
            "enum": [
              "best",
              "recent"
            ],
            "type": "string",
            "description": "How to order reviews.",
            "default": "best"
          },
          "physicalDedupeKey": {
            "title": "🧬 Physical Dedup",
            "type": "boolean",
            "description": "Also drop physically-identical listings (same coordinate + name), not only exact-id duplicates.",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "🧹 Exclude Empty Fields",
            "type": "boolean",
            "description": "Drop null / empty-string / empty-array fields from each record.",
            "default": false
          },
          "compact": {
            "title": "📦 Compact Output",
            "type": "boolean",
            "description": "Output only core comparison fields (for AI-agent / MCP workflows).",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental Mode",
            "type": "boolean",
            "description": "Track new / changed / removed listings across runs. Requires a State Key.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State Key",
            "type": "string",
            "description": "Stable identifier for this tracking universe (e.g. \"nyc-entire-homes\")."
          },
          "emitUnchanged": {
            "title": "♻️ Emit Unchanged Records",
            "type": "boolean",
            "description": "When incremental, also emit listings that have not changed.",
            "default": false
          },
          "emitExpired": {
            "title": "⚰️ Emit Removed Records",
            "type": "boolean",
            "description": "When incremental, also emit listings no longer found. These markers are always tracked so change detection stays complete — they are not subject to Max Results.",
            "default": false
          },
          "skipReposts": {
            "title": "🚫 Skip Reposts",
            "type": "boolean",
            "description": "When incremental, skip listings that are reposts of previously seen (now removed) listings.",
            "default": false
          },
          "telegramToken": {
            "title": "🔑 Telegram Bot Token",
            "type": "string",
            "description": "Telegram bot token (from @BotFather). Required for Telegram notifications."
          },
          "telegramChatId": {
            "title": "💬 Telegram Chat ID",
            "type": "string",
            "description": "Telegram chat or channel ID where alerts are sent."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord Webhook URL",
            "type": "string",
            "description": "Discord incoming webhook URL."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL."
          },
          "whatsappPhoneNumberId": {
            "title": "📱 WhatsApp Phone Number ID",
            "type": "string",
            "description": "WhatsApp Business phone number ID from Meta Business Manager."
          },
          "whatsappAccessToken": {
            "title": "🔐 WhatsApp Access Token",
            "type": "string",
            "description": "Meta Cloud API access token with whatsapp_business_messaging scope."
          },
          "whatsappTo": {
            "title": "📨 WhatsApp Recipient",
            "type": "string",
            "description": "Recipient phone number in E.164 format (e.g. +14155551234)."
          },
          "webhookUrl": {
            "title": "🪝 Generic Webhook URL",
            "type": "string",
            "description": "Universal escape hatch for n8n / Make / Zapier / custom HTTP backends. Receives a JSON POST per run."
          },
          "webhookHeaders": {
            "title": "🪝 Webhook Headers (optional)",
            "type": "object",
            "description": "Additional HTTP headers sent with the generic webhook POST."
          },
          "notificationLimit": {
            "title": "📊 Max Records Per Notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of records included in each notification message (1–20).",
            "default": 5
          },
          "notifyOnlyChanges": {
            "title": "🔄 Notify Only New/Updated",
            "type": "boolean",
            "description": "When Incremental Mode is on, only notify for NEW and UPDATED listings.",
            "default": false
          },
          "appConnector": {
            "title": "📤 Send results to a connected app",
            "type": "string",
            "description": "Optional. Pick a connected app under Settings → API & Integrations to receive your results. A run-summary is written to the connected app; support is best-effort as Apify expands its connector catalog."
          },
          "mcpIssueTeam": {
            "title": "🏷️ Issue tracker team",
            "type": "string",
            "description": "Only when the connected app is an issue tracker: the team (name or ID) the summary issue is created under, if that app requires one."
          },
          "descriptionFormat": {
            "title": "📝 Description Format",
            "enum": [
              "all",
              "text",
              "html",
              "markdown"
            ],
            "type": "string",
            "description": "Choose which representation of the listing description to include. `all` keeps every variant; the others keep only the selected one.",
            "default": "all"
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}