{
  "openapi": "3.0.1",
  "info": {
    "title": "Private Property South Africa Listings & New-Listing Monitor",
    "description": "Every privateproperty.co.za listing for sale or to rent as clean JSON: price, bedrooms, bathrooms, floor and land size, suburb, city, agency and photos. Monitoring mode returns only listings that are new since your last run, and its first run is free. Unofficial.",
    "version": "0.1",
    "x-build-id": "QbnozpWQf45bh1Uyz"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~privateproperty-listings/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-privateproperty-listings",
        "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/neverempty~privateproperty-listings/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-privateproperty-listings",
        "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/neverempty~privateproperty-listings/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-privateproperty-listings",
        "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": {
          "searchUrl": {
            "title": "Search results URL (optional)",
            "type": "string",
            "description": "Paste a results page from privateproperty.co.za, e.g. https://www.privateproperty.co.za/for-sale/western-cape/cape-town/55 or https://www.privateproperty.co.za/to-rent/gauteng/johannesburg/33?bd=2. The place and every filter in the address are kept; only the page number is replaced. When set, channel and location are ignored."
          },
          "channel": {
            "title": "For sale or to rent",
            "enum": [
              "sale",
              "rent"
            ],
            "type": "string",
            "description": "sale = homes for sale, rent = homes to rent. The rent unit (per month and so on) is returned as rentalTerm.",
            "default": "sale"
          },
          "location": {
            "title": "Province, region or area path",
            "type": "string",
            "description": "A province (western-cape, gauteng, kwazulu-natal, eastern-cape, free-state, limpopo, mpumalanga, north-west, northern-cape), all of the country (south-africa), a region (cape-town, johannesburg, pretoria, centurion, durban, garden-route, boland, nelson-mandela-bay ...), or an area path with its number copied from any results address, e.g. western-cape/cape-town/blouberg/60. Empty with no search URL = Cape Town."
          },
          "sortBy": {
            "title": "Order",
            "enum": [
              "newest",
              "price-low",
              "site"
            ],
            "type": "string",
            "description": "Empty = newest first for a location, or the pasted address's own order for a search URL. Monitoring mode always reads newest first."
          },
          "maxListings": {
            "title": "Maximum listings to return",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many listings to return. You are charged for the rows you actually receive. The site shows 20 listings per page.",
            "default": 20
          },
          "maxPages": {
            "title": "Maximum pages to read",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Hard cap on the number of results pages requested. 0 = decide from maxListings (20 listings per page, plus a margin; further when filters drop listings). Reading pages is free; only returned listings are charged.",
            "default": 0
          },
          "includeDetails": {
            "title": "Open each listing for its date, full description and photos",
            "type": "boolean",
            "description": "Also opens every returned listing's own page to add listedDate, the site's exact property type, the full description and the photo URLs shown on that page (up to 9 on most listings). Slower (one more page per listing); the price per listing is the same.",
            "default": false
          },
          "useProxy": {
            "title": "Use Apify proxy",
            "type": "boolean",
            "description": "Off by default: the site answers Apify's network directly. If a request is blocked (403/429/503) the Actor switches to a proxy session by itself and retries.",
            "default": false
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep only listings whose title, type, description, address, suburb, area, city, province, agency or price text contains these words. Case-insensitive.",
            "items": {
              "type": "string"
            }
          },
          "keywordMatch": {
            "title": "Keyword match",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "any = at least one keyword must appear; all = every keyword must appear.",
            "default": "any"
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop listings containing any of these words.",
            "items": {
              "type": "string"
            }
          },
          "agencyNames": {
            "title": "Agency names",
            "type": "array",
            "description": "Keep only listings from these agencies (partial match). A listing without an agency name (private sellers, and promoted tiles whose agency could not be named) is kept.",
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Minimum price (ZAR)",
            "minimum": 0,
            "type": "integer",
            "description": "Sale price, or monthly rent. 0 = off. With a location, the limit is also sent to the site so fewer pages are read.",
            "default": 0
          },
          "maxPrice": {
            "title": "Maximum price (ZAR)",
            "minimum": 0,
            "type": "integer",
            "description": "Sale price, or monthly rent. 0 = off. With a location, the limit is also sent to the site so fewer pages are read.",
            "default": 0
          },
          "requirePrice": {
            "title": "Only listings with a published price",
            "type": "boolean",
            "description": "Drop listings without a number for a price (On Auction, Bank Negotiable and similar).",
            "default": false
          },
          "minBedrooms": {
            "title": "Minimum bedrooms",
            "minimum": -1,
            "type": "integer",
            "description": "-1 = off. The site lists studios as 0.5 bedrooms. With a location, the limit is also sent to the site.",
            "default": -1
          },
          "maxBedrooms": {
            "title": "Maximum bedrooms",
            "minimum": -1,
            "type": "integer",
            "description": "-1 = off.",
            "default": -1
          },
          "minBathrooms": {
            "title": "Minimum bathrooms",
            "minimum": 0,
            "type": "number",
            "description": "0 = off. Half bathrooms are counted (2.5).",
            "default": 0
          },
          "minParkingSpaces": {
            "title": "Minimum parking spaces",
            "minimum": 0,
            "type": "integer",
            "description": "0 = off.",
            "default": 0
          },
          "minFloorSizeSqm": {
            "title": "Minimum floor size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "0 = off. A listing with no published floor size is kept.",
            "default": 0
          },
          "maxFloorSizeSqm": {
            "title": "Maximum floor size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "0 = off.",
            "default": 0
          },
          "minErfSizeSqm": {
            "title": "Minimum land size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "0 = off. Land given in hectares is converted to m². A listing with no published land size is kept.",
            "default": 0
          },
          "maxErfSizeSqm": {
            "title": "Maximum land size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "0 = off.",
            "default": 0
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Partial match on the type: Apartment, House, Townhouse, Cluster, Duplex, Flat, Studio Apartment, Land ... A listing with no type is kept.",
            "items": {
              "type": "string"
            }
          },
          "suburbs": {
            "title": "Suburbs",
            "type": "array",
            "description": "Keep only listings in these suburbs (partial match, e.g. Sea Point).",
            "items": {
              "type": "string"
            }
          },
          "onlyReduced": {
            "title": "Only price-reduced listings",
            "type": "boolean",
            "description": "Keep only listings carrying the site's Reduced banner.",
            "default": false
          },
          "onlyNew": {
            "title": "Only listings marked New",
            "type": "boolean",
            "description": "Keep only listings carrying the site's New banner.",
            "default": false
          },
          "onlyOnShow": {
            "title": "Only listings on show",
            "type": "boolean",
            "description": "Keep only listings with an On Show banner (the show day is returned as onShowDate).",
            "default": false
          },
          "onlyPrivateSellers": {
            "title": "Only private sellers",
            "type": "boolean",
            "description": "Keep only listings marked as listed privately (no agency).",
            "default": false
          },
          "excludeAuctions": {
            "title": "Exclude auctions",
            "type": "boolean",
            "description": "Drop listings shown as On Auction or with an Auction badge.",
            "default": false
          },
          "excludeUnderOffer": {
            "title": "Exclude under offer and sold",
            "type": "boolean",
            "description": "Drop listings carrying an Under Offer or Sold banner.",
            "default": false
          },
          "monitoringMode": {
            "title": "Monitoring mode (only new listings)",
            "type": "boolean",
            "description": "Turn this on and schedule the Actor. The first run only remembers the listings on the site now and is free. Every later run reads newest first and returns only listings that appeared since, up to maxListings. Listings removed by your filters are remembered too; listings that did not fit under the limit are kept for the next run.",
            "default": false
          },
          "resetMonitoringState": {
            "title": "Reset monitoring memory",
            "type": "boolean",
            "description": "One-shot: forget every listing remembered so far for this search. The next monitoring run starts again with a free first run.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}