{
  "openapi": "3.0.1",
  "info": {
    "title": "Redfin Scraper - Homes for Sale & Sold Listings",
    "description": "Scrape redfin.com home listings: price, beds, baths, sqft, lot, year built, coordinates, address, MLS, status, days on market, photos, schools, amenities, tax records, agent and brokerage plus 90+ fields. Search any city, ZIP, neighborhood, or county with sort and filters, or paste Redfin URLs.",
    "version": "1.0",
    "x-build-id": "S79K8igbkd8ZynICZ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~redfin-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-redfin-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~redfin-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-redfin-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~redfin-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-redfin-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": "Mode",
            "enum": [
              "search",
              "url",
              "listings"
            ],
            "type": "string",
            "description": "How to find listings. \"Search\" finds listings by location with filters. \"URL\" fetches the exact region or listing URLs you paste (filters are ignored). \"Addresses / previous dataset\" fetches the exact homes named by street address and/or by a previous run's dataset.",
            "default": "search"
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Places to search, e.g. \"Chicago, IL\", \"Austin, TX\", \"60611\", or \"Brooklyn, NY\". Each location is resolved and searched independently.",
            "default": [
              "Chicago, IL"
            ],
            "items": {
              "type": "string"
            }
          },
          "listingType": {
            "title": "Listing type",
            "enum": [
              "for_sale",
              "sold"
            ],
            "type": "string",
            "description": "Which listings to return: homes currently for sale, or homes sold in the last 3 years.",
            "default": "for_sale"
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "recommended",
              "newest",
              "price_low",
              "price_high",
              "sqft",
              "lot_size",
              "price_per_sqft"
            ],
            "type": "string",
            "description": "Order results are returned in.",
            "default": "recommended"
          },
          "propertyTypes": {
            "title": "Property types",
            "type": "array",
            "description": "Keep only listings matching these property types (e.g. House, Condo, Townhouse, Multi-Family, Land, Manufactured). Leave empty for all types.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Min price (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings priced at or above this amount."
          },
          "maxPrice": {
            "title": "Max price (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings priced at or below this amount."
          },
          "minBeds": {
            "title": "Min bedrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings with at least this many bedrooms."
          },
          "minBaths": {
            "title": "Min bathrooms",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings with at least this many bathrooms."
          },
          "minSqft": {
            "title": "Min square feet",
            "minimum": 0,
            "type": "integer",
            "description": "Only listings with at least this much interior area (sq ft)."
          },
          "urls": {
            "title": "URLs",
            "type": "array",
            "description": "Redfin URLs. Supported: /city, /zipcode, /county, /state, /neighborhood region pages (also with /page-N, /filter/max-price=500k,min-beds=2, /filter/include=sold-3yr, /recently-sold, and category pages such as /condos and /homes-for-sale-under-150000) and listing URLs (.../home/12345678). Pasted /page-N, /filter/ and /recently-sold parts are applied; run-level filter fields are ignored. Unsupported URLs are skipped with a warning. Used only when Mode is \"URL\".",
            "default": [
              "https://www.redfin.com/city/29470/IL/Chicago",
              "https://www.redfin.com/zipcode/60611",
              "https://www.redfin.com/county/727/IL/Cook-County",
              "https://www.redfin.com/state/Illinois",
              "https://www.redfin.com/city/29470/IL/Chicago/page-2",
              "https://www.redfin.com/city/29470/IL/Chicago/filter/max-price=500k,min-beds=2",
              "https://www.redfin.com/city/29470/IL/Chicago/filter/include=sold-3yr",
              "https://www.redfin.com/city/29470/IL/Chicago/condos",
              "https://www.redfin.com/city/29470/IL/Chicago/homes-for-sale-under-150000",
              "https://www.redfin.com/neighborhood/28211/IL/Chicago/Lincoln-Park"
            ],
            "items": {
              "type": "string"
            }
          },
          "addresses": {
            "title": "Addresses",
            "type": "array",
            "description": "Street addresses, e.g. \"61 Oak Point Dr, Holiday Island, AR 72631\". Each is matched to its Redfin listing; an address with no match is reported as an error. Used only when Mode is \"Addresses / previous dataset\".",
            "items": {
              "type": "string"
            }
          },
          "searchResultsDatasetId": {
            "title": "Search results dataset ID",
            "type": "string",
            "description": "Dataset ID of a previous run of this actor; every listing URL in it is fetched again with full details. Used only when Mode is \"Addresses / previous dataset\"."
          },
          "fetchDetails": {
            "title": "Fetch full listing details",
            "type": "boolean",
            "description": "Open each listing's detail panels for the address section, valuation label, and the listing agent and brokerage. Disable for a faster, lower-cost run with the summary fields only.",
            "default": true
          },
          "maxItems": {
            "title": "Max listings",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "The cap on how many listings to return in total. This is THE cap and the only finite limit applied by default (20). Set 0 for unlimited.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "Optional safety stop on the number of result pages per location (350 listings per page). This does NOT cap your total results and defers to \"Max listings\". Defaults to unlimited (empty or 0): paging is uncapped and \"Max listings\" decides when to stop. Only set a value if you specifically want to limit paging depth.",
            "default": 0
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Connection settings. Region pages, pasted URLs and detail enrichment need a residential connection; the bulk search feed works on datacenter.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxResidentialMB": {
            "title": "Residential traffic budget (MB)",
            "minimum": 0,
            "type": "integer",
            "description": "When using a residential proxy group, cap residential traffic at this many MB; after the cap the run auto-downgrades to the lower-cost tier (identical results). 0 = unlimited.",
            "default": 0
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run (delta)",
            "type": "string",
            "description": "Optional. ID of a previous run of this actor (or a dataset ID). Listings already in that dataset are skipped, so this run returns only NEW listings. Combine both runs' datasets for the full set. Max listings then counts only the new listings. One-off continuation of a SPECIFIC run, for ongoing scheduled monitoring of the same search use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental mode (recurring monitoring)",
            "type": "boolean",
            "description": "For a search you run on a schedule (e.g. daily/weekly): remembers what this exact search returned last time and classifies every listing as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED, so you can act on only what changed. A listing is UPDATED when any scraped field changes (price, status, remarks, agent, schools, photos and so on); scrapedAt, days on market and time on Redfin are excluded because they change on their own, and you can exclude more with Ignore fields below. Off by default so existing scheduled runs are unaffected. Separate from Resume above, which continues one specific interrupted run. Uses State key below to isolate different searches; see Emit unchanged rows / Emit expired rows to control which of those get pushed (both bill extra rows when on).",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional)",
            "type": "string",
            "description": "Names the saved baseline Incremental mode compares against. Leave empty to auto-derive one from mode/locations/urls/listingType/sortBy/propertyTypes/price/beds/baths/sqft/fetchDetails, two differently-configured searches never share a baseline even with this left empty. Set your own text only if you want to explicitly reuse or separate baselines yourself. Ignored when Incremental mode is off."
          },
          "emitUnchanged": {
            "title": "Emit unchanged rows",
            "type": "boolean",
            "description": "When Incremental mode is on: also push rows classified UNCHANGED (identical to last run), not just NEW/UPDATED/REAPPEARED/EXPIRED. Off by default to save you from paying for rows that didn't change. Turning this on bills the per-result event (and the detail-enrichment surcharge, when fetched) for every unchanged row too.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired rows",
            "type": "boolean",
            "description": "When Incremental mode is on: push a synthetic EXPIRED row for listings tracked in a previous run that no longer appear in this one. Only fires after a run that completely covered every selected location/URL: if any location could not be looked up, any request was rejected, part of a listing could not be read, or a cap or resume truncated the run, expiry reporting is skipped for that run (with a log line saying which) because a partial scan can't tell 'gone' apart from 'not reached yet'. Off by default; turning it on bills the per-result event for each EXPIRED row emitted. EXPIRED rows count against Max listings like any other row; if the cap is reached, the remaining gone listings stay tracked and are reported on a later run rather than being emitted uncapped.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional. Field names to exclude from UPDATED change detection, in addition to the built-in handling (scrapedAt, days on market and time on Redfin already never trigger a UPDATED: they tick on their own). Matches the name at any depth inside a record; use a dotted path such as schools.rating to ignore only that nested spot. The fields stay in the output either way.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title plus key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page",
            "type": "string",
            "description": "Optional. Parent page ID/URL for a selected Notion connector."
          },
          "maxNotifyListings": {
            "title": "Max items to export",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Optional. Cap how many listings are pushed to the connectors.",
            "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}