{
  "openapi": "3.0.1",
  "info": {
    "title": "Airbnb Host Portfolio & Operator Mapper",
    "description": "Turn Airbnb listings into host entities. One row per operator: every listing found in the areas you scan, whole-property share, years hosting, registration numbers and an auditable 0-100 operator score. Filter to multi-property hosts, scan a city as a grid, get a coverage report. No account needed.",
    "version": "0.0",
    "x-build-id": "32ZgDULPpq2NyQoKM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/apt_marble~airbnb-host-portfolio-mapper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-apt_marble-airbnb-host-portfolio-mapper",
        "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-host-portfolio-mapper/runs": {
      "post": {
        "operationId": "runs-sync-apt_marble-airbnb-host-portfolio-mapper",
        "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-host-portfolio-mapper/run-sync": {
      "post": {
        "operationId": "run-sync-apt_marble-airbnb-host-portfolio-mapper",
        "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 to scan",
            "maxItems": 10,
            "type": "array",
            "description": "Where to look for hosts. Type a place the way you would type it into Airbnb's search box, for example \"Paris, France\" or \"Austin, Texas\". Each place is scanned as a grid of map areas so that far more hosts are found than a single search would show.",
            "default": [
              "Paris, France"
            ],
            "items": {
              "type": "string"
            }
          },
          "bboxes": {
            "title": "Exact map areas",
            "maxItems": 20,
            "type": "array",
            "description": "Optional. Scan a precise rectangle instead of a whole city. Each entry needs the north-east and south-west corners: {\"neLat\": 48.90, \"neLng\": 2.42, \"swLat\": 48.81, \"swLng\": 2.22}. You can add \"query\" to name the neighbourhood; if you leave it out, the first place above is used instead.",
            "default": []
          },
          "tileSaturationThreshold": {
            "title": "Split an area after this many listings",
            "minimum": 40,
            "maximum": 320,
            "type": "integer",
            "description": "Airbnb stops showing new listings for any one area after a few hundred. When an area reaches this many listings, it is divided into four smaller areas and each is scanned again. Lower values mean more thorough coverage and a longer run.",
            "default": 240
          },
          "maxQuadtreeDepth": {
            "title": "How many times an area may be divided",
            "minimum": 0,
            "maximum": 6,
            "type": "integer",
            "description": "Each level divides a crowded area into four smaller ones. Every listing found costs a separate look-up here, so the default is deliberately shallow — raise it only together with the listing ceiling.",
            "default": 3
          },
          "roomTypes": {
            "title": "Property types",
            "maxItems": 4,
            "type": "array",
            "description": "Restrict the scan to certain property types. \"Entire home/apt\" is the one short-let regulations usually target, so it is the most common choice for a compliance or market-share study. Leave empty for everything.",
            "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": []
          },
          "priceBands": {
            "title": "Nightly price slices",
            "maxItems": 8,
            "type": "array",
            "description": "Optional. Extra slices used only when an area is still crowded after being divided as far as allowed, for example [{\"min\": 0, \"max\": 150}, {\"min\": 150, \"max\": 400}]. Splitting a busy area by price reveals listings a single view hides.",
            "default": []
          },
          "minPortfolioSize": {
            "title": "Minimum listings per host",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Only hosts with at least this many listings in the area scanned are saved. Set it to 2 or more to keep multi-property operators and drop one-off hosts. Bear in mind the count is a minimum — an operator whose other properties sit outside the area scanned can be dropped by this filter, so widen the area or raise the listing limit before setting it high. Smaller hosts are still counted in the run summary.",
            "default": 1
          },
          "unregisteredOnly": {
            "title": "Only hosts with a missing registration number",
            "type": "boolean",
            "description": "Keep only hosts who have at least one listing with no registration or licence number visible. A blank means the number is not published where it can be seen — it is not proof that a listing is unlicensed.",
            "default": false
          },
          "registrationFormat": {
            "title": "Expected registration number format",
            "type": "string",
            "description": "Optional pattern each registration number is checked against, for example ^\\d{13}$ for a 13-digit Paris number. Every record then reports whether its number matched. Leave empty to skip the check.",
            "default": ""
          },
          "includeLicence": {
            "title": "Collect registration and licence numbers",
            "type": "boolean",
            "description": "Reads the registration or licence number from every place Airbnb publishes it, and records which of those places it was found in.",
            "default": true
          },
          "emitListingRows": {
            "title": "Also save one row per listing",
            "type": "boolean",
            "description": "Adds a row for every listing behind each host portfolio, with its own registration number, size and rating. Turn it off for a host-only dataset — that lowers both the row count and the cost of the run.",
            "default": true
          },
          "maxListings": {
            "title": "Maximum listings to look up",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "The main cost and time control: every listing here gets its own look-up to find its host. It also decides how much of an area you actually see. The default 500 is a cheap first look and is enough to finish a single district, but a whole city holds tens of thousands of listings — over a city, 500 is a thin slice, most hosts in it will show one listing, and that is a fact about the slice rather than about the market. To measure how concentrated a market is, either scan a map rectangle small enough to finish, or raise this until the coverage report stops saying the scan was cut short.",
            "default": 500
          },
          "maxRequests": {
            "title": "Maximum work per run",
            "minimum": 1,
            "maximum": 8000,
            "type": "integer",
            "description": "A hard ceiling on how much work one run may do in total, counting both area scans and listing look-ups. The projected total is printed in the log before the run starts.",
            "default": 800
          },
          "maxConcurrency": {
            "title": "Parallel workers",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many listings are looked up at the same time. Higher is faster but harder on the source site; 4 is a good balance.",
            "default": 4
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "Currency for the nightly rates in the output, for example USD, EUR or GBP.",
            "default": "USD"
          },
          "locale": {
            "title": "Language",
            "type": "string",
            "description": "Language for names, property types and neighbourhood labels. Only English (\"en\") has been verified; other languages may change how some text fields read.",
            "default": "en"
          },
          "proxyCountry": {
            "title": "Browse from",
            "type": "string",
            "description": "Country to appear to browse from, as a two-letter code such as us, gb or fr. Leave empty unless a market shows you different results from different countries.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}