{
  "openapi": "3.0.1",
  "info": {
    "title": "Realtor.ca Scraper",
    "description": "Realtor.ca scraper & API for Canadian real estate: search homes for sale & rent and export address, price, beds, baths, property type, MLS number, description, agent & brokerage, photos and GPS coordinates. Canada property market data and real-estate lead generation — fast, no login.",
    "version": "1.0",
    "x-build-id": "CoYTLBJDr6vrqzi4n"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/haketa~realtor-ca-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-haketa-realtor-ca-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/haketa~realtor-ca-scraper/runs": {
      "post": {
        "operationId": "runs-sync-haketa-realtor-ca-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/haketa~realtor-ca-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-haketa-realtor-ca-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": {
          "cities": {
            "title": "Cities / Markets",
            "type": "array",
            "description": "Pick the Canadian cities you want listings from. This is the easiest way to run the scraper — no links or codes required. Choose several to compare markets. Leave empty to automatically pull a fresh mixed sample from popular markets across Canada.",
            "items": {
              "type": "string",
              "enum": [
                "toronto",
                "mississauga",
                "brampton",
                "hamilton",
                "ottawa",
                "london-on",
                "kitchener-waterloo",
                "windsor",
                "montreal",
                "quebec-city",
                "gatineau",
                "laval",
                "vancouver",
                "surrey",
                "burnaby",
                "victoria",
                "kelowna",
                "calgary",
                "edmonton",
                "red-deer",
                "winnipeg",
                "regina",
                "saskatoon",
                "halifax",
                "moncton",
                "fredericton",
                "st-johns"
              ],
              "enumTitles": [
                "Toronto, ON",
                "Mississauga, ON",
                "Brampton, ON",
                "Hamilton, ON",
                "Ottawa, ON",
                "London, ON",
                "Kitchener–Waterloo, ON",
                "Windsor, ON",
                "Montreal, QC",
                "Quebec City, QC",
                "Gatineau, QC",
                "Laval, QC",
                "Vancouver, BC",
                "Surrey, BC",
                "Burnaby, BC",
                "Victoria, BC",
                "Kelowna, BC",
                "Calgary, AB",
                "Edmonton, AB",
                "Red Deer, AB",
                "Winnipeg, MB",
                "Regina, SK",
                "Saskatoon, SK",
                "Halifax, NS",
                "Moncton, NB",
                "Fredericton, NB",
                "St. John's, NL"
              ]
            }
          },
          "transactionType": {
            "title": "For Sale or For Rent",
            "enum": [
              "for-sale",
              "for-rent",
              "both"
            ],
            "type": "string",
            "description": "Show properties for sale, for rent, or both.",
            "default": "for-sale"
          },
          "propertyTypeGroup": {
            "title": "Property Category",
            "enum": [
              "residential",
              "commercial",
              "all"
            ],
            "type": "string",
            "description": "High-level property category. Residential covers houses, condos and townhomes; Commercial covers office, retail, industrial and business.",
            "default": "residential"
          },
          "priceMin": {
            "title": "Minimum Price (CAD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings at or above this price. Leave at 0 for no minimum.",
            "default": 0
          },
          "priceMax": {
            "title": "Maximum Price (CAD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings at or below this price. Leave at 0 for no maximum.",
            "default": 0
          },
          "bedroomsMin": {
            "title": "Minimum Bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings with at least this many bedrooms. Leave at 0 for no minimum.",
            "default": 0
          },
          "bathroomsMin": {
            "title": "Minimum Bathrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep listings with at least this many bathrooms. Leave at 0 for no minimum.",
            "default": 0
          },
          "newListingsOnlyDays": {
            "title": "New Listings Only (last N days)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only listings first published within the last N days. Great for fresh-lead monitoring. Leave at 0 to keep all.",
            "default": 0
          },
          "language": {
            "title": "Listing Language",
            "enum": [
              "both",
              "en",
              "fr"
            ],
            "type": "string",
            "description": "Filter listings by detected description language. Quebec listings are typically French.",
            "default": "both"
          },
          "fetchDetails": {
            "title": "Fetch Full Listing Details",
            "type": "boolean",
            "description": "Visit each listing's detail page for the complete record — full remarks, all photos, features, appliances, heating/cooling, basement, financials. Richer data, slightly slower. When off, only the summary fields are extracted.",
            "default": true
          },
          "fetchAgentProfiles": {
            "title": "Enrich With Agent Profiles",
            "type": "boolean",
            "description": "Additionally fetch the full REALTOR agent profile (bio, designations, languages, service areas, listing counts) for each listing's agent. Adds one request per unique agent.",
            "default": false
          },
          "fetchOfficeProfiles": {
            "title": "Enrich With Brokerage Profiles",
            "type": "boolean",
            "description": "Additionally fetch the brokerage/office profile (franchise, agent count, total listings) for each listing's brokerage. Adds one request per unique office.",
            "default": false
          },
          "maxItems": {
            "title": "Max Results",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum total records to return across all cities and inputs. Set 0 for unlimited. Tip: keep a limit for fast, low-cost test runs.",
            "default": 0
          },
          "maxPages": {
            "title": "Max Pages per City",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum result pages per city/market. Each page returns up to ~200 listings.",
            "default": 10
          },
          "advancedMode": {
            "title": "Advanced Input Mode",
            "enum": [
              "cities",
              "search-area",
              "map-bbox",
              "single-listing",
              "agent-profile",
              "office-profile"
            ],
            "type": "string",
            "description": "For power users only. Leave on 'Cities' to use the city dropdown above. Switch to another mode to paste your own Realtor.ca links or a map bounding box in the Advanced Inputs field below.",
            "default": "cities"
          },
          "searchUrls": {
            "title": "Advanced Inputs (links / MLS numbers)",
            "type": "array",
            "description": "Optional — power users only. Used when 'Advanced Input Mode' is set to one of the Advanced options. Examples — area page: 'https://www.realtor.ca/on/ottawa/real-estate'; single listing: an MLS number like 'X13126780'; agent: 'https://www.realtor.ca/agent/2182401/jane-doe'; brokerage: 'https://www.realtor.ca/office/firm/259003/royal-lepage-team'. Most users can ignore this and just pick cities above.",
            "items": {
              "type": "string"
            }
          },
          "mapBoundingBox": {
            "title": "Advanced: Map Bounding Box",
            "type": "object",
            "description": "Optional — power users only. Used when 'Advanced Input Mode' is 'Map bounding box'. Provide latMin, latMax, lngMin, lngMax in decimal degrees. Example (central Ottawa): { \"latMin\": 45.30, \"latMax\": 45.50, \"lngMin\": -75.85, \"lngMax\": -75.55 }."
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Recommended: keep Apify Proxy with the RESIDENTIAL group and country Canada for the most reliable results."
          },
          "requestDelay": {
            "title": "Request Delay (ms)",
            "minimum": 0,
            "maximum": 30000,
            "type": "integer",
            "description": "Delay between requests in milliseconds. Keep this at 1000+ for smooth, sustained runs.",
            "default": 1500
          },
          "maxConcurrency": {
            "title": "Max Concurrency",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many requests run in parallel. Keep this low (2-4) for the smoothest results.",
            "default": 2
          },
          "maxRetries": {
            "title": "Max Retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Retry attempts per failed request.",
            "default": 4
          },
          "applicationId": {
            "title": "API Application ID (advanced)",
            "type": "string",
            "description": "Advanced: leave empty to use the default. Only change this if results stop coming back and you have a known-good value.",
            "default": ""
          },
          "debugMode": {
            "title": "Debug Mode",
            "type": "boolean",
            "description": "Verbose logging for troubleshooting. Leave off for normal runs.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}