{
  "openapi": "3.1.0",
  "info": {
    "title": "RealtyCrawl API",
    "version": "0.1.0",
    "description": "Real-estate data from Zillow, with one typed core schema for every source.",
    "contact": {
      "url": "https://realtycrawl.com/docs"
    }
  },
  "servers": [
    {
      "url": "https://api.realtycrawl.com/v1"
    }
  ],
  "security": [
    {
      "bearer": []
    }
  ],
  "paths": {
    "/zillow/listings": {
      "get": {
        "operationId": "zillow_listings",
        "tags": [
          "Zillow"
        ],
        "summary": "Zillow homes for sale",
        "description": "Homes for sale in an area on Zillow, one page at a time. Zillow shows at most 820 results per search, so we split large areas into smaller map boxes and page through them with `next_cursor`. A cache miss returns 202 and a job to poll.",
        "x-status": "implemented",
        "x-credits": 1,
        "externalDocs": {
          "url": "https://realtycrawl.com/docs/api/zillow-listings"
        },
        "parameters": [
          {
            "name": "zip",
            "in": "query",
            "required": false,
            "description": "Five-digit ZIP code. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{5}$"
            }
          },
          {
            "name": "city",
            "in": "query",
            "required": false,
            "description": "City name. Send with state. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 80
            }
          },
          {
            "name": "state",
            "in": "query",
            "required": false,
            "description": "Two-letter state code. Send with city. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}$"
            }
          },
          {
            "name": "bbox",
            "in": "query",
            "required": false,
            "description": "Map box as west,south,east,north in decimal degrees. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lat",
            "in": "query",
            "required": false,
            "description": "Center latitude. Send with lng and radius_mi. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lng",
            "in": "query",
            "required": false,
            "description": "Center longitude. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "radius_mi",
            "in": "query",
            "required": false,
            "description": "Search radius in miles, up to 10. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "number",
              "minimum": 0.1,
              "maximum": 10
            }
          },
          {
            "name": "min_price",
            "in": "query",
            "required": false,
            "description": "Lowest price in dollars. On rentals, the lowest monthly rent. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "max_price",
            "in": "query",
            "required": false,
            "description": "Highest price in dollars. On rentals, the highest monthly rent. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "beds_min",
            "in": "query",
            "required": false,
            "description": "Fewest bedrooms. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "baths_min",
            "in": "query",
            "required": false,
            "description": "Fewest bathrooms. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "number",
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "sqft_min",
            "in": "query",
            "required": false,
            "description": "Smallest living area in square feet. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "sqft_max",
            "in": "query",
            "required": false,
            "description": "Largest living area in square feet. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "property_type",
            "in": "query",
            "required": false,
            "description": "One or more home types, separated by commas, like single_family,townhouse. Part of the filters group: Optional filters for area searches.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "single_family",
                  "condo",
                  "townhouse",
                  "multi_family",
                  "land",
                  "manufactured",
                  "apartment"
                ]
              },
              "uniqueItems": true
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "The next_cursor from the previous page. It only works on the route that made it and with the same inputs. Part of the paging group: Paging. The first call sends no cursor. Send result.next_cursor to get the next page. It is null on the last page.",
            "schema": {
              "type": "string",
              "maxLength": 2048
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Send the same key when you retry the same call, so you are not charged twice. 1–128 printable ASCII characters, no spaces.",
            "schema": {
              "type": "string",
              "pattern": "^[!-~]{1,128}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Complete, including cache hits. Costs 1 credit.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed per minute on this key.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left this minute.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the minute resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Credits-Charged": {
                "description": "Credits this response charged.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZillowListingsJob"
                },
                "example": {
                  "request_id": "req_01JA4X9EXAMPLE",
                  "status": "complete",
                  "credits": 1,
                  "cached": false,
                  "poll_url": null,
                  "error": null,
                  "result": {
                    "source": "zillow",
                    "query": {
                      "city": "Denver",
                      "state": "CO"
                    },
                    "count": 1,
                    "reported_total": 3942,
                    "next_cursor": "c1.eyJ2IjoxfQ.example",
                    "collected_at": "2026-10-12T20:31:05Z",
                    "schema_version": 1,
                    "completeness": "complete",
                    "summary": {
                      "priced_count": 1,
                      "median_price": 675000,
                      "p25": 675000,
                      "p75": 675000,
                      "median_price_per_sqft": 350
                    },
                    "data": [
                      {
                        "source": "zillow",
                        "source_id": "61471148",
                        "source_url": "https://www.zillow.com/homedetails/1655-Gaylord-St-Denver-CO-80206/61471148_zpid/",
                        "listing_kind": "home",
                        "status": "for_sale",
                        "list_price": {
                          "amount": 675000,
                          "currency": "USD"
                        },
                        "rent_monthly": null,
                        "rent_is_from_price": false,
                        "list_date": null,
                        "days_on_market": 6,
                        "price_per_sqft": 350,
                        "beds": 3,
                        "baths": 2,
                        "living_area_sqft": 1930,
                        "property_type": "single_family",
                        "address": {
                          "line1": "1655 Gaylord Street",
                          "unit": null,
                          "city": "Denver",
                          "state": "CO",
                          "zip": "80206",
                          "county": null,
                          "county_fips": null
                        },
                        "location": {
                          "lat": 39.742653,
                          "lng": -104.96127
                        },
                        "broker_name": "RE/MAX Professionals",
                        "agent_name": null,
                        "photo_count": null,
                        "extras": {
                          "home_type_raw": "SINGLE_FAMILY",
                          "days_on_zillow": 6,
                          "zestimate": {
                            "amount": 659900,
                            "currency": "USD"
                          },
                          "rent_zestimate": {
                            "amount": 3465,
                            "currency": "USD"
                          },
                          "tax_assessed_value": {
                            "amount": 725300,
                            "currency": "USD"
                          },
                          "building_name": null,
                          "units": []
                        }
                      }
                    ],
                    "field_notes": []
                  }
                }
              }
            }
          },
          "202": {
            "description": "Pending. Poll `poll_url` (or `Location`) with the same key.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              },
              "Location": {
                "description": "Job path, like /v1/jobs/{request_id}.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds before polling. Prefer long-polling with ?wait=20.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZillowListingsJob"
                }
              }
            }
          },
          "401": {
            "description": "invalid_api_key: The API key is missing, malformed or revoked.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "account_suspended: The account is suspended, so none of its keys work. Email support to restore it. origin_not_allowed: A browser sent the request from a site that isn't allowed. Call the API from your server.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "not_found: No such path. request_not_found: The job ID is well-formed but unknown, or belongs to another account. An ID that isn't a UUID is no such path: 404 not_found. address_not_found: The source has no home at that address. Not charged.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed: Wrong method for this route. Every v1 route uses GET.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "idempotency_conflict: This Idempotency-Key was already used with different search parameters. result_not_ready: CSV was requested before every search settled. Poll as JSON until status is complete, then ask for CSV.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "414": {
            "description": "uri_too_long: The query string is longer than 2,048 characters.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "unsupported_or_invalid_query: An unknown parameter, or a value outside the documented range. error.param names the input to fix when it is one of the route's inputs. duplicate_parameter: A parameter was sent more than once. invalid_idempotency_key: Idempotency-Key must be 1–128 printable ASCII characters, with no spaces. invalid_wait: wait must be a whole number from 0 to 20. location_required: Send exactly one location: zip, city with state, bbox, or lat with lng and radius_mi. param is location. lookup_required: Send exactly one of address, url or source_id. param is lookup. location_too_large: The area is bigger than this route allows. Send a smaller box or radius. address_ambiguous: The address matches more than one home. Add the unit number or ZIP code, or send the home's url or source_id. Not charged. invalid_cursor: The cursor is damaged, came from another route, or was made with different inputs. param is cursor.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: More than 60 API calls this minute for your account. quota_exceeded: Your plan's credits are used up, and you have no extra credits left. too_many_pending: Your account has too many searches still pending. Wait for results before sending more.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "queue_full: The collection queue is full. collection_unavailable: We can't collect from this source right now. storage_unavailable: Our database is briefly unavailable. origin_unavailable: The edge couldn't reach our API server. service_unconfigured: The API is misconfigured on our side. Contact support.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/zillow/sold": {
      "get": {
        "operationId": "zillow_sold",
        "tags": [
          "Zillow"
        ],
        "summary": "Zillow sold homes",
        "description": "Homes sold in an area on Zillow, with sale price, sale date and how the price is known. Sold prices in non-disclosure states may be null. Large areas are split and paged with `next_cursor`.",
        "x-status": "implemented",
        "x-credits": 1,
        "externalDocs": {
          "url": "https://realtycrawl.com/docs/api/zillow-sold"
        },
        "parameters": [
          {
            "name": "zip",
            "in": "query",
            "required": false,
            "description": "Five-digit ZIP code. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{5}$"
            }
          },
          {
            "name": "city",
            "in": "query",
            "required": false,
            "description": "City name. Send with state. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 80
            }
          },
          {
            "name": "state",
            "in": "query",
            "required": false,
            "description": "Two-letter state code. Send with city. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}$"
            }
          },
          {
            "name": "bbox",
            "in": "query",
            "required": false,
            "description": "Map box as west,south,east,north in decimal degrees. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lat",
            "in": "query",
            "required": false,
            "description": "Center latitude. Send with lng and radius_mi. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lng",
            "in": "query",
            "required": false,
            "description": "Center longitude. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "radius_mi",
            "in": "query",
            "required": false,
            "description": "Search radius in miles, up to 10. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "number",
              "minimum": 0.1,
              "maximum": 10
            }
          },
          {
            "name": "min_price",
            "in": "query",
            "required": false,
            "description": "Lowest price in dollars. On rentals, the lowest monthly rent. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "max_price",
            "in": "query",
            "required": false,
            "description": "Highest price in dollars. On rentals, the highest monthly rent. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "beds_min",
            "in": "query",
            "required": false,
            "description": "Fewest bedrooms. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "baths_min",
            "in": "query",
            "required": false,
            "description": "Fewest bathrooms. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "number",
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "sqft_min",
            "in": "query",
            "required": false,
            "description": "Smallest living area in square feet. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "sqft_max",
            "in": "query",
            "required": false,
            "description": "Largest living area in square feet. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "property_type",
            "in": "query",
            "required": false,
            "description": "One or more home types, separated by commas, like single_family,townhouse. Part of the filters group: Optional filters for area searches.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "single_family",
                  "condo",
                  "townhouse",
                  "multi_family",
                  "land",
                  "manufactured",
                  "apartment"
                ]
              },
              "uniqueItems": true
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "The next_cursor from the previous page. It only works on the route that made it and with the same inputs. Part of the paging group: Paging. The first call sends no cursor. Send result.next_cursor to get the next page. It is null on the last page.",
            "schema": {
              "type": "string",
              "maxLength": 2048
            }
          },
          {
            "name": "sold_within_days",
            "in": "query",
            "required": false,
            "description": "Only homes sold in this many past days. Optional; 90 when not sent.",
            "schema": {
              "type": "integer",
              "enum": [
                7,
                14,
                30,
                90,
                180,
                365,
                730,
                1095
              ],
              "default": 90
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Send the same key when you retry the same call, so you are not charged twice. 1–128 printable ASCII characters, no spaces.",
            "schema": {
              "type": "string",
              "pattern": "^[!-~]{1,128}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Complete, including cache hits. Costs 1 credit.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed per minute on this key.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left this minute.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the minute resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Credits-Charged": {
                "description": "Credits this response charged.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZillowSoldJob"
                },
                "example": {
                  "request_id": "req_01JA4X9EXAMPLE",
                  "status": "complete",
                  "credits": 1,
                  "cached": false,
                  "poll_url": null,
                  "error": null,
                  "result": {
                    "source": "zillow",
                    "query": {
                      "zip": "80221",
                      "sold_within_days": 90
                    },
                    "count": 1,
                    "reported_total": null,
                    "next_cursor": "c1.eyJ2IjoxfQ.example",
                    "collected_at": "2026-10-12T20:31:05Z",
                    "schema_version": 1,
                    "completeness": "complete",
                    "summary": {
                      "priced_count": 1,
                      "disclosed_count": 0,
                      "median_sale_price": 450000,
                      "p25": 450000,
                      "p75": 450000,
                      "median_price_per_sqft": 265,
                      "earliest_sold_date": "2026-10-09",
                      "latest_sold_date": "2026-10-09"
                    },
                    "data": [
                      {
                        "source": "zillow",
                        "source_id": "12998656",
                        "source_url": "https://www.zillow.com/homedetails/2041-Samuel-Dr-Denver-CO-80221/12998656_zpid/",
                        "sold_date": "2026-10-09",
                        "sale_price": {
                          "amount": 450000,
                          "currency": "USD"
                        },
                        "sale_price_disclosure": "unknown",
                        "list_price": null,
                        "list_date": null,
                        "sale_to_list_ratio": null,
                        "days_on_market": null,
                        "price_per_sqft": 265,
                        "beds": 3,
                        "baths": 2,
                        "living_area_sqft": 1700,
                        "property_type": "single_family",
                        "address": {
                          "line1": "2041 Samuel Drive",
                          "unit": null,
                          "city": "Denver",
                          "state": "CO",
                          "zip": "80221",
                          "county": null,
                          "county_fips": null
                        },
                        "location": {
                          "lat": 39.831684,
                          "lng": -105.01129
                        },
                        "broker_name": "LPT Realty",
                        "extras": {
                          "home_type_raw": "SINGLE_FAMILY",
                          "days_on_zillow": 3,
                          "zestimate": {
                            "amount": 446500,
                            "currency": "USD"
                          },
                          "rent_zestimate": {
                            "amount": 2567,
                            "currency": "USD"
                          },
                          "tax_assessed_value": {
                            "amount": 421000,
                            "currency": "USD"
                          }
                        }
                      }
                    ],
                    "field_notes": [
                      {
                        "field": "list_price",
                        "reason": "not_on_search_page",
                        "detail": "Zillow's sold search does not show the last asking price. Call `property` for the full price history."
                      },
                      {
                        "field": "days_on_market",
                        "reason": "not_on_search_page",
                        "detail": "Zillow's sold search shows days since the sale, not days on market. That number is in `extras.days_on_zillow`. Call `property` for listing and sale dates."
                      }
                    ]
                  }
                }
              }
            }
          },
          "202": {
            "description": "Pending. Poll `poll_url` (or `Location`) with the same key.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              },
              "Location": {
                "description": "Job path, like /v1/jobs/{request_id}.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds before polling. Prefer long-polling with ?wait=20.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZillowSoldJob"
                }
              }
            }
          },
          "401": {
            "description": "invalid_api_key: The API key is missing, malformed or revoked.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "account_suspended: The account is suspended, so none of its keys work. Email support to restore it. origin_not_allowed: A browser sent the request from a site that isn't allowed. Call the API from your server.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "not_found: No such path. request_not_found: The job ID is well-formed but unknown, or belongs to another account. An ID that isn't a UUID is no such path: 404 not_found. address_not_found: The source has no home at that address. Not charged.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed: Wrong method for this route. Every v1 route uses GET.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "idempotency_conflict: This Idempotency-Key was already used with different search parameters. result_not_ready: CSV was requested before every search settled. Poll as JSON until status is complete, then ask for CSV.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "414": {
            "description": "uri_too_long: The query string is longer than 2,048 characters.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "unsupported_or_invalid_query: An unknown parameter, or a value outside the documented range. error.param names the input to fix when it is one of the route's inputs. duplicate_parameter: A parameter was sent more than once. invalid_idempotency_key: Idempotency-Key must be 1–128 printable ASCII characters, with no spaces. invalid_wait: wait must be a whole number from 0 to 20. location_required: Send exactly one location: zip, city with state, bbox, or lat with lng and radius_mi. param is location. lookup_required: Send exactly one of address, url or source_id. param is lookup. location_too_large: The area is bigger than this route allows. Send a smaller box or radius. address_ambiguous: The address matches more than one home. Add the unit number or ZIP code, or send the home's url or source_id. Not charged. invalid_cursor: The cursor is damaged, came from another route, or was made with different inputs. param is cursor.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: More than 60 API calls this minute for your account. quota_exceeded: Your plan's credits are used up, and you have no extra credits left. too_many_pending: Your account has too many searches still pending. Wait for results before sending more.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "queue_full: The collection queue is full. collection_unavailable: We can't collect from this source right now. storage_unavailable: Our database is briefly unavailable. origin_unavailable: The edge couldn't reach our API server. service_unconfigured: The API is misconfigured on our side. Contact support.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/zillow/rentals": {
      "get": {
        "operationId": "zillow_rentals",
        "tags": [
          "Zillow"
        ],
        "summary": "Zillow rentals",
        "description": "Homes and apartment buildings for rent in an area on Zillow. Buildings come back as one row with the lowest rent and a unit list in `extras.units`.",
        "x-status": "implemented",
        "x-credits": 1,
        "externalDocs": {
          "url": "https://realtycrawl.com/docs/api/zillow-rentals"
        },
        "parameters": [
          {
            "name": "zip",
            "in": "query",
            "required": false,
            "description": "Five-digit ZIP code. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "string",
              "pattern": "^[0-9]{5}$"
            }
          },
          {
            "name": "city",
            "in": "query",
            "required": false,
            "description": "City name. Send with state. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 80
            }
          },
          {
            "name": "state",
            "in": "query",
            "required": false,
            "description": "Two-letter state code. Send with city. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}$"
            }
          },
          {
            "name": "bbox",
            "in": "query",
            "required": false,
            "description": "Map box as west,south,east,north in decimal degrees. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lat",
            "in": "query",
            "required": false,
            "description": "Center latitude. Send with lng and radius_mi. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lng",
            "in": "query",
            "required": false,
            "description": "Center longitude. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "radius_mi",
            "in": "query",
            "required": false,
            "description": "Search radius in miles, up to 10. Part of the location group: Where to search. Send exactly one of: zip; city with state; bbox; or lat with lng and radius_mi. None, or more than one, returns 422 with param set to location.",
            "schema": {
              "type": "number",
              "minimum": 0.1,
              "maximum": 10
            }
          },
          {
            "name": "min_price",
            "in": "query",
            "required": false,
            "description": "Lowest price in dollars. On rentals, the lowest monthly rent. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "max_price",
            "in": "query",
            "required": false,
            "description": "Highest price in dollars. On rentals, the highest monthly rent. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "beds_min",
            "in": "query",
            "required": false,
            "description": "Fewest bedrooms. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "baths_min",
            "in": "query",
            "required": false,
            "description": "Fewest bathrooms. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "number",
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "sqft_min",
            "in": "query",
            "required": false,
            "description": "Smallest living area in square feet. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "sqft_max",
            "in": "query",
            "required": false,
            "description": "Largest living area in square feet. Part of the filters group: Optional filters for area searches.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "property_type",
            "in": "query",
            "required": false,
            "description": "One or more home types, separated by commas, like single_family,townhouse. Part of the filters group: Optional filters for area searches.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "single_family",
                  "condo",
                  "townhouse",
                  "multi_family",
                  "land",
                  "manufactured",
                  "apartment"
                ]
              },
              "uniqueItems": true
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "The next_cursor from the previous page. It only works on the route that made it and with the same inputs. Part of the paging group: Paging. The first call sends no cursor. Send result.next_cursor to get the next page. It is null on the last page.",
            "schema": {
              "type": "string",
              "maxLength": 2048
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Send the same key when you retry the same call, so you are not charged twice. 1–128 printable ASCII characters, no spaces.",
            "schema": {
              "type": "string",
              "pattern": "^[!-~]{1,128}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Complete, including cache hits. Costs 1 credit.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed per minute on this key.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left this minute.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the minute resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Credits-Charged": {
                "description": "Credits this response charged.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZillowRentalsJob"
                },
                "example": {
                  "request_id": "req_01JA4X9EXAMPLE",
                  "status": "complete",
                  "credits": 1,
                  "cached": false,
                  "poll_url": null,
                  "error": null,
                  "result": {
                    "source": "zillow",
                    "query": {
                      "city": "Denver",
                      "state": "CO"
                    },
                    "count": 1,
                    "reported_total": 14688,
                    "next_cursor": "c1.eyJ2IjoxfQ.example",
                    "collected_at": "2026-10-12T20:31:05Z",
                    "schema_version": 1,
                    "completeness": "complete",
                    "summary": {
                      "priced_count": 1,
                      "median_price": 1960,
                      "p25": 1960,
                      "p75": 1960,
                      "median_price_per_sqft": null
                    },
                    "data": [
                      {
                        "source": "zillow",
                        "source_id": "39.73638--104.97325",
                        "source_url": "https://www.zillow.com/apartments/denver-co/1265-downing/95xKyy/",
                        "listing_kind": "building",
                        "status": "for_rent",
                        "list_price": null,
                        "rent_monthly": {
                          "amount": 1960,
                          "currency": "USD"
                        },
                        "rent_is_from_price": true,
                        "list_date": null,
                        "days_on_market": null,
                        "price_per_sqft": null,
                        "beds": null,
                        "baths": null,
                        "living_area_sqft": null,
                        "property_type": "apartment",
                        "address": {
                          "line1": "1265 N Downing St",
                          "unit": "1265-401",
                          "city": "Denver",
                          "state": "CO",
                          "zip": "80218",
                          "county": null,
                          "county_fips": null
                        },
                        "location": {
                          "lat": 39.73638,
                          "lng": -104.97325
                        },
                        "broker_name": null,
                        "agent_name": null,
                        "photo_count": null,
                        "extras": {
                          "home_type_raw": null,
                          "days_on_zillow": null,
                          "zestimate": null,
                          "rent_zestimate": null,
                          "tax_assessed_value": null,
                          "building_name": "1265 Downing",
                          "units": [
                            {
                              "beds": 2,
                              "rent_from": {
                                "amount": 1960,
                                "currency": "USD"
                              }
                            }
                          ]
                        }
                      }
                    ],
                    "field_notes": []
                  }
                }
              }
            }
          },
          "202": {
            "description": "Pending. Poll `poll_url` (or `Location`) with the same key.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              },
              "Location": {
                "description": "Job path, like /v1/jobs/{request_id}.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds before polling. Prefer long-polling with ?wait=20.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZillowRentalsJob"
                }
              }
            }
          },
          "401": {
            "description": "invalid_api_key: The API key is missing, malformed or revoked.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "account_suspended: The account is suspended, so none of its keys work. Email support to restore it. origin_not_allowed: A browser sent the request from a site that isn't allowed. Call the API from your server.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "not_found: No such path. request_not_found: The job ID is well-formed but unknown, or belongs to another account. An ID that isn't a UUID is no such path: 404 not_found. address_not_found: The source has no home at that address. Not charged.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed: Wrong method for this route. Every v1 route uses GET.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "idempotency_conflict: This Idempotency-Key was already used with different search parameters. result_not_ready: CSV was requested before every search settled. Poll as JSON until status is complete, then ask for CSV.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "414": {
            "description": "uri_too_long: The query string is longer than 2,048 characters.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "unsupported_or_invalid_query: An unknown parameter, or a value outside the documented range. error.param names the input to fix when it is one of the route's inputs. duplicate_parameter: A parameter was sent more than once. invalid_idempotency_key: Idempotency-Key must be 1–128 printable ASCII characters, with no spaces. invalid_wait: wait must be a whole number from 0 to 20. location_required: Send exactly one location: zip, city with state, bbox, or lat with lng and radius_mi. param is location. lookup_required: Send exactly one of address, url or source_id. param is lookup. location_too_large: The area is bigger than this route allows. Send a smaller box or radius. address_ambiguous: The address matches more than one home. Add the unit number or ZIP code, or send the home's url or source_id. Not charged. invalid_cursor: The cursor is damaged, came from another route, or was made with different inputs. param is cursor.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: More than 60 API calls this minute for your account. quota_exceeded: Your plan's credits are used up, and you have no extra credits left. too_many_pending: Your account has too many searches still pending. Wait for results before sending more.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "queue_full: The collection queue is full. collection_unavailable: We can't collect from this source right now. storage_unavailable: Our database is briefly unavailable. origin_unavailable: The edge couldn't reach our API server. service_unconfigured: The API is misconfigured on our side. Contact support.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/zillow/property": {
      "get": {
        "operationId": "zillow_property",
        "tags": [
          "Zillow"
        ],
        "summary": "Zillow property details",
        "description": "Facts about one home on Zillow: size, type, year built, listing agent, last sale, county tax record, and the full price and tax history, including for sold and off-market homes. If the history can't be read on a call, the facts still come back with `completeness: partial` and a field note.",
        "x-status": "implemented",
        "x-credits": 2,
        "externalDocs": {
          "url": "https://realtycrawl.com/docs/api/zillow-property"
        },
        "parameters": [
          {
            "name": "address",
            "in": "query",
            "required": false,
            "description": "Full street address with city and state or ZIP, like 2041 Samuel Dr, Denver, CO 80221. An address that matches several homes returns 422 address_ambiguous with up to 5 candidates. Part of the lookup group: Which home. Send exactly one of address, url or source_id. None, or more than one, returns 422 with param set to lookup.",
            "schema": {
              "type": "string",
              "minLength": 5,
              "maxLength": 200
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": false,
            "description": "The home's page URL on the source site. Part of the lookup group: Which home. Send exactly one of address, url or source_id. None, or more than one, returns 422 with param set to lookup.",
            "schema": {
              "type": "string",
              "maxLength": 500
            }
          },
          {
            "name": "source_id",
            "in": "query",
            "required": false,
            "description": "The source's own ID for the home. On Zillow, the zpid. Part of the lookup group: Which home. Send exactly one of address, url or source_id. None, or more than one, returns 422 with param set to lookup.",
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Send the same key when you retry the same call, so you are not charged twice. 1–128 printable ASCII characters, no spaces.",
            "schema": {
              "type": "string",
              "pattern": "^[!-~]{1,128}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Complete, including cache hits. Costs 2 credits.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed per minute on this key.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left this minute.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the minute resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Credits-Charged": {
                "description": "Credits this response charged.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZillowPropertyJob"
                },
                "example": {
                  "request_id": "req_01JA4X9EXAMPLE",
                  "status": "complete",
                  "credits": 2,
                  "cached": false,
                  "poll_url": null,
                  "error": null,
                  "result": {
                    "source": "zillow",
                    "query": {
                      "address": "2041 Samuel Dr, Denver, CO 80221"
                    },
                    "count": 1,
                    "reported_total": null,
                    "next_cursor": null,
                    "collected_at": "2026-10-12T20:31:05Z",
                    "schema_version": 1,
                    "completeness": "complete",
                    "summary": null,
                    "data": [
                      {
                        "source": "zillow",
                        "source_id": "12998656",
                        "source_url": "https://www.zillow.com/homedetails/2041-Samuel-Dr-Denver-CO-80221/12998656_zpid/",
                        "collected_at": "2026-10-12T20:31:05Z",
                        "status": "sold",
                        "address": {
                          "line1": "2041 Samuel Drive",
                          "unit": null,
                          "city": "Denver",
                          "state": "CO",
                          "zip": "80221",
                          "county": "Adams County",
                          "county_fips": null
                        },
                        "location": {
                          "lat": 39.831684,
                          "lng": -105.01129
                        },
                        "parcel": null,
                        "property_type": "single_family",
                        "beds": 3,
                        "baths": 2,
                        "baths_full": null,
                        "baths_half": null,
                        "living_area_sqft": 1700,
                        "lot_area_sqft": 10018,
                        "year_built": 1958,
                        "stories": null,
                        "hoa_fee_monthly": null,
                        "tax": {
                          "year": 2025,
                          "assessed_value": {
                            "amount": 26320,
                            "currency": "USD"
                          },
                          "amount": {
                            "amount": 3062.52,
                            "currency": "USD"
                          }
                        },
                        "last_sale": {
                          "date": "2026-10-09",
                          "price": {
                            "amount": 450000,
                            "currency": "USD"
                          },
                          "sale_price_disclosure": "mls_reported"
                        },
                        "list_price": null,
                        "rent_monthly": null,
                        "list_date": "2026-08-21",
                        "days_on_market": 27,
                        "broker_name": "LPT Realty",
                        "agent_name": "Mara Brown",
                        "mls_name": "REcolorado as distributed by MLS GRID",
                        "mls_id": "8377091",
                        "photo_count": null,
                        "price_history": [
                          {
                            "date": "2026-10-09",
                            "event": "sold",
                            "event_raw": "Sold",
                            "price": {
                              "amount": 450000,
                              "currency": "USD"
                            },
                            "source_note": "REcolorado as distributed by MLS GRID"
                          },
                          {
                            "date": "2026-09-17",
                            "event": "pending",
                            "event_raw": "Pending sale",
                            "price": {
                              "amount": 450000,
                              "currency": "USD"
                            },
                            "source_note": "REcolorado as distributed by MLS GRID"
                          },
                          {
                            "date": "2026-09-07",
                            "event": "price_change",
                            "event_raw": "Price change",
                            "price": {
                              "amount": 450000,
                              "currency": "USD"
                            },
                            "source_note": "REcolorado as distributed by MLS GRID"
                          },
                          {
                            "date": "2026-08-21",
                            "event": "listed",
                            "event_raw": "Listed for sale",
                            "price": {
                              "amount": 460000,
                              "currency": "USD"
                            },
                            "source_note": "REcolorado as distributed by MLS GRID"
                          }
                        ],
                        "tax_history": [
                          {
                            "year": 2025,
                            "assessed_value": {
                              "amount": 26320,
                              "currency": "USD"
                            },
                            "amount": {
                              "amount": 3062.52,
                              "currency": "USD"
                            }
                          },
                          {
                            "year": 2024,
                            "assessed_value": {
                              "amount": 30100,
                              "currency": "USD"
                            },
                            "amount": {
                              "amount": 3045.14,
                              "currency": "USD"
                            }
                          },
                          {
                            "year": 2023,
                            "assessed_value": {
                              "amount": 30100,
                              "currency": "USD"
                            },
                            "amount": {
                              "amount": 3031.16,
                              "currency": "USD"
                            }
                          }
                        ],
                        "extras": {
                          "home_type_raw": "SINGLE_FAMILY",
                          "tax_assessed_value": {
                            "amount": 421000,
                            "currency": "USD"
                          },
                          "property_tax_rate": 0.63,
                          "buyer_brokerage": "Brokers Guild Homes",
                          "days_on_zillow": 3
                        }
                      }
                    ],
                    "field_notes": [
                      {
                        "field": "baths_full",
                        "reason": "inconsistent_at_source",
                        "detail": "Zillow's full and half bath counts disagreed with its total for this home, so they are left null."
                      },
                      {
                        "field": "price_history",
                        "reason": "truncated_in_example",
                        "detail": "This docs example shows 4 of 13 events; live responses return them all."
                      },
                      {
                        "field": "tax_history",
                        "reason": "truncated_in_example",
                        "detail": "This docs example shows 3 of 26 years; live responses return them all."
                      }
                    ]
                  }
                }
              }
            }
          },
          "202": {
            "description": "Pending. Poll `poll_url` (or `Location`) with the same key.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              },
              "Location": {
                "description": "Job path, like /v1/jobs/{request_id}.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds before polling. Prefer long-polling with ?wait=20.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZillowPropertyJob"
                }
              }
            }
          },
          "401": {
            "description": "invalid_api_key: The API key is missing, malformed or revoked.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "account_suspended: The account is suspended, so none of its keys work. Email support to restore it. origin_not_allowed: A browser sent the request from a site that isn't allowed. Call the API from your server.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "not_found: No such path. request_not_found: The job ID is well-formed but unknown, or belongs to another account. An ID that isn't a UUID is no such path: 404 not_found. address_not_found: The source has no home at that address. Not charged.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed: Wrong method for this route. Every v1 route uses GET.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "idempotency_conflict: This Idempotency-Key was already used with different search parameters. result_not_ready: CSV was requested before every search settled. Poll as JSON until status is complete, then ask for CSV.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "414": {
            "description": "uri_too_long: The query string is longer than 2,048 characters.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "unsupported_or_invalid_query: An unknown parameter, or a value outside the documented range. error.param names the input to fix when it is one of the route's inputs. duplicate_parameter: A parameter was sent more than once. invalid_idempotency_key: Idempotency-Key must be 1–128 printable ASCII characters, with no spaces. invalid_wait: wait must be a whole number from 0 to 20. location_required: Send exactly one location: zip, city with state, bbox, or lat with lng and radius_mi. param is location. lookup_required: Send exactly one of address, url or source_id. param is lookup. location_too_large: The area is bigger than this route allows. Send a smaller box or radius. address_ambiguous: The address matches more than one home. Add the unit number or ZIP code, or send the home's url or source_id. Not charged. invalid_cursor: The cursor is damaged, came from another route, or was made with different inputs. param is cursor.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: More than 60 API calls this minute for your account. quota_exceeded: Your plan's credits are used up, and you have no extra credits left. too_many_pending: Your account has too many searches still pending. Wait for results before sending more.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "queue_full: The collection queue is full. collection_unavailable: We can't collect from this source right now. storage_unavailable: Our database is briefly unavailable. origin_unavailable: The edge couldn't reach our API server. service_unconfigured: The API is misconfigured on our side. Contact support.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/zillow/estimate": {
      "get": {
        "operationId": "zillow_estimate",
        "tags": [
          "Zillow"
        ],
        "summary": "Zillow estimate",
        "description": "Zillow's Zestimate and Rent Zestimate for one home, labeled as Zillow's. We pass them through; we do not make our own.",
        "x-status": "implemented",
        "x-credits": 1,
        "externalDocs": {
          "url": "https://realtycrawl.com/docs/api/zillow-estimate"
        },
        "parameters": [
          {
            "name": "address",
            "in": "query",
            "required": false,
            "description": "Full street address with city and state or ZIP, like 2041 Samuel Dr, Denver, CO 80221. An address that matches several homes returns 422 address_ambiguous with up to 5 candidates. Part of the lookup group: Which home. Send exactly one of address, url or source_id. None, or more than one, returns 422 with param set to lookup.",
            "schema": {
              "type": "string",
              "minLength": 5,
              "maxLength": 200
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": false,
            "description": "The home's page URL on the source site. Part of the lookup group: Which home. Send exactly one of address, url or source_id. None, or more than one, returns 422 with param set to lookup.",
            "schema": {
              "type": "string",
              "maxLength": 500
            }
          },
          {
            "name": "source_id",
            "in": "query",
            "required": false,
            "description": "The source's own ID for the home. On Zillow, the zpid. Part of the lookup group: Which home. Send exactly one of address, url or source_id. None, or more than one, returns 422 with param set to lookup.",
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Send the same key when you retry the same call, so you are not charged twice. 1–128 printable ASCII characters, no spaces.",
            "schema": {
              "type": "string",
              "pattern": "^[!-~]{1,128}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Complete, including cache hits. Costs 1 credit.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed per minute on this key.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left this minute.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the minute resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Credits-Charged": {
                "description": "Credits this response charged.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZillowEstimateJob"
                },
                "example": {
                  "request_id": "req_01JA4X9EXAMPLE",
                  "status": "complete",
                  "credits": 1,
                  "cached": false,
                  "poll_url": null,
                  "error": null,
                  "result": {
                    "source": "zillow",
                    "query": {
                      "source_id": "12998656"
                    },
                    "count": 1,
                    "reported_total": null,
                    "next_cursor": null,
                    "collected_at": "2026-10-12T20:31:05Z",
                    "schema_version": 1,
                    "completeness": "complete",
                    "summary": null,
                    "data": [
                      {
                        "source": "zillow",
                        "source_id": "12998656",
                        "source_url": "https://www.zillow.com/homedetails/2041-Samuel-Dr-Denver-CO-80221/12998656_zpid/",
                        "values": [
                          {
                            "source": "zillow",
                            "kind": "sale",
                            "value": {
                              "amount": 446500,
                              "currency": "USD"
                            },
                            "low": null,
                            "high": null,
                            "as_of": null
                          },
                          {
                            "source": "zillow",
                            "kind": "rent",
                            "value": {
                              "amount": 2567,
                              "currency": "USD"
                            },
                            "low": null,
                            "high": null,
                            "as_of": null
                          }
                        ],
                        "extras": {}
                      }
                    ],
                    "field_notes": [
                      {
                        "field": "values[].low",
                        "reason": "not_shown",
                        "detail": "Zillow did not show a range for this estimate."
                      },
                      {
                        "field": "values[].as_of",
                        "reason": "not_shown",
                        "detail": "Zillow did not show a date for this estimate."
                      }
                    ]
                  }
                }
              }
            }
          },
          "202": {
            "description": "Pending. Poll `poll_url` (or `Location`) with the same key.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              },
              "Location": {
                "description": "Job path, like /v1/jobs/{request_id}.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Seconds before polling. Prefer long-polling with ?wait=20.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZillowEstimateJob"
                }
              }
            }
          },
          "401": {
            "description": "invalid_api_key: The API key is missing, malformed or revoked.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "account_suspended: The account is suspended, so none of its keys work. Email support to restore it. origin_not_allowed: A browser sent the request from a site that isn't allowed. Call the API from your server.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "not_found: No such path. request_not_found: The job ID is well-formed but unknown, or belongs to another account. An ID that isn't a UUID is no such path: 404 not_found. address_not_found: The source has no home at that address. Not charged.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed: Wrong method for this route. Every v1 route uses GET.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "idempotency_conflict: This Idempotency-Key was already used with different search parameters. result_not_ready: CSV was requested before every search settled. Poll as JSON until status is complete, then ask for CSV.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "414": {
            "description": "uri_too_long: The query string is longer than 2,048 characters.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "unsupported_or_invalid_query: An unknown parameter, or a value outside the documented range. error.param names the input to fix when it is one of the route's inputs. duplicate_parameter: A parameter was sent more than once. invalid_idempotency_key: Idempotency-Key must be 1–128 printable ASCII characters, with no spaces. invalid_wait: wait must be a whole number from 0 to 20. location_required: Send exactly one location: zip, city with state, bbox, or lat with lng and radius_mi. param is location. lookup_required: Send exactly one of address, url or source_id. param is lookup. location_too_large: The area is bigger than this route allows. Send a smaller box or radius. address_ambiguous: The address matches more than one home. Add the unit number or ZIP code, or send the home's url or source_id. Not charged. invalid_cursor: The cursor is damaged, came from another route, or was made with different inputs. param is cursor.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: More than 60 API calls this minute for your account. quota_exceeded: Your plan's credits are used up, and you have no extra credits left. too_many_pending: Your account has too many searches still pending. Wait for results before sending more.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "queue_full: The collection queue is full. collection_unavailable: We can't collect from this source right now. storage_unavailable: Our database is briefly unavailable. origin_unavailable: The edge couldn't reach our API server. service_unconfigured: The API is misconfigured on our side. Contact support.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/jobs/{request_id}": {
      "get": {
        "operationId": "jobs_get",
        "tags": [
          "Account"
        ],
        "summary": "Get a job",
        "description": "Poll a search that returned 202. `wait` holds the call open up to 20 seconds for the result.",
        "x-status": "implemented",
        "parameters": [
          {
            "name": "request_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "wait",
            "in": "query",
            "required": false,
            "description": "Seconds to wait for the result before answering.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 20,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Get a job",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed per minute on this key.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left this minute.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the minute resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Credits-Charged": {
                "description": "Credits this response charged.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/ZillowListingsJob"
                    },
                    {
                      "$ref": "#/components/schemas/ZillowSoldJob"
                    },
                    {
                      "$ref": "#/components/schemas/ZillowRentalsJob"
                    },
                    {
                      "$ref": "#/components/schemas/ZillowPropertyJob"
                    },
                    {
                      "$ref": "#/components/schemas/ZillowEstimateJob"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "invalid_api_key: The API key is missing, malformed or revoked.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "account_suspended: The account is suspended, so none of its keys work. Email support to restore it.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "not_found: No such path. request_not_found: The job ID is well-formed but unknown, or belongs to another account. An ID that isn't a UUID is no such path: 404 not_found.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed: Wrong method for this route. Every v1 route uses GET.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "invalid_wait: wait must be a whole number from 0 to 20.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: More than 60 API calls this minute for your account.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "storage_unavailable: Our database is briefly unavailable. origin_unavailable: The edge couldn't reach our API server. service_unconfigured: The API is misconfigured on our side. Contact support.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/usage": {
      "get": {
        "operationId": "usage",
        "tags": [
          "Account"
        ],
        "summary": "Usage",
        "description": "Your plan, credits used, credits left, the reset time, and credits by endpoint for the last 30 days.",
        "x-status": "implemented",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Usage",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed per minute on this key.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left this minute.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the minute resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Credits-Charged": {
                "description": "Credits this response charged.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "plan",
                    "used",
                    "limit",
                    "remaining",
                    "extra_credits",
                    "window",
                    "resets_at",
                    "rate_limit_per_minute",
                    "credits_by_endpoint"
                  ],
                  "properties": {
                    "plan": {
                      "type": "string",
                      "enum": [
                        "free",
                        "lite",
                        "starter",
                        "pro",
                        "business",
                        "scale"
                      ],
                      "description": "Your plan."
                    },
                    "used": {
                      "type": "integer",
                      "description": "Credits used in the current window."
                    },
                    "limit": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Credits in the window. Null when unlimited."
                    },
                    "remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "limit minus used, never below 0."
                    },
                    "extra_credits": {
                      "type": "integer",
                      "description": "Extra credits bought on top of the plan, spent after the plan's credits."
                    },
                    "window": {
                      "type": "string",
                      "enum": [
                        "one_time",
                        "rolling_30_days"
                      ],
                      "description": "rolling_30_days, or one_time for the free credit."
                    },
                    "resets_at": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time",
                      "description": "When the oldest credit in the window frees up."
                    },
                    "rate_limit_per_minute": {
                      "type": "integer",
                      "description": "API calls allowed per minute."
                    },
                    "credits_by_endpoint": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "integer"
                      },
                      "description": "Credits per endpoint ID over the last 30 days."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "invalid_api_key: The API key is missing, malformed or revoked.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "account_suspended: The account is suspended, so none of its keys work. Email support to restore it.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "not_found: No such path. request_not_found: The job ID is well-formed but unknown, or belongs to another account. An ID that isn't a UUID is no such path: 404 not_found.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed: Wrong method for this route. Every v1 route uses GET.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "invalid_wait: wait must be a whole number from 0 to 20.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: More than 60 API calls this minute for your account.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "storage_unavailable: Our database is briefly unavailable. origin_unavailable: The edge couldn't reach our API server. service_unconfigured: The API is misconfigured on our side. Contact support.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/status": {
      "get": {
        "operationId": "status",
        "tags": [
          "Account"
        ],
        "summary": "Status",
        "description": "Public health of each source and route, from real jobs and canary searches. No key needed.",
        "x-status": "implemented",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Status",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed per minute on this key.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left this minute.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the minute resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Credits-Charged": {
                "description": "Credits this response charged.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Per-source and per-route health. Shape to be fixed when the status route is ported (draft)."
                }
              }
            }
          },
          "401": {
            "description": "invalid_api_key: The API key is missing, malformed or revoked.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "account_suspended: The account is suspended, so none of its keys work. Email support to restore it.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "not_found: No such path. request_not_found: The job ID is well-formed but unknown, or belongs to another account. An ID that isn't a UUID is no such path: 404 not_found.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "method_not_allowed: Wrong method for this route. Every v1 route uses GET.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "invalid_wait: wait must be a whole number from 0 to 20.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: More than 60 API calls this minute for your account.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "storage_unavailable: Our database is briefly unavailable. origin_unavailable: The edge couldn't reach our API server. service_unconfigured: The API is misconfigured on our side. Contact support.",
            "headers": {
              "X-Request-Id": {
                "description": "Unique ID for this response. Include it when you contact support.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearer": {
        "type": "http",
        "scheme": "bearer",
        "description": "An API key from the RealtyCrawl dashboard, starting with rc_."
      }
    },
    "schemas": {
      "Money": {
        "type": "object",
        "required": [
          "amount",
          "currency"
        ],
        "properties": {
          "amount": {
            "type": "number",
            "description": "The amount."
          },
          "currency": {
            "type": "string",
            "description": "ISO 4217 code, like USD."
          }
        }
      },
      "Address": {
        "type": "object",
        "required": [
          "line1",
          "unit",
          "city",
          "state",
          "zip",
          "county",
          "county_fips"
        ],
        "properties": {
          "line1": {
            "type": [
              "string",
              "null"
            ],
            "description": "Street number and name. Null when the source hides the address."
          },
          "unit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Unit, apartment or suite. Null when the home has none."
          },
          "city": {
            "type": "string",
            "description": "City."
          },
          "state": {
            "type": "string",
            "description": "Two-letter state code."
          },
          "zip": {
            "type": "string",
            "description": "Five-digit ZIP code."
          },
          "county": {
            "type": [
              "string",
              "null"
            ],
            "description": "County name. Null when the source does not give it."
          },
          "county_fips": {
            "type": [
              "string",
              "null"
            ],
            "description": "Five-digit county FIPS code. Null when unknown."
          }
        }
      },
      "Location": {
        "type": "object",
        "required": [
          "lat",
          "lng"
        ],
        "properties": {
          "lat": {
            "type": "number",
            "description": "Latitude."
          },
          "lng": {
            "type": "number",
            "description": "Longitude."
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "invalid_api_key",
                  "account_suspended",
                  "origin_not_allowed",
                  "not_found",
                  "request_not_found",
                  "method_not_allowed",
                  "idempotency_conflict",
                  "result_not_ready",
                  "uri_too_long",
                  "unsupported_or_invalid_query",
                  "duplicate_parameter",
                  "invalid_idempotency_key",
                  "invalid_wait",
                  "rate_limited",
                  "quota_exceeded",
                  "too_many_pending",
                  "queue_full",
                  "collection_unavailable",
                  "storage_unavailable",
                  "origin_unavailable",
                  "service_unconfigured",
                  "location_required",
                  "lookup_required",
                  "location_too_large",
                  "address_ambiguous",
                  "address_not_found",
                  "invalid_cursor"
                ]
              },
              "message": {
                "type": "string",
                "description": "What the code means, in plain words. Safe to show to a user."
              },
              "param": {
                "type": "string",
                "description": "On a 422: the input or input group to fix. Never a value."
              },
              "candidates": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "description": "On address_ambiguous: up to 5 matching homes."
              },
              "upgrade_url": {
                "type": "string",
                "format": "uri",
                "description": "On quota_exceeded: the billing page."
              }
            }
          }
        }
      },
      "ZillowListingsRow": {
        "type": "object",
        "required": [
          "source",
          "source_id",
          "source_url",
          "listing_kind",
          "status",
          "list_price",
          "rent_monthly",
          "rent_is_from_price",
          "list_date",
          "days_on_market",
          "price_per_sqft",
          "beds",
          "baths",
          "living_area_sqft",
          "property_type",
          "address",
          "location",
          "broker_name",
          "agent_name",
          "photo_count",
          "extras"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Which source the row came from. New sources may be added, so handle values you don't know. Known values: zillow."
          },
          "source_id": {
            "type": "string",
            "description": "The source's own ID for the home or building. On Zillow, a home's ID is its zpid."
          },
          "source_url": {
            "type": "string",
            "description": "Page for this home or building on the source site."
          },
          "listing_kind": {
            "type": "string",
            "enum": [
              "home",
              "building"
            ],
            "description": "home for one home; building for an apartment building whose units are listed together."
          },
          "status": {
            "type": "string",
            "enum": [
              "for_sale",
              "pending",
              "for_rent",
              "sold",
              "off_market"
            ],
            "description": "Listing status."
          },
          "list_price": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Money"
              },
              {
                "type": "null"
              }
            ],
            "description": "Asking price. Null on rentals."
          },
          "rent_monthly": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Money"
              },
              {
                "type": "null"
              }
            ],
            "description": "Monthly rent. For a building, the lowest rent listed. Null on sale listings."
          },
          "rent_is_from_price": {
            "type": "boolean",
            "description": "True when rent_monthly is the lowest of several unit rents."
          },
          "list_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date the current listing started (YYYY-MM-DD). Null when the source does not say."
          },
          "days_on_market": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Days since the current listing started. Null when the source does not say."
          },
          "price_per_sqft": {
            "type": [
              "number",
              "null"
            ],
            "description": "List price or rent divided by living area. Null when either is missing."
          },
          "beds": {
            "type": [
              "number",
              "null"
            ],
            "description": "Bedrooms. Null for a building with mixed units."
          },
          "baths": {
            "type": [
              "number",
              "null"
            ],
            "description": "Bathrooms as the source counts them."
          },
          "living_area_sqft": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Living area in square feet."
          },
          "property_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "single_family",
                  "condo",
                  "townhouse",
                  "multi_family",
                  "land",
                  "manufactured",
                  "apartment",
                  "other"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Home type."
          },
          "address": {
            "$ref": "#/components/schemas/Address",
            "description": "Address of the home or building."
          },
          "location": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Location"
              },
              {
                "type": "null"
              }
            ],
            "description": "Map point."
          },
          "broker_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Listing brokerage."
          },
          "agent_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Listing agent. Null when the source hides it."
          },
          "photo_count": {
            "type": [
              "integer",
              "null"
            ],
            "description": "How many photos the listing has. We never return or store the photos."
          },
          "extras": {
            "type": "object",
            "description": "Fields only this source has. Each source lists its own on its docs page. {} when there are none.",
            "properties": {
              "home_type_raw": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Zillow's own home type code, like SINGLE_FAMILY."
              },
              "days_on_zillow": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Zillow's \"days on Zillow\" count."
              },
              "zestimate": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Money"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Zillow's Zestimate on the search card. Zillow's estimate, not ours."
              },
              "rent_zestimate": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Money"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Zillow's Rent Zestimate on the search card."
              },
              "tax_assessed_value": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Money"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Zillow's \"tax assessed value\". Its basis can differ from the county assessed value in tax_history."
              },
              "building_name": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Building name, for listing_kind: building."
              },
              "units": {
                "type": "array",
                "description": "For a building: {beds, rent_from (Money)} per unit type. Empty for a single home."
              }
            },
            "required": [
              "home_type_raw",
              "days_on_zillow",
              "zestimate",
              "rent_zestimate",
              "tax_assessed_value",
              "building_name",
              "units"
            ]
          }
        }
      },
      "ZillowListingsPage": {
        "type": "object",
        "required": [
          "source",
          "query",
          "count",
          "reported_total",
          "next_cursor",
          "collected_at",
          "schema_version",
          "completeness",
          "summary",
          "data",
          "field_notes"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Source of the rows, like zillow."
          },
          "query": {
            "type": "object",
            "description": "The inputs you sent, as we read them."
          },
          "count": {
            "type": "integer",
            "description": "Rows in data."
          },
          "reported_total": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Total matches the source reported for the whole search, when it shows one."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Send as cursor for the next page. Null on the last page and on lookups."
          },
          "collected_at": {
            "type": "string",
            "description": "When we read the source (ISO 8601, UTC)."
          },
          "schema_version": {
            "type": "integer",
            "description": "Version of the row schema. Changes only with a new, opt-in version."
          },
          "completeness": {
            "type": "string",
            "enum": [
              "complete",
              "partial"
            ],
            "description": "complete, or partial when the source returned less than a full page for a reason other than reaching the end."
          },
          "summary": {
            "type": "object",
            "description": "Maths over the rows on this page: priced_count, median_price, p25, p75, median_price_per_sqft. On rentals, prices are monthly rents."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZillowListingsRow"
            },
            "description": "The rows."
          },
          "field_notes": {
            "type": "array",
            "description": "Why a field is null: {field, reason, detail}. One note covers every row where it applies."
          }
        }
      },
      "ZillowListingsJob": {
        "type": "object",
        "required": [
          "request_id",
          "status",
          "credits",
          "cached",
          "poll_url",
          "error",
          "result"
        ],
        "properties": {
          "request_id": {
            "type": "string",
            "description": "ID of this request. Poll it at /v1/jobs/{request_id}."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "complete",
              "failed"
            ],
            "description": "pending, complete or failed. Always check it, even on HTTP 200."
          },
          "credits": {
            "type": "integer",
            "description": "Credits charged. The route's price when complete; 0 while pending, when failed, or for a page past the last one."
          },
          "cached": {
            "type": "boolean",
            "description": "True when the result came from our cache."
          },
          "poll_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Where to poll while pending. Null when complete."
          },
          "error": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "code",
                  "message"
                ],
                "properties": {
                  "code": {
                    "type": "string",
                    "enum": [
                      "page_mismatch",
                      "schema",
                      "network",
                      "upstream",
                      "throttled",
                      "blocked",
                      "rejected",
                      "not_found",
                      "filter_not_supported",
                      "filter_not_applied",
                      "location_not_served",
                      "auth",
                      "deadline_exceeded",
                      "address_not_found",
                      "address_ambiguous"
                    ]
                  },
                  "message": {
                    "type": "string"
                  },
                  "param": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "result": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ZillowListingsPage"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "ZillowSoldRow": {
        "type": "object",
        "required": [
          "source",
          "source_id",
          "source_url",
          "sold_date",
          "sale_price",
          "sale_price_disclosure",
          "list_price",
          "list_date",
          "sale_to_list_ratio",
          "days_on_market",
          "price_per_sqft",
          "beds",
          "baths",
          "living_area_sqft",
          "property_type",
          "address",
          "location",
          "broker_name",
          "extras"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Which source the row came from. New sources may be added, so handle values you don't know. Known values: zillow."
          },
          "source_id": {
            "type": "string",
            "description": "The source's own ID for the home or building. On Zillow, a home's ID is its zpid."
          },
          "source_url": {
            "type": "string",
            "description": "Page for this home or building on the source site."
          },
          "sold_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sale date (YYYY-MM-DD)."
          },
          "sale_price": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Money"
              },
              {
                "type": "null"
              }
            ],
            "description": "Sale price. Null when the price is not disclosed; field_notes says why. Never filled with a list price or estimate."
          },
          "sale_price_disclosure": {
            "type": "string",
            "enum": [
              "public_record",
              "mls_reported",
              "not_disclosed",
              "unknown"
            ],
            "description": "How the sale price is known. public_record: from county records. mls_reported: the source shows an MLS price. not_disclosed: the price is hidden, usually in a non-disclosure state. unknown: the source shows a price but not where it came from."
          },
          "list_price": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Money"
              },
              {
                "type": "null"
              }
            ],
            "description": "Last asking price before the sale. Null when the source does not show it."
          },
          "list_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date the sold listing started (YYYY-MM-DD)."
          },
          "sale_to_list_ratio": {
            "type": [
              "number",
              "null"
            ],
            "description": "sale_price divided by list_price."
          },
          "days_on_market": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Days from list_date to the first pending date, or to sold_date when there was no pending date. Null when the source does not say."
          },
          "price_per_sqft": {
            "type": [
              "number",
              "null"
            ],
            "description": "Sale price divided by living area."
          },
          "beds": {
            "type": [
              "number",
              "null"
            ],
            "description": "Bedrooms."
          },
          "baths": {
            "type": [
              "number",
              "null"
            ],
            "description": "Bathrooms as the source counts them."
          },
          "living_area_sqft": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Living area in square feet."
          },
          "property_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "single_family",
                  "condo",
                  "townhouse",
                  "multi_family",
                  "land",
                  "manufactured",
                  "apartment",
                  "other"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Home type."
          },
          "address": {
            "$ref": "#/components/schemas/Address",
            "description": "Address."
          },
          "location": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Location"
              },
              {
                "type": "null"
              }
            ],
            "description": "Map point."
          },
          "broker_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Listing brokerage at the time of sale."
          },
          "extras": {
            "type": "object",
            "description": "Fields only this source has. Each source lists its own on its docs page. {} when there are none.",
            "properties": {
              "home_type_raw": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Zillow's own home type code."
              },
              "days_on_zillow": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "On sold rows, Zillow counts days since the sale here, not days on market."
              },
              "zestimate": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Money"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Zillow's Zestimate on the search card."
              },
              "rent_zestimate": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Money"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Zillow's Rent Zestimate on the search card."
              },
              "tax_assessed_value": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Money"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Zillow's \"tax assessed value\"."
              }
            },
            "required": [
              "home_type_raw",
              "days_on_zillow",
              "zestimate",
              "rent_zestimate",
              "tax_assessed_value"
            ]
          }
        }
      },
      "ZillowSoldPage": {
        "type": "object",
        "required": [
          "source",
          "query",
          "count",
          "reported_total",
          "next_cursor",
          "collected_at",
          "schema_version",
          "completeness",
          "summary",
          "data",
          "field_notes"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Source of the rows, like zillow."
          },
          "query": {
            "type": "object",
            "description": "The inputs you sent, as we read them."
          },
          "count": {
            "type": "integer",
            "description": "Rows in data."
          },
          "reported_total": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Total matches the source reported for the whole search, when it shows one."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Send as cursor for the next page. Null on the last page and on lookups."
          },
          "collected_at": {
            "type": "string",
            "description": "When we read the source (ISO 8601, UTC)."
          },
          "schema_version": {
            "type": "integer",
            "description": "Version of the row schema. Changes only with a new, opt-in version."
          },
          "completeness": {
            "type": "string",
            "enum": [
              "complete",
              "partial"
            ],
            "description": "complete, or partial when the source returned less than a full page for a reason other than reaching the end."
          },
          "summary": {
            "type": "object",
            "description": "Maths over the rows on this page: priced_count, disclosed_count, median_sale_price, p25, p75, median_price_per_sqft, earliest_sold_date, latest_sold_date. Rows without a sale price are left out of the price maths but stay in data."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZillowSoldRow"
            },
            "description": "The rows."
          },
          "field_notes": {
            "type": "array",
            "description": "Why a field is null: {field, reason, detail}. One note covers every row where it applies."
          }
        }
      },
      "ZillowSoldJob": {
        "type": "object",
        "required": [
          "request_id",
          "status",
          "credits",
          "cached",
          "poll_url",
          "error",
          "result"
        ],
        "properties": {
          "request_id": {
            "type": "string",
            "description": "ID of this request. Poll it at /v1/jobs/{request_id}."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "complete",
              "failed"
            ],
            "description": "pending, complete or failed. Always check it, even on HTTP 200."
          },
          "credits": {
            "type": "integer",
            "description": "Credits charged. The route's price when complete; 0 while pending, when failed, or for a page past the last one."
          },
          "cached": {
            "type": "boolean",
            "description": "True when the result came from our cache."
          },
          "poll_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Where to poll while pending. Null when complete."
          },
          "error": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "code",
                  "message"
                ],
                "properties": {
                  "code": {
                    "type": "string",
                    "enum": [
                      "page_mismatch",
                      "schema",
                      "network",
                      "upstream",
                      "throttled",
                      "blocked",
                      "rejected",
                      "not_found",
                      "filter_not_supported",
                      "filter_not_applied",
                      "location_not_served",
                      "auth",
                      "deadline_exceeded",
                      "address_not_found",
                      "address_ambiguous"
                    ]
                  },
                  "message": {
                    "type": "string"
                  },
                  "param": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "result": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ZillowSoldPage"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "ZillowRentalsRow": {
        "type": "object",
        "required": [
          "source",
          "source_id",
          "source_url",
          "listing_kind",
          "status",
          "list_price",
          "rent_monthly",
          "rent_is_from_price",
          "list_date",
          "days_on_market",
          "price_per_sqft",
          "beds",
          "baths",
          "living_area_sqft",
          "property_type",
          "address",
          "location",
          "broker_name",
          "agent_name",
          "photo_count",
          "extras"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Which source the row came from. New sources may be added, so handle values you don't know. Known values: zillow."
          },
          "source_id": {
            "type": "string",
            "description": "The source's own ID for the home or building. On Zillow, a home's ID is its zpid."
          },
          "source_url": {
            "type": "string",
            "description": "Page for this home or building on the source site."
          },
          "listing_kind": {
            "type": "string",
            "enum": [
              "home",
              "building"
            ],
            "description": "home for one home; building for an apartment building whose units are listed together."
          },
          "status": {
            "type": "string",
            "enum": [
              "for_sale",
              "pending",
              "for_rent",
              "sold",
              "off_market"
            ],
            "description": "Listing status."
          },
          "list_price": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Money"
              },
              {
                "type": "null"
              }
            ],
            "description": "Asking price. Null on rentals."
          },
          "rent_monthly": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Money"
              },
              {
                "type": "null"
              }
            ],
            "description": "Monthly rent. For a building, the lowest rent listed. Null on sale listings."
          },
          "rent_is_from_price": {
            "type": "boolean",
            "description": "True when rent_monthly is the lowest of several unit rents."
          },
          "list_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date the current listing started (YYYY-MM-DD). Null when the source does not say."
          },
          "days_on_market": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Days since the current listing started. Null when the source does not say."
          },
          "price_per_sqft": {
            "type": [
              "number",
              "null"
            ],
            "description": "List price or rent divided by living area. Null when either is missing."
          },
          "beds": {
            "type": [
              "number",
              "null"
            ],
            "description": "Bedrooms. Null for a building with mixed units."
          },
          "baths": {
            "type": [
              "number",
              "null"
            ],
            "description": "Bathrooms as the source counts them."
          },
          "living_area_sqft": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Living area in square feet."
          },
          "property_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "single_family",
                  "condo",
                  "townhouse",
                  "multi_family",
                  "land",
                  "manufactured",
                  "apartment",
                  "other"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Home type."
          },
          "address": {
            "$ref": "#/components/schemas/Address",
            "description": "Address of the home or building."
          },
          "location": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Location"
              },
              {
                "type": "null"
              }
            ],
            "description": "Map point."
          },
          "broker_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Listing brokerage."
          },
          "agent_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Listing agent. Null when the source hides it."
          },
          "photo_count": {
            "type": [
              "integer",
              "null"
            ],
            "description": "How many photos the listing has. We never return or store the photos."
          },
          "extras": {
            "type": "object",
            "description": "Fields only this source has. Each source lists its own on its docs page. {} when there are none.",
            "properties": {
              "home_type_raw": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Zillow's own home type code, like SINGLE_FAMILY."
              },
              "days_on_zillow": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Zillow's \"days on Zillow\" count."
              },
              "zestimate": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Money"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Zillow's Zestimate on the search card. Zillow's estimate, not ours."
              },
              "rent_zestimate": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Money"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Zillow's Rent Zestimate on the search card."
              },
              "tax_assessed_value": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Money"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Zillow's \"tax assessed value\". Its basis can differ from the county assessed value in tax_history."
              },
              "building_name": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Building name, for listing_kind: building."
              },
              "units": {
                "type": "array",
                "description": "For a building: {beds, rent_from (Money)} per unit type. Empty for a single home."
              }
            },
            "required": [
              "home_type_raw",
              "days_on_zillow",
              "zestimate",
              "rent_zestimate",
              "tax_assessed_value",
              "building_name",
              "units"
            ]
          }
        }
      },
      "ZillowRentalsPage": {
        "type": "object",
        "required": [
          "source",
          "query",
          "count",
          "reported_total",
          "next_cursor",
          "collected_at",
          "schema_version",
          "completeness",
          "summary",
          "data",
          "field_notes"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Source of the rows, like zillow."
          },
          "query": {
            "type": "object",
            "description": "The inputs you sent, as we read them."
          },
          "count": {
            "type": "integer",
            "description": "Rows in data."
          },
          "reported_total": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Total matches the source reported for the whole search, when it shows one."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Send as cursor for the next page. Null on the last page and on lookups."
          },
          "collected_at": {
            "type": "string",
            "description": "When we read the source (ISO 8601, UTC)."
          },
          "schema_version": {
            "type": "integer",
            "description": "Version of the row schema. Changes only with a new, opt-in version."
          },
          "completeness": {
            "type": "string",
            "enum": [
              "complete",
              "partial"
            ],
            "description": "complete, or partial when the source returned less than a full page for a reason other than reaching the end."
          },
          "summary": {
            "type": "object",
            "description": "Maths over the rows on this page: priced_count, median_price, p25, p75, median_price_per_sqft. On rentals, prices are monthly rents."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZillowRentalsRow"
            },
            "description": "The rows."
          },
          "field_notes": {
            "type": "array",
            "description": "Why a field is null: {field, reason, detail}. One note covers every row where it applies."
          }
        }
      },
      "ZillowRentalsJob": {
        "type": "object",
        "required": [
          "request_id",
          "status",
          "credits",
          "cached",
          "poll_url",
          "error",
          "result"
        ],
        "properties": {
          "request_id": {
            "type": "string",
            "description": "ID of this request. Poll it at /v1/jobs/{request_id}."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "complete",
              "failed"
            ],
            "description": "pending, complete or failed. Always check it, even on HTTP 200."
          },
          "credits": {
            "type": "integer",
            "description": "Credits charged. The route's price when complete; 0 while pending, when failed, or for a page past the last one."
          },
          "cached": {
            "type": "boolean",
            "description": "True when the result came from our cache."
          },
          "poll_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Where to poll while pending. Null when complete."
          },
          "error": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "code",
                  "message"
                ],
                "properties": {
                  "code": {
                    "type": "string",
                    "enum": [
                      "page_mismatch",
                      "schema",
                      "network",
                      "upstream",
                      "throttled",
                      "blocked",
                      "rejected",
                      "not_found",
                      "filter_not_supported",
                      "filter_not_applied",
                      "location_not_served",
                      "auth",
                      "deadline_exceeded",
                      "address_not_found",
                      "address_ambiguous"
                    ]
                  },
                  "message": {
                    "type": "string"
                  },
                  "param": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "result": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ZillowRentalsPage"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "ZillowPropertyRow": {
        "type": "object",
        "required": [
          "source",
          "source_id",
          "source_url",
          "collected_at",
          "status",
          "address",
          "location",
          "parcel",
          "property_type",
          "beds",
          "baths",
          "baths_full",
          "baths_half",
          "living_area_sqft",
          "lot_area_sqft",
          "year_built",
          "stories",
          "hoa_fee_monthly",
          "tax",
          "last_sale",
          "list_price",
          "rent_monthly",
          "list_date",
          "days_on_market",
          "broker_name",
          "agent_name",
          "mls_name",
          "mls_id",
          "photo_count",
          "price_history",
          "tax_history",
          "extras"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Which source the row came from. New sources may be added, so handle values you don't know. Known values: zillow."
          },
          "source_id": {
            "type": "string",
            "description": "The source's own ID for the home or building. On Zillow, a home's ID is its zpid."
          },
          "source_url": {
            "type": "string",
            "description": "Page for this home or building on the source site."
          },
          "collected_at": {
            "type": "string",
            "description": "When we read the source (ISO 8601, UTC)."
          },
          "status": {
            "type": "string",
            "enum": [
              "for_sale",
              "pending",
              "for_rent",
              "sold",
              "off_market"
            ],
            "description": "Current status."
          },
          "address": {
            "$ref": "#/components/schemas/Address",
            "description": "Address."
          },
          "location": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Location"
              },
              {
                "type": "null"
              }
            ],
            "description": "Map point."
          },
          "parcel": {
            "type": [
              "object",
              "null"
            ],
            "description": "County parcel number as {county_fips, apn}. Null when the source does not give it."
          },
          "property_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "single_family",
                  "condo",
                  "townhouse",
                  "multi_family",
                  "land",
                  "manufactured",
                  "apartment",
                  "other"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Home type."
          },
          "beds": {
            "type": [
              "number",
              "null"
            ],
            "description": "Bedrooms."
          },
          "baths": {
            "type": [
              "number",
              "null"
            ],
            "description": "Bathrooms as the source counts them."
          },
          "baths_full": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Full bathrooms, when the source splits them."
          },
          "baths_half": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Half bathrooms, when the source splits them."
          },
          "living_area_sqft": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Living area in square feet."
          },
          "lot_area_sqft": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Lot area in square feet."
          },
          "year_built": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Year built."
          },
          "stories": {
            "type": [
              "number",
              "null"
            ],
            "description": "Number of stories."
          },
          "hoa_fee_monthly": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Money"
              },
              {
                "type": "null"
              }
            ],
            "description": "Monthly HOA fee. Null when there is none or the source does not say."
          },
          "tax": {
            "type": [
              "object",
              "null"
            ],
            "description": "Latest county tax record: {year, assessed_value (Money|null), amount (Money|null)}. Null when the source has none."
          },
          "last_sale": {
            "type": [
              "object",
              "null"
            ],
            "description": "Most recent sale: {date, price (Money|null), sale_price_disclosure}. Null when the home has no recorded sale."
          },
          "list_price": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Money"
              },
              {
                "type": "null"
              }
            ],
            "description": "Current asking price when for sale."
          },
          "rent_monthly": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Money"
              },
              {
                "type": "null"
              }
            ],
            "description": "Current rent when for rent."
          },
          "list_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date the current listing started (YYYY-MM-DD)."
          },
          "days_on_market": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Days from list_date to the first pending date, or to the sale date when there was no pending date. For a home still listed, days since list_date."
          },
          "broker_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Listing brokerage."
          },
          "agent_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Listing agent."
          },
          "mls_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "MLS the listing came from."
          },
          "mls_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Listing number in that MLS."
          },
          "photo_count": {
            "type": [
              "integer",
              "null"
            ],
            "description": "How many photos the source shows. We never return or store the photos."
          },
          "price_history": {
            "type": [
              "array",
              "null"
            ],
            "description": "Listing and sale events, newest first: {date, event, event_raw, price (Money|null), source_note}. event is one of listed, price_change, pending, sold, delisted, relisted, listed_for_rent, rent_change, rented, other. event_raw is the source's own wording. Empty when the source has none; null when it could not be read."
          },
          "tax_history": {
            "type": [
              "array",
              "null"
            ],
            "description": "County tax records, newest first: {year, assessed_value (Money|null), amount (Money|null)}. Empty when the source has none; null when it could not be read."
          },
          "extras": {
            "type": "object",
            "description": "Fields only this source has. Each source lists its own on its docs page. {} when there are none.",
            "properties": {
              "home_type_raw": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Zillow's own home type code."
              },
              "tax_assessed_value": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Money"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Zillow's top-line \"tax assessed value\". The core tax field uses the county record instead, because the two can use different bases."
              },
              "property_tax_rate": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Zillow's property tax rate, in percent."
              },
              "buyer_brokerage": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Buyer's brokerage on the last sale."
              },
              "days_on_zillow": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Zillow's \"days on Zillow\" count."
              }
            },
            "required": [
              "home_type_raw",
              "tax_assessed_value",
              "property_tax_rate",
              "buyer_brokerage",
              "days_on_zillow"
            ]
          }
        }
      },
      "ZillowPropertyPage": {
        "type": "object",
        "required": [
          "source",
          "query",
          "count",
          "reported_total",
          "next_cursor",
          "collected_at",
          "schema_version",
          "completeness",
          "summary",
          "data",
          "field_notes"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Source of the rows, like zillow."
          },
          "query": {
            "type": "object",
            "description": "The inputs you sent, as we read them."
          },
          "count": {
            "type": "integer",
            "description": "Rows in data."
          },
          "reported_total": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Total matches the source reported for the whole search, when it shows one."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Send as cursor for the next page. Null on the last page and on lookups."
          },
          "collected_at": {
            "type": "string",
            "description": "When we read the source (ISO 8601, UTC)."
          },
          "schema_version": {
            "type": "integer",
            "description": "Version of the row schema. Changes only with a new, opt-in version."
          },
          "completeness": {
            "type": "string",
            "enum": [
              "complete",
              "partial"
            ],
            "description": "complete, or partial when the source returned less than a full page for a reason other than reaching the end."
          },
          "summary": {
            "type": [
              "object",
              "null"
            ],
            "description": "Maths over this page for area searches. Null on lookups."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZillowPropertyRow"
            },
            "description": "The rows."
          },
          "field_notes": {
            "type": "array",
            "description": "Why a field is null: {field, reason, detail}. One note covers every row where it applies."
          }
        }
      },
      "ZillowPropertyJob": {
        "type": "object",
        "required": [
          "request_id",
          "status",
          "credits",
          "cached",
          "poll_url",
          "error",
          "result"
        ],
        "properties": {
          "request_id": {
            "type": "string",
            "description": "ID of this request. Poll it at /v1/jobs/{request_id}."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "complete",
              "failed"
            ],
            "description": "pending, complete or failed. Always check it, even on HTTP 200."
          },
          "credits": {
            "type": "integer",
            "description": "Credits charged. The route's price when complete; 0 while pending, when failed, or for a page past the last one."
          },
          "cached": {
            "type": "boolean",
            "description": "True when the result came from our cache."
          },
          "poll_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Where to poll while pending. Null when complete."
          },
          "error": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "code",
                  "message"
                ],
                "properties": {
                  "code": {
                    "type": "string",
                    "enum": [
                      "page_mismatch",
                      "schema",
                      "network",
                      "upstream",
                      "throttled",
                      "blocked",
                      "rejected",
                      "not_found",
                      "filter_not_supported",
                      "filter_not_applied",
                      "location_not_served",
                      "auth",
                      "deadline_exceeded",
                      "address_not_found",
                      "address_ambiguous"
                    ]
                  },
                  "message": {
                    "type": "string"
                  },
                  "param": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "result": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ZillowPropertyPage"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "ZillowEstimateRow": {
        "type": "object",
        "required": [
          "source",
          "source_id",
          "source_url",
          "values",
          "extras"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Which source the row came from. New sources may be added, so handle values you don't know. Known values: zillow."
          },
          "source_id": {
            "type": "string",
            "description": "The source's own ID for the home or building. On Zillow, a home's ID is its zpid."
          },
          "source_url": {
            "type": "string",
            "description": "Page for this home or building on the source site."
          },
          "values": {
            "type": "array",
            "description": "One entry per estimate: {source, kind, value (Money), low (Money|null), high (Money|null), as_of}. kind is sale or rent (monthly). Every value is the source's own estimate. We do not make or blend our own."
          },
          "extras": {
            "type": "object",
            "description": "Fields only this source has. Each source lists its own on its docs page. {} when there are none."
          }
        }
      },
      "ZillowEstimatePage": {
        "type": "object",
        "required": [
          "source",
          "query",
          "count",
          "reported_total",
          "next_cursor",
          "collected_at",
          "schema_version",
          "completeness",
          "summary",
          "data",
          "field_notes"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Source of the rows, like zillow."
          },
          "query": {
            "type": "object",
            "description": "The inputs you sent, as we read them."
          },
          "count": {
            "type": "integer",
            "description": "Rows in data."
          },
          "reported_total": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Total matches the source reported for the whole search, when it shows one."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Send as cursor for the next page. Null on the last page and on lookups."
          },
          "collected_at": {
            "type": "string",
            "description": "When we read the source (ISO 8601, UTC)."
          },
          "schema_version": {
            "type": "integer",
            "description": "Version of the row schema. Changes only with a new, opt-in version."
          },
          "completeness": {
            "type": "string",
            "enum": [
              "complete",
              "partial"
            ],
            "description": "complete, or partial when the source returned less than a full page for a reason other than reaching the end."
          },
          "summary": {
            "type": [
              "object",
              "null"
            ],
            "description": "Maths over this page for area searches. Null on lookups."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZillowEstimateRow"
            },
            "description": "The rows."
          },
          "field_notes": {
            "type": "array",
            "description": "Why a field is null: {field, reason, detail}. One note covers every row where it applies."
          }
        }
      },
      "ZillowEstimateJob": {
        "type": "object",
        "required": [
          "request_id",
          "status",
          "credits",
          "cached",
          "poll_url",
          "error",
          "result"
        ],
        "properties": {
          "request_id": {
            "type": "string",
            "description": "ID of this request. Poll it at /v1/jobs/{request_id}."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "complete",
              "failed"
            ],
            "description": "pending, complete or failed. Always check it, even on HTTP 200."
          },
          "credits": {
            "type": "integer",
            "description": "Credits charged. The route's price when complete; 0 while pending, when failed, or for a page past the last one."
          },
          "cached": {
            "type": "boolean",
            "description": "True when the result came from our cache."
          },
          "poll_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Where to poll while pending. Null when complete."
          },
          "error": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "code",
                  "message"
                ],
                "properties": {
                  "code": {
                    "type": "string",
                    "enum": [
                      "page_mismatch",
                      "schema",
                      "network",
                      "upstream",
                      "throttled",
                      "blocked",
                      "rejected",
                      "not_found",
                      "filter_not_supported",
                      "filter_not_applied",
                      "location_not_served",
                      "auth",
                      "deadline_exceeded",
                      "address_not_found",
                      "address_ambiguous"
                    ]
                  },
                  "message": {
                    "type": "string"
                  },
                  "param": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "result": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ZillowEstimatePage"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      }
    }
  }
}
