{
  "openapi": "3.0.1",
  "info": {
    "title": "URA Private Property Transactions Scraper - Singapore Caveats",
    "description": "Scrape official URA private residential transactions (caveats) for Singapore: transacted price, $PSF/$PSM, area, tenure, floor, district, market segment & sale type. Filter by period, type & price. No API key. Export to JSON, CSV or Excel.",
    "version": "0.1",
    "x-build-id": "mVM3KPjOlADgTUaWT"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~ura-property-transactions-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-ura-property-transactions-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/scrapesage~ura-property-transactions-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-ura-property-transactions-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/scrapesage~ura-property-transactions-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-ura-property-transactions-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": {
          "fromMonth": {
            "title": "From month (YYYY-MM)",
            "type": "string",
            "description": "Start of the transaction period, e.g. \"2025-07\". Leave blank to default to 6 months before the current month. URA publishes the actual transacted (caveat) prices, so the most recent weeks are still being lodged.",
            "default": ""
          },
          "toMonth": {
            "title": "To month (YYYY-MM)",
            "type": "string",
            "description": "End of the transaction period, e.g. \"2026-06\". Leave blank to default to the current month.",
            "default": ""
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Which private residential property-type groups to include. Leave empty for all four.",
            "items": {
              "type": "string",
              "enum": [
                "Landed (Non-Strata)",
                "Strata Landed",
                "Apartments & Condominiums",
                "Executive Condominiums"
              ],
              "enumTitles": [
                "Landed (Non-Strata)",
                "Strata Landed",
                "Apartments & Condominiums",
                "Executive Condominiums"
              ]
            },
            "default": []
          },
          "saleTypes": {
            "title": "Sale types",
            "type": "array",
            "description": "New Sale (developer), Sub Sale (re-assignment before completion) or Resale (secondary market). Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "New Sale",
                "Sub Sale",
                "Resale"
              ],
              "enumTitles": [
                "New Sale",
                "Sub Sale",
                "Resale"
              ]
            },
            "default": []
          },
          "postalDistricts": {
            "title": "Postal districts (optional)",
            "type": "array",
            "description": "Keep only transactions in these URA postal districts (01–28). Leave empty for all of Singapore. e.g. 09 = Orchard/River Valley, 10 = Bukit Timah/Holland, 15 = Katong/East Coast, 19 = Hougang/Punggol/Sengkang.",
            "items": {
              "type": "string",
              "enum": [
                "01",
                "02",
                "03",
                "04",
                "05",
                "06",
                "07",
                "08",
                "09",
                "10",
                "11",
                "12",
                "13",
                "14",
                "15",
                "16",
                "17",
                "18",
                "19",
                "20",
                "21",
                "22",
                "23",
                "24",
                "25",
                "26",
                "27",
                "28"
              ],
              "enumTitles": [
                "01 — Raffles Place / Marina",
                "02 — Tanjong Pagar / Anson",
                "03 — Queenstown / Tiong Bahru",
                "04 — Telok Blangah / Harbourfront",
                "05 — Pasir Panjang / Clementi",
                "06 — City Hall / Beach Road",
                "07 — Bugis / Golden Mile",
                "08 — Little India / Farrer Park",
                "09 — Orchard / River Valley",
                "10 — Bukit Timah / Holland / Tanglin",
                "11 — Novena / Newton / Thomson",
                "12 — Balestier / Toa Payoh / Serangoon",
                "13 — Macpherson / Braddell",
                "14 — Geylang / Eunos / Paya Lebar",
                "15 — Katong / East Coast / Marine Parade",
                "16 — Bedok / Upper East Coast",
                "17 — Loyang / Changi",
                "18 — Tampines / Pasir Ris",
                "19 — Hougang / Punggol / Sengkang",
                "20 — Bishan / Ang Mo Kio",
                "21 — Upper Bukit Timah / Clementi Park",
                "22 — Jurong / Boon Lay",
                "23 — Bukit Panjang / Choa Chu Kang",
                "24 — Lim Chu Kang / Tengah",
                "25 — Kranji / Woodlands",
                "26 — Upper Thomson / Springleaf",
                "27 — Yishun / Sembawang",
                "28 — Seletar / Yio Chu Kang"
              ]
            },
            "default": []
          },
          "marketSegments": {
            "title": "Market segments (optional)",
            "type": "array",
            "description": "Keep only these URA market segments: CCR = Core Central Region (prime), RCR = Rest of Central Region (city fringe), OCR = Outside Central Region (suburban). Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "CCR",
                "RCR",
                "OCR"
              ],
              "enumTitles": [
                "CCR — Core Central Region",
                "RCR — Rest of Central Region",
                "OCR — Outside Central Region"
              ]
            },
            "default": []
          },
          "projectNameContains": {
            "title": "Project name contains (optional)",
            "type": "string",
            "description": "Keep only transactions whose project name contains this text (case-insensitive), e.g. \"the sail\", \"normanton\".",
            "default": ""
          },
          "streetContains": {
            "title": "Street name contains (optional)",
            "type": "string",
            "description": "Keep only transactions whose street name contains this text (case-insensitive), e.g. \"river valley\".",
            "default": ""
          },
          "minPrice": {
            "title": "Min transacted price (SGD)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only transactions at or above this price. 0 = no minimum.",
            "default": 0
          },
          "maxPrice": {
            "title": "Max transacted price (SGD)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only transactions at or below this price. 0 = no maximum.",
            "default": 0
          },
          "minPsf": {
            "title": "Min unit price ($PSF)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only transactions at or above this $ per square foot. 0 = no minimum.",
            "default": 0
          },
          "maxPsf": {
            "title": "Max unit price ($PSF)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only transactions at or below this $ per square foot. 0 = no maximum.",
            "default": 0
          },
          "minAreaSqft": {
            "title": "Min area (sqft)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only transactions at or above this floor area in square feet. 0 = no minimum.",
            "default": 0
          },
          "maxAreaSqft": {
            "title": "Max area (sqft)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only transactions at or below this floor area in square feet. 0 = no maximum.",
            "default": 0
          },
          "tenureFilter": {
            "title": "Tenure",
            "enum": [
              "Any",
              "Freehold",
              "Leasehold"
            ],
            "type": "string",
            "description": "Keep only Freehold or only Leasehold transactions.",
            "default": "Any"
          },
          "maxResults": {
            "title": "Max results (transactions)",
            "minimum": 1,
            "maximum": 500000,
            "type": "integer",
            "description": "Cap on transaction records returned across the run. Set to a large number for a full market pull (URA returns thousands of caveats for a typical multi-month, all-Singapore query).",
            "default": 100
          },
          "resultsPerRequest": {
            "title": "Results per request",
            "minimum": 20,
            "maximum": 500,
            "type": "integer",
            "description": "How many transactions to pull per page request (20–500). Higher = fewer requests for big pulls.",
            "default": 200
          },
          "deduplicate": {
            "title": "Deduplicate transactions",
            "type": "boolean",
            "description": "Skip identical caveats already emitted earlier in the same run.",
            "default": true
          },
          "monitorMode": {
            "title": "Monitoring mode — only new transactions",
            "type": "boolean",
            "description": "Remember which caveats were already returned and emit ONLY transactions not seen in previous runs. Pairs with Apify Schedules to track newly lodged caveats over time (it does not conflict with Schedules — Schedules decide when to run, this decides what is new).",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitor store name",
            "type": "string",
            "description": "Named key-value store that holds the 'already seen' transaction fingerprints for monitoring mode. Use a different name per tracked market to keep histories separate.",
            "default": "ura-property-transactions-monitor"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy settings. The URA portal is a public Singapore government site read over standard Apify Proxy with automatic IP rotation; the default works well. Blocked requests retry automatically on a fresh IP.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}