{
  "openapi": "3.0.1",
  "info": {
    "title": "Property24 Scraper & New-Listing Monitor - South Africa",
    "description": "Turn monitoring on and every later run returns only the listings it has not returned before, so you are never charged for the same property twice. Every Property24.com listing as clean JSON: price with its meaning, bedrooms, bathrooms, floor and erf size, suburb. Decoy tiles dropped. Unofficial.",
    "version": "0.1",
    "x-build-id": "PeNnasGMbbhHhjome"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~property24-listings/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-property24-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~property24-listings/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-property24-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~property24-listings/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-property24-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": "Property24 search URL (optional)",
            "type": "string",
            "description": "Paste a Property24 listing page, e.g. https://www.property24.com/for-sale/cape-town/western-cape/432 or https://www.property24.com/apartments-to-rent/sandton/gauteng/109. Only the place (the path with its area id) is used; sort and price parameters are dropped because every filter runs on the rows already fetched. When set, channel and location are ignored."
          },
          "channel": {
            "title": "For sale or to rent",
            "enum": [
              "sale",
              "rent"
            ],
            "type": "string",
            "description": "sale = /for-sale, rent = /to-rent. A rental's unit (monthly, per m², weekly, daily, yearly) is read from the tile and returned as rentalTerm.",
            "default": "sale"
          },
          "location": {
            "title": "City or area path",
            "type": "string",
            "description": "A city Property24 lists on its home page (cape-town, johannesburg, pretoria, durban, sandton, centurion, stellenbosch ...) or an area path with its Property24 id copied from any Property24 address, e.g. sea-point/cape-town/western-cape/11021. Property24 answers 404 without the id, so an unknown city is refused before anything is requested.",
            "default": "cape-town"
          },
          "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. Property24 shows 20 listings per page; a search can run to hundreds of pages (Cape Town for sale: 180 pages).",
            "default": 20
          },
          "maxPages": {
            "title": "Maximum pages to read",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Hard cap on the number of list pages requested. 0 = decide from maxListings (about 20 listings per page, plus a margin). Reading pages is free; only returned listings are charged.",
            "default": 0
          },
          "useProxy": {
            "title": "Use Apify proxy",
            "type": "boolean",
            "description": "Off by default: Property24 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 heading, type, suburb, city, province, agency or price text contains these words. Matching is 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). The agency name is only published as text on boosted, premium and development tiles; a listing whose tile shows only a logo has no name and is kept.",
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Minimum price (ZAR)",
            "minimum": 0,
            "type": "integer",
            "description": "Sale price, or monthly rent. 0 = off. A POA listing is kept, a per-m², weekly or daily rent is kept (not comparable with a monthly budget), and a development is kept whenever any part of its range fits.",
            "default": 0
          },
          "maxPrice": {
            "title": "Maximum price (ZAR)",
            "minimum": 0,
            "type": "integer",
            "description": "Sale price, or monthly rent. 0 = off. A POA listing and a per-m², weekly or daily rent are kept.",
            "default": 0
          },
          "requirePrice": {
            "title": "Only listings with a published price",
            "type": "boolean",
            "description": "Drop listings whose price is POA (price on application).",
            "default": false
          },
          "minBedrooms": {
            "title": "Minimum bedrooms",
            "minimum": -1,
            "type": "integer",
            "description": "-1 = off. Property24 lists studios as 0.5 bedrooms. A listing with no bedroom count (commercial, land) is kept.",
            "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. Property24 counts half bathrooms (3.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 erf (plot) size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "0 = off. A listing with no published erf size is kept.",
            "default": 0
          },
          "maxErfSizeSqm": {
            "title": "Maximum erf (plot) size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "0 = off.",
            "default": 0
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Partial match on Property24's words: Apartment, House, Townhouse, Vacant Land, Farm, Commercial Property, Industrial Property. A listing with no type is kept.",
            "items": {
              "type": "string"
            }
          },
          "suburbs": {
            "title": "Suburbs",
            "type": "array",
            "description": "Keep only listings in these suburbs (partial match on the suburb from the listing address, e.g. Sea Point).",
            "items": {
              "type": "string"
            }
          },
          "excludeDevelopments": {
            "title": "Exclude new developments",
            "type": "boolean",
            "description": "Drop development tiles (a block of units with a From/To price range rather than one home).",
            "default": false
          },
          "excludeAuctions": {
            "title": "Exclude auctions",
            "type": "boolean",
            "description": "Drop listings carrying Property24's AUCTION badge.",
            "default": false
          },
          "onlyReduced": {
            "title": "Only price-reduced listings",
            "type": "boolean",
            "description": "Keep only listings carrying Property24's Reduced banner.",
            "default": false
          },
          "onlyOnShow": {
            "title": "Only listings on show",
            "type": "boolean",
            "description": "Keep only listings with an On Show banner (the show date is returned as onShowDate).",
            "default": false
          },
          "monitoringMode": {
            "title": "Monitoring mode (only new listings)",
            "type": "boolean",
            "description": "Turn this on and schedule the Actor: each run reads the search in Property24's newest-first order and returns only the listings it has never returned before, reading on past the ones it already knows (up to 60 pages, or maxPages) until it has maxListings new ones. Listings removed by your filters are remembered too. Listings that did not fit under the limit are not remembered, so they are still waiting for you on the next run.",
            "default": false
          },
          "resetMonitoringState": {
            "title": "Reset monitoring memory",
            "type": "boolean",
            "description": "One-shot: forget every listing returned so far for this search. The next monitoring run returns everything again.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}