{
  "openapi": "3.0.1",
  "info": {
    "title": "Centaline + 28Hse Scraper – Hong Kong Property Listings",
    "description": "Scrape Centaline and 28Hse (Hong Kong property) listings and full details for sale and rent: price, rent, saleable area, price per sqft, layout, floor and building age. No API or login. Export JSON/CSV/Excel for property market research.",
    "version": "1.0",
    "x-build-id": "qw6fHg7e2aYmPjdAA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/claude_code_reviewer~centaline-scraper-en/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-claude_code_reviewer-centaline-scraper-en",
        "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/claude_code_reviewer~centaline-scraper-en/runs": {
      "post": {
        "operationId": "runs-sync-claude_code_reviewer-centaline-scraper-en",
        "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/claude_code_reviewer~centaline-scraper-en/run-sync": {
      "post": {
        "operationId": "run-sync-claude_code_reviewer-centaline-scraper-en",
        "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": "🎯 Mode",
            "enum": [
              "search",
              "detail",
              "transactions",
              "ccl"
            ],
            "type": "string",
            "description": "What do you want to scrape? Pick one mode, then fill in the matching fields below.",
            "default": "search"
          },
          "dealType": {
            "title": "🏠 Buy/Rent",
            "enum": [
              "buy",
              "rent"
            ],
            "type": "string",
            "description": "Scrape for-sale or for-rent listings.",
            "default": "buy"
          },
          "source": {
            "title": "📡 Data source",
            "enum": [
              "both",
              "centanet",
              "28hse"
            ],
            "type": "string",
            "description": "Which site to scrape. both = combine both sites for the most complete coverage.",
            "default": "both"
          },
          "keywords": {
            "title": "🔎 Keywords",
            "maxItems": 50,
            "uniqueItems": true,
            "type": "array",
            "description": "Search keywords, e.g. estate names: Taikoo Shing, Sha Tin First City, South Horizons. One estate per keyword works best. Transactions mode uses this field for the estate name too (required).",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "districts": {
            "title": "📍 Districts",
            "maxItems": 50,
            "uniqueItems": true,
            "type": "array",
            "description": "Search by district, e.g. Taikoo Shing, Causeway Bay, Sha Tin. Merged into the search together with the keywords above.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "priceMin": {
            "title": "💰 Min price (HKD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep properties with a sale price or monthly rent ≥ this amount. Leave blank for no limit."
          },
          "priceMax": {
            "title": "💰 Max price (HKD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep properties with a sale price or monthly rent ≤ this amount. Leave blank for no limit."
          },
          "areaMin": {
            "title": "📐 Min area (sq ft)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep properties with saleable area ≥ this value (sq ft). Leave blank for no limit."
          },
          "dateFrom": {
            "title": "📅 Only deals on or after this date (optional)",
            "type": "string",
            "description": "Keep only transactions dated on/after this point (transactions mode only). Formats: relative 3d / 12h / 2w, or an absolute date MM/DD/YY (e.g. 08/01/26). Leave blank for no limit."
          },
          "weeks": {
            "title": "📈 CCL weeks to fetch (optional)",
            "minimum": 0,
            "type": "integer",
            "description": "How many recent weeks of the CCL series to return (CCL mode only). 0 = full history since 1994.",
            "default": 52
          },
          "propertyIds": {
            "title": "📦 Property ID (refNo)",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "Centaline property refNo, e.g. CLL467, DAZ418. It's the segment after the last _ in a Centaline detail page URL.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "propertyUrls": {
            "title": "📦 Property URLs",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "Full Centaline property URL, e.g. https://hk.centanet.com/findproperty/detail/太古城_CLL467. The refNo is extracted automatically.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "bulkInput": {
            "title": "📋 Bulk paste",
            "type": "string",
            "description": "One per line (press Enter for a new line). Treated as keywords (estate names) in search and transactions mode, or refNo/property URLs in detail mode. Fastest way is to copy a whole column from Google Sheets.",
            "default": ""
          },
          "maxItems": {
            "title": "📊 Max items",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Max results per keyword × per source, up to 2000. More items = higher cost. Transactions mode: per estate keyword. CCL mode is not limited by this (row count is set by the weeks field, plus 1 row per each of the seven sub-indices). Detail mode is not limited by this (bounded by the number of refNo values instead).",
            "default": 50
          },
          "onlyNew": {
            "title": "🔔 Only new items",
            "type": "boolean",
            "description": "Only return items that earlier runs with the same state key have not returned yet; already-seen items are skipped and not charged. Meant for scheduled monitoring (e.g. the same input every day). Off by default = every run is a full scrape. Not applicable to detail mode (explicit ids) — the option is ignored there.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State key",
            "type": "string",
            "description": "Name of the remembered state used by \"Only new items\". Leave empty to derive it from the mode and filters, so the same scheduled input continues where it left off; set it to keep separate memories for different schedules or integrations (most API callers reuse inputs). Letters, digits, \"_\" and \"-\", 1-100 characters. Ignored unless \"Only new items\" is on."
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy (Apify datacenter proxy on by default)",
            "type": "object",
            "description": "Uses Apify datacenter proxy by default: without a proxy, runs share the platform's egress IPs and 28hse.com blocks them (403), so half the results go missing. Datacenter traffic cost is negligible. Turn off only for your own proxy or local testing.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}