{
  "openapi": "3.0.1",
  "info": {
    "title": "AU Residential Property Scraper",
    "description": "Scrape Australian real estate listings with detailed property information. Extract addresses, prices, bedrooms, bathrooms, property features, descriptions, photos and other available listing details. Includes rich detail-page enrichment for comprehensive property research.",
    "version": "0.5",
    "x-build-id": "CGQXSNfNoDToy0bwi"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~property-au-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-property-au-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/abotapi~property-au-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-property-au-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/abotapi~property-au-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-property-au-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": {
          "mode": {
            "title": "Scraping Mode",
            "enum": [
              "listing",
              "url"
            ],
            "type": "string",
            "description": "Choose scraping mode: 'listing' to scrape by suburb/postcode, or 'url' to scrape specific search page URLs directly.",
            "default": "listing"
          },
          "search": {
            "title": "Location Search",
            "type": "string",
            "description": "Enter a suburb name (e.g. 'southbank'), a postcode (e.g. '3006'), or a partial name (e.g. 'wantir'). The location is resolved automatically. Invalid or ambiguous queries will fail fast rather than run against the wrong location.",
            "default": "southbank"
          },
          "urls": {
            "title": "Search Page URLs",
            "type": "array",
            "description": "List of property.com.au search page URLs of the form /search/?locations=... (used when Scraping Mode is 'url'). Listing type is auto-detected from the propertyStatus / marketStatuses query. Detail pages and /buy|rent|sold/ path pages are skipped with a warning. Pagination walks forward from the URL's own ?pageNumber=N (default 1).",
            "items": {
              "type": "string"
            },
            "default": [
              "https://www.property.com.au/search/?locations=Southbank%2C+VIC+3006&propertyStatus=FOR_SALE",
              "https://www.property.com.au/search/?locations=Southbank%2C+VIC+3006&propertyStatus=FOR_RENT",
              "https://www.property.com.au/search/?locations=Southbank%2C+VIC+3006&propertyStatus=SOLD"
            ]
          },
          "listing_type": {
            "title": "Listing Type",
            "enum": [
              "buy",
              "rent",
              "sold"
            ],
            "type": "string",
            "description": "Type of listings to scrape. In listing mode this drives the search URL. In URL mode it's used as a fallback when the listing type can't be auto-detected from the URL path (/buy/, /rent/, /sold/).",
            "default": "buy"
          },
          "propertyTypes": {
            "title": "Property Types",
            "type": "array",
            "description": "Filter by property type, leave empty for all (listing mode only; in URL mode, encode propertyTypes directly in your URLs).",
            "items": {
              "type": "string",
              "enum": [
                "HOUSE",
                "APARTMENT",
                "TOWNHOUSE",
                "VILLA",
                "LAND",
                "ACREAGE",
                "RURAL",
                "BLOCK_OF_UNITS",
                "RETIREMENT"
              ],
              "enumTitles": [
                "House",
                "Apartment / Unit",
                "Townhouse",
                "Villa",
                "Land",
                "Acreage",
                "Rural",
                "Block of Units",
                "Retirement"
              ]
            }
          },
          "priceMin": {
            "title": "Minimum Price",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum property price in AUD (listing mode only)."
          },
          "priceMax": {
            "title": "Maximum Price",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum property price in AUD (listing mode only)."
          },
          "bedroomsMin": {
            "title": "Minimum Bedrooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Minimum number of bedrooms (listing mode only)."
          },
          "bathroomsMin": {
            "title": "Minimum Bathrooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Minimum number of bathrooms (listing mode only)."
          },
          "landSizeMin": {
            "title": "Minimum Land Size (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum land size in square metres (listing mode only)."
          },
          "carSpacesMin": {
            "title": "Minimum Car Spaces",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of car spaces (listing mode only)."
          },
          "keywords": {
            "title": "Keywords",
            "type": "string",
            "description": "Search keywords e.g. pool, renovated, corner block (listing mode only)."
          },
          "excludeUnderOffer": {
            "title": "Exclude Under Offer",
            "type": "boolean",
            "description": "Exclude properties that are under offer (listing mode, buy only).",
            "default": false
          },
          "sortBy": {
            "title": "Sort Order",
            "enum": [
              "RELEVANCY",
              "NEW_DESC",
              "NEW_ASC",
              "PRICE_ASC",
              "PRICE_DESC",
              "NEXT_AUCTION",
              "NEXT_INSPECTION"
            ],
            "type": "string",
            "description": "Sort order for search results. Default is 'Date (Newest First)'. Only applies in listing mode; in URL mode, include sortOption in your URLs directly.",
            "default": "NEW_DESC"
          },
          "max_properties": {
            "title": "Max Properties",
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of properties to scrape (0 = the hard cap of 100000 per run)",
            "default": 20
          },
          "max_pages": {
            "title": "Max Pages",
            "type": "integer",
            "description": "Maximum number of listing pages to scrape per URL. Walks forward from the URL's own ?pageNumber=N (default 1). Set to 0 for the hard cap of 1000 pages per URL.",
            "default": 0
          },
          "dataset_name": {
            "title": "Dataset Name (optional)",
            "type": "string",
            "description": "Optional named dataset for cross-run accumulation. Results are always written to the run's default dataset (visible on the run page); when this field is set, each record is ALSO appended to the named dataset. Name must be lowercase letters, digits, and hyphens only (e.g. my-dataset-1). Leave empty to write only to the run's default dataset."
          },
          "clear_dataset": {
            "title": "Clear Named Dataset",
            "type": "boolean",
            "description": "Clear the named dataset before scraping (only applies when Dataset Name is set). Useful for refreshing an accumulating dataset.",
            "default": false
          },
          "proxy": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Property.com.au accepts Australian residential connections. Keep Residential + country AU.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "AU"
            }
          },
          "resumeFromRunId": {
            "title": "Resume from run ID",
            "type": "string",
            "description": "Paste the ID of an earlier run of this actor to skip listings it already collected (continue an interrupted run). Leave empty to start fresh."
          },
          "incrementalMode": {
            "title": "Incremental mode (only new and changed listings)",
            "type": "boolean",
            "description": "Remember what earlier runs saw for this exact search and output only NEW, UPDATED and REAPPEARED listings (plus EXPIRED ones that left the results). Each row gets changeType, changedFields, firstSeenAt and lastSeenAt. Off = every listing is output, exactly as before.",
            "default": false
          },
          "stateKey": {
            "title": "State key (incremental mode only)",
            "type": "string",
            "description": "Optional name for the remembered baseline. Leave empty to key it automatically on your search and filters (raising the item caps does not start a new baseline)."
          },
          "emitUnchanged": {
            "title": "Also output unchanged listings (incremental mode only)",
            "type": "boolean",
            "description": "Off by default: listings identical to the last run are skipped.",
            "default": false
          },
          "emitExpired": {
            "title": "Output expired listings (incremental mode only)",
            "type": "boolean",
            "description": "Emit an EXPIRED row for listings seen before that are no longer in the results. Only when the search was walked to its end.",
            "default": true
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Top-level output fields (for example media or timeline) that must not count as a change. Their values are still output.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. Notion gets a page per item; other connectors receive a best-effort write/digest. Leave empty to skip — this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}