> ## Documentation Index
> Fetch the complete documentation index at: https://developers.investorlift.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List MLS sale listings

> Find sale listings near a location and read statistics over every match.

Each row contains the newest MLS listing on one parcel. The default includes ACTIVE and PENDING sale listings.
The route excludes rentals. A SOLD record is a feed status. It does not prove a recorded closing deed.

## Choose a location

Use a point, viewport, parcel ID, ZIP list, city, or street address.
An address needs one five-digit ZIP or a city. ZIP takes precedence when both are present.
An explicit `unit` takes precedence over a unit in the street line.
Do not combine an address with coordinates, a viewport, or a parcel ID.
The API returns candidates when the address identifies several parcels.

Distance is the default order with a reference point. Other locations use `listed_desc`.
All sorts put null values last. Every sort breaks ties on the market, then on the parcel ID.
`meta.geometry` shows the resolved location.

## Read the response

* `property` contains assessor facts, including bedrooms, bathrooms, area, and year built.
* `holder` identifies the current registry holder. It does not prove who offered an older listing.
* `listing` contains the newest MLS status, price, dates, and ownership test.
* `investorlift` counts public listings on the parcel at any time. Its `as_of` dates that source.
* `summary` covers all filtered matches before the cursor and page limit.
* `summary.as_of_by_market` lists every selected market, including markets with no matches.

Use `status=sold` with `sold_since` and `sold_until` for an inclusive closing-date range.
Use `sold_price_min` and `sold_price_max` for closing-price bounds.
Use `sold_price_asc` or `sold_price_desc` to sort by closing price.

The existing price sorts and `list_price_*` filters still read asking prices.
Use `status=off_market` with `off_market_since` for ended records.
A date filter does not change the status selection. All filters intersect.

A range filter on an assessor fact removes a parcel that has no value for that fact.
This rule applies to the bedroom, bathroom, area, and year built bounds.

`on_investorlift=false` excludes parcels with any public Investorlift listing.
That filter needs wholesale coverage in every selected market.

## Sold statistics

`summary.sold` describes sold records within the complete matching set.
It gives closing-price, closing-price-per-square-foot, and selling-time medians with separate usable sample counts.
Each median needs five usable observations. Counts remain visible below the floor.
The square-foot metric includes only houses and condos with a positive price and living area.

Missing closing prices remain null. The API does not substitute asking prices or deed prices.

A mixed status request with a closing-date bound excludes rows without a closing date.
For current inventory and recent sold properties, send separate requests with their respective status and date filters.

## Limits

This source retains the newest listing per parcel. It does not retain every listing cycle.
Use [historical sold listings](/api-reference/endpoints/list-sold-listing-history) for earlier observed sales after relisting, within the published history ZIPs.

The source dates describe observations. They do not establish live availability.
Use the [rental route](/api-reference/endpoints/list-rental-listings) for asking rents.
Use [property comps](/api-reference/endpoints/properties-comps) for comparable sales.

A cursor belongs to its filters and dataset versions. Restart pagination after `invalid_cursor`.
A source refresh during the request returns an error. The page and summary never mix source snapshots.
These routes validate the source on every request, including requests with `If-None-Match`.

[Search nearby inventory](/guides/walkthroughs/nearby-listings) shows the three listing routes together.


## OpenAPI

````yaml GET /v1/listings
openapi: 3.1.0
info:
  title: God Mode API
  version: 0.51.0
  description: >-
    You have a house to sell, usually a wholesale contract. You want **the
    investors who buy houses like this one, from county deed records**. This API
    reads those records for each loaded market and serves three things: deals,
    investors and a ranking. On every response, `meta.coverage[]` lists the
    markets and the area each covers.


    **Deals** are every investment purchase, flip, wholesale and current
    investor holding. **Investors** are the buyers behind them, grouped so that
    the LLCs of an operator and the person behind them count as one. **A
    ranking** says, for a given house, which investors are the best fit and why.


    The documentation site at https://developers.investorlift.com carries the
    guides, the walkthroughs, the error catalogue and the connection steps for
    MCP clients. https://developers.investorlift.com/llms.txt indexes the site
    for a model. This document is the machine-readable reference behind the API
    tab of the site.


    **Start here.** Ranked buyers for a house at 7522 E Cholla St, Scottsdale,
    under contract at $410,000 and in need of a major rehab:


    ```

    GET
    https://api.investorlift.com/v1/buyers/match?lat=33.476917&lng=-111.920385&radius_miles=2&subject_asking_price=410000&subject_condition=MAJOR_REHAB

    Authorization: Bearer zpka_...

    ```


    **Conventions.** Responses are `{ data, meta }`. Lists add `page` (an opaque
    cursor) and sometimes `summary`. A list parameter takes commas or repeated
    keys. Dates are YYYY-MM-DD. Ids carry a prefix: `deal_`, `prop_`, `inv_`,
    `agt_`, `wl_`, `wsr_`.


    Money is whole dollars. It is null, never 0, when the deed carries no price.
    Coordinates are WGS84. A location is a point and radius (`lat`, `lng`,
    `radius_miles`), a viewport (`bbox=west,south,east,north`) or a parcel
    (`property_id`).


    Every operation carries `x-credits`, its price in credits on the public
    tier. `charge` is null at 0 credits. Otherwise `kind` names the deal,
    investor or property (a parcel) that costs 1 credit when new to your
    account. `base` is the credits a call costs before them. `contract: true`
    marks a route sold by contract.


    Every operation also carries `x-raises`, the problem codes it can answer,
    sorted. Each problem response of the operation lists and shows the codes of
    its status alone. The list includes the codes the gateway answers on its
    own.


    This host does not serve the people behind an entity, mailing addresses,
    owner identity, mortgage borrowers or lien parties. It does not serve the
    names, phones, emails and licence numbers of listing agents. It serves the
    entities, the deals, the listings and the ranking.


    Errors are RFC 9457 problem+json with a `code` to switch on. The catalogue
    is https://developers.investorlift.com/problems.json and the Errors page of
    the site. The field `meta.coverage[].dataset_version` changes only when a
    refresh rebuilds the tables of a market. Use it in cache keys, or poll `GET
    /v1/dataset`.


    **MCP.** The API serves the same data to Model Context Protocol clients at
    `POST https://api.investorlift.com/mcp` with the same key: twenty-nine
    read-only tools, four resources, seven prompts. The MCP tab of the
    documentation site has the client setup. The file `mcp-manifest.json` beside
    this document lists the tools with their input schemas.


    Problem codes: 400 validation_error, 400 unknown_parameter, 400
    invalid_cursor, 400 geometry_required, 400 geometry_conflict, 400
    sort_requires_point, 400 invalid_id, 400 market_required, 401 unauthorized,
    403 quota_exceeded, 403 subscription_required, 403 payment_overdue, 403
    plan_limit, 404 not_found, 406 not_acceptable, 410 gone, 422
    outside_coverage, 422 ambiguous_apn, 422 ambiguous_address, 422
    csv_cap_exceeded, 422 listings_unavailable, 422 agents_unavailable, 422
    lenders_unavailable, 422 wholesale_unavailable, 422 str_unavailable, 422
    cash_sale_unavailable, 422 auction_unavailable, 422 parcels_unavailable, 422
    addresses_unavailable, 422 dated_refused, 422 history_unavailable, 400
    quicklist_unavailable, 400 dataset_unavailable, 429 rate_limited, 500
    internal_error, 503 database_unavailable, 503 pool_saturated, 503
    ledger_unavailable, 504 statement_timeout.
servers:
  - url: https://api.investorlift.com
security:
  - bearerAuth: []
tags:
  - name: listings
    x-group: MLS listings
    description: >-
      Sale listings and observed asking rents near a location, with dated facts
      and sample counts.
  - name: buyers
    x-group: Buyers
    description: >-
      Which investors are the best fit for this house: the API ranks nearby
      investors against a subject property and explains each score.
  - name: deals
    x-group: Deals
    description: >-
      What occurred around a location: deals for a table, cells for a map,
      summary stats, and one deal by id.
  - name: investors
    x-group: Investors
    description: >-
      Who the buyers are: investors active in an area, a full profile, and their
      metro-wide history. A search finds an investor by any name they buy under.
  - name: properties
    x-group: Properties
    description: >-
      One parcel: find it from a point or an APN, then read its facts, owner
      information, short-term rental licence and every deal on it. The owner
      information covers investor holdings and business-use short-term rentals.
  - name: agents
    x-group: Listing agents
    description: >-
      Who the listing agents are: find one by name or licence number, then read
      the profile and every listing of theirs. The profile holds the licence,
      the brokerages, the listing counts and the investors they belong to.
  - name: wholesale
    x-group: Investorlift listings
    description: >-
      Investorlift listings as wholesale transactions: the houses listed, and
      what the county deeds show for each (closed, to whom, which deed). Also
      the listing companies, and what each investor bought off Investorlift.
  - name: lenders
    x-group: Lenders
    description: >-
      Who lends on houses in a market: find a lender by any spelling of its
      name. Rank the lenders of a market, or of one ZIP, city or county. Read a
      profile: loans counted once across the open-lien and recorded-history
      tables, the open book, terms, geography and rankings. List every loan of
      one lender.
  - name: dataset
    x-group: Dataset and coverage
    description: >-
      What the API serves, how fresh it is and which data is available where.
      The dataset version and the last deed date of every market, for cache keys
      and freshness checks. The coverage matrix, with a place lookup.
  - name: contract
    x-group: By contract
    description: >-
      Routes sold per jurisdiction under an order form and not reachable on a
      self-serve key. Ask through the console.
externalDocs:
  description: >-
    The documentation site: the guides, the walkthroughs, the error catalogue
    and the MCP connection steps.
  url: https://developers.investorlift.com
