{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Market Data Scraper: Stay Prices & Geo",
    "description": "Export deduplicated Airbnb listings with stay-specific price snapshots, normalized property types, market summaries, and transparent coverage. Supported Tivat searches also include municipality, settlement, and coast-distance context.",
    "version": "0.10",
    "x-build-id": "eeZeZ0EFqMlqzISWH"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/luminar~airbnb-market-geo-intelligence/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-luminar-airbnb-market-geo-intelligence",
        "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/luminar~airbnb-market-geo-intelligence/runs": {
      "post": {
        "operationId": "runs-sync-luminar-airbnb-market-geo-intelligence",
        "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/luminar~airbnb-market-geo-intelligence/run-sync": {
      "post": {
        "operationId": "run-sync-luminar-airbnb-market-geo-intelligence",
        "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",
        "required": [
          "locations"
        ],
        "properties": {
          "locations": {
            "title": "📍 Where do you want to search?",
            "type": "array",
            "description": "Enter one or more Airbnb destination queries, for example Tivat, Montenegro. Each destination adds search work; Maximum live source requests remains the hard run-wide ceiling.",
            "items": {
              "type": "string"
            }
          },
          "dateMode": {
            "title": "📅 Price period mode",
            "enum": [
              "exact_stay",
              "period_scan"
            ],
            "type": "string",
            "description": "Exact stay costs one search request per location. Leave both exact dates blank to use a rolling seven-night stay starting 30 days after each run, or set both dates yourself. Period scan repeats market-wide searches across eligible check-ins.",
            "default": "exact_stay"
          },
          "checkIn": {
            "title": "Exact stay: check-in",
            "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
            "type": "string",
            "description": "Used only in Exact stay mode. Set it together with check-out, or leave both blank for the rolling seven-night default 30 days ahead. The effective dates are reported in every listing and in OUTPUT."
          },
          "checkOut": {
            "title": "Exact stay: check-out",
            "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
            "type": "string",
            "description": "Used in Exact stay mode. Set it together with check-in, or leave both blank. Output keeps stay total, nights, derived nightly price and the effective dates."
          },
          "periodStart": {
            "title": "Period scan: first possible check-in",
            "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
            "type": "string",
            "description": "Start of the period in which the guest may arrive."
          },
          "periodEnd": {
            "title": "Period scan: latest checkout boundary",
            "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
            "type": "string",
            "description": "End boundary of the scan. Only stays fully contained in the period are generated."
          },
          "stayLengthNights": {
            "title": "Period scan: stay length in nights",
            "minimum": 1,
            "maximum": 90,
            "type": "integer",
            "description": "Every compared quote uses this same stay length, so the lowest price comparison remains valid.",
            "default": 7
          },
          "periodCoverage": {
            "title": "Period scan coverage",
            "enum": [
              "sampled",
              "exhaustive"
            ],
            "type": "string",
            "description": "Sampled returns the lowest observed price and says it is sampled. Exhaustive checks every possible check-in and can support a true period minimum subject to listing-inventory coverage.",
            "default": "sampled"
          },
          "sampleEveryDays": {
            "title": "Sample every N days",
            "minimum": 1,
            "maximum": 31,
            "type": "integer",
            "description": "Used only for sampled period scans. First and final eligible check-in are always included.",
            "default": 7
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Adults. The coverage record reports how this filter affects delivered rows.",
            "default": 2
          },
          "children": {
            "title": "Children",
            "minimum": 0,
            "maximum": 15,
            "type": "integer",
            "description": "Children. The coverage record reports how this filter affects delivered rows.",
            "default": 0
          },
          "infants": {
            "title": "Infants",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Infants. The coverage record reports how this filter affects delivered rows.",
            "default": 0
          },
          "pets": {
            "title": "Pets",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Pets. The coverage record reports how this filter affects delivered rows.",
            "default": 0
          },
          "priceMin": {
            "title": "Minimum source price",
            "minimum": 0,
            "type": "integer",
            "description": "Optional lower price bound sent to the source search. Leave blank to keep the full source price range; coverage shows the filters applied."
          },
          "priceMax": {
            "title": "Maximum source price",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum source price. The coverage record reports how this filter affects delivered rows."
          },
          "minBeds": {
            "title": "Minimum beds",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum beds. The coverage record reports how this filter affects delivered rows."
          },
          "minBedrooms": {
            "title": "Minimum bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum bedrooms. The coverage record reports how this filter affects delivered rows."
          },
          "minBathrooms": {
            "title": "Minimum bathrooms",
            "minimum": 0,
            "type": "number",
            "description": "Minimum bathrooms. The coverage record reports how this filter affects delivered rows."
          },
          "keywordsAny": {
            "title": "🔤 Match any keyword or phrase",
            "type": "array",
            "description": "Accent-insensitive deterministic match after extraction. Useful for sea view, jacuzzi, parking, Porto Montenegro and similar wording.",
            "items": {
              "type": "string"
            }
          },
          "keywordsAll": {
            "title": "Must contain every keyword or phrase",
            "type": "array",
            "description": "Must contain every keyword or phrase. The coverage record reports how this filter affects delivered rows.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude keyword or phrase",
            "type": "array",
            "description": "Exclude keyword or phrase. The coverage record reports how this filter affects delivered rows.",
            "items": {
              "type": "string"
            }
          },
          "keywordFields": {
            "title": "Fields searched for keywords",
            "uniqueItems": true,
            "type": "array",
            "description": "Fields searched for keywords. The coverage record reports how this filter affects delivered rows.",
            "items": {
              "type": "string",
              "enum": [
                "title",
                "description",
                "sourcePropertyType",
                "amenities",
                "locationLabel"
              ],
              "enumTitles": [
                "Listing title",
                "Description",
                "Source property type",
                "Amenities",
                "Location label"
              ]
            },
            "default": [
              "title",
              "description",
              "sourcePropertyType",
              "amenities",
              "locationLabel"
            ]
          },
          "normalizedPropertyClasses": {
            "title": "Normalized property classes",
            "uniqueItems": true,
            "type": "array",
            "description": "Normalized property classes. The coverage record reports how this filter affects delivered rows.",
            "items": {
              "type": "string",
              "enum": [
                "apartment",
                "house",
                "villa",
                "studio",
                "room",
                "hotel_like",
                "unique_stay",
                "other"
              ],
              "enumTitles": [
                "Apartment",
                "House",
                "Villa",
                "Studio",
                "Room",
                "Hotel-like",
                "Unique stay",
                "Other"
              ]
            }
          },
          "normalizedRoomClasses": {
            "title": "Room classes",
            "uniqueItems": true,
            "type": "array",
            "description": "Room classes. The coverage record reports how this filter affects delivered rows.",
            "items": {
              "type": "string",
              "enum": [
                "entire_place",
                "private_room",
                "shared_room",
                "hotel_room"
              ],
              "enumTitles": [
                "Entire place",
                "Private room",
                "Shared room",
                "Hotel room"
              ]
            }
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Minimum rating. The coverage record reports how this filter affects delivered rows."
          },
          "minReviews": {
            "title": "Minimum review count",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum review count. The coverage record reports how this filter affects delivered rows."
          },
          "superhostOnly": {
            "title": "Superhost only",
            "type": "boolean",
            "description": "Turn on to keep only rows explicitly marked as Superhost. Rows without a positive source flag are excluded, and coverage reports the reduction.",
            "default": false
          },
          "instantBookOnly": {
            "title": "Instant Book only",
            "type": "boolean",
            "description": "Turn on to keep only rows explicitly marked as Instant Book. Rows without a positive source flag are excluded, and coverage reports the reduction.",
            "default": false
          },
          "requiredAmenities": {
            "title": "Required amenities",
            "type": "array",
            "description": "Required amenities. The coverage record reports how this filter affects delivered rows.",
            "items": {
              "type": "string"
            }
          },
          "marketBoundaryMode": {
            "title": "🗺️ Market boundary handling",
            "enum": [
              "strict_supported_boundary",
              "source_search_results"
            ],
            "type": "string",
            "description": "For Tivat, strict mode removes source results outside the supported municipality boundary before summaries. Keep all source results retains them with an outside-market status and empty Tivat geo fields. Other destinations still work without Tivat-specific enrichment.",
            "default": "strict_supported_boundary"
          },
          "settlements": {
            "title": "🏘️ Settlements or neighborhoods",
            "type": "array",
            "description": "Applied only when a versioned geo boundary package can assign the settlement. No guessing from an exact address.",
            "items": {
              "type": "string"
            }
          },
          "coastDistanceBands": {
            "title": "Approximate distance-to-coast bands",
            "uniqueItems": true,
            "type": "array",
            "description": "Approximate distance-to-coast bands. The coverage record reports how this filter affects delivered rows.",
            "items": {
              "type": "string",
              "enum": [
                "<250 m",
                "250–500 m",
                "500 m–1 km",
                "1–2 km",
                "2–5 km",
                ">5 km"
              ],
              "enumTitles": [
                "Under 250 m",
                "250–500 m",
                "500 m–1 km",
                "1–2 km",
                "2–5 km",
                "Over 5 km"
              ]
            }
          },
          "currency": {
            "title": "Requested currency",
            "type": "string",
            "description": "Three-letter display currency requested from Airbnb, for example EUR or USD. Each row preserves the currency actually returned by the source.",
            "default": "EUR"
          },
          "locale": {
            "title": "Locale",
            "type": "string",
            "description": "Source locale such as en, de or fr. It can change localized labels while the Actor preserves source-provided values.",
            "default": "en"
          },
          "maxListings": {
            "title": "Maximum delivered listings",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum unique listing rows written across all destinations and date windows. Reaching this limit is reported as capped rather than source-complete.",
            "default": 50
          },
          "maxRequests": {
            "title": "Maximum live source requests",
            "minimum": 1,
            "maximum": 120,
            "type": "integer",
            "description": "Hard total request budget across destinations, date windows, pages and retries. The Actor validates the full planned page fanout before source access.",
            "default": 20
          },
          "maxRuntimeSecs": {
            "title": "Maximum source runtime (seconds)",
            "minimum": 30,
            "maximum": 900,
            "type": "integer",
            "description": "Fail-closed wall-clock budget checked before every live source request.",
            "default": 180
          },
          "maxSourceBytes": {
            "title": "Maximum downloaded source bytes",
            "minimum": 1000000,
            "maximum": 200000000,
            "type": "integer",
            "description": "Aggregate response-byte budget. A conservative response reservation is made before each request.",
            "default": 25000000
          },
          "maxCostUsd": {
            "title": "Internal infrastructure ceiling",
            "minimum": 0.01,
            "maximum": 5,
            "type": "number",
            "description": "Internal conservative compute-and-transfer guard; this is not the buyer PPE charge.",
            "default": 0.25
          },
          "maxPagesPerDateWindow": {
            "title": "Maximum result pages per destination and date window",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "3 is the measured balanced default; 1 is quick/cheapest and up to 20 is an advanced deep scan. The Actor follows Airbnb cursors, reserves location × date windows × this value against maxRequests before source access, and reports whether the page cap truncated coverage.",
            "default": 3
          },
          "pageConcurrency": {
            "title": "Parallel result-page requests",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Fetches later cursor pages in bounded parallel batches while preserving deterministic output order. Use 1 for sequential troubleshooting; 3 is the balanced default.",
            "default": 3
          },
          "requestTimeoutSecs": {
            "title": "Per-request timeout (seconds)",
            "minimum": 10,
            "maximum": 60,
            "type": "integer",
            "description": "Maximum wait for one live source request. A timeout is reported in coverage and is never relabeled as a confirmed empty market.",
            "default": 45
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}