{
  "openapi": "3.0.1",
  "info": {
    "title": "Australian Real Estate 💰$1.50💰· All Portals · Download Agents",
    "description": "Scrape AU property listings from Domain, commercialrealestate.com.au, Ray White, Harcourts & LJ Hooker in one unified output. Plus an Instant Agent Database: 87,000+ Australian real estate agents with email & phone, filtered by state, suburb or agency. No browser.",
    "version": "0.0",
    "x-build-id": "dJf5t9cVLnEpMV4yE"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~au-property-multi-portal-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-au-property-multi-portal-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/memo23~au-property-multi-portal-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-au-property-multi-portal-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/memo23~au-property-multi-portal-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-au-property-multi-portal-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": {
          "instantDatabase": {
            "title": "Get agents instantly (no scraping)",
            "type": "boolean",
            "description": "Deliver Australian real estate agents straight from our pre-collected agent directory instead of scraping listing pages: name, agency, email and phone, instantly, with nothing to get blocked. Leave Start URLs empty when this is on, then choose the portals and filters below.",
            "default": false
          },
          "dbCountOnly": {
            "title": "Count only (free preview, no records delivered)",
            "type": "boolean",
            "description": "See how many agents match your filters, and how many of them have an email or a phone, before paying for them. The numbers appear as the run's status message and in the OUTPUT record of the run's key-value store. No agents are delivered and none are billed.",
            "default": false
          },
          "dbPortals": {
            "title": "Portals",
            "type": "array",
            "description": "Which portals' agents to include. An agent listed on both realestate.com.au and domain.com.au is delivered once. commercialrealestate.com.au agents come with a phone number but no email.",
            "items": {
              "type": "string",
              "enum": [
                "rea",
                "domain",
                "commercial"
              ],
              "enumTitles": [
                "realestate.com.au",
                "domain.com.au",
                "commercialrealestate.com.au"
              ]
            },
            "default": [
              "rea",
              "domain",
              "commercial"
            ]
          },
          "dbState": {
            "title": "State",
            "enum": [
              "NSW",
              "VIC",
              "QLD",
              "WA",
              "SA",
              "TAS",
              "ACT",
              "NT"
            ],
            "type": "string",
            "description": "Only agents in this state or territory. Leave empty for all of Australia."
          },
          "dbSuburb": {
            "title": "Suburb (optional)",
            "type": "string",
            "description": "Only agents whose office is in this suburb (partial match, e.g. \"Parramatta\"). domain.com.au agents carry no suburb, so they are left out when this is set rather than returned unfiltered."
          },
          "dbAgency": {
            "title": "Agency name contains (optional)",
            "type": "string",
            "description": "Only agents whose agency name contains this text (case-insensitive), e.g. \"Ray White\"."
          },
          "dbAgentName": {
            "title": "Agent name contains (optional)",
            "type": "string",
            "description": "Only agents whose name contains this text (case-insensitive)."
          },
          "dbIncludeEmail": {
            "title": "Email address",
            "type": "boolean",
            "description": "Include each agent's email address. Billed per email delivered; switch off if you only need phone numbers.",
            "default": true
          },
          "dbIncludePhone": {
            "title": "Phone number",
            "type": "boolean",
            "description": "Include each agent's phone number (the mobile when there is one). Billed per phone delivered.",
            "default": true
          },
          "dbHasEmail": {
            "title": "Only agents with an email",
            "type": "boolean",
            "description": "Leave out agents who have no email address on record.",
            "default": false
          },
          "dbHasPhone": {
            "title": "Only agents with a phone",
            "type": "boolean",
            "description": "Leave out agents who have no phone number on record.",
            "default": false
          },
          "dbOffset": {
            "title": "Skip first N agents",
            "minimum": 0,
            "type": "integer",
            "description": "Skip this many matching agents before delivering, to continue a large pull across several runs: e.g. Maximum results 5,000 in the first run, then Skip 5,000 in the second.",
            "default": 0
          },
          "startUrls": {
            "title": "AU property portal URLs",
            "type": "array",
            "description": "Full URLs from supported portals. Search/listing URLs are paginated/fanned-out automatically until `Maximum items` is reached. Mix portals freely.",
            "items": {
              "type": "string"
            }
          },
          "harvestEmails": {
            "title": "Harvest contact emails from each portal's office website",
            "type": "boolean",
            "description": "When enabled (default), each row's office `websiteUrl` is followed and any contact emails found on that site are added to `harvestedEmails`. Per-URL deduped across the run — same office website is only fetched once. Adds ~0.3-1s per unique office site. For LJ Hooker, this also follows each listing's agents to their profile pages to capture the agent's email (set on `agents[].email`) and the office contact block (name/address/phone/email/website) — requires `Fetch per-listing agents` to also be on.",
            "default": true
          },
          "fetchAgentDetails": {
            "title": "Fetch per-listing agents (LJ Hooker)",
            "type": "boolean",
            "description": "When enabled (default), each LJ Hooker listing's detail page is fetched to attach the listing's `agents` (name, title, mobile, profile URL), feature tags and marketing headline — data the LJ Hooker search API doesn't return. Costs one extra request per LJ Hooker row. Turn off for faster, lighter LJ Hooker runs. Other portals already include agents inline, so this only affects LJ Hooker.",
            "default": true
          },
          "flatten": {
            "title": "Flatten nested fields for CSV-friendly output",
            "type": "boolean",
            "description": "When enabled (default), nested objects (`address`, `office`, `agents`) are expanded to underscore-separated top-level keys (e.g. `address_suburb`, `office_email`). Arrays of objects are JSON-stringified into `*_json` fields. Disable to keep the full nested JSON for code post-processing.",
            "default": true
          },
          "enrichEmails": {
            "title": "Enrich with contact emails (experimental, billed per email)",
            "type": "boolean",
            "description": "If enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Billed per contact email found; only charged when an email is returned, never for misses.",
            "default": false
          },
          "qualifyByPayment": {
            "title": "💳 Qualify by payment (flag businesses that take money online)",
            "type": "boolean",
            "description": "Requires \"Enrich with contact emails\". Scans each business's website — reusing the pages already fetched for email discovery, so no extra cost or time — for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds takesPayments (is this a real paying business?), paymentProcessors (which stack), stripeLiveKey (the public key if exposed) and paymentConfidence. Turn raw contacts into monetization-qualified leads. No extra charge — included with each enriched company.",
            "default": false
          },
          "emitBlockedRows": {
            "title": "🚧 Emit a row for listings blocked by bot protection",
            "type": "boolean",
            "description": "OFF by default. Portals occasionally serve an anti-bot challenge instead of a listing page; those listings are retried on a fresh proxy identity and, if still blocked, left out of the dataset. Blocked URLs are ALWAYS reported — in the run log, in the run status message, and in full in the BLOCKED_URLS record in this run's key-value store — so a partial result is never mistaken for a complete one. Turn this on to also get a placeholder row per blocked listing (scrapeStatus = \"blocked\", plus the URL and the reason), which makes gaps visible directly in the dataset or your CSV. Note these placeholder rows are billed like any other output row.",
            "default": false
          },
          "harcourtsNearby": {
            "title": "Harcourts: listings near a location",
            "type": "string",
            "description": "Optional. Find every Harcourts listing near a place — a suburb (\"Bondi Beach, NSW\"), a postcode (\"2026\"), or coordinates (\"-33.8907,151.2724\"). Harcourts has no search URL for this (its site geocodes in the browser), so it is set here instead of in Start URLs. Leave empty to skip. Works alongside any Start URLs you provide."
          },
          "harcourtsNearbyRadiusKm": {
            "title": "Harcourts nearby: radius (km)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Search radius around the location above. Only used when \"listings near a location\" is set.",
            "default": 25
          },
          "harcourtsNearbyChannel": {
            "title": "Harcourts nearby: channel",
            "enum": [
              "buy",
              "rent",
              "sold",
              "leased"
            ],
            "type": "string",
            "description": "Which Harcourts listings to search near that location. Only used when \"listings near a location\" is set.",
            "default": "buy"
          },
          "maxItems": {
            "title": "Maximum items to scrape",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum rows PER start URL — each search/listing URL you paste gets its own allowance (e.g. 5 city searches × 100 = up to 500 rows), interleaved fairly across URLs. Total spend stays bounded by the run's cost limit. Pasted individual property/agent URLs always return their one row each. In Instant Agent Database mode this is the total number of agents delivered by the run.",
            "default": 10000
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of detail pages processed in parallel. Higher = faster but more proxy bandwidth + higher risk of transient errors. 6-10 is the sweet spot.",
            "default": 8
          },
          "minConcurrency": {
            "title": "Min concurrency",
            "minimum": 1,
            "type": "integer",
            "description": "Minimum number of detail pages processed in parallel.",
            "default": 1
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "type": "integer",
            "description": "Number of retries before a failed request is given up. Transient errors (thin or empty bodies) are auto-detected and retried; this counter covers other failures too.",
            "default": 5
          },
          "proxy": {
            "title": "Proxy configuration (optional override)",
            "type": "object",
            "description": "Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}