{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Scraper: Every Listing, Prices With Fees, Calendar",
    "description": "Scrape every Airbnb listing of a city or map area, past the 280-per-search limit: total stay price with fees, rating, beds, coordinates, photos. Add the 12-month availability calendar and the listing page (amenities, host, rules). By place, search URL or listing ID.",
    "version": "0.1",
    "x-build-id": "7tr17KdvxasCgDSMR"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/alexmorain~airbnb-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-alexmorain-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/alexmorain~airbnb-scraper/runs": {
      "post": {
        "operationId": "runs-sync-alexmorain-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/alexmorain~airbnb-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-alexmorain-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": {
          "locations": {
            "title": "Places",
            "type": "array",
            "description": "City, neighborhood or region, as you would type it on Airbnb: <code>Lisbon, Portugal</code>, <code>Brooklyn, New York</code>, <code>Lake Annecy</code>. The place is turned into a map area (OpenStreetMap), then the whole area is read.",
            "items": {
              "type": "string"
            }
          },
          "searchUrls": {
            "title": "Airbnb search URLs",
            "type": "array",
            "description": "Search pages copied from airbnb.com (any Airbnb domain). The map area (<code>ne_lat</code>, <code>sw_lng</code>…), dates, guests and filters of the URL are used as they are. Move the map before copying to target an exact area.",
            "items": {
              "type": "string"
            }
          },
          "listingUrls": {
            "title": "Listing URLs or IDs",
            "type": "array",
            "description": "Listings to read one by one: <code>https://www.airbnb.com/rooms/41507104</code> or just <code>41507104</code>. Each one returns the full listing page (description, amenities, host, house rules, ratings by category) and, with dates, the total price of the stay.",
            "items": {
              "type": "string"
            }
          },
          "checkIn": {
            "title": "Check-in",
            "type": "string",
            "description": "Optional. With check-in and check-out, every listing carries the total price for the stay, cleaning and service fees included, as Airbnb shows it. Without dates, Airbnb picks a stay of its own (shown in <code>priceDates</code>)."
          },
          "checkOut": {
            "title": "Check-out",
            "type": "string",
            "description": "Set with check-in."
          },
          "adults": {
            "title": "Adults",
            "minimum": 0,
            "maximum": 16,
            "type": "integer",
            "description": "Only listings that fit this many guests. 0 = no guest filter.",
            "default": 0
          },
          "children": {
            "title": "Children",
            "minimum": 0,
            "maximum": 15,
            "type": "integer",
            "description": "Children aged 2 to 17.",
            "default": 0
          },
          "infants": {
            "title": "Infants",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Under 2.",
            "default": 0
          },
          "pets": {
            "title": "Pets",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Above 0, only listings that allow pets.",
            "default": 0
          },
          "minPrice": {
            "title": "Minimum price per night",
            "minimum": 0,
            "type": "integer",
            "description": "In the chosen currency, per night."
          },
          "maxPrice": {
            "title": "Maximum price per night",
            "minimum": 1,
            "type": "integer",
            "description": "In the chosen currency, per night."
          },
          "roomTypes": {
            "title": "Type of place",
            "type": "array",
            "description": "Leave empty for all types.",
            "items": {
              "type": "string",
              "enum": [
                "entire_home",
                "private_room",
                "shared_room",
                "hotel_room"
              ],
              "enumTitles": [
                "Entire home",
                "Private room",
                "Shared room",
                "Hotel room"
              ]
            }
          },
          "minBedrooms": {
            "title": "Minimum bedrooms",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "Only listings with at least this many bedrooms."
          },
          "minBeds": {
            "title": "Minimum beds",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "Only listings with at least this many beds."
          },
          "minBathrooms": {
            "title": "Minimum bathrooms",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "Only listings with at least this many bathrooms."
          },
          "instantBook": {
            "title": "Instant Book only",
            "type": "boolean",
            "description": "Only listings you can book without waiting for the host.",
            "default": false
          },
          "guestFavorite": {
            "title": "Guest favorites only",
            "type": "boolean",
            "description": "Only listings with the Guest favorite badge.",
            "default": false
          },
          "currency": {
            "title": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "CAD",
              "AUD",
              "CHF",
              "JPY",
              "MXN",
              "BRL",
              "INR",
              "SEK",
              "NOK",
              "DKK",
              "PLN",
              "CZK",
              "NZD",
              "SGD",
              "HKD",
              "ZAR",
              "AED",
              "THB",
              "TRY"
            ],
            "type": "string",
            "description": "Prices are returned in this currency, as Airbnb converts them.",
            "default": "USD"
          },
          "maxListingsPerSearch": {
            "title": "Max listings per search",
            "minimum": 0,
            "type": "integer",
            "description": "Cap for each place or search URL. <b>0 = no cap</b>: with Full coverage, a large city returns tens of thousands of listings. With a cap, the map is read level by level, so a capped run is spread over the whole area rather than one corner.",
            "default": 500
          },
          "fullCoverage": {
            "title": "Full coverage (past 280 per search)",
            "type": "boolean",
            "description": "Airbnb shows at most 280 listings per search, whatever the area holds (\"Over 1,000 homes\"). On: the map is split into smaller areas until each one is fully served, then into price ranges where listings are packed in one building. Listings found twice are returned and charged once. Off: one plain search, 280 at most.",
            "default": true
          },
          "includeDetails": {
            "title": "Add listing details",
            "type": "boolean",
            "description": "Reads each listing page: description, all amenities, host (name, Superhost, verified, years hosting, rating, reviews), house rules, ratings by category, capacity, every photo, and the stay price for your dates. One extra request per listing, charged as a detailed listing.",
            "default": false
          },
          "includeCalendar": {
            "title": "Add availability calendar",
            "type": "boolean",
            "description": "Adds the day-by-day calendar (available, minimum and maximum nights, check-in and check-out days) and a summary: available days in the next 30, 90 and 365 days, most common minimum stay, first available check-in. Airbnb does not show nightly prices in the calendar, and an unavailable day can be booked or blocked by the host. Charged as a detailed listing.",
            "default": false
          },
          "calendarMonths": {
            "title": "Calendar months",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "How many months ahead, from the current month.",
            "default": 12
          },
          "mode": {
            "title": "Run mode",
            "enum": [
              "all",
              "new-only"
            ],
            "type": "string",
            "description": "<b>New listings only</b> remembers the listings already returned for this input and returns (and charges) only the new ones. Schedule it daily to watch an area for new listings.",
            "default": "all"
          },
          "registryKey": {
            "title": "Monitor name",
            "type": "string",
            "description": "Only used by <b>New listings only</b>. Leave empty and the memory is named after your input (places, URLs, dates, filters), so the same input always finds its own memory. Set it to make several schedules share one memory."
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "If set, the Actor POSTs a short JSON summary to this URL at the end of the run, <b>only when at least one listing was returned</b>. It carries <code>text</code> and <code>content</code> fields, so a Slack or Discord incoming webhook works as is. A redirect is not followed except 307 or 308; an unreachable webhook is logged and never fails the run."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Airbnb answers Apify datacenter IPs. The Actor starts some requests without proxy (fastest) and moves to these proxies when an IP is refused or slow.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}