> ## 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.

# Get one Investorlift listing

> One listing as a wholesale transaction: what the listing said, what the deeds show, who bought it and on what deed.

<Note>
  Early access: while the developer tier is in beta, the API serves this route to Investorlift's team and trusted partners. Investorlift will restrict the route further before it opens to every key.
</Note>

The body is one [Investorlift listing](/api-reference/objects/wholesale-listing) row, in the same shape
[the list](/api-reference/endpoints/wholesale-listings) returns. `distance_miles` is null because the request has no
reference point.

## Use it when

Use it for the listing card. The card opens from a list row, a deal row's `wholesale_listing` block or a parcel's
`wholesale_listings[]`. It also opens from the Investorlift app, by `source_listing_id` through the list route.

## Read the response

* `verification` is the verdict, `outcome` the detail, `outcome_text` the sentence. `deed.closed_on` dates the
  transaction and `listing.listed_on` is the secondary line.
* `intermediate` is the party that held title between the homeowner and the buyer on a double close or a
  buy-then-sell. The API names it only through its investor id. `intermediate.is_lister` says if it was the listing
  company itself.
* `lister_on_title` and `lister_on_title_role` say if the company, or a joint-venture partner entity, ever held
  title. `buyer_fate` says what the buyer did next: held it, resold it, or listed it on the MLS.
* `offer_buyer_match` compares the accepted offer's buyer with the deed. The row shows `DIFFERENT` as text, and the
  API never names the offer party.

## Gotchas

