{
  "openapi": "3.0.1",
  "info": {
    "title": "PropertyGuru Singapore Scraper – HDB, Condo & Rental Listings",
    "description": "Scrape PropertyGuru Singapore listings for sale or rent. Filter by area, postal district D01-D28, HDB/condo/landed, price and bedrooms. Every row: price, psf, address, district, beds, baths, floor area, tenure, TOP year, agent name and mobile, nearest MRT, coordinates, photos, listing URL.",
    "version": "0.0",
    "x-build-id": "q2y7c7DICpan7k0z6"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rl1987~propertyguru-sg-api-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rl1987-propertyguru-sg-api-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/rl1987~propertyguru-sg-api-scraper/runs": {
      "post": {
        "operationId": "runs-sync-rl1987-propertyguru-sg-api-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/rl1987~propertyguru-sg-api-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-rl1987-propertyguru-sg-api-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",
        "properties": {
          "listingIds": {
            "title": "Listing IDs or URLs (lookup mode)",
            "type": "array",
            "description": "Look up specific listings instead of searching. Paste listing URLs or just the numbers at the end of them (8-9 digits). One request per listing, charged per delivered row like a search row, and a listing that no longer resolves is not charged at all. Leave empty to run a search instead — the search filters are refused if you set both, rather than silently ignored.\n\nLookup rows come from the listing's own page, so they carry MORE than a search row and need no deeper scrape. Measured over 100 listings against the same 100 as a search, 2026-11-03: videos on 39 rows against 0, floor plans on 22 against 0, and the full photo gallery rather than the cover photo.\n\nOne column is thinner and one can differ, same measurement: nearestMRT/nearestMRTDistance are published on 9 of 100 lookup rows against 84 of 100 search rows, and for a listing whose exact address PropertyGuru masks, the coordinates can sit about 320 m from the ones a search returns. If you need the MRT columns, run a search instead — or both and join on id.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location (area name)",
            "type": "string",
            "description": "Singapore area/neighborhood name, e.g. Orchard, Woodlands, Tampines. Matched against PropertyGuru's search (freetext). If it can't be scoped, the run fails rather than silently returning all of Singapore. Leave empty (and no district) for all locations. Ignored when a District is set."
          },
          "districtCode": {
            "title": "District (precise)",
            "enum": [
              "D01",
              "D02",
              "D03",
              "D04",
              "D05",
              "D06",
              "D07",
              "D08",
              "D09",
              "D10",
              "D11",
              "D12",
              "D13",
              "D14",
              "D15",
              "D16",
              "D17",
              "D18",
              "D19",
              "D20",
              "D21",
              "D22",
              "D23",
              "D24",
              "D25",
              "D26",
              "D27",
              "D28"
            ],
            "type": "string",
            "description": "Singapore postal district to scope results precisely. Overrides Location when set."
          },
          "market": {
            "title": "Market",
            "enum": [
              "residential",
              "commercial"
            ],
            "type": "string",
            "description": "Residential property (HDB flats, condos, landed houses) or commercial (offices, shops and shophouses, light industrial, F&B, dormitories, en-bloc land). Residential by default. Commercial listings fill the same columns except bedrooms, bathrooms and furnishing, which PropertyGuru does not publish for them — measured over 10 commercial listings, 2026-11-03. Singapore has about 53,000 residential and 9,000 commercial listings for sale.",
            "default": "residential"
          },
          "listingType": {
            "title": "Listing type",
            "enum": [
              "sale",
              "rent"
            ],
            "type": "string",
            "description": "For Sale or For Rent.",
            "default": "sale"
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "hdb",
              "condo",
              "apartment",
              "terrace",
              "semi-detached",
              "landed"
            ],
            "type": "string",
            "description": "Filter by property type. Leave empty for all types."
          },
          "minPrice": {
            "title": "Min price (S$)",
            "type": "integer",
            "description": "Minimum price in SGD. For rent this is monthly."
          },
          "maxPrice": {
            "title": "Max price (S$)",
            "type": "integer",
            "description": "Maximum price in SGD. For rent this is monthly."
          },
          "bedrooms": {
            "title": "Bedrooms",
            "type": "integer",
            "description": "Exact number of bedrooms to filter by. Leave empty for any."
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "Maximum number of listings to return. 0 = unlimited.",
            "default": 100
          },
          "includeDetails": {
            "title": "Include details - full media & contacts",
            "type": "boolean",
            "description": "Fetch each listing’s full detail: ALL photos, videos, virtual tours, floor plans, and every phone number on the listing including a co-broke agent’s. Off by default — adds one request per listing. The agent’s e-mail is NOT here; it lives on the agent’s own profile, which is the separate option below.",
            "default": false
          },
          "includeAgentContacts": {
            "title": "Include agent e-mail (one request per agent)",
            "type": "boolean",
            "description": "Look up each listing agent’s own profile to get their e-mail address. PropertyGuru stopped serving the e-mail alongside the listing in late October 2026, so this is the only place it is still published. Off by default. One request per DISTINCT agent, cached within a run, so a run of 100 listings by 60 agents costs 60 requests rather than 100 — that makes the run faster, and does not change what you are charged. Measured over 26 agents: an e-mail came back for every one of them; LINE IDs are published as a field but were empty for all 26, so expect agentLineId to stay blank. Check the Pricing tab for what this currently costs.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Route requests through a proxy (Apify Proxy by default).",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}