{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Market Tracker — Occupancy, ADR & Booking Pace",
    "description": "Track Airbnb markets over time. Diffs each listing's availability calendar day over day to surface booking pace, lead time, an occupancy proxy and true ADR from real quotes, per listing and rolled up per market. No browser.",
    "version": "0.1",
    "x-build-id": "0ShseYp11xQweD8aQ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/signalbench~airbnb-market-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-signalbench-airbnb-market-tracker",
        "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/signalbench~airbnb-market-tracker/runs": {
      "post": {
        "operationId": "runs-sync-signalbench-airbnb-market-tracker",
        "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/signalbench~airbnb-market-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-signalbench-airbnb-market-tracker",
        "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": "What to output",
            "enum": [
              "snapshot",
              "deltas",
              "marketRollup"
            ],
            "type": "string",
            "description": "\"Snapshot\" writes today's state of every listing. \"Deltas\" writes what changed per listing since the last run — this is the core output, and it needs at least two runs to mean anything. \"Market rollup\" writes one aggregate row per market.",
            "default": "snapshot"
          },
          "markets": {
            "title": "Markets",
            "type": "array",
            "description": "Places to track — a city name like \"Gatlinburg, TN\", or a full Airbnb search URL if you want to carry filters (price band, property type, bedrooms) into the tracked set. Leave empty if you are tracking specific listings instead.",
            "items": {
              "type": "string"
            }
          },
          "listingIds": {
            "title": "Specific listings",
            "type": "array",
            "description": "Optional. Airbnb listing URLs or bare numeric IDs to track regardless of any market. Use this to follow your own portfolio.",
            "items": {
              "type": "string"
            }
          },
          "maxListingsPerMarket": {
            "title": "Max listings per market",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many listings to pull from each market's search results. Previously tracked listings are carried forward on top of this, so the cohort you measure stays stable.",
            "default": 50
          },
          "forwardWindowDays": {
            "title": "Forward window",
            "minimum": 7,
            "maximum": 365,
            "type": "integer",
            "description": "How many nights ahead to read each calendar. Airbnb caps this at 365. A shorter window is cheaper and still captures near-term booking pace; a longer one is needed for seasonal pickup curves.",
            "default": 90
          },
          "pricing": {
            "title": "Pricing",
            "enum": [
              "off",
              "exact"
            ],
            "type": "string",
            "description": "\"Exact\" quotes a real stay per listing to get the true nightly rate plus fees and taxes — Airbnb publishes no per-night price on the calendar, so this is the only accurate ADR. It costs one extra request per listing. \"Off\" skips it and leaves ADR null.",
            "default": "off"
          },
          "priceProbeLeadDays": {
            "title": "Quote lead time",
            "minimum": 0,
            "maximum": 300,
            "type": "integer",
            "description": "How far ahead to look for the stay to quote. The Actor picks the first bookable window at or after this many days out, so a busy listing still returns a rate.",
            "default": 30
          },
          "priceProbeStayNights": {
            "title": "Quote stay length",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Length of the stay to quote. Keep this consistent across runs or your ADR series will not be comparable.",
            "default": 3
          },
          "includeCompSet": {
            "title": "Include comp set",
            "type": "boolean",
            "description": "Attach the nearest similar-sized listings from the same market to each snapshot row, with their ADR and occupancy proxy. Note this is a comp set derived from your tracked market, not one published by Airbnb.",
            "default": false
          },
          "compSetSize": {
            "title": "Comp set size",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many comparable listings to attach to each snapshot row.",
            "default": 5
          },
          "includeNightlyCalendar": {
            "title": "Include the full night-by-night calendar",
            "type": "boolean",
            "description": "Attach every night's availability to snapshot rows. Off by default because it makes rows large; the summary counts and the deltas are computed either way.",
            "default": false
          },
          "trackKnownListings": {
            "title": "Keep tracking listings that drop out of search",
            "type": "boolean",
            "description": "Airbnb reshuffles search constantly. With this on, a listing already in your tracked set is still measured even when today's search does not return it — which keeps day-over-day deltas comparing the same properties and stops ranking churn being reported as delistings.",
            "default": true
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store holding the previous run's calendars, used for diffing. Use separate names to track separate cohorts independently.",
            "default": "str-state"
          },
          "archiveDatasets": {
            "title": "Also write to named archive datasets",
            "type": "boolean",
            "description": "Mirror output into the named datasets str-snapshots, str-movers and str-markets so history accumulates across runs. These mirrors are never charged — only the run's own dataset is.",
            "default": true
          },
          "excludePersonalData": {
            "title": "Exclude personal data (GDPR/CCPA)",
            "type": "boolean",
            "description": "Drop host names and profile IDs. Market aggregates do not need host identity at all.",
            "default": false
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "ISO currency code for all quoted prices, e.g. USD, EUR, GBP.",
            "default": "USD"
          },
          "locale": {
            "title": "Locale",
            "type": "string",
            "description": "Language for listing titles and labels, e.g. en, es, fr, de.",
            "default": "en"
          },
          "politenessDelayMs": {
            "title": "Delay between requests (ms)",
            "minimum": 0,
            "maximum": 30000,
            "type": "integer",
            "description": "Randomised pause between requests. Tracking runs are large and repeat daily — raise this rather than risk rate limiting.",
            "default": 1000
          },
          "maxRetries": {
            "title": "Retries per request",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "How many times to retry a blocked or failed request, rotating the proxy session each time.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. Airbnb serves this data without a bot-detection stack, so a direct connection normally works. Consider a proxy for large daily runs."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}