{
  "openapi": "3.0.1",
  "info": {
    "title": "Homely.com.au: Buy, Rent, Sold, Agents, Suburbs Reviews",
    "description": "Scrape Homely.com.au properties for sale, rent, and sold, plus agent finder, suburb reviews, ratings, and Q&A. Search by suburb or use URLs. Returns 50+ fields, including price, beds, baths, parking, geo, agent contacts, photos, and inspections.",
    "version": "1.0",
    "x-build-id": "DHmm3517uAsBjlYBf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~homely-com-au-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-homely-com-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~homely-com-au-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-homely-com-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~homely-com-au-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-homely-com-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "1. How will you supply the input?",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Search = tell us a suburb and we find the records. URL = paste exact Homely links. In URL mode the link itself decides what gets scraped, so the dataset picker and every search filter below are ignored.",
            "default": "search"
          },
          "dataset": {
            "title": "2. What do you want to scrape?",
            "enum": [
              "buy",
              "rent",
              "sold",
              "agents",
              "offices",
              "suburb",
              "questions"
            ],
            "type": "string",
            "description": "The kind of record to return. Buy / Rent / Sold are property listings. Agents and Offices come from Homely's agent finder. Suburb returns the community profile (rating, score, pros and cons, reviews). Questions returns the suburb's community Q&A. Ignored when the input method is URL.",
            "default": "buy"
          },
          "location": {
            "title": "Location (suburb)",
            "type": "string",
            "description": "Suburb to scrape, e.g. 'Bondi NSW 2026', 'Bondi, NSW', or a Homely slug like 'bondi-nsw-2026'. The state and postcode help disambiguate same-named suburbs. Required for every dataset in Search mode."
          },
          "locationIds": {
            "title": "Location IDs (advanced)",
            "type": "array",
            "description": "Optional pre-resolved numeric Homely location IDs (Agents mode can use these directly without a name lookup).",
            "items": {
              "type": "string"
            }
          },
          "priceMin": {
            "title": "Min price",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings at or above this price. For Rent this is the weekly rent. Applied to Buy/Rent/Sold."
          },
          "priceMax": {
            "title": "Max price",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings at or below this price (weekly rent for Rent)."
          },
          "bedroomsMin": {
            "title": "Min bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of bedrooms."
          },
          "bedroomsMax": {
            "title": "Max bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of bedrooms."
          },
          "bathroomsMin": {
            "title": "Min bathrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of bathrooms."
          },
          "carSpacesMin": {
            "title": "Min car spaces",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of car spaces."
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Keep only these property types. Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "house",
                "unit",
                "apartment",
                "townhouse",
                "villa",
                "land",
                "acreage",
                "rural",
                "duplex",
                "studio"
              ]
            }
          },
          "propertyFeatures": {
            "title": "Required features",
            "type": "array",
            "description": "Keep only listings whose tags include ALL of these (e.g. 'pool', 'air conditioning'). Leave empty to skip.",
            "items": {
              "type": "string"
            }
          },
          "isUnderOffer": {
            "title": "Under offer only",
            "type": "boolean",
            "description": "If on, keep only listings currently under offer. Leave off to include all."
          },
          "agentSpecialty": {
            "title": "Agent specialty",
            "enum": [
              "any",
              "sale",
              "rent"
            ],
            "type": "string",
            "description": "Filter agents by what they list.",
            "default": "any"
          },
          "officeId": {
            "title": "Office ID (advanced)",
            "type": "integer",
            "description": "List all agents in a specific office by its numeric Homely office ID."
          },
          "sort": {
            "title": "Sort agents by",
            "enum": [
              "default",
              "rating",
              "reviews",
              "sales",
              "listings"
            ],
            "type": "string",
            "description": "Ordering for the Agents / Offices datasets. Property listings come back in Homely's own order and are not re-sorted.",
            "default": "default"
          },
          "startUrls": {
            "title": "Homely URLs",
            "type": "array",
            "description": "Paste exact Homely URLs (for-sale / for-rent / sold-properties SERPs, suburb-profile pages, questions pages, a listing or agent page). Used only in URL mode.",
            "items": {
              "type": "string"
            }
          },
          "detail": {
            "title": "Fetch full details (richer records)",
            "type": "boolean",
            "description": "Open each record's detail source for extra fields: listing agent EMAIL + full description + council rates + floor plans; agent job title, website, areas of expertise, performance. Adds one request per record.",
            "default": false
          },
          "includeSuburbInsights": {
            "title": "Add suburb insights to each listing",
            "type": "boolean",
            "description": "Attach the suburb's community rating, score, pros and cons and 'great for' tags to every property record. Costs one extra request per suburb, not per listing. Applies to the Buy / Rent / Sold datasets. Off by default.",
            "default": false
          },
          "maxItems": {
            "title": "Max records",
            "minimum": 0,
            "type": "integer",
            "description": "THE cap for the run: stop after this many records (default 20). Set to 0 for unlimited.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per location",
            "minimum": 0,
            "type": "integer",
            "description": "How many result pages to read per location. Leave empty (or 0) for unlimited; the run is bounded by Max records."
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Network connection. The default (datacenter) works on all plans and is recommended. Switch to Residential only for heavier runs.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue an interrupted crawl without returning or charging for records already collected there. Use this after an interrupted run, or to continue a large pull in another run. For recurring monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching records as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED records. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those records returned (and billed). State is kept separately per search/filter/detail setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/filters/detail settings -- different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns -- and bills -- extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired records (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search -- not when Max records capped it or when Resume was used. This returns -- and bills -- extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into apps you use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed summary per item; the full record stays in the dataset. Supported: Notion, Linear, Airtable, Apify."
          },
          "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}