{
  "openapi": "3.0.1",
  "info": {
    "title": "Realtor.com [$1.5💰] [Download All 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": "I1T29ZZB3icKA6GqO"
  },
  "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": {
          "dbState": {
            "title": "State (2-letter code)",
            "type": "string",
            "description": "The US state to pull agents for — e.g. FL, CA, TX. Setting this alone delivers instant database results."
          },
          "dbCity": {
            "title": "City (optional)",
            "type": "string",
            "description": "Narrow the results to a single city (case-insensitive substring of the agent's served areas). Leave empty to return the whole state."
          },
          "dbBrokerage": {
            "title": "Brokerage contains (optional)",
            "type": "string",
            "description": "Only return agents whose office / brokerage name contains this text (case-insensitive), e.g. \"Keller Williams\"."
          },
          "dbHasPhone": {
            "title": "Only agents with a phone",
            "type": "boolean",
            "description": "Return only agents that have a phone number on file.",
            "default": false
          },
          "dbMinRecentSales": {
            "title": "Minimum recent sales (optional)",
            "minimum": 0,
            "type": "integer",
            "description": "Only return agents with at least this many sales in the last 12 months — e.g. 5 to get only actively producing agents. Works on <b>both</b> modes. On a live scrape it is applied to the search results before each agent is fetched, so agents below the line cost you nothing, and the run stops by itself once a page falls under the threshold (when your URL sorts by most sales). In Instant Database mode it is applied to the query."
          },
          "dbOffset": {
            "title": "Skip first N agents (optional)",
            "minimum": 0,
            "type": "integer",
            "description": "Skip this many agents from the top of the ranked list before delivering — use it to page deeper across several runs (run 1: skip 0, run 2: skip 1000, and so on). Results are ranked by review count with a stable tiebreak, so pages line up as long as the database snapshot doesn't change in between; after a database refresh, restart from 0. Deep values get slower, since the skipped agents still have to be read first. Leave empty to start from the top."
          },
          "dbHasYoutube": {
            "title": "Only agents with a YouTube channel",
            "type": "boolean",
            "description": "Return only agents who have a YouTube channel linked on their realtor.com profile — ideal for video-marketing / channel-management outreach. Works with or without a State: leave State empty to pull every such agent nationwide.",
            "default": false
          },
          "instantDatabase": {
            "title": "Use Instant Database (no scraping)",
            "type": "boolean",
            "description": "Serve results from the pre-collected database instead of live-scraping. Auto-enabled when you set a State / City / Brokerage above; turn it on explicitly to pull top agents nationwide.",
            "default": false
          },
          "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 (split search by agent surname)",
            "type": "boolean",
            "description": "Off by default, and usually best left off. Realtor.com pages an agent search down to roughly 10,000 results per query and then stops, even where more agents exist (Los Angeles reports 26,738). When enabled, agent-search URLs are expanded into 676 two-letter surname queries (<code>/agentname-aa</code>…<code>/agentname-zz</code>) to reach past that. The trade-off: results arrive grouped by surname rather than in one global ranking, so if you sorted by most sales, turn this off. No effect on non-agent URLs.",
            "default": false
          },
          "maxItems": {
            "title": "Max results per start URL",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum listings/agents to scrape PER start URL — each URL you provide gets its own allowance (e.g. 3 cities × 200 = up to 600 rows). Total spend stays bounded by the run's cost limit. Lower this for quick test runs.",
            "default": 1000
          },
          "monitoringMode": {
            "title": "Monitoring mode (only new or changed results)",
            "type": "boolean",
            "description": "If checked, the scraper will only return results that were not seen in previous runs (useful for daily/weekly delta runs). Works for both property listings and agent searches. 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 — safe for workflows that need to catch status changes, not just brand-new listings. Agents are deduplicated by <strong>agent profile ID</strong>, so re-running the same agent search only outputs agents that were never returned before (an agent is only marked as seen after it was successfully scraped and output).",
            "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
          },
          "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
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}