{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb City Supply Census",
    "description": "Count Airbnb's whole supply in a city, not just the first page. It sweeps a city in many small map areas and merges them into one de-duplicated census of listings, prices, ratings, coordinates and per-area density — with a coverage report stating how complete the count is.",
    "version": "0.0",
    "x-build-id": "2SsjnQbKsUTzhK0Px"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/apt_marble~airbnb-city-supply-census/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-apt_marble-airbnb-city-supply-census",
        "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/apt_marble~airbnb-city-supply-census/runs": {
      "post": {
        "operationId": "runs-sync-apt_marble-airbnb-city-supply-census",
        "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/apt_marble~airbnb-city-supply-census/run-sync": {
      "post": {
        "operationId": "run-sync-apt_marble-airbnb-city-supply-census",
        "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": {
          "places": {
            "title": "Cities or areas",
            "maxItems": 20,
            "type": "array",
            "description": "The cities, neighbourhoods or regions to count. Write them the way you would type them into Airbnb's own search box, for example \"Paris, France\" or \"Austin, Texas\". Each one is counted separately and gets its own coverage report.",
            "default": [
              "Paris, France"
            ],
            "items": {
              "type": "string"
            }
          },
          "bboxes": {
            "title": "Exact map areas (optional)",
            "maxItems": 20,
            "type": "array",
            "description": "Precise map rectangles to count instead of, or in addition to, whole cities. Each entry is {\"neLat\": 48.90, \"neLng\": 2.42, \"swLat\": 48.81, \"swLng\": 2.22} and may carry its own \"query\" with the place name. Use this to census one district, one island or one coastline.",
            "default": []
          },
          "rootBboxFromPlace": {
            "title": "Work out the map area from the city name",
            "type": "boolean",
            "description": "On by default. The first pass over a city is used to work out how far its listings spread, and that becomes the area the census then covers quarter by quarter. Turn it off to count a city as one single search — much cheaper, but it will only ever see the first few hundred listings.",
            "default": true
          },
          "tileSaturationThreshold": {
            "title": "Split an area after this many listings",
            "minimum": 40,
            "maximum": 320,
            "type": "integer",
            "description": "When one map area produces this many listings, Airbnb is assumed to be holding back the rest, and the area is split into four smaller ones. Airbnb stops showing new listings somewhere around 270–320 for any single area, so lower values split earlier and find more, at a higher cost.",
            "default": 240
          },
          "maxQuadtreeDepth": {
            "title": "Maximum splitting depth",
            "minimum": 0,
            "maximum": 6,
            "type": "integer",
            "description": "How many times an area may be quartered. Each extra level can hold four times as many areas, so depth 4 is a sensible city-wide setting and depth 6 is for exhaustive audits of a dense downtown.",
            "default": 4
          },
          "maxPagesPerTile": {
            "title": "Maximum pages per area",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How far to read into one map area before moving on. Airbnb keeps serving pages long after it has run out of new listings, so the census also stops as soon as a page brings almost nothing new.",
            "default": 10
          },
          "freshIdFloor": {
            "title": "Stop an area under this many new listings",
            "minimum": 1,
            "maximum": 40,
            "type": "integer",
            "description": "A page that adds fewer new listings than this ends the area. Raise it to finish faster and spend less, lower it to squeeze the last few listings out of every area.",
            "default": 4
          },
          "priceBands": {
            "title": "Price bands (optional)",
            "maxItems": 8,
            "type": "array",
            "description": "Extra slices applied to an area that is still full at the deepest splitting level, as [{\"min\": 0, \"max\": 100}, {\"min\": 100, \"max\": 250}]. Splitting a crowded area by price is the most effective way to see past Airbnb's per-area ceiling.",
            "default": []
          },
          "roomTypes": {
            "title": "Room types (optional)",
            "maxItems": 4,
            "type": "array",
            "description": "A further slice for areas that are still full after the price bands. \"Entire home/apt\" is the value confirmed to work; the others are accepted but not verified.",
            "items": {
              "type": "string",
              "enum": [
                "Entire home/apt",
                "Private room",
                "Shared room",
                "Hotel room"
              ],
              "enumTitles": [
                "Entire home or apartment",
                "Private room",
                "Shared room",
                "Hotel room"
              ]
            },
            "default": []
          },
          "checkIn": {
            "title": "Check-in date (optional)",
            "type": "string",
            "description": "Leave both dates empty for a plain supply count. Set them and every listing also carries the price for that exact stay, which is what makes the area price summaries comparable across a city.",
            "default": ""
          },
          "checkOut": {
            "title": "Check-out date (optional)",
            "type": "string",
            "description": "Must be later than the check-in date. Both dates are needed, or neither.",
            "default": ""
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Guest count used when dates are set. It changes which listings are shown and what they cost.",
            "default": 2
          },
          "maxListings": {
            "title": "Maximum listings",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Hard cap on how many distinct listings the run may collect across every city and area. The run stops cleanly at the cap and still writes its coverage report.",
            "default": 100
          },
          "maxRequests": {
            "title": "Maximum lookups",
            "minimum": 1,
            "maximum": 6000,
            "type": "integer",
            "description": "Hard budget for how much reading the run may do. A dense city typically needs a few hundred; raise it for an exhaustive audit, lower it for a quick sample.",
            "default": 100
          },
          "emitTileRows": {
            "title": "Include an area summary for every map area",
            "type": "boolean",
            "description": "On by default. Adds one row per map area with its listing count, density per square kilometre, median and quartile nightly rates, guest-favourite share and whether it was still full when the census left it.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Areas at a time",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many map areas to read in parallel. Four is a good default; higher is faster but leans harder on the source site.",
            "default": 4
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "Currency for every price in the dataset, as a three-letter code. Pinned for the whole run so area price summaries are comparable.",
            "default": "USD"
          },
          "locale": {
            "title": "Language",
            "type": "string",
            "description": "Language code for listing text, for example \"en\" or \"fr\". English is the tested option; other languages are accepted but not verified.",
            "default": "en"
          },
          "proxyCountry": {
            "title": "Country to appear to browse from",
            "type": "string",
            "description": "Optional. Leave empty to let the actor choose. Set a two-letter country code such as \"us\", \"fr\" or \"gb\" to see the market the way a visitor from that country would.",
            "default": ""
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}