{
  "openapi": "3.0.1",
  "info": {
    "title": "Zillow Property Detail Scraper",
    "description": "60 fields per Zillow property page, each with the measured number for how often it actually shows up. Paste a listing URL, street address, or Zillow ID. Price, Zestimate, beds, baths, size, tax rate, agent, brokerage, and every photo URL. Apartment buildings and builder communities too.",
    "version": "0.1",
    "x-build-id": "jEoXkHFlwfUfXA8x3"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/studioxl~zillow-detail-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-studioxl-zillow-detail-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/studioxl~zillow-detail-scraper/runs": {
      "post": {
        "operationId": "runs-sync-studioxl-zillow-detail-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/studioxl~zillow-detail-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-studioxl-zillow-detail-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": {
          "startUrls": {
            "title": "Property URLs to scrape",
            "type": "array",
            "description": "Paste Zillow page URLs. Three shapes are supported, and each returns the row that fits it:\n\n• /homedetails/… a single home, the full 60-field record\n• /apartments/… a rental building: unit count, rent and bed ranges, leasing contact\n• /community/… a builder community: spec homes, plans, builder name and phone\n\nBuildings and communities can also be expanded into one row per unit, see the setting below.\n\nA fourth shape, /b/name-city-st-id/, is accepted but rarely worth running. Two tested came back with no building name, no price and at most one unit, so it is not advertised as working.\n\nOne shape is refused on purpose: /b/…/lat,long_ll/ is disallowed by Zillow's robots.txt and is skipped with a note in the log. Another Zillow Actor ships that shape as a prefilled example.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "addresses": {
            "title": "…or street addresses / Zillow IDs",
            "type": "array",
            "description": "Street addresses such as \"21386 Sunnyside Rd, Los Gatos, CA 95033\", or bare Zillow IDs such as \"24996529\". Addresses are matched to a property automatically. Any that cannot be matched are reported in the log and skipped, rather than failing the run.",
            "items": {
              "type": "string"
            }
          },
          "searchResultsDatasetId": {
            "title": "…or a search results dataset",
            "type": "string",
            "description": "Instead of pasting URLs, pick the dataset from a finished Zillow Search Scraper run and every property it found is scraped in full. Search wide and cheap first, then pay detail prices only on the rows you keep. A verified chain: a Phoenix search returned 445 listings and this Actor pulled all 445 full records in 126 seconds, with no failed requests."
          },
          "maxItems": {
            "title": "Maximum properties",
            "minimum": 0,
            "type": "integer",
            "description": "The number of properties this run will fetch before it stops. This is your spend cap, since you pay per property returned, so set it to match the size of the URL, address, or zpid list you are feeding in. Set it low for a first test run before pointing it at a full list.",
            "default": 100
          },
          "photoMaxWidth": {
            "title": "Photo width",
            "enum": [
              "192",
              "384",
              "576",
              "768",
              "960",
              "1152",
              "1344",
              "1536"
            ],
            "type": "string",
            "description": "Choose the pixel width for the photo URLs this Actor returns: 192, 384, 576, 768, 960, 1152, 1344, or 1536. The default is 1536, the largest option this Actor offers. This Actor returns photo URLs, not image files, so the width you choose changes the size of the image at that URL, and nothing about what the run costs you.",
            "default": "1536"
          },
          "expandBuildingUnits": {
            "title": "Expand buildings into individual units",
            "type": "boolean",
            "description": "Turn this on when you are scraping an apartment building (`/apartments/`) or a builder community page and want a row per unit instead of one summary row for the whole building. On a tested apartment building, this returned 24 separate unit rows, each carrying its own rent between $810 and $1,200 and its own bedroom count of 1 or 2, rather than a single row with only a price range. Leave it off if a per-building summary is all you need. No extra requests are made either way, because the units are already on the page we fetch. But each unit is a separate charged row, so a 200-unit building bills as 200 properties. Use the maximum-properties cap alongside this. Each unit row also carries the parent building's photos.",
            "default": false
          },
          "mergeRelistedProperties": {
            "title": "Merge re-listed properties",
            "type": "boolean",
            "description": "A home taken off market and re-listed gets a new Zillow ID. When on, listings at the same coordinates with the same price and size are returned only once, so you are never charged twice for the same house.",
            "default": true
          },
          "onlyNewSinceLastRun": {
            "title": "Only new or changed properties",
            "type": "boolean",
            "description": "Remember every property across runs and return only those that are new, or whose price, Zestimate, rent estimate, status or description actually changed. Unchanged properties are skipped and never charged. Changed ones carry changeDetected: true. View and favourite counts are deliberately ignored, because they move on their own and would mark everything changed every run.",
            "default": false
          },
          "dedupeStoreName": {
            "title": "Memory store name (used when monitoring is on)",
            "type": "string",
            "description": "Only used when 'Only new or changed properties' is switched on. Reuse the same name across a schedule so the Actor remembers what it has already seen; use different names to track separate portfolios independently.",
            "default": "zillow-dedupe"
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "Check each URL against Zillow's robots.txt before fetching. The rules are fetched live and applied properly. Zillow disallows all of /homes/ and then re-permits about 40 specific paths, which only longest-match-wins resolves correctly.\n\nThe /homedetails/, /apartments/ and /community/ shapes are all permitted, so this costs you nothing on normal input. It does skip /b/…/lat,long_ll/ URLs, which Zillow disallows explicitly.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Maximum parallel requests",
            "minimum": 1,
            "maximum": 15,
            "type": "integer",
            "description": "Works together with the rate limit below. 10 is what this Actor is measured and priced around: a 445-property run at 10 parallel delivered all 445, absorbing 100 HTTP 403 responses along the way by rotating to a fresh IP and retrying. That is about 22% of attempts refused on first contact, which is normal for Zillow on residential IPs and costs you nothing, because a retry is never a charged row. Raising this increases the refusal rate faster than it increases speed, and concurrency 40 collapses throughput entirely.",
            "default": 10
          },
          "maxRequestsPerMinute": {
            "title": "Request rate limit",
            "minimum": 10,
            "maximum": 600,
            "type": "integer",
            "description": "Ceiling on requests per minute, and usually the setting that actually decides how long a run takes. At 120 the crawler sat idle waiting for the limiter. 300 is the measured sweet spot: twice as fast as 120 and slightly cheaper. Raising it further increases refusals faster than it increases speed.",
            "default": 300
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Zillow rejects Apify datacenter IPs almost entirely. A measured A/B at identical concurrency returned 60 of 60 properties on residential and nothing at all in 408 seconds on datacenter. Residential US is therefore the default and is what this Actor is priced around; changing it will most likely return nothing.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}