{
  "openapi": "3.0.1",
  "info": {
    "title": "Hipflat Scraper [$0.80/1k💰] Thailand Property & Projects",
    "description": "Scrape hipflat.co.th property listings and new-project data across Thailand: price, price per m², beds, baths, area, floor, type, address, GPS, amenities, photos, full description and project facts. Buy and rent; search and URL modes; project records with available units; sorts and filters.",
    "version": "1.0",
    "x-build-id": "kUjdS8qwSMvcpbRW9"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~hipflat-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-hipflat-scraper",
        "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/abotapi~hipflat-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-hipflat-scraper",
        "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/abotapi~hipflat-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-hipflat-scraper",
        "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": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "search = build searches from a location + filters. url = paste hipflat listing searches, single listing pages, project directories or project pages.",
            "default": "search"
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Locations to search, e.g. Bangkok, Pattaya, Phuket, Chiang Mai, Chonburi. English names for major provinces are mapped automatically; a Thai province name also works. Leave empty to search all of Thailand. Only applies when mode = search.",
            "items": {
              "type": "string"
            }
          },
          "dealType": {
            "title": "Deal type",
            "enum": [
              "buy",
              "rent"
            ],
            "type": "string",
            "description": "Buy or rent. Only applies when mode = search.",
            "default": "buy"
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "condo",
              "house",
              "villa",
              "townhouse",
              "apartment",
              "land",
              "office",
              "commercial",
              "hotel"
            ],
            "type": "string",
            "description": "Property category to search. Only applies when mode = search.",
            "default": "condo"
          },
          "minPrice": {
            "title": "Min price (THB)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum price in Thai baht (for-sale total, or monthly rent). Applies in Search mode and URL mode, including a pasted URL."
          },
          "maxPrice": {
            "title": "Max price (THB)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum price in Thai baht (for-sale total, or monthly rent). Applies in Search mode and URL mode, including a pasted URL."
          },
          "bedrooms": {
            "title": "Bedrooms",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Number of bedrooms (0 = studio, 4 = 4 or more). Applies in Search mode and URL mode, including a pasted URL."
          },
          "minBathrooms": {
            "title": "Min bathrooms",
            "minimum": 1,
            "type": "integer",
            "description": "Minimum number of bathrooms. Applies in Search mode and URL mode, including a pasted URL."
          },
          "minArea": {
            "title": "Min area (m2)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum usable area in square metres. Applies in Search mode and URL mode, including a pasted URL."
          },
          "maxArea": {
            "title": "Max area (m2)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum usable area in square metres. Applies in Search mode and URL mode, including a pasted URL."
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "relevance",
              "price_asc",
              "price_desc",
              "bedrooms_asc",
              "bedrooms_desc",
              "area_asc",
              "area_desc",
              "newest"
            ],
            "type": "string",
            "description": "Result ordering. Only applies when mode = search.",
            "default": "relevance"
          },
          "urls": {
            "title": "Hipflat URLs",
            "type": "array",
            "description": "Paste one or more hipflat URLs. Supported: listing searches (e.g. /ขายคอนโด/กรุงเทพฯ), single listing pages (/ads/...), project directories (/thailand-projects/...) and project pages (/projects/...). Location, deal type, property type and sort order above are ignored in this mode (a pasted URL carries its own); price, bedroom, bathroom and area filters above still apply.",
            "items": {
              "type": "string"
            }
          },
          "includeProjectDetails": {
            "title": "Fetch full project record for each project (project directory URLs)",
            "type": "boolean",
            "description": "When scraping a project directory URL, also fetch each project page to add its available units, facilities, developer, GPS and full description. Adds one request per project and is billed one detail-enrichment event per enriched project.",
            "default": false
          },
          "fetchDetails": {
            "title": "Fetch full detail for each listing",
            "type": "boolean",
            "description": "Fetch each listing page to add floor, price per m², GPS, the full amenity list, the full untruncated description and the parent-project facts. The search results already include title, price, bedrooms, bathrooms, area, property type, description and photos, so leave this off for the leanest, cheapest run. Adds one request per listing.",
            "default": false
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 1,
            "type": "integer",
            "description": "Optional safety stop on how many result pages to read per location/URL (about 30 records per page). This does NOT cap the run: leave it empty (or 0) for unlimited pages and the run is bounded solely by Max items. Set a value only if you also want a per-search page ceiling."
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "The run's single hard cap: maximum total records across all searches. Defaults to 20. Set 0 for unlimited. This is the only default limit; Max pages is unlimited by default and defers to this.",
            "default": 20
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large crawl without returning or charging for records already collected there. Use this after an interrupted run. For recurring monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching records as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED records. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those records returned (and billed). State is kept separately for each search/URL and detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL and detail settings — different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search — not when Max items capped it or when Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "A Thailand residential proxy is required: hipflat serves results only to Thailand residential connections. The actor defaults the country to Thailand."
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}