{
  "openapi": "3.0.1",
  "info": {
    "title": "Realtor.com [$1.5💰] Search · Detail · Agents (no 3k limit)",
    "description": "💰$1.50 per 1,000 results. Effortlessly scrape real estate data from Realtor.com, including property listings AND agent profiles. Extract property details like prices, amenities, locations, and photos, plus agent information such as contact details, reviews, specializations, and performance metrics.",
    "version": "0.0",
    "x-build-id": "ZCrmjLbgj7svttI0A"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~realtor-search-cheerio/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-realtor-search-cheerio",
        "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~realtor-search-cheerio/runs": {
      "post": {
        "operationId": "runs-sync-memo23-realtor-search-cheerio",
        "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~realtor-search-cheerio/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-realtor-search-cheerio",
        "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": {
          "startUrls": {
            "title": "Start URLs",
            "maxItems": 50,
            "type": "array",
            "description": "URLs to start with. Use a real Realtor.com search URL to mirror exactly what you see in the browser. Clear this list and use the 'Scrape with search filters' section below if you prefer a guided form.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "agentZipCodes": {
            "title": "Agent ZIP codes (Agent Search only)",
            "maxItems": 50,
            "type": "array",
            "description": "List of ZIP codes to search for agents (e.g. 32963, 90210). Each becomes a /realestateagents/{zip} URL. Leave empty when scraping listings.",
            "items": {
              "type": "string"
            }
          },
          "searchLocations": {
            "title": "Locations",
            "maxItems": 50,
            "type": "array",
            "description": "City, ZIP code, neighborhood or state to search. Examples: 'Las Vegas, NV', 'Corinth_TX', '90026', 'Brooklyn, NY'. Add as many as you need.",
            "items": {
              "type": "string"
            }
          },
          "searchMode": {
            "title": "Search mode",
            "enum": [
              "for_sale",
              "sold"
            ],
            "type": "string",
            "description": "Top-level search mode. Choose 'For sale / Off market' to use the Statuses filter below, or 'Sold' for recently sold listings (last 6 months window).",
            "default": "for_sale"
          },
          "searchStatuses": {
            "title": "Statuses (only when 'For sale / Off market' mode)",
            "type": "array",
            "description": "Which listing statuses to include. Defaults to active 'For Sale' + 'Ready to Build'. Add 'Pending', 'Contingent' or 'Coming Soon' to also include those sub-statuses. Ignored in 'Sold' mode. <strong>Output note:</strong> realtor.com's underlying <code>status</code> field on each record stays <code>\"for_sale\"</code> even for pending/contingent/coming_soon listings — those are surfaced as separate boolean columns (<code>flag_is_pending</code>, <code>flag_is_contingent</code>, <code>flag_is_coming_soon</code>) and as a derived <code>display_status</code> column (one of <code>pending</code> / <code>contingent</code> / <code>coming_soon</code> / <code>for_sale</code> / <code>sold</code>). If you're filtering downstream by status, use <code>display_status</code> or the flag columns, not <code>status</code>.",
            "items": {
              "type": "string",
              "enum": [
                "for_sale",
                "ready_to_build",
                "pending",
                "coming_soon",
                "contingent"
              ],
              "enumTitles": [
                "For Sale",
                "Ready to Build (new construction)",
                "Pending",
                "Coming Soon",
                "Contingent"
              ]
            },
            "default": [
              "for_sale",
              "ready_to_build"
            ]
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Filter by one or more property types. Leave empty for all types.",
            "items": {
              "type": "string",
              "enum": [
                "single_family",
                "townhomes",
                "condo_townhome",
                "multi_family",
                "land",
                "farm",
                "manufactured",
                "mobile",
                "apartment",
                "coop",
                "duplex_triplex"
              ],
              "enumTitles": [
                "Single-family home",
                "Townhome",
                "Condo / Townhome",
                "Multi-family home",
                "Land",
                "Farm / Ranch",
                "Manufactured",
                "Mobile",
                "Apartment",
                "Co-op",
                "Duplex / Triplex"
              ]
            },
            "default": []
          },
          "priceMin": {
            "title": "Min price (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum list price (or sold price when mode is 'Sold'). Leave empty for no minimum."
          },
          "priceMax": {
            "title": "Max price (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum list price (or sold price when mode is 'Sold'). Leave empty for no maximum."
          },
          "bedsMin": {
            "title": "Min beds",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of bedrooms. Leave empty for any."
          },
          "bathsMin": {
            "title": "Min baths",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum number of bathrooms. Leave empty for any."
          },
          "keyword": {
            "title": "Keyword",
            "type": "string",
            "description": "Free-text keyword that must appear in the listing description (e.g. 'roof', 'pool', 'new roof'). Leave empty to skip keyword filtering."
          },
          "fetchAgentListings": {
            "title": "Fetch active listings for each agent",
            "type": "boolean",
            "description": "If enabled, the scraper will also fetch each agent's current active listings (a separate request per agent). Use this when you want both the agent record and what they're currently selling.",
            "default": false
          },
          "exhaustiveAgents": {
            "title": "Maximize agent coverage (bypass realtor.com ~3k cap)",
            "type": "boolean",
            "description": "Off by default. Realtor.com's agent search returns at most ~3,000 results per query, even when many more agents exist in the area (e.g. Boston/Atlanta have 15,000+). When enabled, agent-search URLs (<code>/realestateagents/...</code>) are automatically sliced by two-letter name prefix (<code>/agentname-aa</code> through <code>/agentname-zz</code>). Each slice is small (a few hundred agents) so none hit the ~3k ceiling, and together they cover every agent in the metro — lifting coverage from ~3k to the full population. Duplicate agents that appear across slices are removed automatically. Trade-off: this runs many more search requests, so it makes the run considerably longer (give it a higher timeout and 2 GB+ memory for large metros). You are still billed only per unique agent returned. The flag is a no-op for URLs that aren't agent-search URLs and for non-paying accounts. Leave it off for a single fast query capped at ~3k.",
            "default": false
          },
          "maxItems": {
            "title": "Max results to scrape per crawl",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of listings/items/agents to scrape per crawl. Lower this for quick test runs; raise it (or leave the default) for full scrapes.",
            "default": 1000
          },
          "monitoringMode": {
            "title": "Monitoring mode (only new or changed listings)",
            "type": "boolean",
            "description": "If checked, the scraper will only return listings that were not seen in previous runs (useful for daily/weekly delta runs). Listings are deduplicated by <strong>property ID + status</strong>, so a property that transitions between buckets (e.g. for_sale → pending → sold) re-surfaces on the next run instead of being silently filtered. This makes monitoring mode safe for workflows that need to catch status changes, not just brand-new listings.",
            "default": false
          },
          "additionalStats": {
            "title": "Fetch additional property stats",
            "type": "boolean",
            "description": "If enabled, the scraper will fetch additional property stats (price history, neighborhood stats) for each listing. Adds extra requests, so it slows the run down.",
            "default": false
          },
          "includePermitHistory": {
            "title": "Include permit history (paid add-on)",
            "type": "boolean",
            "description": "If enabled, the scraper will fetch the public-records 'Permit history' table for each property (date, type of work, project type, project name, status). A derived <code>has_roof_permit</code> flag is also added so you can spot roofing permits at a glance. Adds one extra request per property and is billed via the separate <code>permit-history</code> event, charged <strong>per permit row returned</strong> (e.g. a property with 3 permits = 3 charges; a property with no permits = 0 charges).",
            "default": false
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of pages that can be processed at the same time. Lower values (3-5) help prevent memory issues.",
            "default": 5
          },
          "minConcurrency": {
            "title": "Min concurrency",
            "minimum": 1,
            "type": "integer",
            "description": "Minimum number of pages that will be processed at the same time.",
            "default": 1
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "type": "integer",
            "description": "Number of times the crawler will retry a failed request before giving up.",
            "default": 5
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}