{
  "openapi": "3.0.1",
  "info": {
    "title": "Private Property Scraper - South Africa Listings & API",
    "description": "Scrape privateproperty.co.za for sale and to rent across all 9 South African provinces: price, beds, baths, erf and floor size, levies, rates, suburb, agent, on-show and repossessed stock. JSON, CSV or Excel.",
    "version": "1.0",
    "x-build-id": "bDiXMNg9RpQl5hxdj"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~privateproperty-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-privateproperty-property-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/sian.agency~privateproperty-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-privateproperty-property-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/sian.agency~privateproperty-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-privateproperty-property-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": {
          "operation": {
            "title": "🎯 What do you want to scrape?",
            "enum": [
              "search",
              "listing"
            ],
            "type": "string",
            "description": "Pick one operation per run. Search sweeps an area and returns about 19 listing rows per page it reads; Listing Detail opens one listing and returns the full record for it, including the description, every photo, the map coordinates, levies and rates.",
            "default": "search"
          },
          "locations": {
            "title": "📍 Areas",
            "type": "array",
            "description": "Place names as Private Property writes them — a suburb (\"Sea Point\", \"Midstream Estate\"), a city (\"Cape Town\", \"Durban\"), a region (\"Atlantic Seaboard\") or a province (\"Western Cape\"). Names are matched against the portal's own published area index, so you never have to find an area id. Leave it empty to sweep the whole of South Africa. Ignored when you paste your own Search URLs.",
            "default": [
              "Sea Point"
            ],
            "items": {
              "type": "string"
            }
          },
          "listingType": {
            "title": "🏷️ For sale or to rent",
            "enum": [
              "for-sale",
              "to-rent",
              "on-show",
              "commercial-sales",
              "commercial-rentals",
              "farms-for-sale",
              "farms-to-rent"
            ],
            "type": "string",
            "description": "Which side of the portal to read. \"On show this weekend\" returns only the stock with a scheduled show day, which is a much smaller and fresher set than for sale.",
            "default": "for-sale"
          },
          "propertyType": {
            "title": "🏠 Property type",
            "enum": [
              "",
              "houses",
              "apartments",
              "townhouses",
              "land",
              "garden-cottages"
            ],
            "type": "string",
            "description": "Narrow to one type. Leave on \"Any type\" to get everything the area holds. Garden cottages exist only to rent; land and townhouses exist on both sides.",
            "default": ""
          },
          "maxResults": {
            "title": "🔢 Maximum listings",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Stop after this many listings across all areas. Each page read returns about 19, so 100 costs six page reads.",
            "default": 100
          },
          "includeDetails": {
            "title": "📄 Open each listing for the full record",
            "type": "boolean",
            "description": "Off by default. Turn it on to open every listing found and add the description, every photo, the map coordinates, the listing date, levies and rates and taxes. This reads one extra page per listing and is charged as Listing Detail on top of the search row.",
            "default": false
          },
          "minPrice": {
            "title": "💰 Minimum price",
            "minimum": 0,
            "type": "integer",
            "description": "In rands. For rentals this is the monthly asking rent, not a purchase price. 0 means no minimum.",
            "default": 0
          },
          "maxPrice": {
            "title": "💰 Maximum price",
            "minimum": 0,
            "type": "integer",
            "description": "In rands, and the monthly rent on the to-rent side. 0 means no maximum.",
            "default": 0
          },
          "minBedrooms": {
            "title": "🛏️ Minimum bedrooms",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Returns listings with at least this many bedrooms. 0 means any, and also keeps studios and land, which carry no bedroom count at all.",
            "default": 0
          },
          "minBathrooms": {
            "title": "🛁 Minimum bathrooms",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Returns listings with at least this many bathrooms. 0 means any.",
            "default": 0
          },
          "minParkingSpaces": {
            "title": "🚗 Minimum parking spaces",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Returns listings with at least this many parking spaces or garages. 0 means any.",
            "default": 0
          },
          "searchUrls": {
            "title": "🔗 Search URLs",
            "type": "array",
            "description": "Paste privateproperty.co.za results pages you already have and they are read exactly as given, filters and all. When this is filled the Areas and filter fields above are ignored, so the URL you see in your browser is the search that runs.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "listingUrls": {
            "title": "🔗 Listing URLs",
            "type": "array",
            "description": "Paste individual privateproperty.co.za listing pages to get the full record for each. This switches the run to Listing Detail and ignores every search field.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}