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

# List deals around a location

> Every investor purchase, flip, wholesale, holding and resale inside a radius, a viewport, around a parcel, or in a ZIP or postal city.

The route returns [Deal](/api-reference/objects/deal) rows with the address, the dates, the prices, the profit and
the investor behind each one.

## Use it when

You want the deals table of the God Mode screen, or the "Activity here" table of an investor drawer (add
`investor_id=`).

| Instead use                                                                | When                                                           |
| -------------------------------------------------------------------------- | -------------------------------------------------------------- |
| [`GET /v1/deals/cells`](/api-reference/endpoints/deals-cells)              | A zoomed-out map with too many points to draw.                 |
| [`GET /v1/deals/summary`](/api-reference/endpoints/deals-summary)          | The numbers above the table. A paged list carries no total.    |
| [`GET /v1/deals/{id}`](/api-reference/endpoints/deals-get)                 | One deal, for a card.                                          |
| [`GET /v1/investors/{id}/deals`](/api-reference/endpoints/investors-deals) | One investor's whole history across the market, not just here. |

## Read the response

* The location is a point with `radius_miles`, a `bbox`, a `property_id`, or a place. Send one location per request.
  `lat` + `lng` can go beside a `bbox` or a place as the reference point.
* A place is a `zip`, as a comma list or a repeated key of ZIP codes, or a `city`. The city is the parcel's postal
  city as the county records it. It is not the short-term rental jurisdiction. The API ignores letter case. For a ZIP
  or a city that no loaded market's parcels carry, the API answers
  [`422 outside_coverage`](/guides/concepts/errors#outside_coverage) and names it (`zips_unknown`, `city`). On Free
  and Starter the place is one ZIP ([Plans and limits](/guides/plans-and-limits)).
* The API measures `distance_miles` from the point you gave, or from the parcel of `property_id`. With a `bbox`, a
  `zip` or a `city` and no point, it is null and the default sort is newest first.
* `meta.geometry` echoes the location that ran, so you can repeat a request from its answer.
  [The envelope](/api-reference/objects/envelope) describes it.
* The API names `seller` and `end_buyer` only when they are registered investors. It never names a household, only
  its kind (`PERSON`, `TRUST` or `ENTITY`).
* `investor.name` always carries a value for a registered investor. A buyer **without** an investor id has
  `buyer_status` `unclassified` or `excluded`, and is usually a household. For such a buyer, this host does not serve
  the deed name or `investor.state`: both come back null. It serves `buyer_status` itself.
* `owner` carries a value only on a confirmed current holding. This host does not serve `owner.names` or
  `owner.mailing`: they are null, with `contact_redacted: true`. It serves the owner facts beside them.
* `short_term_rental`, on hold rows, is the parcel's record from the city's own licence roll. `str_status=LICENSED,PENDING`
  keeps the licensed and the pending holdings. `str_business_use=true` keeps the holdings whose licence is a business
  use attributed to the current owner. The block is null on resold rows and outside every loaded city. See
  [the short-term rental parcel](/api-reference/objects/str-parcel).
* `financing` (since 0.16.0) says if a purchase loan is on record in the 45 days from `bought_on`. It also says which
  lender made it and what became of it. `NONE_CAPTURED` is not a cash purchase
  ([The Deal object](/api-reference/objects/deal#how-the-purchase-was-financed)). `financed_by=len_...` keeps the
  deals of investors who borrow from that lender. `uses_private_lender=true` keeps the deals of investors who borrowed
  from a hard-money, investor, `INDIVIDUAL` or `PRIVATE` lender in the registry's window. Both answer
  [`422 lenders_unavailable`](/guides/concepts/errors#lenders_unavailable) where the market has no published
  registry or borrower match.
* Page with `page.next_cursor`: pass it back as `cursor=` with the same query.

## Gotchas

* **By default the list hides institutional investors and public bodies.** To include them, add `institutional` to
  `scale=` and set `include_public=true`. The same defaults apply to the summary and the cells, so the numbers agree.
* `sort=distance` needs a point. With `bbox`, `zip` or `city` alone, the API answers
  [`400 sort_requires_point`](/guides/concepts/errors#sort_requires_point).
* A city, or a list of more than six ZIPs, is a large query, like a radius over five miles. A large query waits for
  the large queries before it.
* A cursor is valid only for the same query, sort and data version. See
  [Pagination](/guides/concepts/pagination).
* This route has no CSV on `api.investorlift.com`. Page the JSON list ([Give me a spreadsheet](/guides/walkthroughs/spreadsheet)).
  The one public CSV is [the loans of a lender](/api-reference/endpoints/lenders-loans#csv).
* For bracketed list syntax (`kind[]=flip`), the API answers
  [`400 unknown_parameter`](/guides/concepts/errors#unknown_parameter). Write `kind=flip,hold` or repeat the key.
* The API follows `investor_id=` with an old id to the current investor and echoes the old id in
  `meta.resolved_from`. For a retired id, the API answers [`410 gone`](/guides/concepts/errors#gone).

## Related

[The calls behind a map](/guides/walkthroughs/map) uses this route with the summary and the cells.
[Filters in plain words](/guides/concepts/filters) lists every filter, and the Texas price rules.


## OpenAPI

````yaml GET /v1/deals
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/deals:
    get:
      tags:
        - deals
      summary: List investor deals around a location
      description: >-
        Every investor purchase, flip, wholesale, current holding and resale in
        a radius, a viewport, around a parcel, or in a ZIP list or postal city.
        Each row has the address, the dates, the prices, the profit and the
        investor behind it.


        Use it for a table of deals. For a map use `/v1/deals/cells`. For the
        totals above the table use `/v1/deals/summary`, and for one investor's
        history use `/v1/investors/{id}/deals`.


        [Reading the response and the
        filters](https://developers.investorlift.com/api-reference/endpoints/deals-list).
      operationId: listDeals
      parameters:
        - schema:
            minItems: 1
            type: array
            items:
              type: string
              enum:
                - flip
                - wholesale
                - hold
                - long_hold
                - other
                - build
              description: >-
                What occurred on the deal. flip: bought, fixed and resold within
                about a year at a profit-shaped margin; wholesale: bought and
                resold in under 30 days, or a chain resale or round trip within
                90 (a double close); hold: bought and still owned at data_end, a
                confirmed holding or an un-resold purchase; long_hold: held over
                a year, then sold (a landlord exit); other: an investor resale
                that is not a clean flip. Reasons: a loss, a thin margin, a
                builder's new home resold, an iBuyer resale, or a chain resale
                of 3 to 12 months; build: a registered investor bought a lot or
                teardown, built a house on it during the hold, then sold. A
                builder's finished home bought and resold is other. On data
                built after 2026-09-17 the kind keeps only a single-family
                parcel held over 90 days, its house complete by the sale year. A
                market built on or before 2026-09-17 (meta.coverage[].loaded_at)
                counts every lot-to-build resale by a registered investor as a
                build until its next build.
          in: query
          name: kind
          required: false
          description: >-
            Deal kinds to keep (comma list or repeated key). Default: every
            kind.
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: price_min
          required: false
          description: >-
            Minimum bought price, inclusive, integer dollars. When you set
            price_min or price_max, the API drops null-priced rows unless
            include_unpriced=true.
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: price_max
          required: false
          description: Maximum bought price, inclusive, integer dollars.
        - schema:
            type: string
          in: query
          name: bought_after
          required: false
          description: >-
            Keep deals bought on or after this date. When you set bought_after
            or bought_before, the API drops null-date rows unless
            include_undated=true.
        - schema:
            type: string
          in: query
          name: bought_before
          required: false
          description: Keep deals bought on or before this date.
        - schema:
            type: string
          in: query
          name: sold_after
          required: false
          description: 'Resold deals only: sold on or after this date.'
        - schema:
            type: string
          in: query
          name: sold_before
          required: false
          description: 'Resold deals only: sold on or before this date.'
        - schema:
            minItems: 1
            type: array
            items:
              type: string
              enum:
                - SFR
                - CONDO_TH
                - OTHER
              description: >-
                Parcel segment: SFR, CONDO_TH (condo or townhouse) or OTHER, a
                mixed bucket of manufactured, multi-family, land and commercial
                parcels.
          in: query
          name: segment
          required: false
          description: 'Parcel segments to keep. Default: every segment.'
        - schema:
            type: integer
            minimum: 0
            maximum: 50
          in: query
          name: beds_min
          required: false
          description: Minimum bedrooms, inclusive.
        - schema:
            type: integer
            minimum: 0
            maximum: 1000000
          in: query
          name: sqft_min
          required: false
          description: Minimum living area in square feet, inclusive, 0 to 1,000,000.
        - schema:
            type: integer
            minimum: 0
            maximum: 1000000
          in: query
          name: sqft_max
          required: false
          description: Maximum living area in square feet, inclusive, 0 to 1,000,000.
        - schema:
            minItems: 1
            type: array
            items:
              type: string
              enum:
                - FLIPPER
                - WHOLESALER
                - LANDLORD
                - BUILDER
                - IBUYER
              description: >-
                Investor kind, the primary one of kinds[] (an investor can carry
                several), for display only. FLIPPER: buys, renovates and
                resells. WHOLESALER: buys to resell quickly, often through a
                double close. LANDLORD: buys and holds rentals. BUILDER: builds
                on lots it buys. IBUYER: Opendoor, Offerpad or Zillow.
          in: query
          name: investor_kind
          required: false
          description: >-
            Keep investors that carry at least one listed kind. The check reads
            any of their kinds[], never the primary kind. Default: every kind.
            Buyers without an investor id pass unless registered_only=true.
        - schema:
            minItems: 1
            type: array
            items:
              type: string
              enum:
                - FLIPPER
                - WHOLESALER
                - LANDLORD
                - BUILDER
                - IBUYER
              description: >-
                Investor kind, the primary one of kinds[] (an investor can carry
                several), for display only. FLIPPER: buys, renovates and
                resells. WHOLESALER: buys to resell quickly, often through a
                double close. LANDLORD: buys and holds rentals. BUILDER: builds
                on lots it buys. IBUYER: Opendoor, Offerpad or Zillow.
          in: query
          name: investor_kind_exclude
          required: false
          description: >-
            Drop investors that carry any listed kind. The API checks kinds[]
            after investor_kind. investor_kind_exclude=WHOLESALER removes
            investors who also wholesale.
        - schema:
            type: string
            enum:
              - STRONG
              - PROBABLE
              - WEAK
          in: query
          name: investor_confidence_min
          required: false
          description: >-
            Minimum registry confidence in the investor kind: STRONG, PROBABLE
            or WEAK (WEAK admits everything).
        - schema:
            minItems: 1
            type: array
            items:
              type: string
              enum:
                - individual
                - small
                - mid
                - large
                - institutional
              description: >-
                Investor scale: individual (one person, no entity), small (fewer
                than 10 investment deals), mid (10 to 99), large (100 to 999) or
                institutional. An institutional investor is an iBuyer, a
                production builder, a bulk landlord with 500 or more holdings,
                or a known brand from a list. The registry counts the deals
                inside the area loaded for the market
                (meta.coverage[].universe_kind), so in a ZIP market the tier is
                a floor.
          in: query
          name: scale
          required: false
          description: >-
            Scale tiers to keep. Default: every tier except institutional. An
            explicit list replaces the default entirely. scale=institutional
            alone returns only institutional.
            scale=individual,small,mid,large,institutional returns everyone.
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: include_public
          required: false
          description: >-
            Include public-body investors (counties, cities, housing
            authorities) and their deals. Default false: every list endpoint
            hides them.
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: include_unpriced
          required: false
          description: >-
            Keep null-priced rows when you set price_min or price_max (default
            false).
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: include_undated
          required: false
          description: >-
            Keep null-date rows when you set bought_after or bought_before
            (default false).
        - schema:
            type: integer
            minimum: 1
            maximum: 600
          in: query
          name: active_within_months
          required: false
          description: >-
            Keep investors whose last purchase is at most this many months
            before data_end (data_end minus last_bought_on). Sales and transfers
            do not count. No default.
        - schema:
            type: integer
            minimum: 1
            maximum: 1000000
          in: query
          name: investor_deals_min
          required: false
          description: >-
            Minimum purchase events of that investor inside the geometry, 1 to
            1,000,000. The API applies it after the other filters.
        - schema:
            type: integer
            minimum: 0
            maximum: 1000000
          in: query
          name: holds_min
          required: false
          description: >-
            Investor filter: keep investors who hold at least this many parcels
            across the whole market at the deed data end
            (meta.coverage[].data_end). The count is the investor's n_holds:
            confirmed holdings plus un-resold purchases inside the area loaded
            for the market, not the holdings inside the geometry. Range 0 to
            1,000,000, inclusive. For example, holds_min=20 keeps the larger
            portfolios. Buyers without an investor id pass unless
            registered_only=true.
        - schema:
            type: integer
            minimum: 0
            maximum: 1000000
          in: query
          name: holds_max
          required: false
          description: >-
            Investor filter: keep investors who hold at most this many parcels
            across the whole market at the deed data end (n_holds). Range 0 to
            1,000,000, inclusive. holds_max=0 keeps the investors that hold
            nothing. Beside holds_min the pair is a band. Buyers without an
            investor id pass unless registered_only=true.
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: buys_wholesale
          required: false
          description: >-
            Investor filter: at least one bought-from-wholesaler deal in the 36
            months before data_end.
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: buys_at_auction
          required: false
          description: >-
            Investor filter: true keeps investors who bought at least one house
            at a foreclosure auction in the 24 months before data_end. A
            foreclosure auction is a trustee's sale or an Arizona sheriff's
            sale, and the filter reads investor.auction.is_active_auction_buyer.
            These buyers pay cash within a day and buy without an inspection.
            False keeps registered investors who did not. Buyers without an
            investor id pass unless registered_only=true. The API answers 422
            auction_unavailable in a market that does not publish its auction
            counts (meta.coverage[].auction_counted false).
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: buys_reo
          required: false
          description: >-
            Investor filter: true keeps investors who bought at least one house
            from a lender, servicer or agency after a foreclosure. The window is
            the 24 months before data_end, and the filter reads
            investor.auction.is_active_reo_buyer. A bank-owned (REO) sale gave
            the buyer weeks, an inspection and the option to finance: the weaker
            cash signal beside buys_at_auction. False keeps registered investors
            who did not, and buys_at_auction=true&buys_reo=false is the
            cash-only set. Buyers without an investor id pass unless
            registered_only=true. The API answers 422 auction_unavailable where
            the market does not publish its auction counts.
        - schema:
            minItems: 1
            type: array
            items:
              type: string
              enum:
                - TRUSTEE_SALE
                - SHERIFF_SALE
                - HOA_TRUSTEE_SALE
                - TAX_SALE
                - TAX_LIEN_DEED
              description: >-
                The kind of auction the purchase deed records: TRUSTEE_SALE and
                SHERIFF_SALE count toward buys_at_auction, and the API shows the
                other three but never counts them. TRUSTEE_SALE: a lender's
                foreclosure sale by the trustee, cash and final on the day,
                without redemption. In Arizona the buyer pays a $10,000 deposit
                and the full bid by 5 pm the next business day. In Texas it is
                the first-Tuesday courthouse sale, in Washington the Friday sale
                at the county's designated place under RCW 61.24. SHERIFF_SALE:
                a judicial sale under court order. In Arizona it is an HOA or
                judgment-lien sale, cash but subject to the first mortgage and
                to a 30-day or 6-month redemption. In Washington it is a
                judicial mortgage foreclosure or lien sale under RCW 6.21, with
                an 8-month or 1-year redemption. In Washington the sale is
                subject to the senior lien only when it is a lien sale.
                HOA_TRUSTEE_SALE: a Texas homeowners association foreclosure
                recorded as a trustee's deed, cash, subject to the first lien
                and to a 180-day redemption. TAX_SALE: a Texas constable or
                taxing-unit tax sale, cash, with a 180-day or 2-year redemption.
                In Washington it is the county treasurer's deed after the tax
                foreclosure judgment, with no redemption after the sale.
                TAX_LIEN_DEED: an Arizona treasurer's deed to a tax-lien holder,
                mostly vacant land, not an auction of the house.
          in: query
          name: bought_auction_kind
          required: false
          description: >-
            Deal filter: keep deals whose purchase deed was a third-party
            auction purchase of one of the listed kinds (comma list or repeated
            key). For example, bought_auction_kind=TRUSTEE_SALE keeps houses
            bought at a foreclosure sale. The API drops deals bought any other
            way and deals without a buy deed. The API answers 422
            auction_unavailable where the market does not publish its auction
            counts.
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: bought_from_wholesaler
          required: false
          description: >-
            Deal filter: bought through a documented double close from a
            wholesaler, or from a known wholesaler. Assignments leave no deed,
            so absence is not evidence.
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: bought_distressed
          required: false
          description: >-
            Deal filter: the buy leg was a distressed sale. That is a
            foreclosure, trustee, sheriff or tax instrument, a deed in lieu, or
            a deed the feed flags as REO. It is wider than bought_auction_kind,
            which keeps only third-party auction purchases.
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: registered_only
          required: false
          description: >-
            Keep only rows whose buyer carries an investor id (investor.id is
            not null).
        - schema:
            minItems: 1
            type: array
            items:
              type: string
              enum:
                - registered
                - unclassified
                - excluded
                - unknown
              description: >-
                The buyer's standing in the registry: registered (has an
                investor id), unclassified, excluded or unknown (the deed names
                no buyer). Unclassified: a named buyer the registry did not
                classify as an investor, usually a household. Excluded: a named
                buyer the registry deliberately left out. Those are custodian
                trusts, relocation companies, auction houses and ambiguous
                surnames.
          in: query
          name: buyer_status
          required: false
          description: Buyer statuses to keep.
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: str_operator
          required: false
          description: >-
            Investor filter: true keeps investors that hold at least one parcel
            with a business-use short-term-rental licence attributed to them.
            That is the str roll-up's n_holdings at 1 or more. False keeps
            investors with none. Buyers without an investor id pass unless
            registered_only=true. The API answers 422 str_unavailable when a
            market in play has no short-term rental tables
            (meta.coverage[].str_as_of null).
        - schema:
            type: integer
            minimum: 1
            maximum: 100000
          in: query
          name: str_holdings_min
          required: false
          description: >-
            Investor filter: at least this many of the investor's holdings carry
            a business-use short-term-rental licence attributed to them (the str
            roll-up's n_holdings), 1 or more. Buyers without an investor id pass
            unless registered_only=true. The API answers 422 str_unavailable
            when a market in play has no short-term rental tables.
        - schema:
            type: string
            pattern: ^len_[0-9a-f]{12}$
          in: query
          name: financed_by
          required: false
          description: >-
            Investor filter: keep investors with at least one recorded loan from
            this lender, as the main borrower of the mortgage or the open lien.
            The value is a lender id, len_ followed by 12 hex characters, for
            example len_d2028f0766fc from GET /v1/lenders/search. The match is
            investor_id on the lender's loan rows. The count is a floor: the
            recorded history sees about one loan in five. Buyers without an
            investor id pass unless registered_only=true. The API answers 422
            lenders_unavailable when a market in play has no lender registry
            with the borrower match (meta.coverage[].lenders null or
            borrowers_measured false).
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: uses_private_lender
          required: false
          description: >-
            Investor filter: true keeps investors with a loan from a private
            lender, recorded in the 24 months before the lender registry's slice
            date (meta.coverage[].lenders.as_of). A private lender is a
            hard-money lender by name or behaviour (is_hard_money) or an
            investor lender by behaviour (is_investor_lender). A lender whose
            class reads INDIVIDUAL or PRIVATE also counts as private. False
            keeps registered investors with none such, and the result is a floor
            of a partial feed. Buyers without an investor id pass unless
            registered_only=true. The API answers 422 lenders_unavailable when a
            market in play has no lender registry with the borrower match.
        - schema:
            type: string
            pattern: ^inv_[0-9a-f]{12}$
          in: query
          name: investor_id
          required: false
          description: >-
            Scope the rows to one buyer (the drawer's "Activity here"). The API
            follows an old id from an earlier data refresh to the investor that
            superseded it and echoes the old id in meta.resolved_from. A retired
            id is 410 gone.
        - schema:
            type: string
            pattern: ^deal_[0-9a-f]{32}$
          in: query
          name: deal_id
          required: false
          description: Scope the rows to one deal.
        - schema:
            type: number
            minimum: -90
            maximum: 90
          in: query
          name: lat
          required: false
          description: >-
            Point latitude (with lng). With radius_miles it is the search
            geometry. With bbox it is the reference point only.
        - schema:
            type: number
            minimum: -180
            maximum: 180
          in: query
          name: lng
          required: false
          description: Point longitude (with lat).
        - schema:
            type: number
            minimum: 0.25
            maximum: 20
          in: query
          name: radius_miles
          required: false
          description: >-
            Search radius in miles around the point or around the centre of the
            property_id parcel, 0.25 to 20 (default 2). Not allowed with bbox.
        - schema:
            type: string
          in: query
          name: bbox
          required: false
          description: >-
            Viewport as west,south,east,north (WGS84 degrees). West must be less
            than east, south less than north, and the diagonal at most 40 mi. It
            must intersect a loaded market's coverage bbox (422 outside_coverage
            otherwise). It can carry lat + lng (without radius_miles) as the
            reference point for distances and sort=distance.
        - schema:
            type: string
            pattern: ^prop_[0-9a-f]{32}$
          in: query
          name: property_id
          required: false
          description: >-
            Parcel geometry: search around the centre of that parcel, with
            radius_miles. Not allowed with lat, lng or bbox.
        - schema:
            minItems: 1
            maxItems: 50
            type: array
            items:
              type: string
              pattern: ^\d{5}$
          in: query
          name: zip
          required: false
          description: >-
            Place geometry: the parcels of these 5-digit ZIP codes, as a comma
            list or a repeated key, up to 50. On the deal and investor routes
            the Free and Starter plans take exactly one ZIP, and more is 403
            plan_limit. You can add lat + lng as the reference point for
            distances. Not with radius_miles, bbox, property_id or city. A ZIP
            that no parcel of a loaded market carries is 422 outside_coverage
            (zips_unknown in the body).
        - schema:
            type: string
            minLength: 1
            maxLength: 100
          in: query
          name: city
          required: false
          description: >-
            Place geometry: the parcels whose postal city is this one, as the
            county records it ("Scottsdale"). Case does not matter: the API
            compares the value folded upper case. Never the short-term rental
            jurisdiction (meta.coverage[].str.jurisdictions[]). You can add lat
            + lng as the reference point, but not radius_miles, bbox,
            property_id or zip. On the deal and investor routes of the Free and
            Starter plans a city-wide search is 403 plan_limit. A city that no
            parcel of a loaded market carries is 422 outside_coverage.
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: bought_on_investorlift
          required: false
          description: >-
            Keep only deals whose closing deed closed an Investorlift listing.
            Those rows carry a wholesale_listing block. The API answers 422
            wholesale_unavailable when the market has no wholesale tables
            (meta.coverage[].wholesale_as_of null).
        - schema:
            minItems: 1
            type: array
            items:
              type: string
              enum:
                - LICENSED
                - PENDING
                - EXPIRED
              description: >-
                The short-term rental status a holding must carry for the API to
                keep the row: the block's status. LICENSED means an active
                licence or permit, PENDING an application on file with none
                active, and EXPIRED every record on the parcel inactive. The API
                keeps a row when any of the values matches. Rows that are not
                holdings (flips, wholesales, resold purchases) carry no block
                and never match. The API serves NONE on rows, but NONE is not
                filterable in this release (400 for the value).
          in: query
          name: str_status
          required: false
          description: >-
            Keep only holdings whose short-term rental status matches one of the
            values (comma list or repeated key): LICENSED, PENDING or EXPIRED,
            the block's status. The API serves NONE on rows, but NONE is not
            filterable in this release (400 for the value). The API applies the
            filter before it cuts the page. Rows that are not holdings never
            match. 422 str_unavailable when a market in play has no short-term
            rental tables (meta.coverage[].str_as_of null). Default: every row.
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
          in: query
          name: str_business_use
          required: false
          description: >-
            With true, keep only hold rows whose licence is a business use
            attributed to the current owner: the UI's short-term rental deal
            type. With false, keep only hold rows whose licence is not one: a
            person's own home with a casita permit, or a prior owner's permit.
            Without str_status the test covers LICENSED and PENDING records, the
            only ones where business_use is true. Combine it with str_status to
            widen or narrow. The API applies the filter before it cuts the page.
            Rows that are not holdings never match. 422 str_unavailable when a
            market in play has no short-term rental tables
            (meta.coverage[].str_as_of null). Default: every row.
        - schema:
            type: string
            enum:
              - distance
              - date_desc
              - date_asc
              - price_desc
              - price_asc
          in: query
          name: sort
          required: false
          description: >-
            Row order: distance (nearest first), date_desc (newest purchase
            first), date_asc (oldest purchase first), price_desc or price_asc
            (on the purchase price). With a reference point the default is
            distance, which needs lat + lng or property_id. With bbox alone the
            default is date_desc. Undated rows come last under both date sorts,
            and unpriced rows last under both price sorts.
        - schema:
            default: 500
            type: integer
            minimum: 1
            maximum: 500
          in: query
          name: limit
          required: false
          description: Page size, 1-500 (default 500).
        - schema:
            type: string
            minLength: 1
            maxLength: 4096
          in: query
          name: cursor
          required: false
          description: >-
            Opaque cursor from page.next_cursor of the previous page. A change
            of query, sort, weights or data version invalidates it (400
            invalid_cursor). Then restart from page 1.
      responses:
        '200':
          description: >-
            One page of deals inside the geometry after the filters, in the
            requested sort, with the cursor for the next page.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Deal'
                    description: The rows of this page.
                  page:
                    $ref: '#/components/schemas/Page'
                  meta:
                    $ref: '#/components/schemas/Meta'
                required:
                  - data
                  - page
                  - meta
                additionalProperties: false
                description: Deals inside the geometry, one page.
              example:
                data:
                  - id: deal_3d737e533571e3d9a95e071392860320
                    market: phx
                    kind: flip
                    deal_type: PAIR
                    deal_kind: FLIP
                    ownership_confirmed: null
                    buyer_status: registered
                    buyer_exclusion: null
                    property:
                      id: prop_d58780568cc908831cf5a059808d6e9e
                      market: phx
                      apn: 131-28-197
                      apn_norm: '13128197'
                      county_fips: '04013'
                      address_short: 7424 E Cambridge Ave
                      street_no_unit: 7424 E Cambridge Ave
                      unit: null
                      city: SCOTTSDALE
                      state: AZ
                      zip: '85257'
                      latitude: 33.478319
                      longitude: -111.920385
                      segment: SFR
                      bedrooms: 3
                      bathrooms: 2
                      sqft: 1371
                      year_built: 1959
                      pool: true
                    distance_miles: 0.1
                    bought_on: '2025-07-09'
                    date_quality: deed
                    held_since_source: DEED_ACQUISITION
                    bought_price: 575000
                    sold_on: '2026-02-17'
                    sold_price: 930000
                    hold_days: 223
                    gross_profit: 355000
                    spread_ratio: 0.617391
                    price_quality: BOTH
                    days_held_to_data_end: null
                    sold_to_wholesaler: false
                    round_trip: false
                    is_purchase_event: true
                    n_parcels_in_event: 1
                    bought_from_wholesaler: false
                    bought_from_wholesaler_via: null
                    wholesaler_investor_id: null
                    bought_from_investor: false
                    bought_distressed: false
                    bought_auction_kind: null
                    holding_kind: null
                    acquisition_kind: null
                    investor:
                      id: inv_5494f8b4fb59
                      market: phx
                      name: VICSDALE HOME DESIGNS LLC
                      display_name: VICSDALE HOME DESIGNS LLC
                      state: AZ
                      kind: FLIPPER
                      confidence: STRONG
                      scale: mid
                      institutional: false
                      is_public: false
                      last_bought_on: '2026-04-22'
                      n_deals: 37
                      buyer_status: registered
                    seller:
                      id: null
                      name: null
                      display_name: null
                      kind: TRUST
                      kinds: null
                    end_buyer:
                      id: null
                      name: null
                      display_name: null
                      kind: PERSON
                      kinds: null
                    owner: null
                    listing: null
                    short_term_rental: null
                    wholesale_listing: null
                    financing:
                      purchase_loan_status: NONE_CAPTURED
                      purchase_loan: null
                      secondary_loans_n: null
                      link_window: null
                      outcome: null
                      as_of: '2026-06-25'
                      dated: true
                  - id: deal_46f741afdfd3a1be57bbf5afa8ed6e58
                    market: phx
                    kind: flip
                    deal_type: PAIR
                    deal_kind: FLIP
                    ownership_confirmed: null
                    buyer_status: registered
                    buyer_exclusion: null
                    property:
                      id: prop_a2818176007027aee8d47996b448609a
                      market: phx
                      apn: 131-28-196
                      apn_norm: '13128196'
                      county_fips: '04013'
                      address_short: 7428 E Cambridge Ave
                      street_no_unit: 7428 E Cambridge Ave
                      unit: null
                      city: SCOTTSDALE
                      state: AZ
                      zip: '85257'
                      latitude: 33.478329
                      longitude: -111.920155
                      segment: SFR
                      bedrooms: 3
                      bathrooms: 2
                      sqft: 1683
                      year_built: 1959
                      pool: true
                    distance_miles: 0.1
                    bought_on: '2025-03-05'
                    date_quality: deed
                    held_since_source: DEED_ACQUISITION
                    bought_price: 540000
                    sold_on: '2025-09-18'
                    sold_price: 690000
                    hold_days: 197
                    gross_profit: 150000
                    spread_ratio: 0.277778
                    price_quality: BOTH
                    days_held_to_data_end: null
                    sold_to_wholesaler: false
                    round_trip: false
                    is_purchase_event: true
                    n_parcels_in_event: 1
                    bought_from_wholesaler: false
                    bought_from_wholesaler_via: null
                    wholesaler_investor_id: null
                    bought_from_investor: false
                    bought_distressed: false
                    bought_auction_kind: null
                    holding_kind: null
                    acquisition_kind: null
                    investor:
                      id: inv_0d079771ae62
                      market: phx
                      name: KREATIVE HOME SOLUTIONS LLC
                      display_name: KREATIVE HOME SOLUTIONS LLC
                      state: AZ
                      kind: FLIPPER
                      confidence: WEAK
                      scale: small
                      institutional: false
                      is_public: false
                      last_bought_on: '2025-03-05'
                      n_deals: 1
                      buyer_status: registered
                    seller:
                      id: null
                      name: null
                      display_name: null
                      kind: PERSON
                      kinds: null
                    end_buyer:
                      id: null
                      name: null
                      display_name: null
                      kind: PERSON
                      kinds: null
                    owner: null
                    listing: null
                    short_term_rental: null
                    wholesale_listing: null
                    financing:
                      purchase_loan_status: NONE_CAPTURED
                      purchase_loan: null
                      secondary_loans_n: null
                      link_window: null
                      outcome: null
                      as_of: '2026-06-25'
                      dated: true
                page:
                  next_cursor: >-
                    eyJ2IjoxLCJydW4iOiIxNzg4NDY5ODE5IiwicSI6IjRlNzcwNGQyMjljY2E1NGNjYWFjYzFmYzJjNzkwMGM2NTkwZDUzMzU4Zjg4YWJhZWVkZTgzZWRmOGJlMzZmZjkiLCJrIjpbMTU4LjQ0OTk3ODY0MjAzNzUsIjQ2Zjc0MWFmZGZkM2ExYmU1N2JiZjVhZmE4ZWQ2ZTU4Il19
                  limit: 2
                  returned: 2
                meta:
                  generated_at: '2026-09-03T21:40:00.000Z'
                  reference_point:
                    lat: 33.476917
                    lng: -111.920385
                  geometry:
                    kind: radius
                    lat: 33.476917
                    lng: -111.920385
                    radius_miles: 2
                    bbox: null
                    property_id: null
                    zip: null
                    city: null
                  coverage:
                    - market: phx
                      state: AZ
                      counties:
                        - fips: '04013'
                          name: Maricopa
                          data_end: '2026-08-12'
                        - fips: '04021'
                          name: Pinal
                          data_end: '2026-08-06'
                      bbox:
                        - -113.332773
                        - 32.46915
                        - -110.455491
                        - 33.999503
                      data_end: '2026-08-12'
                      build_run_id: 1
                      registry_run: 7
                      registry_version: v4-metro-review-fixes
                      dataset_version: 1788469819
                      loaded_at: '2026-09-03T21:10:18.682Z'
                      metro_buy_to_resale_ratio: 0.7192
                      universe_kind: metro
                      universe_zips: null
                      point_tolerance_miles: 20
                      n_parcels: null
                      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'
            X-Credits-Charged:
              $ref: '#/components/headers/X-Credits-Charged'
            X-Credits-Remaining:
              $ref: '#/components/headers/X-Credits-Remaining'
        '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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '410':
          description: >-
            Gone: a retired investor, agent or lender id, with superseded_by
            (gone)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                gone:
                  summary: Gone
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#gone
                    title: Gone
                    status: 410
                    code: gone
                    detail: >-
                      The registry retired investor inv_003c1db2782c in run 8
                      (RETIRED). No current investor holds its names. Use
                      /v1/investors/search instead.
                    instance: /v1/deals
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    superseded_by: null
                    reason: RETIRED
                    market: phx
          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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    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/deals
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
components:
  schemas:
    Deal:
      type: object
      properties:
        id:
          type: string
          pattern: ^deal_[0-9a-f]{32}$
          description: >-
            Deal id: deal_ followed by 32 hex characters, for example
            deal_5d1b2c3d4e5f60718293a4b5c6d7e8f9. The prefix is part of the id.
        market:
          type: string
          description: >-
            Market code the deal belongs to, for example phx. The loaded markets
            are in meta.coverage[].
        kind:
          type: string
          enum:
            - flip
            - wholesale
            - hold
            - long_hold
            - other
            - build
          description: >-
            What occurred on the deal. flip: bought, fixed and resold within
            about a year at a profit-shaped margin; wholesale: bought and resold
            in under 30 days, or a chain resale or round trip within 90 (a
            double close); hold: bought and still owned at data_end, a confirmed
            holding or an un-resold purchase; long_hold: held over a year, then
            sold (a landlord exit); other: an investor resale that is not a
            clean flip. Reasons: a loss, a thin margin, a builder's new home
            resold, an iBuyer resale, or a chain resale of 3 to 12 months;
            build: a registered investor bought a lot or teardown, built a house
            on it during the hold, then sold. A builder's finished home bought
            and resold is other. On data built after 2026-09-17 the kind keeps
            only a single-family parcel held over 90 days, its house complete by
            the sale year. A market built on or before 2026-09-17
            (meta.coverage[].loaded_at) counts every lot-to-build resale by a
            registered investor as a build until its next build.
        deal_type:
          type: string
          enum:
            - PAIR
            - HOLDING
            - PURCHASE
          description: >-
            What kind of record the row is. PAIR: a purchase and its resale, two
            deeds. HOLDING: a confirmed current holding, where the owner of
            record at the deed data end (meta.coverage[].data_end) matches the
            investor. PURCHASE: an investor purchase deed with no resale and no
            ownership confirmation at the deed data end.
        deal_kind:
          type: string
          enum:
            - FLIP
            - WHOLESALE
            - INVESTOR_HOLD
            - INVESTOR_OTHER
            - CURRENT_HOLDING
            - BUILD
          description: >-
            The label of the classifier behind kind, for diagnostics: use kind
            for display. FLIP: a clean flip held 30 to 365 days, both deeds
            priced and resold for 10 to 150% over the purchase price. FLIP also
            covers an unpriced purchase deed in that window, the usual Texas
            shape, that a registry investor resold at a price. About one flip in
            six has no investor id. WHOLESALE: resold in under 30 days, or a
            chain resale or a round trip within 90 days. INVESTOR_HOLD: held
            over a year and then sold, or bought and not resold by the deed data
            end. INVESTOR_OTHER: resold by an investor but not a clean flip. A
            loss, a margin under 10%, a resale over 150%, a builder's resold new
            home, an iBuyer resale, a 3 to 12 month chain resale.
            CURRENT_HOLDING means a confirmed holding at the deed data end.
            BUILD means a registered investor bought a lot or a teardown, built
            a house, and sold. The Deal page lists the bounds and their as-of.
        ownership_confirmed:
          description: >-
            True on a confirmed holding: the owner of record at the deed data
            end matches the investor. False on a purchase with no ownership
            confirmation at the deed data end. Null on resold rows.
          type:
            - boolean
            - 'null'
        buyer_status:
          type: string
          enum:
            - registered
            - unclassified
            - excluded
            - unknown
          description: >-
            The buyer's standing in the registry: registered (has an investor
            id), unclassified, excluded or unknown (the deed names no buyer).
            Unclassified: a named buyer the registry did not classify as an
            investor, usually a household. Excluded: a named buyer the registry
            deliberately left out. Those are custodian trusts, relocation
            companies, auction houses and ambiguous surnames.
        buyer_exclusion:
          anyOf:
            - type: string
              enum:
                - INSTITUTION
                - AMBIGUOUS_NAME
                - POOLED_NAME
              description: >-
                Why an excluded buyer has no investor id. INSTITUTION: a
                custodian, a relocation company or an auction house.
                AMBIGUOUS_NAME: a bare surname. POOLED_NAME: a name that many
                unrelated people share.
            - type: 'null'
          description: >-
            Only when buyer_status is excluded. Null otherwise. Why an excluded
            buyer has no investor id. INSTITUTION: a custodian, a relocation
            company or an auction house. AMBIGUOUS_NAME: a bare surname.
            POOLED_NAME: a name that many unrelated people share.
        property:
          $ref: '#/components/schemas/DealProperty'
        distance_miles:
          description: >-
            Miles from the reference point, rounded to 2 decimals. The reference
            point is lat and lng, or the centre of the property_id parcel. Null
            when the request had no reference point.
          type:
            - number
            - 'null'
        bought_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            Purchase date, YYYY-MM-DD. Null on holdings with no dated record
            (date_quality unknown).
        date_quality:
          type: string
          enum:
            - deed
            - ownership_record
            - assessor
            - unknown
            - implausible
          description: >-
            Where bought_on comes from. With deed it comes from the acquisition
            or transfer deed, the best source. With ownership_record it comes
            from the county ownership start, and with assessor from the
            assessor's last-sold date. With unknown no date exists and bought_on
            is null. With implausible the source date lay in the future, so
            bought_on is null.
        held_since_source:
          type: string
          enum:
            - DEED_ACQUISITION
            - DEED_TRANSFER
            - CORE_OWNERSHIP_START
            - CORE_LAST_SOLD
            - SECMASTER_DEED
            - NONE
          description: >-
            The record bought_on comes from. DEED_ACQUISITION: the purchase
            deed, on purchases and resales. DEED_TRANSFER: an unpriced transfer
            deed to the owner. CORE_OWNERSHIP_START means the county ownership
            start date, and CORE_LAST_SOLD the assessor's last-sold date.
            SECMASTER_DEED: a deed in the county secondary records. NONE: no
            dated record, so bought_on is null.
        bought_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            What the investor paid, whole dollars, for example 610000. Null,
            never 0, when the deed carries no price: an unpriced transfer or
            holding, or a deed in a non-disclosure state (Texas). Most
            off-market purchases in such a state carry no price. The field
            price_quality says which prices the row has.
        sold_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            Resale date. Null while the investor holds the parcel at the deed
            data end.
        sold_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            Resale price, whole dollars. Null while the investor holds the
            parcel at the deed data end, or when the resale deed carries no
            price (non-disclosure states).
        hold_days:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Days between purchase and resale. Null while the investor holds the
            parcel at the deed data end.
        gross_profit:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            sold_price minus bought_price, whole dollars, on resold rows. Null
            while the investor holds the parcel at the deed data end. Also null
            when either price is unknown, price_quality other than BOTH: a Texas
            flip bought off-market carries only its resale price. Not net of
            rehab or costs.
        spread_ratio:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            sold_price / bought_price minus 1, a ratio (0.336 = +33.6%). Null
            while the investor holds the parcel at the deed data end, or when
            either price is unknown (price_quality other than BOTH).
        price_quality:
          type: string
          enum:
            - BOTH
            - SELL_ONLY
            - BUY_ONLY
            - NONE
          description: >-
            Which of the two prices the deed record carries. BOTH: the purchase
            and the resale carry a price. SELL_ONLY: the resale carries a price
            and the purchase does not, the normal shape of a Texas flip bought
            off-market and sold through the MLS. BUY_ONLY: the purchase carries
            a price, and the investor holds the parcel at the deed data end or
            resold it without a price. NONE: neither carries a price.
            Non-disclosure states (Texas) record no price on most off-market
            deeds, so bought_price, gross_profit and spread_ratio are null there
            while sold_price is known.
        days_held_to_data_end:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            On hold rows: days from bought_on to the data end date. Null on
            resold rows and on undated holdings.
        sold_to_wholesaler:
          description: >-
            True when the end buyer resold within 90 days (180 for an entity): a
            fact about the counterparty.
          type:
            - boolean
            - 'null'
        round_trip:
          description: >-
            True when the parcel came back to the seller within the window: a
            financing round trip, not a real sale.
          type:
            - boolean
            - 'null'
        is_purchase_event:
          type: boolean
          description: >-
            True when the row is real purchase evidence, a purchase deed. False
            for transfers and for undeeded or unmatched holdings, which the map
            shows too.
        n_parcels_in_event:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Parcels the investor bought on the same day: 21 means "1 of 21
            bought 2023-12-18", a bulk buy.
        bought_from_wholesaler:
          description: >-
            True when the investor bought through a documented double close from
            a wholesaler, or from a known wholesaler. Contract assignments leave
            no deed, so false is not evidence of a retail purchase.
          type:
            - boolean
            - 'null'
        bought_from_wholesaler_via:
          anyOf:
            - type: string
              enum:
                - DOUBLE_CLOSE
                - SELLER_KIND
              description: >-
                How the registry detected the wholesale purchase. DOUBLE_CLOSE:
                a wholesaler bought the parcel and resold it to this investor
                within 90 days, two deeds. SELLER_KIND: the seller is a
                registered WHOLESALER.
            - type: 'null'
          description: >-
            Only when bought_from_wholesaler is true. Null otherwise. How the
            registry detected the wholesale purchase. DOUBLE_CLOSE: a wholesaler
            bought the parcel and resold it to this investor within 90 days, two
            deeds. SELLER_KIND: the seller is a registered WHOLESALER.
        wholesaler_investor_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 wholesaler's investor id when known.
        bought_from_investor:
          description: True when the seller carried an investor id.
          type:
            - boolean
            - 'null'
        bought_distressed:
          description: >-
            True when the purchase deed was a distressed sale (foreclosure,
            trustee, tax). Null when the buy deed is unknown.
          type:
            - boolean
            - 'null'
        bought_auction_kind:
          anyOf:
            - type: string
              enum:
                - TRUSTEE_SALE
                - SHERIFF_SALE
                - HOA_TRUSTEE_SALE
                - TAX_SALE
                - TAX_LIEN_DEED
              description: >-
                The kind of auction the purchase deed records: TRUSTEE_SALE and
                SHERIFF_SALE count toward buys_at_auction, and the API shows the
                other three but never counts them. TRUSTEE_SALE: a lender's
                foreclosure sale by the trustee, cash and final on the day,
                without redemption. In Arizona the buyer pays a $10,000 deposit
                and the full bid by 5 pm the next business day. In Texas it is
                the first-Tuesday courthouse sale, in Washington the Friday sale
                at the county's designated place under RCW 61.24. SHERIFF_SALE:
                a judicial sale under court order. In Arizona it is an HOA or
                judgment-lien sale, cash but subject to the first mortgage and
                to a 30-day or 6-month redemption. In Washington it is a
                judicial mortgage foreclosure or lien sale under RCW 6.21, with
                an 8-month or 1-year redemption. In Washington the sale is
                subject to the senior lien only when it is a lien sale.
                HOA_TRUSTEE_SALE: a Texas homeowners association foreclosure
                recorded as a trustee's deed, cash, subject to the first lien
                and to a 180-day redemption. TAX_SALE: a Texas constable or
                taxing-unit tax sale, cash, with a 180-day or 2-year redemption.
                In Washington it is the county treasurer's deed after the tax
                foreclosure judgment, with no redemption after the sale.
                TAX_LIEN_DEED: an Arizona treasurer's deed to a tax-lien holder,
                mostly vacant land, not an auction of the house.
            - type: 'null'
          description: >-
            The kind of auction when the purchase deed was a third-party auction
            purchase, for example TRUSTEE_SALE. A third party is not the lender,
            the trustee, a bulk instrument or a former owner of the parcel. Null
            on every other purchase and when the buy deed is unknown. Also null
            on every row of a market without published auction counts
            (meta.coverage[].auction_counted false). The bought_auction_kind
            filter reads it. The kind of auction the purchase deed records:
            TRUSTEE_SALE and SHERIFF_SALE count toward buys_at_auction, and the
            API shows the other three but never counts them. TRUSTEE_SALE: a
            lender's foreclosure sale by the trustee, cash and final on the day,
            without redemption. In Arizona the buyer pays a $10,000 deposit and
            the full bid by 5 pm the next business day. In Texas it is the
            first-Tuesday courthouse sale, in Washington the Friday sale at the
            county's designated place under RCW 61.24. SHERIFF_SALE: a judicial
            sale under court order. In Arizona it is an HOA or judgment-lien
            sale, cash but subject to the first mortgage and to a 30-day or
            6-month redemption. In Washington it is a judicial mortgage
            foreclosure or lien sale under RCW 6.21, with an 8-month or 1-year
            redemption. In Washington the sale is subject to the senior lien
            only when it is a lien sale. HOA_TRUSTEE_SALE: a Texas homeowners
            association foreclosure recorded as a trustee's deed, cash, subject
            to the first lien and to a 180-day redemption. TAX_SALE: a Texas
            constable or taxing-unit tax sale, cash, with a 180-day or 2-year
            redemption. In Washington it is the county treasurer's deed after
            the tax foreclosure judgment, with no redemption after the sale.
            TAX_LIEN_DEED: an Arizona treasurer's deed to a tax-lien holder,
            mostly vacant land, not an auction of the house.
        holding_kind:
          anyOf:
            - type: string
              enum:
                - OWNER_OCCUPIED
                - ABSENTEE_INDIVIDUAL
                - ABSENTEE_ENTITY
                - RENTAL_REGISTERED
                - RENTAL_SIGNAL
                - UNKNOWN
              description: >-
                How the owner holds the parcel at the deed data end
                (meta.coverage[].data_end), read from the county owner roll
                behind the row. OWNER_OCCUPIED means the owner lives there,
                ABSENTEE_INDIVIDUAL a person whose mailing address is elsewhere,
                and ABSENTEE_ENTITY an LLC or trust. RENTAL_REGISTERED means the
                parcel is on the county rental registry. RENTAL_SIGNAL means an
                owner-attributed business-use short-term-rental licence in any
                market. In Texas it also means an absentee owner with no
                homestead exemption or a rental listing. The short_term_rental
                block says which. UNKNOWN means the county roll does not say.
            - type: 'null'
          description: >-
            Only on confirmed holdings. Null otherwise. How the owner holds the
            parcel at the deed data end (meta.coverage[].data_end), read from
            the county owner roll behind the row. OWNER_OCCUPIED means the owner
            lives there, ABSENTEE_INDIVIDUAL a person whose mailing address is
            elsewhere, and ABSENTEE_ENTITY an LLC or trust. RENTAL_REGISTERED
            means the parcel is on the county rental registry. RENTAL_SIGNAL
            means an owner-attributed business-use short-term-rental licence in
            any market. In Texas it also means an absentee owner with no
            homestead exemption or a rental listing. The short_term_rental block
            says which. UNKNOWN means the county roll does not say.
        acquisition_kind:
          anyOf:
            - type: string
              enum:
                - PURCHASE
                - TRANSFER
                - NO_DEED
                - UNMATCHED
              description: >-
                How the owner at the deed data end got the parcel. PURCHASE (an
                arm's-length deed, priced where the state records prices).
                TRANSFER (an unpriced deed between related parties). NO_DEED: no
                deed found. UNMATCHED: a deed exists but its buyer name does not
                match the owner.
            - type: 'null'
          description: >-
            Only on confirmed holdings. Null otherwise. How the owner at the
            deed data end got the parcel. PURCHASE (an arm's-length deed, priced
            where the state records prices). TRANSFER (an unpriced deed between
            related parties). NO_DEED: no deed found. UNMATCHED: a deed exists
            but its buyer name does not match the owner.
        investor:
          $ref: '#/components/schemas/InvestorSummary'
          description: >-
            The buyer on the deal: the investor when it has an id, otherwise the
            name and buyer_status only.
        seller:
          $ref: '#/components/schemas/Party'
          description: Who sold to the investor.
        end_buyer:
          $ref: '#/components/schemas/Party'
          description: >-
            Who bought from the investor on a resold row. Every field is null
            while the investor holds the parcel at the deed data end.
        owner:
          anyOf:
            - $ref: '#/components/schemas/Owner'
            - type: 'null'
          description: >-
            The owner of record at the deed data end, only on a confirmed
            holding. Null on every other row. This host never names the holder.
        listing:
          anyOf:
            - $ref: '#/components/schemas/Listing'
            - type: 'null'
          description: >-
            The MLS listing on the parcel, on hold rows only (kind hold). It
            carries the latest listing the feed knows at listings_data_end, its
            status and prices, if it belongs to this investor (owner_test) and
            the listing agent. Null on resold rows, where a listing belongs to
            the end buyer, and on hold rows whose parcel carries no listing
            record. Also null on every row of a market without published listing
            tables: meta.coverage[].listings_data_end is null then. This host
            does not name the agents.
        short_term_rental:
          anyOf:
            - $ref: '#/components/schemas/ShortTermRental'
            - type: 'null'
          description: >-
            The short-term rental licence facts of the parcel, on hold rows only
            (kind hold), served to every key. It says if the parcel is licensed
            on the city roll and since when. It also says if the licence belongs
            to this investor and is a business use. Null on resold rows and on
            hold rows whose parcel lies outside every loaded city. Also null on
            every row of a market without published short-term rental tables:
            meta.coverage[].str_as_of is null then. NONE, not null, inside a
            served city with no record.
        wholesale_listing:
          anyOf:
            - $ref: '#/components/schemas/DealWholesaleListing'
            - type: 'null'
          description: >-
            The Investorlift listing this deal closed, served to every key. The
            API fills it when a wholesaler listed the house on Investorlift and
            the deed of this deal closed the listing. It carries the listing
            company, the listed date and asking price, and what the deeds show
            (outcome, verification). Null when no Investorlift listing links to
            the deed. Also null on every row of a market without published
            wholesale tables: meta.coverage[].wholesale_as_of is null then. Open
            GET `/v1/wholesale-listings/{id}` for the whole record.
        financing:
          anyOf:
            - $ref: '#/components/schemas/DealFinancing'
            - type: 'null'
          description: >-
            How the investor financed the purchase, from the lender registry,
            served to every key. It says if a purchase loan has a recording date
            in the 45 days from bought_on. It names the lender, the loan against
            the price and the outcome. NONE_CAPTURED is not evidence of cash:
            the open-lien table sees about one purchase loan in five. A deal
            bought after 45 days before the newest recording is NOT_MEASURED.
            Null on every row of a market without a published lender registry or
            deal link: meta.coverage[].lenders is null or
            investor_lending_measured is false.
      required:
        - id
        - market
        - kind
        - deal_type
        - deal_kind
        - ownership_confirmed
        - buyer_status
        - buyer_exclusion
        - property
        - distance_miles
        - bought_on
        - date_quality
        - held_since_source
        - bought_price
        - sold_on
        - sold_price
        - hold_days
        - gross_profit
        - spread_ratio
        - price_quality
        - days_held_to_data_end
        - sold_to_wholesaler
        - round_trip
        - is_purchase_event
        - n_parcels_in_event
        - bought_from_wholesaler
        - bought_from_wholesaler_via
        - wholesaler_investor_id
        - bought_from_investor
        - bought_distressed
        - bought_auction_kind
        - holding_kind
        - acquisition_kind
        - investor
        - seller
        - end_buyer
        - owner
        - listing
        - short_term_rental
        - wholesale_listing
        - financing
      description: >-
        One deal: what occurred on a parcel, when, for how much, who took part
        and how the investor financed it. Every field is present on every row.
        Fields that apply only to holdings are null elsewhere.
    Page:
      type: object
      properties:
        next_cursor:
          description: >-
            Opaque cursor for the next page: pass it back as cursor= with the
            same query. Null on the last page.
          type:
            - string
            - 'null'
        limit:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: The page size the API applied.
        returned:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Rows in this page.
      required:
        - next_cursor
        - limit
        - returned
      additionalProperties: false
      description: >-
        Pagination: the page size, the rows returned and the cursor for the next
        page. Paged lists carry no total. The summary block does.
    Meta:
      type: object
      properties:
        generated_at:
          type: string
          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.
    DealProperty:
      type: object
      properties:
        id:
          type: string
          pattern: ^prop_[0-9a-f]{32}$
          description: >-
            Parcel id, prop_ followed by 32 hex characters: pass it to
            `/v1/properties/{property_id}` or as property_id geometry.
        market:
          type: string
          description: >-
            Market code the parcel belongs to, for example phx. The loaded
            markets are in meta.coverage[].
        apn:
          description: >-
            Assessor parcel number as recorded, for example "131-28-253". Null
            when the county did not supply one.
          type:
            - string
            - 'null'
        apn_norm:
          description: >-
            APN with punctuation removed, upper case, for example "13128253":
            the lookup key for /v1/properties/resolve.
          type:
            - string
            - 'null'
        county_fips:
          description: >-
            County FIPS, 5 digits, for example 04013 Maricopa, 04021 Pinal or
            48201 Harris.
          type:
            - string
            - 'null'
        address_short:
          description: >-
            Situs street address in title case including the unit, for example
            "7522 E Cholla St".
          type:
            - string
            - 'null'
        street_no_unit:
          description: The street address without the unit.
          type:
            - string
            - 'null'
        unit:
          description: Unit designation, for example "UNIT 8". Null for most parcels.
          type:
            - string
            - 'null'
        city:
          description: City, upper case.
          type:
            - string
            - 'null'
        state:
          description: 2-letter state.
          type:
            - string
            - 'null'
        zip:
          description: 5-digit ZIP.
          type:
            - string
            - 'null'
        latitude:
          anyOf:
            - type: number
              minimum: -90
              maximum: 90
              description: WGS84 latitude.
            - type: 'null'
          description: WGS84 latitude of the parcel. Null when the parcel has no geocode.
        longitude:
          anyOf:
            - type: number
              minimum: -180
              maximum: 180
              description: WGS84 longitude.
            - type: 'null'
          description: WGS84 longitude of the parcel. Null when the parcel 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: >-
            Parcel segment: SFR (a house), CONDO_TH (condo or townhouse) or
            OTHER (manufactured, multi-family, land, commercial). Null when
            unknown.
        bedrooms:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Bedrooms per the assessor. Null when the assessor did not report
            them.
        bathrooms:
          description: >-
            Bathrooms per the assessor. The value can be fractional, for example
            2.5. Null when the assessor did not report them.
          type:
            - number
            - 'null'
        sqft:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Living area in square feet. Null when the assessor did not report
            it.
        year_built:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: Year built. Null when the assessor did not report it.
        pool:
          description: >-
            True for a private pool, false for community pool or spa only, null
            when the assessor did not report it (most parcels).
          type:
            - boolean
            - 'null'
      required:
        - id
        - market
        - apn
        - apn_norm
        - county_fips
        - address_short
        - street_no_unit
        - unit
        - city
        - state
        - zip
        - latitude
        - longitude
        - segment
        - bedrooms
        - bathrooms
        - sqft
        - year_built
        - pool
      additionalProperties: false
      description: 'The parcel the deal is on: address, coordinates and the assessor facts.'
    InvestorSummary:
      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: >-
            Investor id, inv_<12 hex>, stable across data refreshes and the
            identity to store. Null when the buyer is not a registered investor
            (see buyer_status).
        market:
          description: >-
            Market code the id belongs to, for example phx. The loaded markets
            are in meta.coverage[]. Null when id is null.
          type:
            - string
            - 'null'
        name:
          description: >-
            Buyer name as recorded on the deed, upper case. For a registered
            investor it is the deed spelling, the one most often on their deeds,
            SURNAME GIVEN for a person. For example "ZAK VENTURES LLC" or
            "RIVERA DANA". The deed spelling can change under a stable id when
            another of their names overtakes, so it is never a key. Match, join
            and search on it. Print display_name. Null when the buyer has no
            investor id.
          type:
            - string
            - 'null'
        display_name:
          description: >-
            The name to print. For a registered investor that is a cleanly
            parsed person, it has the form 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 or an ambiguous spelling it equals name. For a buyer
            without an investor id it is the deed name as recorded. Display
            only: match, join and search on name. Null exactly when name is
            null.
          type:
            - string
            - 'null'
        state:
          description: >-
            For a registered investor, the 2-letter state of the market. The
            loaded markets and their states are in meta.coverage[]. For a buyer
            without an investor id, the state of their mailing address when the
            deed carries one. Null when the buyer has no investor id.
          type:
            - string
            - 'null'
        kind:
          anyOf:
            - type: string
              enum:
                - FLIPPER
                - WHOLESALER
                - LANDLORD
                - BUILDER
                - IBUYER
              description: >-
                Investor kind, the primary one of kinds[] (an investor can carry
                several), for display only. FLIPPER: buys, renovates and
                resells. WHOLESALER: buys to resell quickly, often through a
                double close. LANDLORD: buys and holds rentals. BUILDER: builds
                on lots it buys. IBUYER: Opendoor, Offerpad or Zillow.
            - type: 'null'
          description: >-
            Primary kind, display only. Filters and scoring read kinds[]
            instead. Null when id is null. Investor kind, the primary one of
            kinds[] (an investor can carry several), for display only. FLIPPER:
            buys, renovates and resells. WHOLESALER: buys to resell quickly,
            often through a double close. LANDLORD: buys and holds rentals.
            BUILDER: builds on lots it buys. IBUYER: Opendoor, Offerpad or
            Zillow.
        confidence:
          anyOf:
            - type: string
              enum:
                - STRONG
                - PROBABLE
                - WEAK
              description: >-
                How sure the registry is of the kind. STRONG: several deals of
                that kind and a consistent pattern. PROBABLE: some evidence.
                WEAK: a single signal. The registry judges the confidence from
                the deeds inside the area loaded for the market
                (meta.coverage[].universe_kind). In a ZIP market an investor's
                deals outside the ZIP are unseen, so the confidence is a floor.
            - type: 'null'
          description: >-
            Registry confidence in the primary kind. Null when id is null. How
            sure the registry is of the kind. STRONG: several deals of that kind
            and a consistent pattern. PROBABLE: some evidence. WEAK: a single
            signal. The registry judges the confidence from the deeds inside the
            area loaded for the market (meta.coverage[].universe_kind). In a ZIP
            market an investor's deals outside the ZIP are unseen, so the
            confidence is a floor.
        scale:
          anyOf:
            - type: string
              enum:
                - individual
                - small
                - mid
                - large
                - institutional
              description: >-
                Investor scale: individual (one person, no entity), small (fewer
                than 10 investment deals), mid (10 to 99), large (100 to 999) or
                institutional. An institutional investor is an iBuyer, a
                production builder, a bulk landlord with 500 or more holdings,
                or a known brand from a list. The registry counts the deals
                inside the area loaded for the market
                (meta.coverage[].universe_kind), so in a ZIP market the tier is
                a floor.
            - type: 'null'
          description: >-
            Scale tier. Null when id is null. Investor scale: individual (one
            person, no entity), small (fewer than 10 investment deals), mid (10
            to 99), large (100 to 999) or institutional. An institutional
            investor is an iBuyer, a production builder, a bulk landlord with
            500 or more holdings, or a known brand from a list. The registry
            counts the deals inside the area loaded for the market
            (meta.coverage[].universe_kind), so in a ZIP market the tier is a
            floor.
        institutional:
          description: >-
            True for iBuyers, production builders, 500+ holding bulk landlords
            and the brand list. Lists hide them unless scale includes
            institutional. Null when id is null.
          type:
            - boolean
            - 'null'
        is_public:
          description: >-
            True for a public body: a county, a city, a housing authority or a
            school district. Lists hide them unless include_public=true. Null
            when id is null.
          type:
            - boolean
            - 'null'
        last_bought_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            Date of their last purchase anywhere inside the area loaded for the
            market, YYYY-MM-DD. Sales and transfers never count. Null when they
            never bought or id is null.
        n_deals:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Investment deals as buyer inside the area loaded for the market
            (meta.coverage[].universe_kind), all kinds and years, for example
            755. The count is a floor in a ZIP market. Null when id is null.
        buyer_status:
          type: string
          enum:
            - registered
            - unclassified
            - excluded
            - unknown
          description: >-
            registered when the row carries an id. Otherwise why the buyer has
            no id.
      required:
        - id
        - market
        - name
        - display_name
        - state
        - kind
        - confidence
        - scale
        - institutional
        - is_public
        - last_bought_on
        - n_deals
        - buyer_status
      additionalProperties: false
      description: >-
        The investor behind a deal. When id is null, only buyer_status always
        carries a value. name and state are then null.
    Party:
      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: Investor id when the party is a registered investor. Null otherwise.
        name:
          description: >-
            The party's deed spelling, upper case, SURNAME GIVEN for a person,
            only when id is not null. The API never names a retail household.
            Print display_name.
          type:
            - string
            - 'null'
        display_name:
          description: >-
            The name to print for the party, only when id is not null. For a
            person whose deed spelling parsed cleanly, GIVEN [MIDDLE] SURNAME
            [SUFFIX] in upper case. For example, "DANA RIVERA" from the deed's
            "RIVERA DANA". Otherwise equal to name. Null exactly when name is
            null.
          type:
            - string
            - 'null'
        kind:
          anyOf:
            - type: string
              enum:
                - PERSON
                - TRUST
                - ENTITY
              description: >-
                Kind of the party on the deed: PERSON, TRUST or ENTITY (an LLC,
                corporation or partnership).
            - type: 'null'
          description: >-
            On every row that has the party. Null when the deed carries none.
            Kind of the party on the deed: PERSON, TRUST or ENTITY (an LLC,
            corporation or partnership).
        kinds:
          anyOf:
            - type: array
              items:
                type: string
                enum:
                  - FLIPPER
                  - WHOLESALER
                  - LANDLORD
                  - BUILDER
                  - IBUYER
                description: >-
                  Investor kind, the primary one of kinds[] (an investor can
                  carry several), for display only. FLIPPER: buys, renovates and
                  resells. WHOLESALER: buys to resell quickly, often through a
                  double close. LANDLORD: buys and holds rentals. BUILDER:
                  builds on lots it buys. IBUYER: Opendoor, Offerpad or Zillow.
            - type: 'null'
          description: >-
            The investor kinds of the party, only when id is not null. Null
            otherwise.
      required:
        - id
        - name
        - display_name
        - kind
        - kinds
      additionalProperties: false
      description: >-
        The counterparty of a deal (seller or end buyer). Named only when it
        carries an investor id.
    Owner:
      type: object
      properties:
        name_order:
          type: string
          enum:
            - surname_first
            - given_first
            - unknown
          description: >-
            Always given_first for owner names. The word order of the raw name.
            A deed name is surname_first, for example "RIVERA DANA". A parsed
            owner name is given_first, for example "Dana Rivera". The order is
            unknown for one token, a truncated name, "&" or ET AL: the split
            fields are then null.
        kind:
          anyOf:
            - type: string
              enum:
                - PERSON
                - TRUST
                - ENTITY
                - PUBLIC_INSTITUTIONAL
              description: >-
                Kind of the owner at the deed data end: PERSON, TRUST, ENTITY or
                PUBLIC_INSTITUTIONAL (a public body).
            - type: 'null'
          description: >-
            Null when the county roll does not say. Kind of the owner at the
            deed data end: PERSON, TRUST, ENTITY or PUBLIC_INSTITUTIONAL (a
            public body).
        is_trust:
          description: True when the owner is a trust. Null when unknown.
          type:
            - boolean
            - 'null'
        is_public:
          description: True when the owner is a public body. Null when unknown.
          type:
            - boolean
            - 'null'
        owner_occupied:
          description: >-
            True when the owner's mailing address is the parcel itself. Null
            when the county roll does not say.
          type:
            - boolean
            - 'null'
        absentee:
          description: >-
            True when the owner's mailing address is elsewhere. Null when the
            county roll does not say.
          type:
            - boolean
            - 'null'
        rental_registered:
          description: >-
            True when the parcel is on the county rental registry. Null when
            unknown.
          type:
            - boolean
            - 'null'
        held_since:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            When the ownership at the deed data end started, YYYY-MM-DD. Null
            when no dated record exists.
        months_held:
          description: >-
            Months since held_since, measured at the data end date, for example
            44.4. Null without held_since.
          type:
            - number
            - 'null'
        permits_last_24m:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Building permits filed on the parcel in the 24 months before the
            data end date. Null when permit data is unavailable.
      required:
        - name_order
        - kind
        - is_trust
        - is_public
        - owner_occupied
        - absentee
        - rental_registered
        - held_since
        - months_held
        - permits_last_24m
      description: >-
        The owner at the deed data end of a confirmed investor holding. Set only
        on a confirmed holding, deal_type HOLDING with ownership_confirmed true.
        Null elsewhere.
    Listing:
      type: object
      properties:
        status:
          type: string
          enum:
            - ACTIVE
            - PENDING
            - SOLD
            - OFF_MARKET
          description: >-
            The listing's status in the feed, normalised. ACTIVE means on the
            market, and PENDING means under contract, contingent or not. SOLD
            means the listing sold, or any listing whose sale date is on or
            after its listing date: the sale is the later fact. OFF_MARKET means
            the listing ended without a sale: cancelled, expired or withdrawn
            (see off_market_reason). Only ACTIVE and PENDING are on the market.
        status_detail:
          anyOf:
            - type: string
              enum:
                - NEW
                - PRICE_CHANGE
                - COMING_SOON
                - BACK_ON_MARKET
                - CONTINGENT
                - UNDER_CONTRACT
              description: >-
                The feed's sub-status of an ACTIVE or PENDING listing. NEW means
                just listed, PRICE_CHANGE means the price moved, and COMING_SOON
                means announced, before showings start. BACK_ON_MARKET means a
                contract fell through. CONTINGENT means under contract with
                contingencies, and UNDER_CONTRACT means under contract. Null
                when the feed gives none. Always null on SOLD and OFF_MARKET
                rows, where the sub-status is stale.
            - type: 'null'
          description: >-
            Null when the feed gives no sub-status, and on SOLD and OFF_MARKET
            rows. The feed's sub-status of an ACTIVE or PENDING listing. NEW
            means just listed, PRICE_CHANGE means the price moved, and
            COMING_SOON means announced, before showings start. BACK_ON_MARKET
            means a contract fell through. CONTINGENT means under contract with
            contingencies, and UNDER_CONTRACT means under contract. Null when
            the feed gives none. Always null on SOLD and OFF_MARKET rows, where
            the sub-status is stale.
        status_raw:
          type: string
          description: >-
            The feed's own status and sub-status, for diagnosis, for example
            "Active / Price Change" or "Failed / Canceled". Do not branch on it:
            use status and status_detail.
        off_market_reason:
          anyOf:
            - type: string
              enum:
                - CANCELED
                - EXPIRED
                - OFF_MARKET
              description: >-
                Why an OFF_MARKET listing ended. CANCELED means the seller
                cancelled, and EXPIRED means the listing agreement ran out.
                OFF_MARKET means withdrawn or temporarily off the market, and
                the feed says no more. Null on every other status.
            - type: 'null'
          description: >-
            Only on OFF_MARKET rows, null otherwise. Why an OFF_MARKET listing
            ended. CANCELED means the seller cancelled, and EXPIRED means the
            listing agreement ran out. OFF_MARKET means withdrawn or temporarily
            off the market, and the feed says no more. Null on every other
            status.
        is_rental:
          type: boolean
          description: >-
            True when the feed flags the listing as a rental, or when its asking
            price is under $10,000. That is a monthly rent in the sale price
            field of a row the feed did not flag: about 1 in 40 active rows. A
            rental listing keeps its status but is never on the market and never
            counts.
        on_market:
          type: boolean
          description: >-
            True when status is ACTIVE or PENDING and the listing is not a
            rental. The parcel is then for sale at the listing data end date
            (meta.coverage[].listings_data_end). A parcel fact, independent of
            who owns it.
        owner_test:
          anyOf:
            - type: string
              enum:
                - PASSED
                - FAILED
                - UNDATED
                - NOT_HOLDER
              description: >-
                The ownership test: if the listing belongs to the investor
                holding the parcel at the deed data end date
                (meta.coverage[].data_end). PASSED: listed on or after the
                holder's purchase date, so it is their listing. FAILED: listed
                before the purchase, so it is the listing they bought under or
                an older one, never their inventory. UNDATED: the holding has no
                purchase date, so the test cannot run, and the API shows and
                flags the listing but does not count it. NOT_HOLDER, on a deal
                row only: this row is not the parcel's current hold deal, and
                another investor holds the parcel. Null when the parcel has no
                investor holding: a household, a public body or an unregistered
                owner.
            - type: 'null'
          description: >-
            Null when the parcel has no investor holding. The ownership test: if
            the listing belongs to the investor holding the parcel at the deed
            data end date (meta.coverage[].data_end). PASSED: listed on or after
            the holder's purchase date, so it is their listing. FAILED: listed
            before the purchase, so it is the listing they bought under or an
            older one, never their inventory. UNDATED: the holding has no
            purchase date, so the test cannot run, and the API shows and flags
            the listing but does not count it. NOT_HOLDER, on a deal row only:
            this row is not the parcel's current hold deal, and another investor
            holds the parcel. Null when the parcel has no investor holding: a
            household, a public body or an unregistered owner.
        counted:
          type: boolean
          description: >-
            True when on_market is true and owner_test is PASSED: exactly the
            rows the investor's listings rollup (n_active, n_pending) counts.
            The API shows everything else for context and never counts it.
        list_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            The current asking price, whole dollars, for example 289000. Null,
            never 0, when the feed has none.
        price_low:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            The lowest asking price this listing carried, whole dollars. Null
            when the feed has none, and null when the feed's price history
            predates this listing (a prior listing's range).
        price_low_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: When the listing carried price_low, YYYY-MM-DD. Null with price_low.
        price_high:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            The highest asking price this listing carried, whole dollars. Null
            under the same rule as price_low.
        price_high_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            When the listing carried price_high, YYYY-MM-DD. Null with
            price_high.
        listed_on:
          type: string
          description: >-
            When the listing went live, YYYY-MM-DD (the feed's original listing
            date). Always set.
        status_updated_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            When the feed last changed the status, YYYY-MM-DD: the row's own
            as-of date. Null when the feed gives none.
        off_market_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            When an OFF_MARKET listing ended, YYYY-MM-DD. Null on every other
            status, and when the feed's end date predates the listing.
        sold_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: When a SOLD listing closed, YYYY-MM-DD. Null on every other status.
        sold_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            What a SOLD listing closed at, whole dollars. Null on every other
            status, and when the feed has no price.
        days_on_market:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Days from listed_on to the status's end date: ACTIVE to the listing
            data end date (meta.coverage[].listings_data_end), PENDING to
            status_updated_on, SOLD to sold_on, OFF_MARKET to off_market_on.
            Null when that end date is unknown or earlier than listed_on. Never
            measured from the request time.
        list_to_bought_ratio:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            list_price divided by what the investor paid, rounded to 4 decimals,
            for example 1.3182: an asking price 32% above the purchase. On hold
            deal rows only. Null on the property row, and when either price is
            unknown, as for most Texas purchases.
        mls_number:
          description: >-
            The MLS listing number as the feed writes it, for example "6812345".
            Null when the feed has none.
          type:
            - string
            - 'null'
        brokerage_name:
          description: >-
            The listing brokerage: the brokerage name the feed writes, else the
            listing office's corporate name from the feed's office record. The
            two never overlap. Set on about half of all listing rows. On the
            rows on the market the feed carries neither on most rows, so expect
            it on a fifth or fewer there. Served to every key.
          type:
            - string
            - 'null'
        agents:
          type: array
          items:
            $ref: '#/components/schemas/ListingAgent'
          description: >-
            The listing agents, usually one. Empty when the feed names none.
            This host does not serve the identifying fields of each agent; the
            array itself is always present.
      required:
        - status
        - status_detail
        - status_raw
        - off_market_reason
        - is_rental
        - on_market
        - owner_test
        - counted
        - list_price
        - price_low
        - price_low_on
        - price_high
        - price_high_on
        - listed_on
        - status_updated_on
        - off_market_on
        - sold_on
        - sold_price
        - days_on_market
        - list_to_bought_ratio
        - mls_number
        - brokerage_name
        - agents
      additionalProperties: false
      description: >-
        The MLS listing on a parcel: the latest listing the feed knows, its
        status and prices, and the listing agent. The block says if the listing
        belongs to the investor holding the parcel. Measured at the listing data
        end date, never the clock.
    ShortTermRental:
      type: object
      properties:
        status:
          anyOf:
            - type: string
              enum:
                - LICENSED
                - PENDING
                - EXPIRED
                - NONE
              description: >-
                The parcel's short-term rental status on the city's roll: the
                first value that applies over its matched records. LICENSED
                means an active licence or permit, and PENDING means an
                application on file with none active. EXPIRED means every record
                on the parcel is inactive: expired, withdrawn or dropped from
                the roll. NONE means the parcel is inside a served city and has
                no record at all. The API counts a parcel the city lists as
                advertised without a licence, and never serves that as a status.
                Null inside a loaded city the API does not serve in this release
                (coverage.served false).
            - type: 'null'
          description: >-
            Null inside a loaded city the API does not serve in this release
            (coverage.served false). The parcel's short-term rental status on
            the city's roll: the first value that applies over its matched
            records. LICENSED means an active licence or permit, and PENDING
            means an application on file with none active. EXPIRED means every
            record on the parcel is inactive: expired, withdrawn or dropped from
            the roll. NONE means the parcel is inside a served city and has no
            record at all. The API counts a parcel the city lists as advertised
            without a licence, and never serves that as a status. Null inside a
            loaded city the API does not serve in this release (coverage.served
            false).
        coverage:
          $ref: '#/components/schemas/StrCoverage'
        active_permits:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Active licence numbers on the parcel that the API attributes to the
            current owner through the purchase test or a name match, for example
            1. The API does not count a prior owner's stale active record. 0
            when status is NONE, EXPIRED or null.
        multi_unit:
          type: boolean
          description: >-
            True when active_permits is 2 or more: several units licensed on one
            parcel.
        building:
          type: boolean
          description: >-
            True when active_permits is 5 or more, or when the parcel is not a
            house or condo and carries 2 or more. A licensed building counts as
            one holding, never as that many.
        first_application:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The earliest application or issue date over every record on the
            parcel, whatever its status, YYYY-MM-DD (lifetime). Null when no
            source carries an application or issue date (dates_source
            EXPIRY_ONLY or NONE) and when status is NONE.
        current_application:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The current owner's earliest active or pending application,
            YYYY-MM-DD. This is the earliest active or pending date on or after
            the purchase date less 14 days, when one exists. Else it is the
            earliest active or pending date. Null when no active or pending
            record carries a date, and when status is NONE.
        licensed_since:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The issue date of the current licence, YYYY-MM-DD. Null under
            dates_source EXPIRY_ONLY and NONE, and when status is NONE or
            EXPIRED. In Houston the roll is EXPIRY_ONLY, and the API never
            derives this date from the expiry.
        expires_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            When the current licence expires, YYYY-MM-DD. Houston rolls carry
            only this date. Null when no record is active or the source carries
            no expiry.
        dates_source:
          type: string
          enum:
            - APPLICATION
            - ISSUE
            - EXPIRY_ONLY
            - NONE
          description: >-
            What the dates on the block are. APPLICATION: the application date
            the city recorded, as in Phoenix SHAPE PHX records and Scottsdale
            pending applications. ISSUE: the issue or renewal date, a later
            bound on the application, as in Scottsdale staff records, Phoenix
            active permits and Fountain Hills. EXPIRY_ONLY: the roll carries an
            expiry date alone, so first_application, current_application and
            licensed_since are null, as in Houston. NONE: the roll carries no
            dates at all, as in Tempe, Paradise Valley and Cave Creek, and every
            block with status NONE. APPLICATION and ISSUE dates drive the
            purchase test, but EXPIRY_ONLY and NONE dates do not.
        permit_after_purchase:
          description: >-
            True when the current owner applied for the licence, or the city
            issued it, on or after the purchase, with 14 days of tolerance. Also
            true when the owner bought before the city's licence regime began
            (attribution_basis LICENCE_START). False when the application
            predates the purchase, or when the record was already on the roll
            before the purchase (a prior owner's licence). Null when no date, no
            regime bound and no name settles it, and when status is NONE.
          type:
            - boolean
            - 'null'
        days_purchase_to_permit:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Days from the purchase date to current_application, signed, for
            example 412. Negative when the application came first. Null without
            an application or issue date, and when status is NONE.
        operator:
          type: string
          enum:
            - owner
            - manager
            - unknown
          description: >-
            Who operates the rental, from the city's record. With owner, a name
            on the record keys to the current owner of the parcel. With manager,
            the record names a property-management company and no name keys to
            the owner. With unknown, the record names nobody the test can use:
            every Houston record, and every record whose names match neither.
        owner_attributed:
          type: boolean
          description: >-
            True when the licence belongs to the current owner. That is status
            LICENSED or PENDING, and either the purchase test is not false or a
            name on the record keys to the owner. False when status is NONE,
            EXPIRED or null, and on a prior owner's permit.
        attribution_basis:
          anyOf:
            - type: string
              enum:
                - PURCHASE_DATE
                - OWNER_NAME
                - LICENCE_START
                - ASSUMED
              description: >-
                Why the API attributes the licence to the current owner,
                strongest first. PURCHASE_DATE: the application or issue date
                falls on or after the owner's purchase, with 14 days of
                tolerance. OWNER_NAME: a name on the record keys to the owner.
                LICENCE_START: no date, no name, but the purchase (Houston: on
                or before 2025-10-15) predates the city's licence regime, so
                nobody else was able to apply. ASSUMED: no date, no name, no
                regime bound, but the record is present and not contradicted,
                and the API never serves owner identity under it. Null when the
                API does not attribute the licence to the owner: status NONE or
                EXPIRED, or a prior owner's permit.
            - type: 'null'
          description: >-
            Null when owner_attributed is false. Why the API attributes the
            licence to the current owner, strongest first. PURCHASE_DATE: the
            application or issue date falls on or after the owner's purchase,
            with 14 days of tolerance. OWNER_NAME: a name on the record keys to
            the owner. LICENCE_START: no date, no name, but the purchase
            (Houston: on or before 2025-10-15) predates the city's licence
            regime, so nobody else was able to apply. ASSUMED: no date, no name,
            no regime bound, but the record is present and not contradicted, and
            the API never serves owner identity under it. Null when the API does
            not attribute the licence to the owner: status NONE or EXPIRED, or a
            prior owner's permit.
        business_use:
          type: boolean
          description: >-
            True when the API attributes the licence to the current owner and
            the parcel is not a person's or a trust's own home. An own home is
            owner_occupied with owner kind PERSON or TRUST. This is the one
            predicate behind the investor counts, the RENTAL_SIGNAL holding kind
            and the owner identity rule. In Washington the operator's own
            declaration on the licence decides it in place of the home test. A
            Seattle unit declared not the operator's primary residence is a
            business use, and one declared primary is not. False when the API
            does not attribute the licence, and on an owner-occupied home with a
            casita permit.
        prior_owner_permit:
          type: boolean
          description: >-
            True when someone other than the current owner applied for an active
            licence before the sale, and no name keys to the owner. This is a
            licence that must lapse on sale, a renewal kept under the old
            number, or a stale owner on the county roll. The API shows such a
            licence and never counts it toward the owner's holdings.
        manager:
          description: >-
            The property-management company named on the city's record, as the
            city writes it, for example "VACASA LLC". Served to every key: the
            API stores only a company-shaped name, and nulls a person-shaped
            value before it serves the row. Null when the record names no
            manager or the value was person-shaped.
          type:
            - string
            - 'null'
        signals:
          type: array
          items:
            type: string
            description: One signal code.
          description: >-
            The short-term rental signals on the holding. Examples:
            STR_LICENSED, STR_PENDING, STR_EXPIRED, STR_PERMIT_AFTER_PURCHASE,
            STR_PERMIT_AT_PURCHASE, STR_PERMIT_PRIOR_OWNER, STR_LAPSED_ON_SALE,
            STR_CONVERTED_FROM_LTR, STR_OWNER_OCCUPIED, STR_OWNER_IS_LICENSEE,
            STR_MANAGED, STR_MULTI_UNIT, STR_LEGACY_2020,
            STR_ATTRIBUTION_ASSUMED. STR_PERMIT_AT_PURCHASE means the licence
            falls within 180 days of the purchase. STR_CONVERTED_FROM_LTR means
            the parcel was on the rental registry as a long-term rental before
            the licence. Empty when status is NONE.
        match_method:
          anyOf:
            - type: string
              enum:
                - APN
                - ADDRESS_EXACT
                - ADDRESS_STREET
                - POINT_UNIQUE
              description: >-
                How the API attached the city's record to the parcel, most
                reliable first. APN: the assessor parcel number on the record.
                ADDRESS_EXACT: the normalised address with its unit matched one
                parcel. ADDRESS_STREET: the address without its unit matched one
                parcel. POINT_UNIQUE: the record's coordinates fell within 25 m
                of exactly one parcel, and the API never matches a point near
                several parcels. Null when status is NONE (no record).
            - type: 'null'
          description: >-
            Null when status is NONE (no record to match). How the API attached
            the city's record to the parcel, most reliable first. APN: the
            assessor parcel number on the record. ADDRESS_EXACT: the normalised
            address with its unit matched one parcel. ADDRESS_STREET: the
            address without its unit matched one parcel. POINT_UNIQUE: the
            record's coordinates fell within 25 m of exactly one parcel, and the
            API never matches a point near several parcels. Null when status is
            NONE (no record).
        data_as_of:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The snapshot date of the city roll the API read the block from,
            YYYY-MM-DD (meta.coverage[].str.jurisdictions[].snapshot_date for
            coverage.jurisdiction). Null only when the market row carries no
            entry for the city.
      required:
        - status
        - coverage
        - active_permits
        - multi_unit
        - building
        - first_application
        - current_application
        - licensed_since
        - expires_on
        - dates_source
        - permit_after_purchase
        - days_purchase_to_permit
        - operator
        - owner_attributed
        - attribution_basis
        - business_use
        - prior_owner_permit
        - manager
        - signals
        - match_method
        - data_as_of
      additionalProperties: false
      description: >-
        The short-term rental licence facts of a parcel, read from the city's
        own licence and permit roll. The block says if the parcel is licensed
        and since when. It says if the licence belongs to the current owner and
        on what basis. It says if the use is a business and not a person's own
        home. Present on every parcel inside a loaded city, with NONE when it
        has no record. Null outside every loaded city, and where the market has
        no published short-term rental tables.
    DealWholesaleListing:
      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.
        wholesaler:
          $ref: '#/components/schemas/WholesalerRef'
        listed_on:
          type: string
          description: >-
            The date the wholesaler published the listing on Investorlift,
            YYYY-MM-DD.
        asking_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            The asking price on Investorlift, whole dollars. Null when the
            listing carried none.
        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.
        days_listed_to_deed:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Days from the Investorlift publication to this deal's closing deed,
            for example 32. Negative when the county recorded the deed before
            the wholesaler published the listing. Null when the listing has no
            closing deed.
      required:
        - id
        - wholesaler
        - listed_on
        - asking_price
        - outcome
        - verification
        - days_listed_to_deed
      additionalProperties: false
      description: >-
        The Investorlift listing this deal closed: a wholesaler listed the
        house, and the buyer on this deal bought it off that listing. On deal
        rows only where a listing links to the deed. Null otherwise.
    DealFinancing:
      type: object
      properties:
        purchase_loan_status:
          type: string
          enum:
            - FOUND
            - NONE_CAPTURED
            - NOT_MEASURED
          description: >-
            The deal's purchase-loan status: FOUND means a loan of either table
            has a recording date in the 45 days from the purchase date. The
            largest amount, then the earliest, is the purchase loan.
            NONE_CAPTURED: the registry covers the window and no loan has a
            recording date in it. NONE_CAPTURED is not evidence of a cash
            purchase: the open-lien table sees about one purchase loan in five
            on holds, one in fifteen on flips. The cash-buyer quicklist keeps
            its own signal. NOT_MEASURED: the purchase date is unknown or later
            than 45 days before the newest recording, or the market has no
            registry.
        purchase_loan:
          anyOf:
            - $ref: '#/components/schemas/DealPurchaseLoan'
            - type: 'null'
          description: >-
            The purchase loan when purchase_loan_status is FOUND. The registry
            takes the largest loan recorded in the 45 days from bought_on, then
            the earliest. Null otherwise.
        secondary_loans_n:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Other loans recorded in the same window, for example 1. A second
            loan or a rehab draw counts here. Null unless purchase_loan_status
            is FOUND.
        link_window:
          anyOf:
            - type: string
              enum:
                - STRICT
                - LOOSE
              description: >-
                How the registry tied the loan to its deal. STRICT: the
                recording date falls in the 45 days from the purchase date, the
                window every count uses. LOOSE: the recording date falls from 15
                days before to 90 days after the purchase date. The row keeps a
                LOOSE link for reading, but no count uses it, and the registry
                never applies it to a wholesale deal.
            - type: 'null'
          description: >-
            Null unless purchase_loan_status is FOUND. How the registry tied the
            loan to its deal. STRICT: the recording date falls in the 45 days
            from the purchase date, the window every count uses. LOOSE: the
            recording date falls from 15 days before to 90 days after the
            purchase date. The row keeps a LOOSE link for reading, but no count
            uses it, and the registry never applies it to a wholesale deal.
        outcome:
          anyOf:
            - type: string
              enum:
                - RESOLVED_BY_RESALE
                - REFINANCED
                - OPEN
                - FORECLOSED
                - UNKNOWN
              description: >-
                What became of a loan tied to a deal: a performance proxy read
                from the deed chain, never from a delinquency record or payment
                history. RESOLVED_BY_RESALE is a priced deed on the parcel after
                the loan, and REFINANCED is a later mortgage on it in either
                table before any resale. OPEN is an open lien position at the
                slice date and nothing later, and UNKNOWN is none of these
                because the chain runs out. FORECLOSED: a take-back deed on the
                parcel more than 90 days after the loan's recording, before any
                priced resale and any later mortgage. A take-back deed is a
                trustee's deed, a sheriff's deed or a deed in lieu, and the
                foreclosed block on the loan row carries it. A shorter gap is
                the auction buyer's own deed, not a foreclosure of this loan.
            - type: 'null'
          description: >-
            Null unless purchase_loan_status is FOUND. What became of a loan
            tied to a deal: a performance proxy read from the deed chain, never
            from a delinquency record or payment history. RESOLVED_BY_RESALE is
            a priced deed on the parcel after the loan, and REFINANCED is a
            later mortgage on it in either table before any resale. OPEN is an
            open lien position at the slice date and nothing later, and UNKNOWN
            is none of these because the chain runs out. FORECLOSED: a take-back
            deed on the parcel more than 90 days after the loan's recording,
            before any priced resale and any later mortgage. A take-back deed is
            a trustee's deed, a sheriff's deed or a deed in lieu, and the
            foreclosed block on the loan row carries it. A shorter gap is the
            auction buyer's own deed, not a foreclosure of this loan.
        as_of:
          type: string
          description: >-
            The slice date of the lender registry, YYYY-MM-DD. The registry
            measures the status at this date. It is the financing slice date,
            not the deed data end. The block is dated: see meta.dated[].
        dated:
          type: boolean
          description: >-
            True while the Recorder & Mortgage datasets are not in the current
            delivery: this block is a snapshot at as_of.
      required:
        - purchase_loan_status
        - purchase_loan
        - secondary_loans_n
        - link_window
        - outcome
        - as_of
        - dated
      additionalProperties: false
      description: >-
        How the investor financed the purchase, as far as the slice can tell. It
        says if the registry found a purchase loan, which lender made it, and
        what became of it. NONE_CAPTURED is not cash: the open-lien table sees
        about one purchase loan in five. Null where it sits for a market without
        a published lender registry or without its deal link.
    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.
    ListingAgent:
      type: object
      properties:
        role:
          description: >-
            The agent's role as the feed writes it, "Listing Agent" on every
            on-market row of the feed. Null when the feed gives none.
          type:
            - string
            - 'null'
        agent_id:
          anyOf:
            - type: string
              pattern: ^agt_[0-9a-f]{12}$
              description: >-
                Listing agent id: agt_ followed by 12 hex characters, for
                example agt_fdfd4a0f8bae. The registry mints the id from a
                matched state licence number, else from the name and the feed's
                identifying keys. The id is stable across data refreshes. A
                licence-based id is the same in every market. The API follows an
                old id through the alias table. Store it as the identity.
            - type: 'null'
          description: >-
            The stable id of this agent in the agent registry, for example
            agt_fdfd4a0f8bae: the key to GET `/v1/agents/{id}`. The id is the
            same across every listing the agent appears on, whatever the
            spelling of the name. Served to every key. Null when the market has
            no published agent registry (meta.coverage[].agents_data_end is
            null). Also null when the feed named an agent the registry does not
            carry.
        identity_basis:
          anyOf:
            - type: string
              enum:
                - LICENSE_FEED
                - LICENSE_NAME
                - LICENSE_NAME_DISAMBIGUATED
                - LICENSE_NICKNAME
                - CONTACT_CLUSTER
                - NAME_BROKERAGE
                - NAME_ONLY
              description: >-
                How the registry established the agent's identity, strongest
                first: the four LICENSE_ values are the licence-keyed agents.
                LICENSE_FEED: the MLS feed carried the agent's state licence
                number on their listings, so the feed's own attribution keyed
                the agent on the public record. LICENSE_NAME: exactly one state
                licence carries this name, and LICENSE_NAME_DISAMBIGUATED:
                several do, and the middle initial, brokerage, office phone or
                licence period picked one. LICENSE_NICKNAME: the registry found
                the licence through a nickname or short form of the given name,
                for example DOUG for DOUGLAS. Without a licence, the registry
                merged name spellings through a shared personal phone or email
                (CONTACT_CLUSTER), or through the name and a common brokerage
                (NAME_BROKERAGE). NAME_ONLY: the name fold alone, so two people
                with the same name are one agent here (see license_candidates).
            - type: 'null'
          description: >-
            Served to every key. Null with agent_id. How the registry
            established the agent's identity, strongest first: the four LICENSE_
            values are the licence-keyed agents. LICENSE_FEED: the MLS feed
            carried the agent's state licence number on their listings, so the
            feed's own attribution keyed the agent on the public record.
            LICENSE_NAME: exactly one state licence carries this name, and
            LICENSE_NAME_DISAMBIGUATED: several do, and the middle initial,
            brokerage, office phone or licence period picked one.
            LICENSE_NICKNAME: the registry found the licence through a nickname
            or short form of the given name, for example DOUG for DOUGLAS.
            Without a licence, the registry merged name spellings through a
            shared personal phone or email (CONTACT_CLUSTER), or through the
            name and a common brokerage (NAME_BROKERAGE). NAME_ONLY: the name
            fold alone, so two people with the same name are one agent here (see
            license_candidates).
        agent_is_holder_member:
          description: >-
            True when this agent is, with high confidence, a person member of
            the investor holding the parcel. The agent then lists their own
            inventory (a self-listing), not a client's. False when the parcel
            has a holder and the agent is not one of its people. Null when the
            parcel has no investor holding, or when the market has no published
            agent registry. Served to every key, independent of owner_test.
          type:
            - boolean
            - 'null'
      required:
        - role
        - agent_id
        - identity_basis
        - agent_is_holder_member
      description: >-
        One listing agent of an MLS listing. Through the agent you reach an
        investor's listed inventory. The block carries the stable agent id, how
        the registry established that identity, and if the agent lists their own
        inventory. This host does not serve the identifying fields (name,
        phones, email, licence).
    StrCoverage:
      type: object
      properties:
        jurisdiction:
          type: string
          description: >-
            The city whose roll covers the parcel, upper case, for example
            SCOTTSDALE. This is the city-limit polygon the parcel falls in,
            never the postal city: 560 Phoenix permits carry a SCOTTSDALE postal
            address. Its regime, freshness and counts are in
            meta.coverage[].str.jurisdictions.
        served:
          type: boolean
          description: >-
            True when the API loads, matches and serves the city's roll, so it
            measures status (NONE included). False in a loaded city with no spot
            check: Tempe and Paradise Valley in release 1. Status is then null
            and every count is 0.
        licence_start:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The earliest date a licence can exist in this city, YYYY-MM-DD: the
            day its ordinance took effect, for example 2025-10-01 for Houston.
            Null when unknown.
        feed_stale:
          type: boolean
          description: >-
            True when this week's city feed failed the freshness rule and the
            API serves the last good snapshot (data_as_of says which). False
            otherwise.
      required:
        - jurisdiction
        - served
        - licence_start
        - feed_stale
      additionalProperties: false
      description: >-
        Which city's roll the API read the block from, and if the API serves
        that roll and the roll is fresh.
    WholesalerRef:
      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.
      required:
        - id
        - name
      additionalProperties: false
      description: >-
        The company that listed the house on Investorlift: the key to GET
        `/v1/wholesalers/{id}` and the name to show.
    DealPurchaseLoan:
      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.
        amount:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: The loan amount, whole dollars. Null when the file carries none.
        recording_date:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The recording date of the loan, YYYY-MM-DD. Under STRICT it falls
            within 45 days after bought_on. Under LOOSE it falls from 15 days
            before bought_on to 90 days after it.
        loan_to_price:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            amount divided by bought_price, 4 decimals, for example 0.88. With a
            rehab holdback on top of the price it can be above 1, for example
            1.12. Null when either value is unknown. Also null when the ratio is
            above 3 without a blanket group: that amount is a facility amount,
            not a loan on this parcel.
        source:
          type: string
          enum:
            - OPEN
            - RECORDED
          description: >-
            The table where the registry found the loan. Which table the row
            comes from. OPEN: an open lien position at the slice date, 1 to 4
            per parcel, with the balance, rate, term and maturity the open-lien
            table carries. RECORDED: a slot of the recorded mortgage history,
            the 5 newest per parcel, with older ones lost. The same instrument
            is in both tables when the dates and amounts match, and in_both says
            so.
        property_id:
          type: string
          pattern: ^prop_[0-9a-f]{32}$
          description: >-
            The parcel the loan is on, the deal's parcel. It is the key to the
            financing block of that parcel. The block lists the loan among the
            open liens or the recorded history.
      required:
        - id
        - name
        - lender_class
        - is_hard_money
        - amount
        - recording_date
        - loan_to_price
        - source
        - property_id
      additionalProperties: false
      description: >-
        The loan that financed the purchase: the lender, the amount, the date,
        the loan against the price and which table it came from.
    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
    X-Credits-Charged:
      description: >-
        The origin sets this header: the credits this response cost. It is 0
        when the account already unlocked every record on it. The plans page of
        the documentation site says what counts.
      schema:
        type: integer
        minimum: 0
    X-Credits-Remaining:
      description: >-
        The edge sets this header: the credits left in the billing period after
        this response, recent to within a minute. It is negative on a plan with
        overage, down to its ceiling. Absent on Enterprise.
      schema:
        type: integer
    Retry-After:
      description: >-
        Whole seconds to wait before you retry, never below 1. On a 429, the
        seconds until the spent bucket refills. On a 503, 1 for pool_saturated
        and 5 for ledger_unavailable, and none for database_unavailable. On a
        403 plan_limit for the name-search day cap, the seconds to the next UTC
        midnight, when the cap resets. The other plan limits carry none. The
        body repeats it as retry_after on the 429, the ledger refusal and the
        day cap.
      schema:
        type: integer
        minimum: 1
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        API key from the developer console (starts with zpka_). Create one at
        https://developers.investorlift.com/get-a-key.

````

## Related topics

- [Get one deal](/api-reference/endpoints/deals-get.md)
- [Get one deal by id](/api-reference/deals/get-one-deal-by-id.md)
- [List investor deals around a location](/api-reference/deals/list-investor-deals-around-a-location.md)
- [Summarise deal activity around a location](/api-reference/deals/summarise-deal-activity-around-a-location.md)
- [List Investorlift listings around a location with what the deeds show](/api-reference/wholesale/list-investorlift-listings-around-a-location-with-what-the-deeds-show.md)
