{
  "openapi": "3.0.1",
  "info": {
    "title": "CommercialGuru Scraper - SG Commercial Property Leads",
    "description": "Scrape CommercialGuru.com.sg commercial & industrial listings: price, PSF, size, tenure, district, MRT and agent leads (name, CEA licence, agency, mobile). Export to JSON, CSV or Excel.",
    "version": "0.1",
    "x-build-id": "Rxnxhixoen5PMHmYf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~commercialguru-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-commercialguru-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~commercialguru-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-commercialguru-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~commercialguru-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-commercialguru-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": {
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Commercial / industrial property types to scrape. Each is crawled as a CommercialGuru category page.",
            "items": {
              "type": "string",
              "enum": [
                "office",
                "retail",
                "shop",
                "food-beverage-outlets",
                "industrial",
                "factory",
                "warehouse",
                "business-science-park",
                "commercial-land",
                "shophouse",
                "conservation-shophouse",
                "medical-suite",
                "hdb-shop",
                "dormitory",
                "hotel"
              ],
              "enumTitles": [
                "Office",
                "Retail",
                "Shop",
                "F&B outlet",
                "Industrial (B1/B2)",
                "Factory",
                "Warehouse",
                "Business / Science Park",
                "Commercial land",
                "Shophouse",
                "Conservation shophouse",
                "Medical suite",
                "HDB shop",
                "Dormitory / workers' housing",
                "Hotel"
              ]
            },
            "default": [
              "office"
            ]
          },
          "listingType": {
            "title": "For sale or rent",
            "enum": [
              "sale",
              "rent",
              "both"
            ],
            "type": "string",
            "description": "Scrape listings for sale, for rent, or both.",
            "default": "sale"
          },
          "startUrls": {
            "title": "Start URLs (optional)",
            "type": "array",
            "description": "Specific CommercialGuru category or listing URLs (e.g. https://www.commercialguru.com.sg/office-for-rent or a /listing/... page). Overrides/augments the property-type selection.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max listings",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Maximum number of listings to scrape across all categories. Keep modest for fast, cheap runs.",
            "default": 100
          },
          "includeListingDetails": {
            "title": "Include listing details + agent mobile",
            "type": "boolean",
            "description": "Open each listing's detail page to add the agent's MOBILE number, full description, unit features, floor level, condition and amenities. Slower (one extra request per listing) and charged per enrichment.",
            "default": false
          },
          "maxPagesPerCategory": {
            "title": "Max pages per category",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Pagination cap per property-type category (20 listings/page).",
            "default": 30
          },
          "minPrice": {
            "title": "Min price (S$)",
            "type": "integer",
            "description": "Only keep listings at or above this price (monthly rent for rentals, total for sale)."
          },
          "maxPrice": {
            "title": "Max price (S$)",
            "type": "integer",
            "description": "Only keep listings at or below this price."
          },
          "minSizeSqft": {
            "title": "Min size (sqft)",
            "type": "integer",
            "description": "Only keep listings with floor area at or above this many square feet."
          },
          "maxSizeSqft": {
            "title": "Max size (sqft)",
            "type": "integer",
            "description": "Only keep listings with floor area at or below this many square feet."
          },
          "districts": {
            "title": "Districts (optional)",
            "type": "array",
            "description": "Filter by Singapore postal district code(s), e.g. D01, D25. Leave empty for all districts.",
            "items": {
              "type": "string"
            }
          },
          "verifiedListingsOnly": {
            "title": "Verified / official listings only",
            "type": "boolean",
            "description": "Only keep listings marked verified or official by CommercialGuru.",
            "default": false
          },
          "deduplicate": {
            "title": "Deduplicate",
            "type": "boolean",
            "description": "Skip listings already emitted in this run (by listing ID).",
            "default": true
          },
          "monitorMode": {
            "title": "Monitor mode (only new listings)",
            "type": "boolean",
            "description": "Remember listing IDs across runs in a named key-value store and return ONLY newly-seen listings on later runs. Pair with Apify Schedules for new-listing alerts.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitor store name",
            "type": "string",
            "description": "Named key-value store for monitor mode.",
            "default": "commercialguru-scraper-monitor"
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Parallel requests. Residential proxy + Cloudflare means 4–8 is a good balance.",
            "default": 6
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Residential proxy in Singapore is REQUIRED to clear Cloudflare. The default already selects Apify Residential, country SG — leave it unless you know what you're doing.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "SG"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}