* The id must carry the `wl_` prefix. Otherwise the API answers
  [`400 invalid_id`](/guides/concepts/errors#invalid_id). The API answers 404 for an id that is not on file in any
  loaded market.
* For a listing whose market has no published wholesale tables, the API answers
  [`422 wholesale_unavailable`](/guides/concepts/errors#wholesale_unavailable).
* The row names the buyer only as a registry investor or an unregistered company. It never names a person, on any
  key.


## OpenAPI

````yaml GET /v1/wholesale-listings/{id}
openapi: 3.1.0
info:
  title: God Mode API
  version: 0.33.1
  description: >-
    You have a house to sell, usually a wholesale contract. You want to know
    **who nearby buys houses like this one and how to reach them**. County deed
    records already hold the answer. This API reads them 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`).


    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-six
    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: 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/wholesale-listings/{id}:
    get:
      tags:
        - wholesale
      summary: Get one Investorlift listing by id
      description: >-
        One Investorlift listing as a wholesale transaction: what the company
        listed, the outcome the county deeds show, who bought it and on what
        deed. The body is one `/v1/wholesale-listings` row.


        Use it for the listing card, opened from a list row, a deal row's
        `wholesale_listing` block or a parcel's `wholesale_listings[]`.


        [The intermediate party, the title fields and the buyer
        fate](https://developers.investorlift.com/api-reference/endpoints/wholesale-listings-get).
      operationId: getWholesaleListing
      parameters:
        - schema:
            type: string
          in: path
          name: id
          required: true
          description: >-
            Investorlift listing id, wl_ followed by 32 hex characters, from any
            wholesale_listing block or list row. The prefix is part of the id
            (400 invalid_id otherwise).
      responses:
        '200':
          description: >-
            The listing, in the same shape as a /v1/wholesale-listings row, with
            distance_miles null.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/WholesaleListing'
                  meta:
                    $ref: '#/components/schemas/Meta'
                required:
                  - data
                  - meta
                additionalProperties: false
                description: >-
                  The listing, in the same shape as a /v1/wholesale-listings
                  row, with distance_miles null.
              examples:
                phoenix_recorded:
                  summary: >-
                    Recorded at the Phoenix golden point, as a deals-only key
                    gets it
                  value:
                    data:
                      id: wl_9a400cf479a21c309a0526e1fd25f1d5
                      market: phx
                      source_listing_id: 29121
                      property:
                        id: prop_39bff26662a6bb02899027c254a407f1
                        address_short: 121 S 92nd Ave
                        city: TOLLESON
                        state: AZ
                        zip: '85353'
                        latitude: 33.44487
                        longitude: -112.257329
                        segment: SFR
                        bedrooms: 3
                        sqft: 1280
                      distance_miles: null
                      wholesaler:
                        id: wsr_4b8d1df516b9
                        name: Pulse Capital LLC
                        brands:
                          - Pulse Capital
                      listing:
                        listed_on: '2022-06-15'
                        accepted_offer_on: null
                        contract_verified_on: null
                        asking_price: 360000
                        arv_estimate: null
                        condition: null
                      outcome: DOUBLE_CLOSED
                      verification: CONFIRMED
                      outcome_text: >-
                        Closed 2022-07-01 by double close (the listing company
                        took title first); bought per the recorded deed.
                      time_fit: true
                      closed_before_publish: false
                      confidence: HIGH
                      buyer:
                        id: inv_e7c486427687
                        name: RIVERA DANA
                        display_name: DANA RIVERA
                        kind: PERSON
                        tier: REGISTRY_STRONG
                        market: phx
                      intermediate:
                        id: inv_bd8f38fd855b
                        name: CHENNY PROPERTIES LLC
                        display_name: CHENNY PROPERTIES LLC
                        is_lister: true
                      deed:
                        closed_on: '2022-07-01'
                        pattern: DOUBLE_CLOSE
                        chain_certain: true
                        price: 360000
                        price_basis: RECORDED
                        price_ratio: 1
                      registry_deal_id: deal_6caa4fc2180e7a3feb572d8c95cc2b15
                      lenders_active:
                        - id: len_9f4e246dcf57
                          name: FIRST FIDELITY BANK
                          lender_class: BANK
                          is_hard_money: false
                          'n': 21
                          n_investor: 21
                          n_purchase_money: 0
                          share: 0.006495515
                          as_of: '2026-06-25'
                          dated: true
                        - id: len_5e4ef5c48d63
                          name: GERMAN AMERICAN CAP CORP
                          lender_class: NONBANK
                          is_hard_money: false
                          'n': 17
                          n_investor: 17
                          n_purchase_money: 0
                          share: 0.005258274
                          as_of: '2026-06-25'
                          dated: true
                        - id: len_c5c2e7961690
                          name: DESERT FINANCIAL CREDIT UNION
                          lender_class: BANK
                          is_hard_money: false
                          'n': 197
                          n_investor: 12
                          n_purchase_money: 5
                          share: 0.060934117
                          as_of: '2026-06-25'
                          dated: true
                        - id: len_aeda9b5f9e0c
                          name: WELLS FARGO BANK NA
                          lender_class: BANK
                          is_hard_money: false
                          'n': 26
                          n_investor: 11
                          n_purchase_money: 2
                          share: 0.008042066
                          as_of: '2026-06-25'
                          dated: true
                        - id: len_b3729c2447dd
                          name: GERMAN AMERICAN CAPITAL CORP
                          lender_class: NONBANK
                          is_hard_money: false
                          'n': 12
                          n_investor: 11
                          n_purchase_money: 0
                          share: 0.003711723
                          as_of: '2026-06-25'
                          dated: true
                      lister_attribution: PRIMARY
                      lister_on_title: INTERMEDIATE
                      lister_on_title_role: OWN
                      buyer_fate: HELD
                      offer_buyer_match: UNNAMED
                      retail_signals: []
                      n_other_listings: 0
                      n_listings_on_parcel: 1
                      superseded_by_id: null
                      data_end: '2026-08-12'
                      as_of: '2026-09-09'
                    meta:
                      generated_at: '2026-09-10T00:34:00.000Z'
                      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-12'
                          build_run_id: 1
                          registry_run: 8
                          registry_version: v4-metro-review-fixes
                          dataset_version: 1788999683
                          loaded_at: '2026-09-10T00:21:23.302Z'
                          metro_buy_to_resale_ratio: 0.7192
                          universe_kind: metro
                          universe_zips: null
                          point_tolerance_miles: 20
                          n_parcels: 1836307
                          listings_data_end: '2026-08-31'
                          agents_data_end: '2026-08-31'
                          wholesale_as_of: '2026-09-09'
                          str_as_of: null
                          str: null
                          auction_counted: true
                          parcel_as_of: null
                          address_as_of: null
                          parcel: null
                          lenders: null
                      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
                lister_held:
                  summary: >-
                    LISTER_HELD_THEN_SOLD: the listing company took title and
                    resold within 90 days (Investorlift listing 5507)
                  value:
                    data:
                      id: wl_23eda5eb0a7de512641f189972b4ddcf
                      market: phx
                      source_listing_id: 5507
                      property:
                        id: prop_a5517d844d662186be2d71bea60d4c3c
                        address_short: 555 N Elm
                        city: MESA
                        state: AZ
                        zip: '85201'
                        latitude: 33.425707
                        longitude: -111.857589
                        segment: SFR
                        bedrooms: 5
                        sqft: 1755
                      distance_miles: null
                      wholesaler:
                        id: wsr_37e2a3dcdf4c
                        name: Home Team Investors
                        brands:
                          - Home Team Deals
                      listing:
                        listed_on: '2021-07-16'
                        accepted_offer_on: null
                        contract_verified_on: null
                        asking_price: 360000
                        arv_estimate: 460000
                        condition: null
                      outcome: LISTER_HELD_THEN_SOLD
                      verification: CONFIRMED
                      outcome_text: >-
                        The listing company took title and resold 2021-10-11 (69
                        days later); bought per the recorded deed.
                      time_fit: true
                      closed_before_publish: false
                      confidence: HIGH
                      buyer:
                        id: inv_a61331a35b68
                        name: BLACK CANYON EQUITY LLC
                        display_name: BLACK CANYON EQUITY LLC
                        kind: ENTITY
                        tier: REGISTRY_STRONG
                        market: phx
                      intermediate:
                        id: inv_c7676145b4e8
                        name: HOME TEAM INVESTORS LLC
                        display_name: HOME TEAM INVESTORS LLC
                        is_lister: true
                      deed:
                        closed_on: '2021-10-11'
                        pattern: BUY_THEN_SELL
                        chain_certain: true
                        price: 375000
                        price_basis: RECORDED
                        price_ratio: 1.042
                      registry_deal_id: deal_e65f2bc84823cd8e0034a0b6c1443e49
                      lenders_active: null
                      lister_attribution: PRIMARY
                      lister_on_title: INTERMEDIATE
                      lister_on_title_role: OWN
                      buyer_fate: RESALE_366P
                      offer_buyer_match: UNNAMED
                      retail_signals: []
                      n_other_listings: 0
                      n_listings_on_parcel: 1
                      superseded_by_id: null
                      data_end: '2026-08-12'
                      as_of: '2026-09-09'
                    meta:
                      generated_at: '2026-09-10T00:34:00.000Z'
                      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-12'
                          build_run_id: 1
                          registry_run: 8
                          registry_version: v4-metro-review-fixes
                          dataset_version: 1788999683
                          loaded_at: '2026-09-10T00:21:23.302Z'
                          metro_buy_to_resale_ratio: 0.7192
                          universe_kind: metro
                          universe_zips: null
                          point_tolerance_miles: 20
                          n_parcels: 1836307
                          listings_data_end: '2026-08-31'
                          agents_data_end: '2026-08-31'
                          wholesale_as_of: '2026-09-09'
                          str_as_of: null
                          str: null
                          auction_counted: true
                          parcel_as_of: null
                          address_as_of: null
                          parcel: null
                          lenders: null
                      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
                closed_before_publish:
                  summary: >-
                    ASSIGNED with the deed recorded before the listing was
                    published, confidence MEDIUM (Investorlift listing 2084)
                  value:
                    data:
                      id: wl_d3d293ec9bac8a9224eefcf78d8a7c21
                      market: phx
                      source_listing_id: 2084
                      property:
                        id: prop_e1a23484d7420e3b9303ea8e5b9783b9
                        address_short: 334 N 83rd St
                        city: MESA
                        state: AZ
                        zip: '85207'
                        latitude: 33.421494
                        longitude: -111.652228
                        segment: OTHER
                        bedrooms: 3
                        sqft: 2280
                      distance_miles: null
                      wholesaler:
                        id: wsr_c2714a400056
                        name: US Home Group LLC
                        brands:
                          - We Buy Homes Cash
                          - We Buy Homes Cash, an Official Home Buyer
                      listing:
                        listed_on: '2021-02-27'
                        accepted_offer_on: '2020-12-01'
                        contract_verified_on: null
                        asking_price: 85000
                        arv_estimate: 165000
                        condition: null
                      outcome: ASSIGNED
                      verification: CONFIRMED
                      outcome_text: Closed 2020-12-31; bought per the recorded deed.
                      time_fit: true
                      closed_before_publish: true
                      confidence: MEDIUM
                      buyer:
                        id: inv_ea572b554eaa
                        name: RIVERA DANA
                        display_name: DANA RIVERA
                        kind: ENTITY
                        tier: REGISTRY_STRONG
                        market: phx
                      intermediate:
                        id: null
                        name: null
                        display_name: null
                        is_lister: null
                      deed:
                        closed_on: '2020-12-31'
                        pattern: SINGLE
                        chain_certain: null
                        price: 75000
                        price_basis: RECORDED
                        price_ratio: 0.882
                      registry_deal_id: deal_4fda743d71edcdd158e3a60451ee84d1
                      lenders_active: null
                      lister_attribution: PRIMARY
                      lister_on_title: NONE
                      lister_on_title_role: null
                      buyer_fate: HELD
                      offer_buyer_match: DIFFERENT
                      retail_signals: []
                      n_other_listings: 0
                      n_listings_on_parcel: 1
                      superseded_by_id: null
                      data_end: '2026-08-12'
                      as_of: '2026-09-09'
                    meta:
                      generated_at: '2026-09-10T00:34:00.000Z'
                      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-12'
                          build_run_id: 1
                          registry_run: 8
                          registry_version: v4-metro-review-fixes
                          dataset_version: 1788999683
                          loaded_at: '2026-09-10T00:21:23.302Z'
                          metro_buy_to_resale_ratio: 0.7192
                          universe_kind: metro
                          universe_zips: null
                          point_tolerance_miles: 20
                          n_parcels: 1836307
                          listings_data_end: '2026-08-31'
                          agents_data_end: '2026-08-31'
                          wholesale_as_of: '2026-09-09'
                          str_as_of: null
                          str: null
                          auction_counted: true
                          parcel_as_of: null
                          address_as_of: null
                          parcel: null
                          lenders: null
                      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
                superseded:
                  summary: >-
                    SUPERSEDED: the transfer on the parcel is credited to
                    another Investorlift listing, no buyer, no deed
                    (Investorlift listing 175177)
                  value:
                    data:
                      id: wl_e80d1f45cf2b67bbf9be38e3b2624dea
                      market: phx
                      source_listing_id: 175177
                      property:
                        id: prop_16a7e7eaf66b199553181496fc97b1a7
                        address_short: 5714 N 19th Dr
                        city: PHOENIX
                        state: AZ
                        zip: '85015'
                        latitude: 33.521529
                        longitude: -112.101043
                        segment: SFR
                        bedrooms: 3
                        sqft: 1469
                      distance_miles: null
                      wholesaler:
                        id: wsr_5314bba2f18b
                        name: OneRoof Real Estate Group
                        brands:
                          - OneRoof Real Estate
                      listing:
                        listed_on: '2024-09-07'
                        accepted_offer_on: null
                        contract_verified_on: null
                        asking_price: 359990
                        arv_estimate: null
                        condition: null
                      outcome: SUPERSEDED
                      verification: NONE
                      outcome_text: >-
                        Listed 2024-09-07; the transfer on this parcel is
                        credited to another Investorlift listing.
                      time_fit: true
                      closed_before_publish: false
                      confidence: HIGH
                      buyer:
                        id: null
                        name: null
                        display_name: null
                        kind: null
                        tier: UNRESOLVED
                        market: null
                      intermediate:
                        id: null
                        name: null
                        display_name: null
                        is_lister: null
                      deed:
                        closed_on: null
                        pattern: NONE
                        chain_certain: null
                        price: null
                        price_basis: null
                        price_ratio: null
                      registry_deal_id: null
                      lenders_active: null
                      lister_attribution: NONE
                      lister_on_title: NONE
                      lister_on_title_role: null
                      buyer_fate: null
                      offer_buyer_match: null
                      retail_signals: []
                      n_other_listings: 1
                      n_listings_on_parcel: 2
                      superseded_by_id: wl_f47ab3011e2c336d335143216a5fa27d
                      data_end: '2026-08-12'
                      as_of: '2026-09-09'
                    meta:
                      generated_at: '2026-09-10T00:34:00.000Z'
                      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-12'
                          build_run_id: 1
                          registry_run: 8
                          registry_version: v4-metro-review-fixes
                          dataset_version: 1788999683
                          loaded_at: '2026-09-10T00:21:23.302Z'
                          metro_buy_to_resale_ratio: 0.7192
                          universe_kind: metro
                          universe_zips: null
                          point_tolerance_miles: 20
                          n_parcels: 1836307
                          listings_data_end: '2026-08-31'
                          agents_data_end: '2026-08-31'
                          wholesale_as_of: '2026-09-09'
                          str_as_of: null
                          str: null
                          auction_counted: true
                          parcel_as_of: null
                          address_as_of: null
                          parcel: null
                          lenders: null
                      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
          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'
        '400':
          description: >-
            Bad request (dataset_unavailable, geometry_conflict,
            geometry_required, invalid_cursor, invalid_id, market_required,
            quicklist_unavailable, 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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                invalid_id:
                  summary: Invalid id
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#invalid_id
                    title: Invalid id
                    status: 400
                    code: invalid_id
                    detail: >-
                      An investor id is inv_ followed by 12 hex characters. The
                      prefix is part of the id.
                    instance: /v1/wholesale-listings/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                market_required:
                  summary: Market required
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#market_required
                    title: Market required
                    status: 400
                    code: market_required
                    detail: >-
                      inv_0a20a550f33b exists in 2 loaded markets. Pass market=.
                      The codes are in markets[].
                    instance: /v1/wholesale-listings/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    markets:
                      - phx
                      - hou
                    errors:
                      - param: market
                        message: one of phx, hou
                        code: market_required
                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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    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:
                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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '422':
          description: >-
            Unprocessable (addresses_unavailable, agents_unavailable,
            ambiguous_address, ambiguous_apn, auction_unavailable,
            cash_sale_unavailable, dated_refused, history_unavailable,
            lenders_unavailable, listings_unavailable, outside_coverage,
            parcels_unavailable, str_unavailable, wholesale_unavailable)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                agents_unavailable:
                  summary: Agents unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#agents_unavailable
                    title: Agents unavailable
                    status: 422
                    code: agents_unavailable
                    detail: >-
                      This market has no published agent registry. See
                      meta.coverage[].agents_data_end.
                    instance: /v1/wholesale-listings/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                auction_unavailable:
                  summary: Auction counts unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#auction_unavailable
                    title: Auction counts unavailable
                    status: 422
                    code: auction_unavailable
                    detail: >-
                      This market has no published foreclosure-auction counts:
                      its registry predates them. So the API cannot answer
                      buys_at_auction, buys_reo and bought_auction_kind there,
                      and meta.coverage[].auction_counted is false for it. Drop
                      the parameter to list every row.
                    instance: /v1/wholesale-listings/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                lenders_unavailable:
                  summary: Lenders unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#lenders_unavailable
                    title: Lenders unavailable
                    status: 422
                    code: lenders_unavailable
                    detail: >-
                      Market hou has no published lender registry
                      (meta.coverage[].lenders is null there). The API still
                      serves the financing block on parcels where the slice is.
                    instance: /v1/wholesale-listings/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    markets:
                      - hou
                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/wholesale-listings/{id}
                    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 is outside every loaded
                      market's point tolerance (loaded: phx, hou). See
                      meta.coverage[].bbox and point_tolerance_miles on any list
                      response.
                    instance: /v1/wholesale-listings/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                str_unavailable:
                  summary: Short-term rental data unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#str_unavailable
                    title: Short-term rental data unavailable
                    status: 422
                    code: str_unavailable
                    detail: >-
                      This market has no published short-term rental tables. See
                      meta.coverage[].str_as_of.
                    instance: /v1/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    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/wholesale-listings/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
components:
  schemas:
    WholesaleListing:
      type: object
      properties:
        id:
          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.
        market:
          type: string
          description: >-
            Market code the listing belongs to, for example phx. The loaded
            markets are in meta.coverage[].
        source_listing_id:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            The listing's id in the Investorlift app, for example 34905: the
            join key back to the app and to the feedback file.
        property:
          anyOf:
            - $ref: '#/components/schemas/WholesaleParcel'
            - type: 'null'
          description: >-
            The parcel the API matched the listing to: the key to GET
            `/v1/properties/{property_id}` and the address to show. 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 row never
            matches a geometry, is absent from the parcel's
            wholesale_listings[], and is reachable under its wholesaler only.
        distance_miles:
          description: >-
            Miles from the reference point, rounded to 2 decimals. The reference
            point is lat + lng, or the centre of the property_id parcel. Null
            when the request had no reference point, and on a hidden-address
            row.
          type:
            - number
            - 'null'
        wholesaler:
          $ref: '#/components/schemas/WholesalerSummary'
          description: >-
            The company that listed the house on Investorlift, with its brands.
            The API always serves it, as a business name.
        listing:
          $ref: '#/components/schemas/WholesaleListingFacts'
        outcome:
          type: string
          enum:
            - ASSIGNED
            - DOUBLE_CLOSED
            - LISTER_HELD_THEN_SOLD
            - LISTER_SOLD_FROM_INVENTORY
            - SOLD_OFF_MARKET_GRANTOR
            - SOLD_TO_OWNER_OCCUPANT
            - FAILED_THEN_RETAIL_MLS
            - DISTRESSED_TRANSFER
            - LATE_TRANSFER
            - NO_TRANSFER_400
            - NO_DEED_120
            - PENDING
            - SUPERSEDED
            - AMBIGUOUS_DEEDS
          description: >-
            What the county deeds record for the listing, in detail. The
            one-word verdict is verification. ASSIGNED: one deed from the
            homeowner to the buyer, and the listing company is not on title, so
            a contract assignment. DOUBLE_CLOSED: two chained deeds 0 to 14 days
            apart, with the company or its buyer in the middle.
            LISTER_HELD_THEN_SOLD: the company took title and resold within 90
            days. LISTER_SOLD_FROM_INVENTORY: the company already owned the
            house and sold it. SOLD_OFF_MARKET_GRANTOR: one deed from a seller
            who is neither the homeowner of record nor the company, so an
            unrecorded step came before it. SOLD_TO_OWNER_OCCUPANT: the buyer
            moved in, so not an investor sale. FAILED_THEN_RETAIL_MLS: the
            homeowner sold on the MLS instead. DISTRESSED_TRANSFER: a sheriff's,
            trustee's or REO deed. LATE_TRANSFER: a deed 180 to 400 days after
            the listing that nothing ties to it. NO_TRANSFER_400: no deed within
            400 days. NO_DEED_120: no deed by the deed data end, 120 to 400 days
            after the listing, so provisional. PENDING: the company listed the
            house fewer than 120 days before the deed data end, and no deed
            exists yet. SUPERSEDED: another Investorlift listing of the same
            parcel holds the credit for the deed. AMBIGUOUS_DEEDS: two or more
            unrelated sales that the rules cannot order.
        verification:
          type: string
          enum:
            - CONFIRMED
            - RETAIL
            - OPEN
            - NONE
          description: >-
            The API derives the one-word verdict of the deeds on the listing
            from outcome alone, and the Investorlift status plays no part.
            CONFIRMED: a recorded deed closed it to a buyer, so a verified
            wholesale transaction. RETAIL: it closed, but to an owner-occupant
            or through the MLS, so not an investor sale. OPEN: the deeds record
            no transfer yet, up to the deed data_end. NONE: no transfer within
            400 days, a distressed deed, or a transfer the rules cannot tie to
            this listing. NONE also when the credit went to another listing of
            the parcel.
        outcome_text:
          type: string
          description: >-
            One name-free sentence that says what the deeds show, ready to
            display. For example "closed 2024-06-10: bought by a registered
            investor per the recorded deed" or "listed 2024-03-02; no recorded
            transfer yet". Add the buyer's name from buyer.name when that field
            is not null.
        time_fit:
          description: >-
            True when the closing deed sits inside the expected window of the
            listing. The window runs from 30 days before to 120 days after
            publication, or from 45 days before to 120 days after the accepted
            offer. False when it closed later or earlier than that, and the API
            then caps confidence at MEDIUM. Null without a closing deed.
          type:
            - boolean
            - 'null'
        closed_before_publish:
          description: >-
            True when the county recorded the closing deed before the company
            published the listing: the company's own acquisition, or a listing
            published after closing. Null without a closing deed.
          type:
            - boolean
            - 'null'
        confidence:
          type: string
          enum:
            - HIGH
            - MEDIUM
            - LOW
            - NONE
          description: >-
            How sure the match between the listing and the deed is, to show as
            text beside the verdict. HIGH: the parcel matched exactly, and the
            deed sits inside the expected window with a corroborator. A
            corroborator is a price match, the company on title, the accepted
            offer's buyer on the deed, or a chained pair. MEDIUM: a deed inside
            the window without a corroborator, an off-market grantor, or a late
            or uncertain-order deed. LOW: a fuzzy parcel match or a guessed
            unit. NONE: below the floor, so the API serves the row without a
            buyer.
        buyer:
          $ref: '#/components/schemas/WholesaleBuyer'
        intermediate:
          $ref: '#/components/schemas/WholesaleIntermediate'
        deed:
          $ref: '#/components/schemas/WholesaleDeed'
        registry_deal_id:
          description: >-
            The deal row the API serves the closing deed as, deal_ followed by
            32 hex characters: the key to GET `/v1/deals/{id}`. That row's
            wholesale_listing block points back here. Null when the deed is not
            a served deal: a household buyer with no investor id, or no closing
            deed.
          type:
            - string
            - 'null'
        lenders_active:
          anyOf:
            - type: array
              items:
                $ref: '#/components/schemas/LenderActive'
            - type: 'null'
          description: >-
            The five lenders with the most investor loans in the listing's ZIP
            in the 24 months to the lender registry's slice date. They show who
            funds this deal kind here. The order is n_investor desc, then n,
            then id, from the registry's ZIP rankings. Empty when the ZIP has no
            investor lending. Null on a hidden-address row, and in a market
            without the lender registry or its borrower match. Also null on rows
            of a registry built before phase 3.
        lister_attribution:
          type: string
          description: >-
            Who gets the credit for the closing deed when several Investorlift
            listings of the same parcel can claim it. PRIMARY: this listing,
            because its accepted offer's buyer is on the deed, its company is on
            title, or it sat closest before the deed. SHARED(n): n companies
            listed the house and nothing tells them apart, so "listed by n
            companies", and none carries "sold by". UNCERTAIN: a retail,
            distressed or ambiguous outcome. NONE: no closing deed. Wholesaler
            and investor counts use PRIMARY rows only.
        lister_on_title:
          type: string
          enum:
            - NONE
            - INTERMEDIATE
            - GRANTOR
            - PRIOR_OWNER
          description: >-
            How the listing company, or a partner entity of its account, appears
            on the deeds. NONE: an assignment, so the company never held title.
            INTERMEDIATE: it bought and resold, the middle of a double close.
            GRANTOR: it sold the house on the closing deed. PRIOR_OWNER: it
            already owned the house before the listing.
        lister_on_title_role:
          anyOf:
            - type: string
              enum:
                - OWN
                - PARTNER
              description: >-
                Which entity of the listing company's account is on title. OWN:
                the company's own entity, its title or a brand. PARTNER: a
                joint-venture partner entity listed under the account. Null when
                lister_on_title is NONE.
            - type: 'null'
          description: >-
            Which entity of the listing company's account is on title. OWN: the
            company's own entity, its title or a brand. PARTNER: a joint-venture
            partner entity listed under the account. Null when lister_on_title
            is NONE.
        buyer_fate:
          anyOf:
            - type: string
              enum:
                - HELD
                - RESALE_15_90
                - RESALE_91_365
                - RESALE_366P
                - MLS_LISTED
              description: >-
                What the buyer did with the house after the closing deed, as of
                the deed data_end, or null without a closing deed. HELD: the
                buyer still owns it at the deed data_end. RESALE_15_90: the
                buyer resold within 90 days, and so behaved like a wholesaler.
                RESALE_91_365: the buyer resold within a year, a flip.
                RESALE_366P: the buyer resold after more than a year.
                MLS_LISTED: the house is on the market in the MLS feed, as of
                the market's listings_data_end.
            - type: 'null'
          description: >-
            What the buyer did with the house after the closing deed, as of the
            deed data_end, or null without a closing deed. HELD: the buyer still
            owns it at the deed data_end. RESALE_15_90: the buyer resold within
            90 days, and so behaved like a wholesaler. RESALE_91_365: the buyer
            resold within a year, a flip. RESALE_366P: the buyer resold after
            more than a year. MLS_LISTED: the house is on the market in the MLS
            feed, as of the market's listings_data_end.
        offer_buyer_match:
          anyOf:
            - type: string
              enum:
                - EXACT
                - TOKEN
                - DIFFERENT
                - UNNAMED
              description: >-
                How the buyer named on the accepted Investorlift offer compares
                with the buyer on the deed, or null without a closing deed.
                EXACT: the same name. TOKEN: the same words in another order.
                DIFFERENT: the offer named a different party than the deed, for
                example a disposition agent who bid for a client. Show DIFFERENT
                as text: the API never names the offer party. UNNAMED: the offer
                carried no buyer name, or the listing had no accepted offer.
            - type: 'null'
          description: >-
            How the buyer named on the accepted Investorlift offer compares with
            the buyer on the deed, or null without a closing deed. EXACT: the
            same name. TOKEN: the same words in another order. DIFFERENT: the
            offer named a different party than the deed, for example a
            disposition agent who bid for a client. Show DIFFERENT as text: the
            API never names the offer party. UNNAMED: the offer carried no buyer
            name, or the listing had no accepted offer.
        retail_signals:
          type: array
          items:
            type: string
            description: >-
              One signal code. For example R1 says the buyer's mailing address
              is the house, and R2 says the homeowner listed on the MLS.
          description: >-
            The retail tests that fired on the closing deed. Empty when none
            did. Two signals make a RETAIL verdict. Show them as text beside the
            verdict, never as a colour alone.
        n_other_listings:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Other Investorlift listings of the same parcel, at any time:
            n_listings_on_parcel minus 1. 0 when this is the only one.
        n_listings_on_parcel:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Every Investorlift listing of the parcel, this one included
            (n_other_listings + 1).
        superseded_by_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: >-
            On a SUPERSEDED row, the listing of the same parcel that holds the
            credit for the deed. Null otherwise.
        data_end:
          type: string
          description: >-
            The deed data end date, YYYY-MM-DD, the same as
            meta.coverage[].data_end. The API measures every window on this row
            against it.
        as_of:
          type: string
          description: >-
            The date of the Investorlift export behind this row, YYYY-MM-DD, the
            same as meta.coverage[].wholesale_as_of.
      required:
        - id
        - market
        - source_listing_id
        - property
        - distance_miles
        - wholesaler
        - listing
        - outcome
        - verification
        - outcome_text
        - time_fit
        - closed_before_publish
        - confidence
        - buyer
        - intermediate
        - deed
        - registry_deal_id
        - lenders_active
        - lister_attribution
        - lister_on_title
        - lister_on_title_role
        - buyer_fate
        - offer_buyer_match
        - retail_signals
        - n_other_listings
        - n_listings_on_parcel
        - superseded_by_id
        - data_end
        - as_of
      additionalProperties: false
      description: >-
        One Investorlift listing as a wholesale transaction: what the company
        listed, what the county deeds record for it, and who bought it. The
        verdict is verification. outcome carries the detail, and outcome_text
        carries the sentence.
    Meta:
      type: object
      properties:
        generated_at:
          type: string
          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.
    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.
    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.
          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.
        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.
        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.
      required:
        - id
        - address_short
        - city
        - state
        - zip
        - latitude
        - longitude
        - segment
        - bedrooms
        - sqft
      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.
    WholesalerSummary:
      type: object
      properties:
        id:
          type: string
          pattern: ^wsr_[0-9a-f]{12}$
          description: >-
            Wholesaler id (an Investorlift listing company): wsr_ followed by 12
            hex characters, for example wsr_3f9a1c27b4e0. The id is stable per
            company across data refreshes. It is the key to GET
            `/v1/wholesalers/{id}`. The prefix is part of the id.
        name:
          type: string
          description: >-
            The listing company's name as it appears on Investorlift, for
            example "Home Team Investors". The API serves it to every key, as a
            business name.
        brands:
          type: array
          items:
            type: string
            description: One brand name.
          description: >-
            The other names the company markets under on Investorlift, for
            example ["OneRoof Deals"]. Empty when none.
      required:
        - id
        - name
        - brands
      additionalProperties: false
      description: The listing company with its brands.
    WholesaleListingFacts:
      type: object
      properties:
        listed_on:
          type: string
          description: >-
            The date the company published the listing on Investorlift,
            YYYY-MM-DD. Always set.
        accepted_offer_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The date of the earliest accepted offer on the listing, YYYY-MM-DD.
            The API serves it only on CONFIRMED rows: an accepted offer on a
            listing that never transferred is a claim, not a fact. Null
            otherwise, and when the listing had no accepted offer.
        contract_verified_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The date Investorlift verified the listing company's purchase
            contract, YYYY-MM-DD. Null when Investorlift verified no contract.
        asking_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            The asking price on Investorlift, whole dollars, for example 260000.
            Null when the listing carried none. Never 0.
        arv_estimate:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            The after-repair value the listing company estimated, whole dollars.
            Null when the company gave none.
        condition:
          anyOf:
            - type: string
              enum:
                - FULL_REHAB
                - MAJOR_REPAIR
                - LIGHT_REHAB
                - TURN_KEY
              description: >-
                The condition the listing company gave the house on
                Investorlift. FULL_REHAB: a gut job. MAJOR_REPAIR: heavy work.
                LIGHT_REHAB: cosmetic work. TURN_KEY: move-in ready. Null when
                the listing carried none.
            - type: 'null'
          description: >-
            The condition the listing company gave the house on Investorlift.
            FULL_REHAB: a gut job. MAJOR_REPAIR: heavy work. LIGHT_REHAB:
            cosmetic work. TURN_KEY: move-in ready. Null when the listing
            carried none.
      required:
        - listed_on
        - accepted_offer_on
        - contract_verified_on
        - asking_price
        - arv_estimate
        - condition
      additionalProperties: false
      description: >-
        What the listing said on Investorlift: dates and prices as the company
        published them. The API never serves the company's own purchase price.
    WholesaleBuyer:
      type: object
      properties:
        id:
          anyOf:
            - type: string
              pattern: ^inv_[0-9a-f]{12}$
              description: >-
                Investor id: inv_ followed by 12 hex characters, for example
                inv_abaf618f44a3. The id is stable across data refreshes within
                a market. Store it as the investor's identity.
            - type: 'null'
          description: >-
            The buyer's investor id when the buyer on the closing deed is a
            registry investor (tier REGISTRY_STRONG or REGISTRY_WEAK): the key
            to GET `/v1/investors/{id}`. Null on every other tier and without a
            closing deed.
        name:
          description: >-
            The buyer's name. For a registry investor, the registry name,
            whatever its kind, as on every deal row. The registry name is the
            deed spelling in upper case, SURNAME GIVEN for a person. For an
            unregistered company, its name as written on the deed, "not yet in
            the registry". That covers tiers IL_BUYER_CONFIRMED and
            ENTITY_UNREGISTERED when the grantee is an entity. Null for a
            person, a trust or an owner-occupant that is not itself a registry
            investor, and without a closing deed.
          type:
            - string
            - 'null'
        display_name:
          description: >-
            The name to print for the buyer. For a registry investor whose deed
            spelling is a cleanly parsed person's, GIVEN [MIDDLE] SURNAME
            [SUFFIX] in upper case. For example, "DANA RIVERA" from the deed's
            "RIVERA DANA". For an entity, a trust, a public body, an
            institutional investor, an ambiguous spelling or an unregistered
            company, it equals name. The API computes it from the buyer's
            current registry row. The name field keeps the spelling stored when
            the API matched the listing, so the two can differ between data
            refreshes. Display only: match and join on id and name. Null exactly
            when name is null.
          type:
            - string
            - 'null'
        kind:
          anyOf:
            - type: string
              enum:
                - ENTITY
                - TRUST
                - PERSON
                - MIXED
              description: >-
                The kind of the grantee or grantees on the closing deed. ENTITY:
                every grantee is an LLC, corporation or partnership. TRUST: a
                trust, and no entity. PERSON: every grantee is a person. MIXED:
                a person beside an entity or a trust.
            - type: 'null'
          description: >-
            Null without a closing deed. The kind of the grantee or grantees on
            the closing deed. ENTITY: every grantee is an LLC, corporation or
            partnership. TRUST: a trust, and no entity. PERSON: every grantee is
            a person. MIXED: a person beside an entity or a trust.
        tier:
          type: string
          enum:
            - REGISTRY_STRONG
            - REGISTRY_WEAK
            - IL_BUYER_CONFIRMED
            - ENTITY_UNREGISTERED
            - PERSON_ABSENTEE
            - OWNER_OCCUPANT
            - UNRESOLVED
          description: >-
            Who the buyer on the closing deed is, strongest first.
            REGISTRY_STRONG: a registry investor at STRONG or PROBABLE
            confidence, named, with an investor id. REGISTRY_WEAK: a registry
            investor at WEAK confidence, named, with an id. IL_BUYER_CONFIRMED:
            not in the registry, but the accepted offer's buyer or an
            Investorlift buyer account keys to the deed. On that tier the API
            names an entity and never a person. ENTITY_UNREGISTERED: an LLC or
            corporation not yet in the registry, often a fresh single-deed
            entity, named, no id. PERSON_ABSENTEE: a person whose mailing
            address is not the house, never named: show "individual buyer, not a
            known investor". OWNER_OCCUPANT: the buyer moved in, never named.
            UNRESOLVED: no closing deed. The first three count as a known
            investor.
        market:
          description: >-
            The market the buyer's investor id belongs to, the listing's market.
            Null when id is null.
          type:
            - string
            - 'null'
      required:
        - id
        - name
        - display_name
        - kind
        - tier
        - market
      additionalProperties: false
      description: >-
        Who bought the house per the recorded closing deed. The API names the
        buyer when the deed names a registry investor, whatever its kind, or an
        unregistered company. The API describes a person, a trust or an
        owner-occupant that is not itself a registry investor by tier alone,
        never by name.
    WholesaleIntermediate:
      type: object
      properties:
        id:
          anyOf:
            - type: string
              pattern: ^inv_[0-9a-f]{12}$
              description: >-
                Investor id: inv_ followed by 12 hex characters, for example
                inv_abaf618f44a3. The id is stable across data refreshes within
                a market. Store it as the investor's identity.
            - type: 'null'
          description: >-
            The investor id of the party in the middle of a double close or a
            buy-then-sell, when it is a registry investor. That party is the
            grantee of the first deed and the grantor of the second. Null
            otherwise, and when the pattern has no intermediate.
        name:
          description: >-
            That investor's registry name, the deed spelling, upper case,
            SURNAME GIVEN for a person. Null when id is null: the API names an
            intermediate only through a registry id.
          type:
            - string
            - 'null'
        display_name:
          description: >-
            The name to print for the intermediate: given-first for a cleanly
            parsed person, otherwise equal to name. Null exactly when name is
            null.
          type:
            - string
            - 'null'
        is_lister:
          description: >-
            True when the intermediate is the listing company itself, or a
            partner entity of its account: the company bought and resold the
            house. False when a third party did. Null when the pattern has no
            intermediate.
          type:
            - boolean
            - 'null'
      required:
        - id
        - name
        - display_name
        - is_lister
      additionalProperties: false
      description: >-
        The party that held title between the homeowner and the end buyer on a
        chained pair of deeds, when one exists.
    WholesaleDeed:
      type: object
      properties:
        closed_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The date of the closing deed, YYYY-MM-DD: the transaction's own
            date. Null without a closing deed (verification OPEN or NONE).
        pattern:
          type: string
          enum:
            - SINGLE
            - DOUBLE_CLOSE
            - BUY_THEN_SELL
            - DEED_THEN_RESALE
            - TWO_NOT_CHAIN
            - MULTI
            - NONE
          description: >-
            The shape of the deeds recorded on the parcel around the listing.
            SINGLE: one deed. DOUBLE_CLOSE: two chained deeds 0 to 14 days
            apart, so the intermediate bought and resold at once. BUY_THEN_SELL:
            two chained deeds 15 to 90 days apart. DEED_THEN_RESALE: the closing
            deed and the buyer's own resale more than 90 days later.
            TWO_NOT_CHAIN is two unrelated sales within 90 days, MULTI is three
            or more sales, and NONE is no attributable deed.
        chain_certain:
          description: >-
            True when the parties or the prices establish the order of the deeds
            of a chained pair. False when the rules cannot order two same-day
            deeds, and the API then caps confidence at MEDIUM. Null on a single
            deed and without a deed.
          type:
            - boolean
            - 'null'
        price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            What the buyer paid per the closing deed, whole dollars, for example
            245000. Null when the deed carries no price and no MLS sale matches
            it, as on most Texas deeds, and without a closing deed. Never 0.
        price_basis:
          anyOf:
            - type: string
              enum:
                - RECORDED
                - MLS_DERIVED
              description: >-
                Where the deed price comes from. RECORDED: the consideration
                stated on the deed, as in Arizona. MLS_DERIVED: a non-disclosure
                state such as Texas, where the deed carries no price and the
                price is the MLS sold price of the same sale.
            - type: 'null'
          description: >-
            Null when price is null. Where the deed price comes from. RECORDED:
            the consideration stated on the deed, as in Arizona. MLS_DERIVED: a
            non-disclosure state such as Texas, where the deed carries no price
            and the price is the MLS sold price of the same sale.
        price_ratio:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            price divided by asking_price, for example 0.94 when the buyer paid
            94% of the asking price. Null when either is unknown.
      required:
        - closed_on
        - pattern
        - chain_certain
        - price
        - price_basis
        - price_ratio
      additionalProperties: false
      description: >-
        The recorded deed that closed the listing: when, in what shape, and for
        how much.
    LenderActive:
      type: object
      properties:
        id:
          type: string
          pattern: ^len_[0-9a-f]{12}$
          description: 'The lender: the key to GET `/v1/lenders/{id}`.'
        name:
          type: string
          description: >-
            The lender's display name in the market, upper case as the file
            writes it, for example KIAVI FUNDING INC. A business name, which the
            API serves to every key.
        lender_class:
          type: string
          enum:
            - BANK
            - NONBANK
            - PRIVATE
            - INDIVIDUAL
            - GOVERNMENT
          description: >-
            A reading of the name, never a legal status. How the lender name
            reads. BANK: a bank, credit union or thrift. NONBANK: a mortgage
            company or other lending business. PRIVATE: a trust, a seller
            carry-back or another private party, not the hard-money sense of
            private lender, which the Lender object carries as is_hard_money.
            INDIVIDUAL: a person's name. GOVERNMENT: an agency or a public body.
        is_hard_money:
          type: boolean
          description: >-
            True when the name carries hard-money vocabulary or is a known
            hard-money brand, or when the book behaves like one. The profile's
            hard_money_basis says which, and the behaviour test needs the
            market's deed link. A PRIVATE lender_class is a trust or a seller
            carry-back, not a hard-money lender.
        'n':
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Instruments the lender recorded in the listing's ZIP in the 24
            months that end on as_of, counted once across the open-lien and
            recorded-history tables.
        n_investor:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Of those, the instruments whose borrower resolves to a registered
            investor: the count that ranks the five.
        n_purchase_money:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Of those, the instruments whose purpose is PURCHASE: a priced deed
            on the parcel in the 45 days up to the recording. Null while the
            registry has no deed link for the market.
        share:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            n over every lender's instruments in the ZIP in the window, 0 to 1,
            and the denominator counts every lender.
        as_of:
          type: string
          description: >-
            The lender registry's slice date, YYYY-MM-DD, at which the registry
            measures the counts. The block is dated: see meta.dated[].
        dated:
          type: boolean
          description: >-
            True while the financing slice behind the registry, dated as_of, is
            not in the current delivery.
      required:
        - id
        - name
        - lender_class
        - is_hard_money
        - 'n'
        - n_investor
        - n_purchase_money
        - share
        - as_of
        - dated
      additionalProperties: false
      description: >-
        One of the lenders most active with investors in a listing's ZIP. The
        lender stub with its instruments, investor loans, purchase-money loans
        and share there, over the registry's 24-month window.
    MetaGeometry:
      type: object
      properties:
        kind:
          type: string
          enum:
            - radius
            - bbox
            - place
          description: >-
            Which location ran: radius, bbox or place. A radius is a point with
            radius_miles, or a property_id request, which runs around the parcel
            centroid. 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.
        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'
      required:
        - kind
        - lat
        - lng
        - radius_miles
        - bbox
        - property_id
        - 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
                    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
          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
          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
              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
              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
              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
              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
              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
              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
                      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.
                recordings_through:
                  anyOf:
                    - type: string
                      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.
                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.
                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.
                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
          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.
    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
              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
              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
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: The deed data end that the parcel layer build used, YYYY-MM-DD.
        n_parcels:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: Parcels in the layer for this market.
        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
                      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.
                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.
                  type:
                    - string
                    - 'null'
                n_parcels:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: Parcels with a row in the slice.
                n_with_open_lien:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: Parcels with at least one open lien at as_of.
                n_free_and_clear:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: Parcels with zero open liens at as_of.
                n_avm:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: Parcels with an AVM at as_of.
                n_involuntary:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: Parcels with an involuntary lien at as_of.
                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.
              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
                      description: Calendar date, YYYY-MM-DD.
                    - type: 'null'
                  description: >-
                    The effective date of the loaded permit snapshot,
                    YYYY-MM-DD.
                n_permits:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: Permits served for this market.
                n_parcels:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: Parcels with at least one permit.
                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.
                jurisdictions:
                  anyOf:
                    - type: array
                      items:
                        type: object
                        properties:
                          jurisdiction:
                            type:
                              - string
                              - 'null'
                          n_permits:
                            anyOf:
                              - type: integer
                                minimum: -9007199254740991
                                maximum: 9007199254740991
                              - type: 'null'
                          last_issue_date:
                            anyOf:
                              - type: string
                                description: Calendar date, YYYY-MM-DD.
                              - type: 'null'
                          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.
              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
                      description: Calendar date, YYYY-MM-DD.
                    - type: 'null'
                  description: >-
                    The date of the delivery the Owner Profile block comes from,
                    YYYY-MM-DD.
                n_parcels:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: Parcels carrying a profile.
                n_multi:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: Parcels whose owner holds two or more properties.
                n_portfolio_5:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: Parcels whose owner holds five or more.
              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
                      description: Calendar date, YYYY-MM-DD.
                    - type: 'null'
                  description: >-
                    The first weekly file the history lake replayed (the
                    baseline FULL).
                last_week:
                  anyOf:
                    - type: string
                      description: Calendar date, YYYY-MM-DD.
                    - type: 'null'
                  description: The last weekly file replayed.
                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.
                n_events:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: Typed events on record.
                n_weeks:
                  anyOf:
                    - type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    - type: 'null'
                  description: Weekly files replayed.
                domains:
                  anyOf:
                    - type: object
                      propertyNames:
                        type: string
                      additionalProperties:
                        type: object
                        properties:
                          first_week:
                            anyOf:
                              - type: string
                                description: Calendar date, YYYY-MM-DD.
                              - type: 'null'
                          last_week:
                            anyOf:
                              - type: string
                                description: Calendar date, YYYY-MM-DD.
                              - type: 'null'
                          n_events:
                            anyOf:
                              - type: integer
                                minimum: -9007199254740991
                                maximum: 9007199254740991
                              - type: 'null'
                        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.
              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 carries its as-of date and counts.
    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
              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
    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
      description: >-
        API key from the developer console (starts with zpka_). Create one at
        https://developers.investorlift.com/get-a-key.

````

## Related topics

- [Get one Investorlift listing by id](/api-reference/wholesale/get-one-investorlift-listing-by-id.md)
- [Get the profile of one Investorlift listing company](/api-reference/wholesale/get-the-profile-of-one-investorlift-listing-company.md)
- [Get one listing company](/api-reference/endpoints/wholesalers-get.md)
- [Get one listing agent](/api-reference/endpoints/agents-get.md)
- [List one company's Investorlift listings](/api-reference/endpoints/wholesalers-listings.md)