paths:
  /v1/listings:
    get:
      tags:
        - listings
      summary: List MLS sale listings near a location
      description: >-
        The newest MLS sale listing on each matching parcel, with full listing
        facts and a summary over all matches. Default is active or pending.
        Rentals are excluded.


        A sold listing is not a ranked comparable sale.


        A call costs 1 credit per parcel new to your account.


        [Read the listing contract and source
        limits](https://developers.investorlift.com/api-reference/endpoints/list-listings).
      operationId: listListings
      parameters:
        - schema:
            type: number
            minimum: -90
            maximum: 90
          in: query
          name: lat
          required: false
          description: >-
            Point latitude (with lng). With radius_miles it is the search
            geometry. With bbox it is the reference point only.
        - schema:
            type: number
            minimum: -180
            maximum: 180
          in: query
          name: lng
          required: false
          description: Point longitude (with lat).
        - schema:
            type: number
            minimum: 0.25
            maximum: 20
          in: query
          name: radius_miles
          required: false
          description: >-
            Search radius in miles around the point or around the centre of the
            property_id parcel, 0.25 to 20 (default 2). Not allowed with bbox.
        - schema:
            type: string
          in: query
          name: bbox
          required: false
          description: >-
            Viewport as west,south,east,north (WGS84 degrees). West must be less
            than east, south less than north, and the diagonal at most 40 mi. It
            must intersect a loaded market's coverage bbox (422 outside_coverage
            otherwise). It can carry lat + lng (without radius_miles) as the
            reference point for distances and sort=distance.
        - schema:
            type: string
            pattern: ^prop_[0-9a-f]{32}$
          in: query
          name: property_id
          required: false
          description: >-
            Parcel geometry: search around the centre of that parcel, with
            radius_miles. Not allowed with lat, lng or bbox.
        - schema:
            minItems: 1
            maxItems: 50
            type: array
            items:
              type: string
              pattern: ^\d{5}$
          in: query
          name: zip
          required: false
          description: >-
            ZIP list for a place search. With address, use exactly one
            five-digit ZIP. ZIP takes precedence over city for an address.
          style: form
          explode: true
        - schema:
            type: string
            minLength: 1
            maxLength: 100
          in: query
          name: city
          required: false
          description: >-
            Postal city for a place search or address resolution. With address,
            ZIP takes precedence when both are present.
        - schema:
            type: string
            minLength: 1
            maxLength: 200
          in: query
          name: address
          required: false
          description: >-
            Street address to resolve before the radius search. Needs one
            five-digit ZIP or a city. ZIP takes precedence over city.
        - schema:
            type: string
            minLength: 1
            maxLength: 16
          in: query
          name: unit
          required: false
          description: >-
            Unit of the address. Only with address. An explicit unit takes
            precedence over a unit in the street line.
        - schema:
            type: string
            format: date
          in: query
          name: listed_since
          required: false
          description: >-
            Keep listing dates on or after this date. This filter does not
            change the status filter.
        - schema:
            minItems: 1
            type: array
            items:
              type: string
              enum:
                - SFR
                - CONDO_TH
                - OTHER
              description: >-
                Parcel segment: SFR, CONDO_TH (condo or townhouse) or OTHER, a
                mixed bucket of manufactured, multi-family, land and commercial
                parcels.
          in: query
          name: segment
          required: false
          description: 'Keep these assessor segments: SFR, CONDO_TH, or OTHER.'
          style: form
          explode: true
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: beds_min
          required: false
          description: Minimum assessor bedroom count, inclusive.
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: beds_max
          required: false
          description: Maximum assessor bedroom count, inclusive.
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: sqft_min
          required: false
          description: Minimum living area in square feet, inclusive.
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: sqft_max
          required: false
          description: Maximum living area in square feet, inclusive.
        - schema:
            type: number
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: baths_min
          required: false
          description: >-
            Minimum assessor bathroom count, inclusive. A half bathroom counts
            as 0.5.
        - schema:
            type: number
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: baths_max
          required: false
          description: >-
            Maximum assessor bathroom count, inclusive. A half bathroom counts
            as 0.5.
        - schema:
            type: integer
            minimum: 1600
            maximum: 2100
          in: query
          name: year_built_min
          required: false
          description: Earliest assessor year built, inclusive.
        - schema:
            type: integer
            minimum: 1600
            maximum: 2100
          in: query
          name: year_built_max
          required: false
          description: Latest assessor year built, inclusive.
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: investor_held
          required: false
          description: >-
            True keeps a PASSED ownership test. False keeps other results. Omit
            the filter to keep every result.
        - schema:
            default: 100
            type: integer
            minimum: 1
            maximum: 500
          in: query
          name: limit
          required: false
          description: Page size, 1-500 (default 100).
        - schema:
            type: string
            minLength: 1
            maxLength: 4096
          in: query
          name: cursor
          required: false
          description: >-
            Opaque cursor from page.next_cursor of the previous page. A change
            of query, sort, weights or data version invalidates it (400
            invalid_cursor). Then restart from page 1.
        - schema:
            minItems: 1
            type: array
            items:
              type: string
              enum:
                - on_market
                - active
                - pending
                - sold
                - off_market
          in: query
          name: status
          required: false
          description: >-
            Statuses to keep. Default on_market means active or pending. Every
            status excludes rentals.
          style: form
          explode: true
        - schema:
            minItems: 1
            type: array
            items:
              type: string
              enum:
                - NEW
                - PRICE_CHANGE
                - COMING_SOON
                - BACK_ON_MARKET
                - CONTINGENT
                - UNDER_CONTRACT
          in: query
          name: status_detail
          required: false
          description: >-
            Keep these listing details. Only active and pending records carry
            these values.
          style: form
          explode: true
        - schema:
            minItems: 1
            type: array
            items:
              type: string
              enum:
                - CANCELED
                - EXPIRED
                - OFF_MARKET
          in: query
          name: off_market_reason
          required: false
          description: >-
            Keep these end reasons. Use status=off_market because this filter
            does not change the default status.
          style: form
          explode: true
        - schema:
            type: string
            format: date
          in: query
          name: sold_since
          required: false
          description: >-
            Keep sold dates on or after this date. Use status=sold to include
            sold rows.
        - schema:
            type: string
            format: date
          in: query
          name: sold_until
          required: false
          description: >-
            Keep sold dates on or before this date. Use status=sold to include
            sold rows.
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: sold_price_min
          required: false
          description: >-
            Minimum closing price in whole US dollars, inclusive. Missing prices
            do not match. Use status=sold to include sold rows.
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: sold_price_max
          required: false
          description: >-
            Maximum closing price in whole US dollars, inclusive. Missing prices
            do not match. Use status=sold to include sold rows.
        - schema:
            type: string
            format: date
          in: query
          name: off_market_since
          required: false
          description: >-
            Keep end dates on or after this date. Use status=off_market to
            include ended rows.
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: list_price_min
          required: false
          description: Minimum asking sale price in whole US dollars, inclusive.
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: list_price_max
          required: false
          description: Maximum asking sale price in whole US dollars, inclusive.
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: days_on_market_min
          required: false
          description: Minimum days on market at the source date, inclusive.
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: days_on_market_max
          required: false
          description: Maximum days on market at the source date, inclusive.
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: on_investorlift
          required: false
          description: >-
            True requires a public Investorlift listing on this parcel at any
            time. False requires none. Missing source coverage is an error.
        - schema:
            type: string
            enum:
              - distance
              - listed_desc
              - sold_desc
              - off_market_desc
              - price_asc
              - price_desc
              - sold_price_asc
              - sold_price_desc
              - dom_desc
          in: query
          name: sort
          required: false
          description: >-
            Order by distance, newest listing, newest sale, newest end, price,
            or descending duration. Price sorts use asking prices unless named
            sold_price. Null values come last. Every sort breaks ties on the
            market, then on the parcel id.
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListingsResponse'
              example:
                data:
                  - property:
                      id: prop_a03a80c431d2ac1878d5e619fa11a41b
                      address_short: 2613 N 74th Pl
                      city: SCOTTSDALE
                      state: AZ
                      zip: '85257'
                      latitude: 33.477252
                      longitude: -111.921199
                      address_held_back: null
                      location_radius_m: null
                      segment: SFR
                      bedrooms: 3
                      sqft: 1430
                      bathrooms: 2
                      year_built: 1959
                    distance_miles: 0.05
                    holder: null
                    listing:
                      status: ACTIVE
                      status_detail: null
                      status_raw: Active
                      off_market_reason: null
                      is_rental: false
                      on_market: true
                      owner_test: null
                      counted: false
                      list_price: 568000
                      price_low: null
                      price_low_on: null
                      price_high: 568000
                      price_high_on: '2026-07-30'
                      listed_on: '2026-07-30'
                      status_updated_on: '2026-07-30'
                      off_market_on: null
                      sold_on: null
                      sold_price: null
                      days_on_market: 46
                      list_to_bought_ratio: null
                      mls_number: '7060213'
                      brokerage_name: Rock Realty & Investments, LLC
                      agents:
                        - role: Listing Agent
                          agent_id: agt_870680a40821
                          identity_basis: LICENSE_NAME
                          agent_is_holder_member: null
                    investorlift:
                      n_listings: 0
                      newest_listed_on: null
                      newest_listing_id: null
                      as_of: '2026-09-09'
                  - property:
                      id: prop_6bb1ec1646a23ad16ea4a502fc6aeb29
                      address_short: 7433 E Cambridge Ave
                      city: SCOTTSDALE
                      state: AZ
                      zip: '85257'
                      latitude: 33.477953
                      longitude: -111.919928
                      address_held_back: null
                      location_radius_m: null
                      segment: SFR
                      bedrooms: 3
                      sqft: 1804
                      bathrooms: 2
                      year_built: 1959
                    distance_miles: 0.08
                    holder: null
                    listing:
                      status: ACTIVE
                      status_detail: null
                      status_raw: Active / Unknown
                      off_market_reason: null
                      is_rental: false
                      on_market: true
                      owner_test: null
                      counted: false
                      list_price: 799000
                      price_low: 799000
                      price_low_on: '2026-08-30'
                      price_high: 799000
                      price_high_on: '2026-08-30'
                      listed_on: '2026-08-28'
                      status_updated_on: '2026-09-01'
                      off_market_on: null
                      sold_on: null
                      sold_price: null
                      days_on_market: 17
                      list_to_bought_ratio: null
                      mls_number: '7067313'
                      brokerage_name: null
                      agents:
                        - role: Listing Agent
                          agent_id: agt_83ed399db6e3
                          identity_basis: LICENSE_NAME
                          agent_is_holder_member: null
                    investorlift:
                      n_listings: 0
                      newest_listed_on: null
                      newest_listing_id: null
                      as_of: '2026-09-09'
                  - property:
                      id: prop_5ccb07e7e6f1948fc3e21942a8cb6b36
                      address_short: 7513 E Cambridge Ave
                      city: SCOTTSDALE
                      state: AZ
                      zip: '85257'
                      latitude: 33.477953
                      longitude: -111.919004
                      address_held_back: null
                      location_radius_m: null
                      segment: SFR
                      bedrooms: 3
                      sqft: 1625
                      bathrooms: 2
                      year_built: 1959
                    distance_miles: 0.11
                    holder:
                      investor_id: inv_6545b05f6338
                      name: BLACK ROCK 16 LP
                      display_name: BLACK ROCK 16 LP
                    listing:
                      status: PENDING
                      status_detail: null
                      status_raw: Pending
                      off_market_reason: null
                      is_rental: false
                      on_market: true
                      owner_test: PASSED
                      counted: true
                      list_price: 715900
                      price_low: null
                      price_low_on: null
                      price_high: 715900
                      price_high_on: '2026-07-07'
                      listed_on: '2026-07-07'
                      status_updated_on: '2026-07-07'
                      off_market_on: null
                      sold_on: null
                      sold_price: null
                      days_on_market: 0
                      list_to_bought_ratio: null
                      mls_number: '7050818'
                      brokerage_name: HomeSmart
                      agents:
                        - role: Listing Agent
                          agent_id: agt_00f054933ded
                          identity_basis: LICENSE_NAME
                          agent_is_holder_member: false
                    investorlift:
                      n_listings: 0
                      newest_listed_on: null
                      newest_listing_id: null
                      as_of: '2026-09-09'
                page:
                  next_cursor: >-
                    eyJ2IjoxLCJydW4iOiIxNzg5NzI5NzgzIiwicSI6ImZkNTZhYThjNjdlNDc5MjhmNTk5NWJhZTM2NDY5NDIwMDM0NjQzNmE1ZTQ4MzkyMDlkMzdlOGMyNmQ5MDI3ZDYiLCJrIjpbMTcyLjI2ODQ2Nzc0MDc5NDEsInBoeCIsIjVjY2IwN2U3ZTZmMTk0OGZjM2UyMTk0MmE4Y2I2YjM2Il19
                  limit: 3
                  returned: 3
                meta:
                  generated_at: '2026-09-20T22:58:55.559Z'
                  reference_point:
                    lat: 33.476917
                    lng: -111.920385
                  geometry:
                    kind: radius
                    lat: 33.476917
                    lng: -111.920385
                    radius_miles: 1
                    bbox: null
                    property_id: null
                    address: null
                    zip: null
                    city: null
                  coverage:
                    - market: phx
                      state: AZ
                      counties:
                        - fips: '04013'
                          name: Maricopa
                          data_end: '2026-08-12'
                        - fips: '04021'
                          name: Pinal
                          data_end: '2026-08-06'
                      bbox:
                        - -113.332773
                        - 32.46915
                        - -110.455491
                        - 33.999503
                      data_end: '2026-08-27'
                      build_run_id: 3
                      registry_run: 12
                      registry_version: v6-auction
                      dataset_version: 1789729783
                      loaded_at: '2026-09-18T11:09:43.434Z'
                      metro_buy_to_resale_ratio: 0.719
                      universe_kind: metro
                      universe_zips: null
                      point_tolerance_miles: 20
                      n_parcels: 1836311
                      listings_data_end: '2026-09-14'
                      agents_data_end: '2026-09-07'
                      wholesale_as_of: '2026-09-09'
                      str_as_of: '2026-09-10'
                      str:
                        jurisdictions:
                          - name: APACHE_JUNCTION
                            regime: NOT_REQUIRED
                            coverage_reason: NO_REQUIREMENT
                            served: false
                            snapshot_only: false
                            licence_start: null
                            snapshot_date: null
                            feed_stale: false
                            sources: []
                            n_licensed: 0
                            n_pending: 0
                            n_expired: 0
                            n_advertised: 0
                            share_unmatched: null
                            share_assumed: null
                          - name: AVONDALE
                            regime: REQUIRED
                            coverage_reason: REQUIRED_NOT_PUBLISHED
                            served: false
                            snapshot_only: false
                            licence_start: null
                            snapshot_date: null
                            feed_stale: false
                            sources: []
                            n_licensed: 0
                            n_pending: 0
                            n_expired: 0
                            n_advertised: 0
                            share_unmatched: null
                            share_assumed: null
                      auction_counted: true
                      parcel_as_of: '2026-08-27'
                      address_as_of: '2026-08-27'
                      parcel:
                        parcel_as_of: '2026-08-27'
                        n_parcels: 1836311
                        sale_mortgage_measured: false
                        financing:
                          as_of: '2026-06-25'
                          dated: true
                          dated_reason: dataset not in current delivery
                          n_parcels: 1611957
                          n_with_open_lien: 1032808
                          n_free_and_clear: 579149
                          n_avm: 1528967
                          n_involuntary: 192400
                          n_lenders: 76212
                        permits:
                          as_of: '2026-09-01'
                          n_permits: 2377496
                          n_parcels: 663045
                          n_unmatched: 355
                          jurisdictions:
                            - jurisdiction: PHOENIX
                              n_permits: 795764
                              last_issue_date: '2026-05-11'
                              windows_measured: true
                            - jurisdiction: MESA
                              n_permits: 330809
                              last_issue_date: '2026-05-29'
                              windows_measured: true
                        owner_profile:
                          as_of: '2026-09-09'
                          n_parcels: 1611077
                          n_multi: 646963
                          n_portfolio_5: 277841
                        history:
                          first_week: '2025-07-24'
                          last_week: '2026-09-09'
                          zips:
                            - '85251'
                          n_parcels: 18774
                          n_events: 236022
                          n_weeks: 62
                          domains:
                            tax:
                              first_week: '2025-07-24'
                              last_week: '2026-09-09'
                              n_events: 18597
                            deed:
                              first_week: '2025-07-24'
                              last_week: '2026-09-09'
                              n_events: 17615
                            sale:
                              first_week: '2025-07-24'
                              last_week: '2026-09-09'
                              n_events: 1700
                            listing:
                              first_week: '2025-07-24'
                              last_week: '2026-09-09'
                              n_events: 21122
                            mailing:
                              first_week: '2025-07-24'
                              last_week: '2026-09-09'
                              n_events: 2128
                            vacancy:
                              first_week: '2025-07-24'
                              last_week: '2026-09-09'
                              n_events: 2583
                            financing:
                              first_week: '2025-12-02'
                              last_week: '2026-06-25'
                              n_events: 6420
                            occupancy:
                              first_week: '2025-07-24'
                              last_week: '2026-09-09'
                              n_events: 1297
                            ownership:
                              first_week: '2025-07-24'
                              last_week: '2026-09-09'
                              n_events: 3238
                            structure:
                              first_week: '2025-07-24'
                              last_week: '2026-09-09'
                              n_events: 2548
                            valuation:
                              first_week: '2025-07-24'
                              last_week: '2026-06-25'
                              n_events: 83657
                            assessment:
                              first_week: '2025-07-24'
                              last_week: '2026-09-09'
                              n_events: 16450
                            owner_profile:
                              first_week: '2025-07-24'
                              last_week: '2026-09-09'
                              n_events: 58404
                            classification:
                              first_week: '2025-07-24'
                              last_week: '2026-09-09'
                              n_events: 263
                      lenders:
                        as_of: '2026-06-25'
                        recordings_through: '2026-06-11'
                        counties:
                          - '04013'
                        history_capture_share: 0.183706
                        n_lender_ids: 32045
                        purchase_measured: true
                        investor_lending_measured: true
                        flips_measured: true
                        borrowers_measured: true
                        takebacks_measured: true
                        counties_measured: false
                        dated: true
                        n_parcels_uncovered: 224192
                  terms: >-
                    Data: Investorlift Data Services. Public-record and MLS
                    listing data licensed through BatchData; municipal
                    short-term rental registries; Investorlift marketplace
                    records. Attribution and data-use terms:
                    https://developers.investorlift.com/guides/terms
                summary:
                  sold:
                    n_listings: 0
                    n_with_sold_date: 0
                    n_with_sold_price: 0
                    median_sold_price: null
                    n_with_price_per_sqft: 0
                    median_sold_price_per_sqft: null
                    n_with_days_on_market: 0
                    median_days_on_market: null
                    min_sample: 5
                    method: 1
                  n_listings: 104
                  by_status:
                    ACTIVE: 96
                    PENDING: 8
                    SOLD: 0
                    OFF_MARKET: 0
                  median_list_price: 577250
                  median_days_on_market: 55.5
                  median_price_per_sqft: 390.84
                  n_with_price_history: 71
                  n_price_cut: 26
                  n_investor_held: 28
                  n_on_investorlift: 5
                  as_of: '2026-09-14'
                  as_of_by_market:
                    - market: phx
                      listings_data_end: '2026-09-14'
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
            X-Rows:
              $ref: '#/components/headers/X-Rows'
            X-Dataset-Version:
              $ref: '#/components/headers/X-Dataset-Version'
            X-Data-End:
              $ref: '#/components/headers/X-Data-End'
            X-Credits-Charged:
              $ref: '#/components/headers/X-Credits-Charged'
            X-Credits-Remaining:
              $ref: '#/components/headers/X-Credits-Remaining'
        '400':
          description: >-
            Bad request (geometry_conflict, geometry_required, invalid_cursor,
            sort_requires_point, unknown_parameter, validation_error)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                geometry_conflict:
                  summary: Geometry conflict
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#geometry_conflict
                    title: Geometry conflict
                    status: 400
                    code: geometry_conflict
                    detail: >-
                      You cannot combine radius_miles with bbox. Send one
                      geometry only.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                geometry_required:
                  summary: Geometry required
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#geometry_required
                    title: Geometry required
                    status: 400
                    code: geometry_required
                    detail: >-
                      The request needs one geometry: lat and lng with
                      radius_miles, bbox, property_id, zip (a list) or city.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                invalid_cursor:
                  summary: Invalid cursor
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#invalid_cursor
                    title: Invalid cursor
                    status: 400
                    code: invalid_cursor
                    detail: >-
                      The API issued the cursor for another query. Restart from
                      page 1.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                sort_requires_point:
                  summary: Sort requires a reference point
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#sort_requires_point
                    title: Sort requires a reference point
                    status: 400
                    code: sort_requires_point
                    detail: >-
                      sort=distance needs a reference point: add lat and lng, or
                      property_id.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                unknown_parameter:
                  summary: Unknown parameter
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#unknown_parameter
                    title: Unknown parameter
                    status: 400
                    code: unknown_parameter
                    detail: >-
                      The query carries a parameter this endpoint does not
                      define: kind[]. Write the list as kind=flip,hold or as
                      repeated keys.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    errors:
                      - param: kind[]
                        message: unknown parameter
                        code: unknown_parameter
                validation_error:
                  summary: Validation error
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#validation_error
                    title: Validation error
                    status: 400
                    code: validation_error
                    detail: radius_miles must be 20 or less.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    errors:
                      - param: radius_miles
                        message: must be 20 or less
                        code: too_big
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '401':
          description: Unauthorized (unauthorized)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                unauthorized:
                  summary: Unauthorized
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#unauthorized
                    title: Unauthorized
                    status: 401
                    code: unauthorized
                    detail: 'Send Authorization: Bearer with a current key.'
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '403':
          description: >-
            Forbidden (payment_overdue, plan_limit, quota_exceeded,
            subscription_required)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                payment_overdue:
                  summary: Payment overdue
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#payment_overdue
                    title: Payment overdue
                    status: 403
                    code: payment_overdue
                    detail: >-
                      The subscription's payment is overdue and the grace period
                      passed. Update the card under Manage Billing in the
                      developer console.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                plan_limit:
                  summary: Plan limit
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#plan_limit
                    title: Plan limit
                    status: 403
                    code: plan_limit
                    detail: >-
                      The free plan searches within 5 miles of a point, a
                      viewport up to 10 miles across, or one ZIP code. Your zip
                      parameter lists 2 ZIP codes. Upgrade in the developer
                      console for city-wide and multi-ZIP searches.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    tier: free
                    limit: geometry
                    max_radius_miles: 5
                    max_bbox_diagonal_miles: 10
                    max_zips: 1
                quota_exceeded:
                  summary: Quota exceeded
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#quota_exceeded
                    title: Quota exceeded
                    status: 403
                    code: quota_exceeded
                    detail: >-
                      Your requests spent the plan's credits for this billing
                      period (5000 of 5000). Wait for the period to reset on the
                      subscription's billing date, or upgrade in the developer
                      console.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    used: 5000
                    line: 5000
                subscription_required:
                  summary: Subscription required
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#subscription_required
                    title: Subscription required
                    status: 403
                    code: subscription_required
                    detail: >-
                      This key has no active plan subscription. Subscribe in the
                      developer console.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '404':
          description: Not found (not_found)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                not_found:
                  summary: Not found
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#not_found
                    title: Not found
                    status: 404
                    code: not_found
                    detail: No such deal in any loaded market.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '406':
          description: Not acceptable (not_acceptable)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                not_acceptable:
                  summary: Not acceptable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#not_acceptable
                    title: Not acceptable
                    status: 406
                    code: not_acceptable
                    detail: >-
                      Accept text/html names no representation this endpoint
                      produces (application/json).
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '422':
          description: >-
            Unprocessable (addresses_unavailable, ambiguous_address,
            listings_unavailable, outside_coverage, wholesale_unavailable)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                addresses_unavailable:
                  summary: Addresses unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#addresses_unavailable
                    title: Addresses unavailable
                    status: 422
                    code: addresses_unavailable
                    detail: >-
                      No market has a published address table:
                      meta.coverage[].address_as_of is null on every market.
                      Resolve by lat / lng or apn until the sql/22j step runs.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                ambiguous_address:
                  summary: Ambiguous address
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#ambiguous_address
                    title: Ambiguous address
                    status: 422
                    code: ambiguous_address
                    detail: >-
                      7522 E Cholla St in ZIP 85254 names 3 parcels. Pass unit=
                      to pick one. candidates[] lists them. Call GET
                      /v1/properties/{property_id} with the one you mean.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    truncated: false
                    candidates:
                      - id: prop_0a1b2c3d4e5f60718293a4b5c6d7e8f9
                        unit: '1'
                        n_deals: 2
                listings_unavailable:
                  summary: Listings unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#listings_unavailable
                    title: Listings unavailable
                    status: 422
                    code: listings_unavailable
                    detail: >-
                      You gave listing_status for a market with no published
                      listing tables. See meta.coverage[].listings_data_end.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                outside_coverage:
                  summary: Outside coverage
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#outside_coverage
                    title: Outside coverage
                    status: 422
                    code: outside_coverage
                    detail: >-
                      The point 40.712776, -74.005974 lies outside every loaded
                      market's point tolerance. Read the loaded markets and
                      their boxes from markets[] when present, and from
                      meta.coverage[].bbox and point_tolerance_miles on any list
                      response.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                wholesale_unavailable:
                  summary: Wholesale transactions unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#wholesale_unavailable
                    title: Wholesale transactions unavailable
                    status: 422
                    code: wholesale_unavailable
                    detail: >-
                      This market has no published Investorlift wholesale
                      tables. See meta.coverage[].wholesale_as_of.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '429':
          description: Rate limited, with Retry-After (rate_limited)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                rate_limited:
                  summary: Rate limited
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#rate_limited
                    title: Rate limited
                    status: 429
                    code: rate_limited
                    detail: >-
                      The request exceeded the per-key budget. Retry in 12
                      seconds.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    retry_after: 12
                    bucket: key
          headers:
            Retry-After:
              $ref: '#/components/headers/Retry-After'
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '500':
          description: Internal error (internal_error)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                internal_error:
                  summary: Internal error
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#internal_error
                    title: Internal error
                    status: 500
                    code: internal_error
                    detail: The request failed. Quote request_id when you report it.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '503':
          description: >-
            Unavailable, with Retry-After on pool_saturated and
            ledger_unavailable (database_unavailable, ledger_unavailable,
            pool_saturated)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                database_unavailable:
                  summary: Database unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#database_unavailable
                    title: Database unavailable
                    status: 503
                    code: database_unavailable
                    detail: >-
                      The service failed to reach the database and did not run
                      the request.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                ledger_unavailable:
                  summary: Ledger unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#ledger_unavailable
                    title: Ledger unavailable
                    status: 503
                    code: ledger_unavailable
                    detail: >-
                      The credit ledger is unreachable. The API charged nothing.
                      Retry in 5 seconds.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    retry_after: 5
                pool_saturated:
                  summary: Pool saturated
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#pool_saturated
                    title: Pool saturated
                    status: 503
                    code: pool_saturated
                    detail: >-
                      No pooled connection was free. The service did not run the
                      request.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            Retry-After:
              $ref: '#/components/headers/Retry-After'
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '504':
          description: Statement timeout (statement_timeout)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                statement_timeout:
                  summary: Statement timeout
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#statement_timeout
                    title: Statement timeout
                    status: 504
                    code: statement_timeout
                    detail: >-
                      The query exceeded the 10 second statement timeout. Narrow
                      the geometry or filters.
                    instance: /v1/listings
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
components:
  schemas:
    ListingsResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/SaleListingRow'
          description: The rows of this page.
        page:
          $ref: '#/components/schemas/Page'
        meta:
          $ref: '#/components/schemas/Meta'
        summary:
          $ref: '#/components/schemas/SaleListingSummary'
      required:
        - data
        - page
        - meta
        - summary
      additionalProperties: false
    Problem:
      type: object
      properties:
        type:
          type: string
          description: >-
            URI of the problem: the Errors page of the documentation site,
            anchored at the code.
        title:
          type: string
          description: Short human-readable summary of the problem code.
        status:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: HTTP status.
        code:
          type: string
          description: >-
            Stable machine-readable code from the catalogue at
            https://developers.investorlift.com/problems.json.
        detail:
          type: string
          description: Human-readable explanation specific to this occurrence.
        instance:
          type: string
          description: Request path.
        request_id:
          type: string
          description: Request id to quote when you report a problem.
        errors:
          description: Per-parameter validation failures (400 only).
          type: array
          items:
            type: object
            properties:
              param:
                description: >-
                  The offending parameter. Null when the problem is not about
                  one parameter.
                type:
                  - string
                  - 'null'
              message:
                type: string
                description: What is wrong with it.
              code:
                type: string
                description: Machine-readable reason, for example invalid_enum_value.
            required:
              - param
              - message
              - code
            additionalProperties: false
            description: One validation failure.
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - request_id
      additionalProperties: {}
      description: >-
        RFC 9457 problem details (application/problem+json). Some codes add
        extra fields beside these: superseded_by, candidates, n_deals, cap,
        suggestion, markets, retry_after.
    SaleListingRow:
      type: object
      properties:
        property:
          $ref: '#/components/schemas/WholesaleParcel'
          description: >-
            Parcel facts from the assessor. The same stub appears on all three
            nearby listing routes.
        distance_miles:
          description: Miles from the reference point. Null when no reference point exists.
          type:
            - number
            - 'null'
        holder:
          anyOf:
            - type: object
              properties:
                investor_id:
                  type: string
                  pattern: ^inv_[0-9a-f]{12}$
                  description: >-
                    The current registry holder. This ID does not prove who
                    offered an older listing.
                name:
                  description: >-
                    Registry name of the holder. Null when the registry has no
                    matching row.
                  type:
                    - string
                    - 'null'
                display_name:
                  description: >-
                    Name to display for the registry holder. Null when no name
                    exists.
                  type:
                    - string
                    - 'null'
              required:
                - investor_id
                - name
                - display_name
              additionalProperties: false
            - type: 'null'
          description: >-
            Current registry holder at the deed data end. Null when no registry
            holder exists. The owner test describes the listing relationship.
        listing:
          $ref: '#/components/schemas/Listing'
          description: Newest MLS listing on this parcel.
        investorlift:
          anyOf:
            - type: object
              properties:
                n_listings:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                  description: >-
                    Publicly linked listings on this parcel at any time. Hidden
                    parcel links never count.
                newest_listed_on:
                  anyOf:
                    - type: string
                      format: date
                      description: Calendar date, YYYY-MM-DD.
                    - type: 'null'
                  description: Newest public listing date. Null when the count is zero.
                newest_listing_id:
                  anyOf:
                    - type: string
                      pattern: ^wl_[0-9a-f]{32}$
                      description: >-
                        Investorlift listing id: wl_ followed by 32 hex
                        characters, for example
                        wl_9f2c1d0e8b7a6c5d4e3f2a1b0c9d8e7f. The id is stable
                        per Investorlift listing and the same in every market.
                        It is the key to GET `/v1/wholesale-listings/{id}`. The
                        prefix is part of the id.
                    - type: 'null'
                  description: >-
                    ID of the newest public listing. Null when the count is
                    zero.
                as_of:
                  type: string
                  format: date
                  description: Date of the Investorlift export behind this block.
              required:
                - n_listings
                - newest_listed_on
                - newest_listing_id
                - as_of
              additionalProperties: false
            - type: 'null'
          description: >-
            Public Investorlift listings on this parcel. Null when the market
            lacks wholesale coverage.
      required:
        - property
        - distance_miles
        - holder
        - listing
        - investorlift
    Page:
      type: object
      properties:
        next_cursor:
          description: >-
            Opaque cursor for the next page: pass it back as cursor= with the
            same query. Null on the last page.
          type:
            - string
            - 'null'
        limit:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: The page size the API applied.
        returned:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Rows in this page.
      required:
        - next_cursor
        - limit
        - returned
      additionalProperties: false
      description: >-
        Pagination: the page size, the rows returned and the cursor for the next
        page. Paged lists carry no total. The summary block does.
    Meta:
      type: object
      properties:
        generated_at:
          type: string
          format: date-time
          description: >-
            When the API produced this response, ISO 8601. It does not change
            the ETag.
        weights:
          description: >-
            The effective match weights, one per factor, rounded to 4 decimals
            (buyers/match only). The API rescales the weights of the scored
            factors to sum 1 before it reports them.
          type: object
          propertyNames:
            type: string
          additionalProperties:
            type: number
        reference_point:
          description: >-
            The point the API measures every distance in the response from: lat
            + lng, or the centre of the property_id parcel. Absent with a bare
            bbox.
          type: object
          properties:
            lat:
              type: number
              minimum: -90
              maximum: 90
              description: Latitude of the reference point.
            lng:
              type: number
              minimum: -180
              maximum: 180
              description: Longitude of the reference point.
          required:
            - lat
            - lng
          additionalProperties: false
        geometry:
          $ref: '#/components/schemas/MetaGeometry'
          description: >-
            The location that ran, defaults filled and keyed as the query is
            (see MetaGeometry), on REST only: the MCP meta carries
            reference_point alone. Present on every route that takes a location:
            the deal lists, summary and cells, the investors, wholesale listings
            and short-term rental parcels, and `/v1/buyers/match`. Also on the
            comps of a parcel, kind radius around the subject and property_id
            the subject, and on POST `/v1/properties/search` (a county-only body
            echoes nothing). The lender list and a lender's loans carry it when
            you gave a geometry, a zip or a city. They apply a geometry as the
            H3 res-8 cells whose centre lies inside it, and echo no county,
            because MetaGeometry has no county slot. Absent on a route with no
            location, and on `/v1/properties/resolve`, whose lat + lng is a hint
            for the nearest parcel, not an area that ran.
        resolved_from:
          description: >-
            Present when an id in the request was an old id from an earlier data
            refresh: the old ids the API followed, in order. The ids are the
            investor id, from the path or the investor_id filter, the agent id
            and the lender id. The lender id comes from the path of the lender
            routes, the financed_by filter or filters.financing.lender_id. Store
            the id the response carries, not the old one.
          type: array
          items:
            type: string
            pattern: ^(inv|agt|len)_[0-9a-f]{12}$
            description: >-
              An investor id (inv_...), a listing agent id (agt_...) or a lender
              id (len_...).
        coverage:
          type: array
          items:
            $ref: '#/components/schemas/Coverage'
          description: >-
            The markets the response draws on, with their counties, data end
            dates and data versions.
        dated:
          description: >-
            Present when the response carries a block that is a dated snapshot
            at its as-of date, not current data. Those blocks are the financing,
            lien and valuation blocks of the parcel products. One entry per
            dated block, with its as-of date. Absent when nothing in the
            response is dated.
          type: array
          items:
            $ref: '#/components/schemas/Dated'
        terms:
          type: string
          description: Attribution and data-use terms for the data in this response.
      required:
        - generated_at
        - coverage
        - terms
      additionalProperties: false
      description: >-
        Response metadata: when the API produced it, which markets it covers,
        and how fresh they are.
    SaleListingSummary:
      type: object
      properties:
        sold:
          type: object
          properties:
            n_listings:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Matching sold listings.
            n_with_sold_date:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Matching sold listings with a closing date.
            n_with_sold_price:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Matching sold listings with a positive closing price.
            median_sold_price:
              description: >-
                Median closing price in whole US dollars. Null below five usable
                prices.
              type:
                - number
                - 'null'
            n_with_price_per_sqft:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: >-
                Sold houses and condos with a positive closing price and
                positive living area.
            median_sold_price_per_sqft:
              description: >-
                Median closing price per square foot of living area, in US
                dollars to two decimals. Null below five usable observations.
              type:
                - number
                - 'null'
            n_with_days_on_market:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Matching sold listings with a valid nonnegative duration.
            median_days_on_market:
              description: >-
                Median sold listing duration in days, to two decimals. Null
                below five usable durations.
              type:
                - number
                - 'null'
            min_sample:
              type: number
              const: 5
              description: Each sold metric needs this many usable observations.
            method:
              type: number
              const: 1
              description: Version of the sold statistics method.
          required:
            - n_listings
            - n_with_sold_date
            - n_with_sold_price
            - median_sold_price
            - n_with_price_per_sqft
            - median_sold_price_per_sqft
            - n_with_days_on_market
            - median_days_on_market
            - min_sample
            - method
          additionalProperties: false
          description: >-
            Sold statistics over all matches before pagination. Counts remain
            visible below each metric sample floor.
        n_listings:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Matching listings before the cursor and page limit.
        by_status:
          type: object
          properties:
            ACTIVE:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Active rows.
            PENDING:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Pending rows.
            SOLD:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Sold rows.
            OFF_MARKET:
              type: integer
              minimum: 0
              maximum: 9007199254740991
              description: Ended rows.
          required:
            - ACTIVE
            - PENDING
            - SOLD
            - OFF_MARKET
          additionalProperties: false
          description: Count for each normalized status.
        median_list_price:
          description: Median asking sale price in whole US dollars. Null without prices.
          type:
            - number
            - 'null'
        median_days_on_market:
          description: Median source duration in days. Null without durations.
          type:
            - number
            - 'null'
        median_price_per_sqft:
          description: >-
            Median asking sale price for each square foot of living area, in US
            dollars to two decimals. Only SFR and CONDO_TH rows with a price and
            a positive area count. Null without such rows.
          type:
            - number
            - 'null'
        n_with_price_history:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: >-
            Matching listings that carry an asking price and the highest asking
            price of the listing.
        n_price_cut:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: >-
            Matching listings whose asking price is below the highest asking
            price of the listing. Divide by n_with_price_history for the share
            with a price cut.
        n_investor_held:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: Matching listings whose ownership test is PASSED.
        n_on_investorlift:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Matching parcels with public Investorlift listings. Null unless
            every selected market has wholesale coverage.
        as_of:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            Common source date when all selected markets share it. Null when
            their dates differ.
        as_of_by_market:
          type: array
          items:
            type: object
            properties:
              market:
                type: string
                description: Market code.
              listings_data_end:
                type: string
                format: date
                description: Listing source date for this market.
            required:
              - market
              - listings_data_end
            additionalProperties: false
          description: >-
            Source dates for every selected market, including markets with no
            matching rows.
      required:
        - sold
        - n_listings
        - by_status
        - median_list_price
        - median_days_on_market
        - median_price_per_sqft
        - n_with_price_history
        - n_price_cut
        - n_investor_held
        - n_on_investorlift
        - as_of
        - as_of_by_market
      additionalProperties: false
    WholesaleParcel:
      type: object
      properties:
        id:
          type: string
          pattern: ^prop_[0-9a-f]{32}$
          description: >-
            Parcel id, prop_ followed by 32 hex characters: the key to GET
            `/v1/properties/{property_id}`.
        address_short:
          description: >-
            Situs street address in title case, for example "7522 E Cholla St".
            Null when the parcel is not in the parcel table. Null also while the
            property is listed on Investorlift: see address_held_back.
          type:
            - string
            - 'null'
        city:
          description: City, upper case. Null when unknown.
          type:
            - string
            - 'null'
        state:
          description: 2-letter state. Null when unknown.
          type:
            - string
            - 'null'
        zip:
          description: 5-digit ZIP. Null when unknown.
          type:
            - string
            - 'null'
        latitude:
          anyOf:
            - type: number
              minimum: -90
              maximum: 90
              description: WGS84 latitude.
            - type: 'null'
          description: >-
            WGS84 latitude of the parcel. Null when it has no geocode. An
            approximate value while the property is listed on Investorlift: see
            location_radius_m.
        longitude:
          anyOf:
            - type: number
              minimum: -180
              maximum: 180
              description: WGS84 longitude.
            - type: 'null'
          description: >-
            WGS84 longitude of the parcel. Null when it has no geocode. An
            approximate value while the property is listed on Investorlift: see
            location_radius_m.
        address_held_back:
          description: >-
            The reason that the API holds the address of the property back. The
            value listed_on_investorlift means that a wholesaler lists the
            property on Investorlift now, and the deed records show no transfer
            after the listing. Then the street line, the unit and the APN are
            null, and the point is approximate. Null for each other property.
          type:
            - string
            - 'null'
        location_radius_m:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            The radius in metres of the circle to draw around latitude and
            longitude: 1200 while the property is listed on Investorlift. The
            circle always contains the true point. Null when the point is exact,
            and when the row has no point.
        segment:
          anyOf:
            - type: string
              enum:
                - SFR
                - CONDO_TH
                - OTHER
              description: >-
                Parcel segment: SFR, CONDO_TH (condo or townhouse) or OTHER, a
                mixed bucket of manufactured, multi-family, land and commercial
                parcels.
            - type: 'null'
          description: >-
            Null when unknown. Parcel segment: SFR, CONDO_TH (condo or
            townhouse) or OTHER, a mixed bucket of manufactured, multi-family,
            land and commercial parcels.
        bedrooms:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Bedrooms per the assessor. Null when the assessor roll does not
            report them.
        sqft:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            The living area in square feet. Null when the assessor roll does not
            report it.
        bathrooms:
          description: Bathrooms per the assessor. Null when unknown.
          type:
            - number
            - 'null'
        year_built:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: Year built per the assessor. Null when unknown.
      required:
        - id
        - address_short
        - city
        - state
        - zip
        - latitude
        - longitude
        - address_held_back
        - location_radius_m
        - segment
        - bedrooms
        - sqft
        - bathrooms
        - year_built
      additionalProperties: false
      description: >-
        The parcel the API matched the Investorlift listing to. Null on a
        hidden-address listing, where the company hid the address on its own
        site, with no closing deed by the deed data_end. Such a listing is
        reachable under the wholesaler only.
    Listing:
      type: object
      properties:
        status:
          type: string
          enum:
            - ACTIVE
            - PENDING
            - SOLD
            - OFF_MARKET
          description: >-
            The listing's status in the feed, normalised. ACTIVE means on the
            market, and PENDING means under contract, contingent or not. SOLD
            means the listing sold, or any listing whose sale date is on or
            after its listing date: the sale is the later fact. OFF_MARKET means
            the listing ended without a sale: cancelled, expired or withdrawn
            (see off_market_reason). Only ACTIVE and PENDING are on the market.
        status_detail:
          anyOf:
            - type: string
              enum:
                - NEW
                - PRICE_CHANGE
                - COMING_SOON
                - BACK_ON_MARKET
                - CONTINGENT
                - UNDER_CONTRACT
              description: >-
                The feed's sub-status of an ACTIVE or PENDING listing. NEW means
                just listed, PRICE_CHANGE means the price moved, and COMING_SOON
                means announced, before showings start. BACK_ON_MARKET means a
                contract fell through. CONTINGENT means under contract with
                contingencies, and UNDER_CONTRACT means under contract. Null
                when the feed gives none. Always null on SOLD and OFF_MARKET
                rows, where the sub-status is stale.
            - type: 'null'
          description: >-
            Null when the feed gives no sub-status, and on SOLD and OFF_MARKET
            rows. The feed's sub-status of an ACTIVE or PENDING listing. NEW
            means just listed, PRICE_CHANGE means the price moved, and
            COMING_SOON means announced, before showings start. BACK_ON_MARKET
            means a contract fell through. CONTINGENT means under contract with
            contingencies, and UNDER_CONTRACT means under contract. Null when
            the feed gives none. Always null on SOLD and OFF_MARKET rows, where
            the sub-status is stale.
        status_raw:
          type: string
          description: >-
            The feed's own status and sub-status, for diagnosis, for example
            "Active / Price Change" or "Failed / Canceled". Do not branch on it:
            use status and status_detail.
        off_market_reason:
          anyOf:
            - type: string
              enum:
                - CANCELED
                - EXPIRED
                - OFF_MARKET
              description: >-
                Why an OFF_MARKET listing ended. CANCELED means the seller
                cancelled, and EXPIRED means the listing agreement ran out.
                OFF_MARKET means withdrawn or temporarily off the market, and
                the feed says no more. Null on every other status.
            - type: 'null'
          description: >-
            Only on OFF_MARKET rows, null otherwise. Why an OFF_MARKET listing
            ended. CANCELED means the seller cancelled, and EXPIRED means the
            listing agreement ran out. OFF_MARKET means withdrawn or temporarily
            off the market, and the feed says no more. Null on every other
            status.
        is_rental:
          type: boolean
          description: >-
            True when the feed flags the listing as a rental, or when its asking
            price is under $10,000. That is a monthly rent in the sale price
            field of a row the feed did not flag: about 1 in 40 active rows. A
            rental listing keeps its status but is never on the market and never
            counts.
        on_market:
          type: boolean
          description: >-
            True when status is ACTIVE or PENDING and the listing is not a
            rental. The parcel is then for sale at the listing data end date
            (meta.coverage[].listings_data_end). A parcel fact, independent of
            who owns it.
        owner_test:
          anyOf:
            - type: string
              enum:
                - PASSED
                - FAILED
                - UNDATED
                - NOT_HOLDER
              description: >-
                The ownership test: if the listing belongs to the investor
                holding the parcel at the deed data end date
                (meta.coverage[].data_end). PASSED: listed on or after the
                holder's purchase date, so it is their listing. FAILED: listed
                before the purchase, so it is the listing they bought under or
                an older one, never their inventory. UNDATED: the holding has no
                purchase date, so the test cannot run, and the API shows and
                flags the listing but does not count it. NOT_HOLDER, on a deal
                row only: this row is not the parcel's current hold deal, and
                another investor holds the parcel. Null when the parcel has no
                investor holding: a household, a public body or an unregistered
                owner.
            - type: 'null'
          description: >-
            Null when the parcel has no investor holding. The ownership test: if
            the listing belongs to the investor holding the parcel at the deed
            data end date (meta.coverage[].data_end). PASSED: listed on or after
            the holder's purchase date, so it is their listing. FAILED: listed
            before the purchase, so it is the listing they bought under or an
            older one, never their inventory. UNDATED: the holding has no
            purchase date, so the test cannot run, and the API shows and flags
            the listing but does not count it. NOT_HOLDER, on a deal row only:
            this row is not the parcel's current hold deal, and another investor
            holds the parcel. Null when the parcel has no investor holding: a
            household, a public body or an unregistered owner.
        counted:
          type: boolean
          description: >-
            True when on_market is true and owner_test is PASSED: exactly the
            rows the investor's listings rollup (n_active, n_pending) counts.
            The API shows everything else for context and never counts it.
        list_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            The current asking price, whole dollars, for example 289000. Null,
            never 0, when the feed has none.
        price_low:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            The lowest asking price this listing carried, whole dollars. Null
            when the feed has none, and null when the feed's price history
            predates this listing (a prior listing's range).
        price_low_on:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: When the listing carried price_low, YYYY-MM-DD. Null with price_low.
        price_high:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            The highest asking price this listing carried, whole dollars. Null
            under the same rule as price_low.
        price_high_on:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            When the listing carried price_high, YYYY-MM-DD. Null with
            price_high.
        listed_on:
          type: string
          format: date
          description: >-
            When the listing went live, YYYY-MM-DD (the feed's original listing
            date). Always set.
        status_updated_on:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            When the feed last changed the status, YYYY-MM-DD: the row's own
            as-of date. Null when the feed gives none.
        off_market_on:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            When an OFF_MARKET listing ended, YYYY-MM-DD. Null on every other
            status, and when the feed's end date predates the listing.
        sold_on:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: When a SOLD listing closed, YYYY-MM-DD. Null on every other status.
        sold_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            What a SOLD listing closed at, whole dollars. Null on every other
            status, and when the feed has no price.
        days_on_market:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Days from listed_on to the status's end date: ACTIVE to the listing
            data end date (meta.coverage[].listings_data_end), PENDING to
            status_updated_on, SOLD to sold_on, OFF_MARKET to off_market_on.
            Null when that end date is unknown or earlier than listed_on. Never
            measured from the request time.
        list_to_bought_ratio:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            list_price divided by what the investor paid, rounded to 4 decimals,
            for example 1.3182: an asking price 32% above the purchase. On hold
            deal rows only. Null on the property row, and when either price is
            unknown, as for most Texas purchases.
        mls_number:
          description: >-
            The MLS listing number as the feed writes it, for example "6812345".
            Null when the feed has none.
          type:
            - string
            - 'null'
        brokerage_name:
          description: >-
            The listing brokerage: the brokerage name the feed writes, else the
            listing office's corporate name from the feed's office record. The
            two never overlap. Set on about half of all listing rows. Null when
            the feed carries neither. On the rows on the market the feed carries
            neither on most rows, so expect it on a fifth or fewer there. Served
            to every key.
          type:
            - string
            - 'null'
        agents:
          type: array
          items:
            $ref: '#/components/schemas/ListingAgent'
          description: >-
            The listing agents, usually one. Empty when the feed names none.
            This host does not serve the identifying fields of each agent. The
            array itself is always present.
      required:
        - status
        - status_detail
        - status_raw
        - off_market_reason
        - is_rental
        - on_market
        - owner_test
        - counted
        - list_price
        - price_low
        - price_low_on
        - price_high
        - price_high_on
        - listed_on
        - status_updated_on
        - off_market_on
        - sold_on
        - sold_price
        - days_on_market
        - list_to_bought_ratio
        - mls_number
        - brokerage_name
        - agents
      additionalProperties: false
      description: >-
        The MLS listing on a parcel: the latest listing the feed knows, its
        status and prices, and the listing agent. The block says if the listing
        belongs to the investor holding the parcel. Measured at the listing data
        end date, never the clock.
    MetaGeometry:
      type: object
      properties:
        kind:
          type: string
          enum:
            - radius
            - bbox
            - place
          description: >-
            Which location ran: radius, bbox or place. A radius uses a point, a
            parcel ID, or a resolved address. A bbox is a viewport. A place is a
            ZIP list or a postal city.
        lat:
          anyOf:
            - type: number
              minimum: -90
              maximum: 90
              description: WGS84 latitude.
            - type: 'null'
          description: >-
            The centre of the radius, or the reference point you gave beside a
            bbox or a place. For a property_id request the centre is the parcel
            centroid. Null when a bbox or a place had no reference point.
        lng:
          anyOf:
            - type: number
              minimum: -180
              maximum: 180
              description: WGS84 longitude.
            - type: 'null'
          description: The longitude beside lat. Null when lat is null.
        radius_miles:
          description: >-
            The radius that ran, in miles: the value you sent, or the default
            when you sent none. The default is 2 on the GET lists and 1 around
            property_id on POST `/v1/properties/search`. Null for a bbox or a
            place.
          type:
            - number
            - 'null'
        bbox:
          anyOf:
            - type: array
              prefixItems:
                - type: number
                  minimum: -180
                  maximum: 180
                  description: West edge (longitude).
                - type: number
                  minimum: -90
                  maximum: 90
                  description: South edge (latitude).
                - type: number
                  minimum: -180
                  maximum: 180
                  description: East edge (longitude).
                - type: number
                  minimum: -90
                  maximum: 90
                  description: North edge (latitude).
              items: false
              minItems: 4
              maxItems: 4
              description: '[west, south, east, north] in WGS84 degrees.'
            - type: 'null'
          description: >-
            The viewport as [west, south, east, north] in WGS84 degrees. Null
            unless kind is bbox.
        property_id:
          anyOf:
            - type: string
              pattern: ^prop_[0-9a-f]{32}$
              description: >-
                Parcel id: prop_ followed by 32 hex characters, for example
                prop_e93c776c53354a88de4e58448a6bf21b. The prefix is part of the
                id.
            - type: 'null'
          description: >-
            The parcel at the centre of the radius. Null unless the request
            named property_id.
        address:
          description: >-
            Resolved situs line for an address search. Null for other location
            forms. This field describes the resolved parcel.
          type:
            - string
            - 'null'
        zip:
          anyOf:
            - type: array
              items:
                type: string
                pattern: ^\d{5}$
            - type: 'null'
          description: >-
            The ZIP list as you sent it, for example ["85251", "85257"]. Null
            unless kind is place and the request named ZIPs.
        city:
          description: >-
            The postal city as the API compared it: trimmed and folded to upper
            case ("Scottsdale" ran as "SCOTTSDALE"). Null unless kind is place
            and the request named a city.
          type:
            - string
            - 'null'
        location_radius_m:
          description: >-
            Present when the property at the centre is listed on Investorlift.
            Then lat and lng are an approximate point, address is null, and this
            value is the radius in metres of the circle that contains the true
            point. The API measures each distance from the true point.
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
      required:
        - kind
        - lat
        - lng
        - radius_miles
        - bbox
        - property_id
        - address
        - zip
        - city
      additionalProperties: false
      description: >-
        The location the API computed the response over, as it ran: defaults
        filled, a parcel resolved to its centroid, a city folded. Copy it back
        as the query to repeat the request.
    Coverage:
      type: object
      properties:
        market:
          type: string
          description: Market code, for example phx. One entry per loaded market.
        state:
          type: string
          description: >-
            2-letter state of the market. The loaded markets and their states
            are in meta.coverage[].
        counties:
          type: array
          items:
            type: object
            properties:
              fips:
                type: string
                description: The 5-digit county FIPS code, for example 04013.
              name:
                type: string
                description: County name, for example Maricopa.
              data_end:
                anyOf:
                  - type: string
                    format: date
                    description: Calendar date, YYYY-MM-DD.
                  - type: 'null'
                description: >-
                  The last deed date on file for this county, YYYY-MM-DD. Null
                  when the county carries no dated deed.
            required:
              - fips
              - name
              - data_end
            additionalProperties: false
            description: One county the loaded area lies in.
          description: >-
            The counties the loaded area lies in, each with its own data end
            date. For a zip market the list names the county, but the loaded
            area is only the ZIP (see universe_kind).
        bbox:
          type: array
          prefixItems:
            - type: number
              minimum: -180
              maximum: 180
              description: West edge (longitude).
            - type: number
              minimum: -90
              maximum: 90
              description: South edge (latitude).
            - type: number
              minimum: -180
              maximum: 180
              description: East edge (longitude).
            - type: number
              minimum: -90
              maximum: 90
              description: North edge (latitude).
          items: false
          minItems: 4
          maxItems: 4
          description: >-
            The rectangle (west, south, east, north) that encloses every deal in
            the market: the initial map viewport and, with
            point_tolerance_miles, the limit for outside_coverage.
        data_end:
          type: string
          format: date
          description: >-
            The last deed date in the data, YYYY-MM-DD. The API measures every
            "days since" value from this data_end, never from the request time.
        build_run_id:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Which pipeline build produced the data. Informational: use
            dataset_version for caching. Null when the data does not record it.
        registry_run:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Which investor registry run produced the data. Informational: use
            dataset_version for caching. Null when the data does not record it.
        registry_version:
          description: >-
            Which registry code version produced the data. Informational: use
            dataset_version for caching. Null when the data does not record it.
          type:
            - string
            - 'null'
        dataset_version:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Version of the loaded data, an integer that grows with every
            refresh. It is the cache key and the ETag, and every cursor binds to
            it.
        loaded_at:
          type: string
          format: date-time
          description: When this data version went live, ISO 8601.
        metro_buy_to_resale_ratio:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            The median of purchase price divided by resale price over the
            market's priced flips since 2021. For example, 0.72 means flippers
            pay about 72% of the resale price. The price_fit factor uses it when
            an investor has too few flips of their own. Null when no priced
            flips exist.
        universe_kind:
          anyOf:
            - type: string
              enum:
                - zip
                - county
                - metro
              description: >-
                The area every count in this market covers: metro, county or
                zip. A metro market covers whole counties. A county market
                covers one county. The market cannot see what an investor did in
                the neighbouring counties. A zip market covers one or more ZIP
                codes. The market cannot see what an investor did outside them,
                a larger gap. In a county or zip market every investor count,
                price band, scale tier and confidence is a floor.
            - type: 'null'
          description: >-
            Null when the market row does not record it, a seed older than the
            column. The area every count in this market covers: metro, county or
            zip. A metro market covers whole counties. A county market covers
            one county. The market cannot see what an investor did in the
            neighbouring counties. A zip market covers one or more ZIP codes.
            The market cannot see what an investor did outside them, a larger
            gap. In a county or zip market every investor count, price band,
            scale tier and confidence is a floor.
        universe_zips:
          anyOf:
            - type: array
              items:
                type: string
                description: A 5-digit ZIP.
            - type: 'null'
          description: >-
            The ZIP codes of a zip universe, for example ["77088"]. Null for
            county and metro markets.
        point_tolerance_miles:
          type: number
          description: >-
            How far outside bbox a point can lie and get an answer, in miles: 20
            for a metro, 2 for a county market. The point is lat + lng, or the
            centre of a property_id parcel. Farther out, the API answers 422
            outside_coverage. A bbox must intersect the coverage bbox.
        n_parcels:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Parcels in the loaded area, the universe every count covers. Null
            when the data does not record it.
        listings_data_end:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The as-of date of the MLS listing feed for this market, YYYY-MM-DD:
            the newest status update among its listing rows, later than
            data_end. The deeds and the listings arrive in one delivery, each
            with its own end. The API measures every listing window
            (days_on_market, n_listed_12m) against this date. Null when this
            market has no published listing tables. Every listing block and
            listings rollup is null then, and the correct reading is "no listing
            data".
        agents_data_end:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The as-of date of the listing set behind the agent registry of this
            market, YYYY-MM-DD. It equals listings_data_end when the registry is
            current. It is earlier when a refresh moved the listings but left
            the agents on the older set. Null when this market has no published
            agent tables. Then every agent_id, identity_basis and
            agent_is_holder_member on the listing agents is null, and the
            investor profile carries has_licensed_member and agent_links null.
            The /v1/agents routes then answer 422 agents_unavailable.
        wholesale_as_of:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The date of the Investorlift export behind the market's wholesale
            transactions, YYYY-MM-DD. Every Investorlift listing published up to
            this date is on file. The API measures every wholesale window
            (n_listed_12m, n_bought_via_investorlift_12m) against the deed
            data_end. Null when this market has no published wholesale tables.
            Then every wholesale_listing block on deal rows, wholesale_purchases
            block on investor rows and wholesale_listings[] on a parcel is null.
            Then /v1/wholesale-listings, /v1/wholesalers,
            `/v1/investors/{id}/wholesale-purchases` and the source=investorlift
            and bought_on_investorlift filters answer 422 wholesale_unavailable.
        str_as_of:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The short-term rental snapshot of this market, YYYY-MM-DD: the
            oldest snapshot date among its served jurisdictions. Each
            jurisdiction's own date is in str.jurisdictions[].snapshot_date and
            on every block as data_as_of. Null when this market has no published
            short-term rental tables, or when the API serves none of its
            jurisdictions. Then every short_term_rental block on parcels and
            hold rows and every str roll-up on investor rows is null. Then the
            str_status, str_business_use, str_operator and str_holdings_min
            filters and /v1/str-parcels answer 422 str_unavailable.
        str:
          anyOf:
            - type: object
              properties:
                jurisdictions:
                  type: array
                  items:
                    $ref: '#/components/schemas/StrCoverageJurisdiction'
                  description: >-
                    Every city of the market the short-term rental build knows,
                    served or not. This list, not the parcel, explains a null
                    block on a parcel: read the city's coverage_reason.
              required:
                - jurisdictions
              additionalProperties: false
            - type: 'null'
          description: >-
            The short-term rental jurisdiction table of this market. Null when
            this market has no published short-term rental tables.
        auction_counted:
          type: boolean
          description: >-
            True when this market measures the foreclosure-auction and REO
            purchase counts. Then every investor row carries the auction block
            (investor.auction) and deal rows carry bought_auction_kind. False
            when the market's registry build came before the counts existed.
            Then the block is null on every investor of the market, and
            bought_auction_kind is null on every deal. The buys_at_auction,
            buys_reo and bought_auction_kind filters then answer 422
            auction_unavailable.
        parcel_as_of:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The deed data end that the build of the parcel product layer used,
            YYYY-MM-DD. The layer serves POST /v1/properties/search and the
            financing, permit and history routes. Null when this market has no
            published parcel product tables: those routes then answer 422
            parcels_unavailable.
        address_as_of:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The deed data end of the address table behind GET
            /v1/properties/resolve?address, YYYY-MM-DD. Null when this market
            has no published address table. The address lookup answers 422
            addresses_unavailable while no market carries the table.
        parcel:
          anyOf:
            - $ref: '#/components/schemas/ParcelCoverage'
            - type: 'null'
          description: >-
            What the parcel products cover in this market. The parts are the
            layer, the dated financing slice, the permit snapshot, the Owner
            Profile block and the history lake with its ZIP set. Null when this
            market has no published parcel product tables.
        lenders:
          anyOf:
            - type: object
              properties:
                as_of:
                  anyOf:
                    - type: string
                      format: date
                      description: Calendar date, YYYY-MM-DD.
                    - type: 'null'
                  description: >-
                    The slice date behind the lender registry, YYYY-MM-DD. It
                    equals parcel.financing.as_of. Null when the registry row
                    does not record it.
                recordings_through:
                  anyOf:
                    - type: string
                      format: date
                      description: Calendar date, YYYY-MM-DD.
                    - type: 'null'
                  description: >-
                    The newest recording date in either source table,
                    YYYY-MM-DD. The API measures every recency on a lender
                    against this date. Null when the registry row does not
                    record it.
                counties:
                  type: array
                  items:
                    type: string
                    description: A 5-digit county FIPS.
                  description: >-
                    The counties the lender registry covers. A ZIP, city or
                    county outside them answers 422 outside_coverage.
                history_capture_share:
                  anyOf:
                    - type: number
                      description: Decimal ratio, never a percentage (0.53 = +53%).
                    - type: 'null'
                  description: >-
                    The share of open lien positions recorded since 2022 that
                    the recorded history also carries within 3 days, 0 to 1. It
                    says how much of the open table the history sees. Null when
                    the registry did not measure it.
                n_lender_ids:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Lender ids served in the market: the identities with a
                    profile, after the person gate. parcel.financing.n_lenders
                    counts raw spellings, several per id. Null when the registry
                    row does not record it.
                purchase_measured:
                  type: boolean
                  description: >-
                    True when the market has the deed link. Then the API serves
                    purpose and the deed block on the loan rows, and the
                    purchase-money counts and ranks on the lenders. It also
                    serves the lender list's purpose, investor_only and
                    purchase_desc parameters. False on a registry built before
                    the deed link: every such value is null, and those
                    parameters answer 422 lenders_unavailable.
                investor_lending_measured:
                  type: boolean
                  description: >-
                    True when the market has the deal link and the borrower
                    match. Then the API serves the deal block, outcome and
                    investor ids on the loan rows, and the investor_lending
                    block on the profiles. It also serves the financing block on
                    deal rows and the financing sidecar on investor profiles.
                    False otherwise: every one of those is null.
                flips_measured:
                  type: boolean
                  description: >-
                    True when the market measures the flips each lender
                    financed, the flips_financed block on the profiles. False
                    otherwise: the block is null.
                borrowers_measured:
                  type: boolean
                  description: >-
                    True when the market has the borrower fold. Then the API
                    serves borrower keys on the loan rows, the borrowers block
                    on the profiles, GET `/v1/lenders/{id}/borrowers` and the
                    financed_by and uses_private_lender filters. False
                    otherwise: the block is null, and the route and the filters
                    answer 422 lenders_unavailable.
                takebacks_measured:
                  type: boolean
                  description: >-
                    True when the registry of this market includes the
                    foreclosure take-backs. That needs the auction deed tables
                    built and the lender members present. Then the API serves
                    the takebacks block on the profiles, the foreclosed block on
                    the loan rows and the FORECLOSED outcome. False otherwise:
                    the block is null on every profile, and foreclosed is null
                    on every loan row.
                counties_measured:
                  type: boolean
                  description: >-
                    True when the market has more than one loaded county, so a
                    county ranking means something:
                    rankings.n_counties_ranked_first_24m on the profiles. False
                    while the slice covers one county: that count is null.
                dated:
                  description: >-
                    True when the registry is a snapshot valued at as_of, like
                    the financing slice behind it. The API stamps every value
                    from it in meta.dated[] as the lenders block. Null on a
                    registry row that does not record it, a row older than the
                    column.
                  type:
                    - boolean
                    - 'null'
                n_parcels_uncovered:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Parcels of the market outside the counties the registry
                    covers. Such a county is one the financing slice does not
                    reach. Null when the row does not record it.
              required:
                - as_of
                - recordings_through
                - counties
                - history_capture_share
                - n_lender_ids
                - purchase_measured
                - investor_lending_measured
                - flips_measured
                - borrowers_measured
                - takebacks_measured
                - counties_measured
                - dated
                - n_parcels_uncovered
              additionalProperties: false
            - type: 'null'
          description: >-
            The lender registry of this market. Null when this market has no
            published lender tables: every /v1/lenders route then answers 422
            lenders_unavailable.
      required:
        - market
        - state
        - counties
        - bbox
        - data_end
        - build_run_id
        - registry_run
        - registry_version
        - dataset_version
        - loaded_at
        - metro_buy_to_resale_ratio
        - universe_kind
        - universe_zips
        - point_tolerance_miles
        - n_parcels
        - listings_data_end
        - agents_data_end
        - wholesale_as_of
        - str_as_of
        - str
        - auction_counted
        - parcel_as_of
        - address_as_of
        - parcel
        - lenders
      additionalProperties: false
      description: >-
        One loaded market: the area its counts cover (universe_kind), the
        counties it lies in, how fresh it is, and its data version.
    Dated:
      type: object
      properties:
        block:
          type: string
          enum:
            - valuation
            - financing
            - liens
            - lenders
          description: >-
            The block of the response that is a snapshot at as_of, not current
            data. The values are valuation (the AVM, equity and LTV), financing
            (open liens and mortgage history), liens (involuntary liens) and
            lenders. The lenders block is the lender registry and every count on
            it, built from the same slice.
        as_of:
          type: string
          format: date
          description: >-
            The date of the delivery that valued the snapshot, YYYY-MM-DD: the
            same date as meta.coverage[].parcel.financing.as_of for the market.
        reason:
          type: string
          description: >-
            Why the block is dated, in one sentence: the dataset is not in the
            current delivery.
      required:
        - block
        - as_of
        - reason
      additionalProperties: false
      description: >-
        One block of the response that is a dated snapshot. Every response that
        carries a value from a dated block lists it here. A caller that cannot
        use dated data passes require_current: true. The API then answers 422
        dated_refused instead.
    ListingAgent:
      type: object
      properties:
        role:
          description: >-
            The agent's role as the feed writes it, "Listing Agent" on every
            on-market row of the feed. Null when the feed gives none.
          type:
            - string
            - 'null'
        agent_id:
          anyOf:
            - type: string
              pattern: ^agt_[0-9a-f]{12}$
              description: >-
                Listing agent id: agt_ followed by 12 hex characters, for
                example agt_fdfd4a0f8bae. The registry mints the id from a
                matched state licence number, else from the name and the feed's
                identifying keys. The id is stable across data refreshes. A
                licence-based id is the same in every market. The API follows an
                old id through the alias table. Store it as the identity.
            - type: 'null'
          description: >-
            The stable id of this agent in the agent registry, for example
            agt_fdfd4a0f8bae: the key to GET `/v1/agents/{id}`. The id is the
            same across every listing the agent appears on, whatever the
            spelling of the name. Served to every key. Null when the market has
            no published agent registry (meta.coverage[].agents_data_end is
            null). Also null when the feed named an agent the registry does not
            carry.
        identity_basis:
          anyOf:
            - type: string
              enum:
                - LICENSE_FEED
                - LICENSE_NAME
                - LICENSE_NAME_DISAMBIGUATED
                - LICENSE_NICKNAME
                - CONTACT_CLUSTER
                - NAME_BROKERAGE
                - NAME_ONLY
              description: >-
                How the registry established the agent's identity, strongest
                first: the four LICENSE_ values are the licence-keyed agents.
                LICENSE_FEED: the MLS feed carried the agent's state licence
                number on their listings, so the feed's own attribution keyed
                the agent on the public record. LICENSE_NAME: exactly one state
                licence carries this name, and LICENSE_NAME_DISAMBIGUATED:
                several do, and the middle initial, brokerage, office phone or
                licence period picked one. LICENSE_NICKNAME: the registry found
                the licence through a nickname or short form of the given name,
                for example DOUG for DOUGLAS. Without a licence, the registry
                merged name spellings through a shared personal phone or email
                (CONTACT_CLUSTER), or through the name and a common brokerage
                (NAME_BROKERAGE). NAME_ONLY: the name fold alone, so two people
                with the same name are one agent here (see license_candidates).
            - type: 'null'
          description: >-
            Served to every key. Null with agent_id. How the registry
            established the agent's identity, strongest first: the four LICENSE_
            values are the licence-keyed agents. LICENSE_FEED: the MLS feed
            carried the agent's state licence number on their listings, so the
            feed's own attribution keyed the agent on the public record.
            LICENSE_NAME: exactly one state licence carries this name, and
            LICENSE_NAME_DISAMBIGUATED: several do, and the middle initial,
            brokerage, office phone or licence period picked one.
            LICENSE_NICKNAME: the registry found the licence through a nickname
            or short form of the given name, for example DOUG for DOUGLAS.
            Without a licence, the registry merged name spellings through a
            shared personal phone or email (CONTACT_CLUSTER), or through the
            name and a common brokerage (NAME_BROKERAGE). NAME_ONLY: the name
            fold alone, so two people with the same name are one agent here (see
            license_candidates).
        agent_is_holder_member:
          description: >-
            True when this agent is, with high confidence, a person member of
            the investor holding the parcel. The agent then lists their own
            inventory (a self-listing), not a client's. False when the parcel
            has a holder and the agent is not one of its people. Null when the
            parcel has no investor holding, or when the market has no published
            agent registry. Served to every key, independent of owner_test.
          type:
            - boolean
            - 'null'
      required:
        - role
        - agent_id
        - identity_basis
        - agent_is_holder_member
      description: >-
        One listing agent of an MLS listing. Through the agent you reach an
        investor's listed inventory. The block carries the stable agent id, how
        the registry established that identity, and if the agent lists their own
        inventory. This host does not serve the identifying fields (name,
        phones, email, licence).
    StrCoverageJurisdiction:
      type: object
      properties:
        name:
          type: string
          description: >-
            The jurisdiction, upper case, for example SCOTTSDALE, PHOENIX or
            HOUSTON: the city-limit polygon the parcel falls in, never the
            postal city. The same value as
            short_term_rental.coverage.jurisdiction on the parcels inside it.
        regime:
          anyOf:
            - type: string
              enum:
                - REQUIRED
                - NOT_REQUIRED
                - UNKNOWN
              description: >-
                The city's rule on a short-term rental licence or permit.
                REQUIRED: an ordinance requires one. NOT_REQUIRED: the city has
                no requirement, so no roll exists. UNKNOWN: the survey did not
                cover the city. Null when the market row does not record it.
            - type: 'null'
          description: >-
            Null when the market row does not record it. The city's rule on a
            short-term rental licence or permit. REQUIRED: an ordinance requires
            one. NOT_REQUIRED: the city has no requirement, so no roll exists.
            UNKNOWN: the survey did not cover the city. Null when the market row
            does not record it.
        coverage_reason:
          anyOf:
            - type: string
              enum:
                - LOADED_SERVED
                - LOADED_UNVALIDATED
                - LOADED_COUNTS_ONLY
                - REQUIRED_NOT_PUBLISHED
                - NO_REQUIREMENT
                - NOT_SURVEYED
              description: >-
                Why parcels of this jurisdiction carry, or do not carry, a
                short-term rental block. LOADED_SERVED: the city's roll is on
                file, matched to parcels and served, so every parcel inside
                carries a block, NONE when it has no record. LOADED_UNVALIDATED:
                the roll is on file and matched, but without a spot check, so
                the block is present with status null and coverage.served false.
                LOADED_COUNTS_ONLY: the roll is on file for counts only, because
                no parcel match is possible for the file, so no block. No block
                for REQUIRED_NOT_PUBLISHED (licence required, no roll
                published), NO_REQUIREMENT (no licence required) or NOT_SURVEYED
                (outside the survey). Null when the market row does not record
                it.
            - type: 'null'
          description: >-
            Null when the market row does not record it. Why parcels of this
            jurisdiction carry, or do not carry, a short-term rental block.
            LOADED_SERVED: the city's roll is on file, matched to parcels and
            served, so every parcel inside carries a block, NONE when it has no
            record. LOADED_UNVALIDATED: the roll is on file and matched, but
            without a spot check, so the block is present with status null and
            coverage.served false. LOADED_COUNTS_ONLY: the roll is on file for
            counts only, because no parcel match is possible for the file, so no
            block. No block for REQUIRED_NOT_PUBLISHED (licence required, no
            roll published), NO_REQUIREMENT (no licence required) or
            NOT_SURVEYED (outside the survey). Null when the market row does not
            record it.
        served:
          type: boolean
          description: >-
            True when parcels inside this jurisdiction carry a measured status
            (LICENSED, PENDING, EXPIRED or NONE). False when they carry a block
            with status null, or no block at all: coverage_reason says why.
        snapshot_only:
          type: boolean
          description: >-
            True when the roll came from a single pull and has no weekly feed
            (Fountain Hills, Cave Creek). Its dates are the pull date, and the
            API never sets feed_stale.
        licence_start:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The earliest possible date of a licence in this jurisdiction, the
            day its ordinance took effect, YYYY-MM-DD, for example 2025-10-01
            for Houston. Null when unknown, or when the city requires no
            licence.
        snapshot_date:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The snapshot the served blocks read, YYYY-MM-DD:
            short_term_rental.data_as_of on every parcel inside. Null when no
            roll is on file.
        feed_stale:
          type: boolean
          description: >-
            True when this week's feed failed the freshness rule and the API
            serves the last good snapshot instead. Every block inside then
            carries coverage.feed_stale true. False otherwise.
        sources:
          type: array
          items:
            $ref: '#/components/schemas/StrCoverageSource'
          description: >-
            The city files behind this jurisdiction, each with its newest load
            date and its stale flag. Empty when no roll is on file.
        n_licensed:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Parcels inside with status LICENSED on this snapshot. Null when no
            roll is on file.
        n_pending:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: Parcels inside with status PENDING. Null when no roll is on file.
        n_expired:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: Parcels inside with status EXPIRED. Null when no roll is on file.
        n_advertised:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Parcels the city lists as advertised without a licence, Scottsdale
            only. The API counts them and never serves them as a status. Null
            when the city publishes no such list.
        share_unmatched:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            The share of the city's records that matched no parcel, 0 to 1, for
            example 0.04. Null when no roll is on file.
        share_assumed:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            The share of attributed parcels with attribution_basis ASSUMED, 0 to
            1. ASSUMED means the attribution has no date, no name and no regime
            bound. Null when no roll is on file.
      required:
        - name
        - regime
        - coverage_reason
        - served
        - snapshot_only
        - licence_start
        - snapshot_date
        - feed_stale
        - sources
        - n_licensed
        - n_pending
        - n_expired
        - n_advertised
        - share_unmatched
        - share_assumed
      additionalProperties: false
      description: >-
        One city of the market in the short-term rental build. It says if the
        licence roll is on file and served, how fresh it is, and what it counts.
        It explains a null short_term_rental block on a parcel: the block is
        null where the API does not serve the jurisdiction.
    ParcelCoverage:
      type: object
      properties:
        parcel_as_of:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The deed data end that the parcel layer build used, YYYY-MM-DD. Null
            when the coverage row does not record it.
        n_parcels:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Parcels in the layer for this market. Null when the coverage row
            does not record it.
        sale_mortgage_measured:
          type: boolean
          description: >-
            True when the delivery records a purchase mortgage on at least one
            priced last sale in five of the market. Then cash_sale_proxy, the
            sale.cash_sale filter and the cash-buyer quicklist are measured.
            False below that bar, as in the 2026 deliveries, which carry the
            column empty. Then cash_sale_proxy is null on every parcel, and the
            filter and the quicklist answer 422 cash_sale_unavailable.
        financing:
          anyOf:
            - type: object
              properties:
                as_of:
                  anyOf:
                    - type: string
                      format: date
                      description: Calendar date, YYYY-MM-DD.
                    - type: 'null'
                  description: >-
                    The date of the delivery that valued the financing, lien and
                    valuation slice, YYYY-MM-DD. Null when the coverage row does
                    not record it.
                dated:
                  type: boolean
                  description: >-
                    True while the Recorder & Mortgage and AVM datasets are not
                    in the current delivery, so the slice stays at as_of. The
                    API then stamps every value from the slice in meta.dated[].
                dated_reason:
                  description: Why the slice is dated. Null when dated is false.
                  type:
                    - string
                    - 'null'
                n_parcels:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Parcels with a row in the slice. Null when the coverage row
                    does not record it.
                n_with_open_lien:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Parcels with at least one open lien at as_of. Null when the
                    coverage row does not record it.
                n_free_and_clear:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Parcels with zero open liens at as_of. Null when the
                    coverage row does not record it.
                n_avm:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Parcels with an AVM at as_of. Null when the coverage row
                    does not record it.
                n_involuntary:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Parcels with an involuntary lien at as_of. Null when the
                    coverage row does not record it.
                n_lenders:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Distinct raw lender spellings over the two lien tables, not
                    registry ids. For registry ids, read
                    meta.coverage[].lenders.n_lender_ids. Null when the coverage
                    row does not record it.
              required:
                - as_of
                - dated
                - dated_reason
                - n_parcels
                - n_with_open_lien
                - n_free_and_clear
                - n_avm
                - n_involuntary
                - n_lenders
              additionalProperties: false
            - type: 'null'
          description: The financing slice. Null when this market has none.
        permits:
          anyOf:
            - type: object
              properties:
                as_of:
                  anyOf:
                    - type: string
                      format: date
                      description: Calendar date, YYYY-MM-DD.
                    - type: 'null'
                  description: >-
                    The effective date of the loaded permit snapshot,
                    YYYY-MM-DD. Null when the coverage row does not record it.
                n_permits:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Permits served for this market. Null when the coverage row
                    does not record it.
                n_parcels:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Parcels with at least one permit. Null when the coverage row
                    does not record it.
                n_unmatched:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Permits in the county file that landed on no parcel of the
                    market, so the API does not serve them. Null when the
                    coverage row does not record it.
                jurisdictions:
                  anyOf:
                    - type: array
                      items:
                        type: object
                        properties:
                          jurisdiction:
                            description: >-
                              The issuing city or county, upper case. Null when
                              the file names none.
                            type:
                              - string
                              - 'null'
                          n_permits:
                            anyOf:
                              - type: integer
                                minimum: -9007199254740991
                                maximum: 9007199254740991
                              - type: 'null'
                            description: >-
                              Permits the jurisdiction issued, all time. Null
                              when the coverage row does not record it.
                          last_issue_date:
                            anyOf:
                              - type: string
                                format: date
                                description: Calendar date, YYYY-MM-DD.
                              - type: 'null'
                            description: >-
                              The newest issue date of the jurisdiction,
                              YYYY-MM-DD. Null when no permit of the
                              jurisdiction carries an issue date.
                          windows_measured:
                            description: >-
                              True when the jurisdiction issued a permit in the
                              12 months before as_of. False when it did not: its
                              feed is stale, so its parcels carry null 24-month
                              and 36-month windows. The rule applies in every
                              market. Read those null windows (n_permits_24m,
                              n_open_permits_12m, major_work_36m, tags_24m,
                              job_value_24m) as unmeasured, not as permit-free.
                              The negative permit filters of the search leave
                              such parcels out. Null only on a coverage row
                              built before the flag existed.
                            type:
                              - boolean
                              - 'null'
                        required:
                          - jurisdiction
                          - n_permits
                          - last_issue_date
                          - windows_measured
                        additionalProperties: false
                    - type: 'null'
                  description: >-
                    The issuing jurisdictions, largest first, each with its
                    permit count, its newest issue date and its windows_measured
                    flag. Null when the coverage row does not record them.
              required:
                - as_of
                - n_permits
                - n_parcels
                - n_unmatched
                - jurisdictions
              additionalProperties: false
            - type: 'null'
          description: The permit snapshot. Null when this market has none.
        owner_profile:
          anyOf:
            - type: object
              properties:
                as_of:
                  anyOf:
                    - type: string
                      format: date
                      description: Calendar date, YYYY-MM-DD.
                    - type: 'null'
                  description: >-
                    The date of the delivery the Owner Profile block comes from,
                    YYYY-MM-DD. Null when the coverage row does not record it.
                n_parcels:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Parcels carrying a profile. Null when the coverage row does
                    not record it.
                n_multi:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Parcels whose owner holds two or more properties. Null when
                    the coverage row does not record it.
                n_portfolio_5:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Parcels whose owner holds five or more. Null when the
                    coverage row does not record it.
              required:
                - as_of
                - n_parcels
                - n_multi
                - n_portfolio_5
              additionalProperties: false
            - type: 'null'
          description: The Owner Profile block. Null when this market has none.
        history:
          anyOf:
            - type: object
              properties:
                first_week:
                  anyOf:
                    - type: string
                      format: date
                      description: Calendar date, YYYY-MM-DD.
                    - type: 'null'
                  description: >-
                    The first weekly file the history lake replayed (the
                    baseline FULL), YYYY-MM-DD. Null when the lake has no file.
                last_week:
                  anyOf:
                    - type: string
                      format: date
                      description: Calendar date, YYYY-MM-DD.
                    - type: 'null'
                  description: >-
                    The last weekly file replayed, YYYY-MM-DD. Null when the
                    lake has no file.
                zips:
                  anyOf:
                    - type: array
                      items:
                        type: string
                    - type: 'null'
                  description: >-
                    The ZIP codes the history lake covers. A parcel outside them
                    has no history: `GET /v1/properties/{id}/history` answers
                    422 history_unavailable and the history block is null.
                n_parcels:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Parcels observed in the ZIP set. Null when the coverage row
                    does not record it.
                n_events:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Typed events on record. Null when the coverage row does not
                    record it.
                n_weeks:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: >-
                    Weekly files replayed. Null when the coverage row does not
                    record it.
                domains:
                  anyOf:
                    - type: object
                      propertyNames:
                        type: string
                      additionalProperties:
                        type: object
                        properties:
                          first_week:
                            anyOf:
                              - type: string
                                format: date
                                description: Calendar date, YYYY-MM-DD.
                              - type: 'null'
                            description: >-
                              The first weekly file with the domain, YYYY-MM-DD.
                              Null when the lake has no file for it.
                          last_week:
                            anyOf:
                              - type: string
                                format: date
                                description: Calendar date, YYYY-MM-DD.
                              - type: 'null'
                            description: >-
                              The last weekly file with the domain, YYYY-MM-DD.
                              Null when the lake has no file for it.
                          n_events:
                            anyOf:
                              - type: integer
                                minimum: -9007199254740991
                                maximum: 9007199254740991
                              - type: 'null'
                            description: >-
                              Typed events of the domain on record. Null when
                              the coverage row does not record it.
                        required:
                          - first_week
                          - last_week
                          - n_events
                        additionalProperties: false
                    - type: 'null'
                  description: >-
                    Per domain, the weeks the lake covers it. Valuation and
                    financing end at the financing slice date, financing.as_of.
                    The rest run to last_week. Null when the coverage row does
                    not record them.
              required:
                - first_week
                - last_week
                - zips
                - n_parcels
                - n_events
                - n_weeks
                - domains
              additionalProperties: false
            - type: 'null'
          description: The history lake. Null when this market has none.
      required:
        - parcel_as_of
        - n_parcels
        - sale_mortgage_measured
        - financing
        - permits
        - owner_profile
        - history
      additionalProperties: false
      description: >-
        What the parcel products cover in one market. The parts are the parcel
        layer, the dated financing slice, the permit snapshot, the Owner Profile
        block and the history lake. Each part carries its as-of date and its
        counts, and is null where the market has none of it. The block itself is
        null where the market has no parcel product tables.
    StrCoverageSource:
      type: object
      properties:
        source:
          type: string
          description: >-
            The source code of one city file, for example S1 (the Scottsdale
            licensed roll), P1 (the Phoenix active permits layer) or COH (the
            Houston registry).
        snapshot_date:
          anyOf:
            - type: string
              format: date
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The date of the newest load of this source, YYYY-MM-DD. Null before
            the first load of this source.
        stale:
          type: boolean
          description: >-
            True when the newest load failed the freshness rule and the API
            still serves the previous snapshot. A load fails the rule when the
            count moved more than 30 percent, or when its newest date is more
            than 14 days old.
      required:
        - source
        - snapshot_date
        - stale
      additionalProperties: false
      description: >-
        One city file behind a jurisdiction's short-term rental data: the date
        of its newest load, and if that load is stale.
  headers:
    ETag:
      description: >-
        The entity tag of the answer, derived from the dataset version of the
        markets in the response and from the representation, not from the body.
        It moves only when a refresh rebuilds the tables of a market. On a JSON
        route, send it back as If-None-Match, and an unchanged dataset answers
        304 with no body. The API streams an export whatever the tag. GET
        /v1/dataset runs no query, so it is the lowest-cost place to send the
        tag. On every 2xx and the 304, never on an error.
      schema:
        type: string
    X-Request-Id:
      description: >-
        The id of this call. The edge mints it and also sends it as zp-rid, the
        gateway's own name for it. The API keys its log line for the call on it,
        and every error body repeats it as request_id. Log it on every response,
        not only on errors. A refusal the gateway answers itself carries zp-rid
        and request_id alone. Those refusals are a 401, a 403 quota_exceeded and
        a 429 at the limit of the plan.
      schema:
        type: string
    X-Rows:
      description: >-
        How many rows the body carries: data.length on a list, 1 on a single
        record. The size of the body, not a charge. Absent on a streamed export,
        whose count the API knows only when the stream ends, and on a 304.
      schema:
        type: integer
        minimum: 0
    X-Dataset-Version:
      description: >-
        The dataset version of every market in the response, as market=version
        pairs joined by commas (phx=1788469819 for one market). The header
        carries one pair per loaded market. The figures are the same as
        meta.coverage[].dataset_version, and you can read them without parsing
        the body. A version moves only when a refresh rebuilds the tables of the
        market, so fold the label into cache keys. On every 2xx and the 304,
        never on an error. Absent when the answer names no market: an empty
        deployment, or a GET /v1/coverage lookup outside every market.
      schema:
        type: string
    X-Data-End:
      description: >-
        The last deed date of every market in the response, as market=YYYY-MM-DD
        pairs joined by commas (phx=2026-08-12 for one market). The header
        carries one pair per loaded market. The dates are the same as
        meta.coverage[].data_end. On every 2xx and the 304, never on an error.
        Absent when the answer names no market: an empty deployment, or a GET
        /v1/coverage lookup outside every market.
      schema:
        type: string
    X-Credits-Charged:
      description: >-
        The origin sets this header: the credits this response cost. It is 0
        when the account already unlocked every record on it. The plans page of
        the documentation site says what counts.
      schema:
        type: integer
        minimum: 0
    X-Credits-Remaining:
      description: >-
        The edge sets this header: the credits left in the billing period after
        this response, recent to within a minute. It is negative on a plan with
        overage, down to its ceiling. Absent on Enterprise.
      schema:
        type: integer
    Retry-After:
      description: >-
        Whole seconds to wait before you retry, never below 1. On a 429, the
        seconds until the spent bucket refills. On a 503, 1 for pool_saturated
        and 5 for ledger_unavailable, and none for database_unavailable. On a
        403 plan_limit for the name-search day cap, the seconds to the next UTC
        midnight, when the cap resets. The other plan limits carry none. The
        body repeats it as retry_after on the 429, the ledger refusal and the
        day cap.
      schema:
        type: integer
        minimum: 1
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: >-
        API key from the developer console (starts with zpka_). Create one at
        https://developers.investorlift.com/get-a-key. The same key works on
        POST /mcp.

````

## Related topics

- [List MLS sale listings near a location](/api-reference/listings/list-mls-sale-listings-near-a-location.md)
- [Search nearby inventory](/guides/walkthroughs/nearby-listings.md)
- [List historical sold listing cycles](/api-reference/listings/list-historical-sold-listing-cycles.md)
- [List Investorlift listings](/api-reference/endpoints/wholesale-listings.md)
- [Read a parcel's comps](/api-reference/endpoints/properties-comps.md)
