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

# Get one investor

> The full profile: every deed name split into given and surname, how they operate, how recently they bought, and how to contact them.

Everything the API knows about one [Investor](/api-reference/objects/investor): who they are, how they operate, how
recently they bought, and how to contact them.

## Use it when

The investor drawer, which you open from a list row, a deal row or a search hit. Also each time an id you stored
earlier needs a refresh. For the investor's deals, use
[`GET /v1/investors/{id}/deals`](/api-reference/endpoints/investors-deals). To find an id from a name, use
[`GET /v1/investors/search`](/api-reference/endpoints/investors-search).

## Read the response

* **The API returns person names SURNAME GIVEN**, as on the deed. Print `display_name` (since 0.29.0). It is the
  same person given-first when the spelling parsed cleanly, and it equals `name` otherwise. For a member, use the
  split fields `given` and `surname`, never a given-first splitter on `name`. If `is_ambiguous` is true, the split is
  unsafe: show the raw `name`.
* `contact.mailing_addresses` lists every address. `is_generic` marks title companies, registered agents and
  shared head offices. `contact.primary_address` is the best non-generic one, usually where the investor actually
  is. `skip_trace_targets` pairs a person with an address, best first. Read it as: send these to a skip-trace vendor
  in this order.
* The API measures `days_since_last_purchase` and every `_12m` / `_24m` window from `data_end`, never from today.
* `median_purchase_year` (since 0.26.0) is the median year the investor bought what it still holds. It is null when no
  holding has a date to measure: [The Investor object](/api-reference/objects/investor#holdings). The lists filter on the
  same count (`holds_min` and `holds_max`). `GET /v1/investors` sorts on the holdings inside a geometry (`sort=holds_desc`).
* `buyer_signal` is the operator behind this investor: the ids it spans, where it is in its capital cycle, and its
  fitted probability to buy again. The API serves it to every key, ids and numbers only. See
  [Same buyer, cash right now](/guides/walkthroughs/same-buyer).
* `financing` (since 0.16.0) is what the lender registry ties to the investor. It carries the loans, which the API
  counts once across the open-lien and recorded-history tables, the lenders behind them and the last loan. It says
  for how many of the recent purchases the registry found a loan, and if a hard-money lender was among them. The API
  serves it to every key, because lender names are business records. It is null in a market without a published
  registry or borrower match. Every count is a floor of a partial feed:
  [The Investor object](/api-reference/objects/investor#the-financing-block).
* `meta.resolved_from` is present when a refresh replaced the id you sent with a newer one. Store the new
  `id`.

## Gotchas

* This host does not serve `members`, `contact.primary_address`, `contact.mailing_addresses`, `contact.person_members`
  and `contact.skip_trace_targets` (null, `contact_redacted: true`). This host serves `member_names`, but it lists
  only the entity and trust names.
* For a **retired** id, the API answers [`410 gone`](/guides/concepts/errors#gone) with `superseded_by: null`. Search
  by name instead. A **merged** id is not an error: you get the new profile with `meta.resolved_from`. For an id that
  the API never issued, the API answers a 404.
* **Public bodies and institutional investors resolve here** even though the lists hide them. The route does not
  accept `include_public` and answers [`400 unknown_parameter`](/guides/concepts/errors#unknown_parameter): the API
  always returns a profile reached by id.
* Pass `market` when an id exists in more than one loaded market.
  [`400 market_required`](/guides/concepts/errors#market_required) says so and lists them.

## Related

[Tell me about this investor](/guides/walkthroughs/investor-profile).


## OpenAPI

````yaml GET /v1/investors/{id}
openapi: 3.1.0
info:
  title: God Mode API
  version: 0.33.1
  description: >-
    You have a house to sell, usually a wholesale contract. You want to know
    **who nearby buys houses like this one and how to reach them**. County deed
    records already hold the answer. This API reads them for each loaded market
    and serves three things: deals, investors and a ranking. On every response,
    `meta.coverage[]` lists the markets and the area each covers.


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


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


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


    ```

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

    Authorization: Bearer zpka_...

    ```


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


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


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


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


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


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


        For their deals use `/v1/investors/{id}/deals`. To find an id from a
        name use `/v1/investors/search`.


        [The buyer signal and what becomes of an old
        id](https://developers.investorlift.com/api-reference/endpoints/investors-get).
      operationId: getInvestor
      parameters:
        - schema:
            type: string
            minLength: 1
            maxLength: 16
          in: query
          name: market
          required: false
          description: >-
            Market code, for example phx. The loaded markets are in
            meta.coverage[]. Send it only when the id exists in more than one
            loaded market. 400 market_required says so. Otherwise the API uses
            the id's own market.
        - schema:
            type: string
          in: path
          name: id
          required: true
          description: >-
            Investor id, inv_ followed by 12 hex characters, for example
            inv_abaf618f44a3. The API follows an old id from an earlier data
            refresh to the current investor (meta.resolved_from). It answers 410
            for a retired id.
      responses:
        '200':
          description: >-
            The full profile. meta.resolved_from lists the old ids that
            redirected here.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/InvestorProfile'
                  meta:
                    $ref: '#/components/schemas/Meta'
                required:
                  - data
                  - meta
                additionalProperties: false
                description: >-
                  The full profile. meta.resolved_from lists the old ids that
                  redirected here.
              examples:
                phoenix_recorded:
                  summary: >-
                    Recorded at the Phoenix golden point, as a deals-only key
                    gets it
                  value:
                    data:
                      id: inv_0a20a550f33b
                      market: phx
                      name: ZAK VENTURES LLC
                      display_name: ZAK VENTURES LLC
                      state: AZ
                      kind: LANDLORD
                      confidence: STRONG
                      scale: large
                      institutional: false
                      is_public: false
                      last_bought_on: '2026-08-05'
                      n_deals: 775
                      buyer_status: registered
                      mailing_states:
                        - AZ
                        - CA
                      registry_version: v4-metro-review-fixes
                      registry_run: 8
                      id_history:
                        - registry_run: 1
                          assign_method: NEW
                          jaccard: null
                          prev_group_id: null
                        - registry_run: 2
                          assign_method: INHERITED
                          jaccard: 1
                          prev_group_id: 317607
                        - registry_run: 3
                          assign_method: INHERITED
                          jaccard: 1
                          prev_group_id: 317607
                        - registry_run: 4
                          assign_method: INHERITED
                          jaccard: 1
                          prev_group_id: 317607
                        - registry_run: 5
                          assign_method: INHERITED
                          jaccard: 1
                          prev_group_id: 317607
                        - registry_run: 6
                          assign_method: INHERITED
                          jaccard: 0.8
                          prev_group_id: 317607
                        - registry_run: 7
                          assign_method: INHERITED
                          jaccard: 1
                          prev_group_id: 318750
                        - registry_run: 8
                          assign_method: INHERITED
                          jaccard: 1
                          prev_group_id: 318750
                      kinds:
                        - LANDLORD
                        - FLIPPER
                        - BUILDER
                        - WHOLESALER
                      confidence_by_kind:
                        BUILDER:
                          'n': 668
                          confidence: STRONG
                        FLIPPER:
                          'n': 346
                          confidence: STRONG
                        LANDLORD:
                          'n': 334
                          confidence: STRONG
                        WHOLESALER:
                          'n': 158
                          confidence: STRONG
                      classification_reasons:
                        - FLIPPER:STRICT_FLIPS_2P
                        - FLIPPER:STRICT_FLIP_ENTITY
                        - FLIPPER:STRICT_FLIP_PLUS_QUICK_RESALE
                        - WHOLESALER:QUICK_RESALES_2P
                        - WHOLESALER:QUICK_RESALE_ENTITY_2PAIRS
                        - LANDLORD:LONG_HOLDS_2P_CONCURRENT
                        - LANDLORD:HOLDINGS_2P_RENTAL
                        - LANDLORD:RENTAL_HOLDING_PLUS_FLIP
                        - LANDLORD:ENTITY_LONG_HOLD_RENTAL_REG
                        - BUILDER:LOT_TO_BUILD_2P
                        - BUILDER:NEW_CONSTRUCTION_SALES_3P
                        - BUILDER:BUILDER_NAME_SALES_3P
                        - NOTE:SOLD_TO_WHOLESALER
                      is_entity: true
                      flipper_first: true
                      holdings_first: true
                      flipper_demoted: false
                      has_builder_name: true
                      is_ibuyer: false
                      n_strict_flips: 188
                      n_quick_resales: 158
                      n_lot_to_build_built: 5
                      n_sales_new_construction: 41
                      n_current_holdings: 302
                      is_production_builder: false
                      is_sfr_bulk_holder: false
                      institutional_reason: null
                      institutional_reasons: []
                      public_name: null
                      n_flips: 188
                      n_wholesales: 158
                      n_long_holds: 63
                      n_holds: 314
                      median_purchase_year: 2021
                      n_other: 47
                      n_builds: 5
                      n_acquisitions: 646
                      n_priced_deals: 763
                      n_unpriced_deals: 12
                      n_purchases: 1367
                      n_sales: 983
                      first_deed: '1997-07-03'
                      last_deed: '2026-08-11'
                      last_sold_on: '2026-08-11'
                      last_flip_sold_on: '2026-08-11'
                      last_deal_on: '2026-08-11'
                      days_since_last_purchase: 7
                      n_purchase_events_12m: 45
                      n_purchase_events_24m: 81
                      n_flips_24m: 13
                      n_holds_24m: 61
                      n_sales_12m: 26
                      bought_12m: true
                      bought_24m: true
                      price_band:
                        window: 5y
                        p25: 210000
                        p50: 245000
                        p75: 288875
                        n_priced_purchases: 238
                      p50_flip_sold_price: 244950
                      p50_buy_to_resale_ratio: 0.6857
                      median_hold_days: 73
                      median_spread_ratio: 0.4167
                      median_gross_profit: 70000
                      median_bought_price: 179000
                      segment_mix:
                        sfr: 0.894
                        condo_th: 0.086
                        other: 0.019
                      segment_sfr_share: 0.894
                      cities_active:
                        - PHOENIX
                        - GLENDALE
                        - PEORIA
                      n_bought_from_wholesaler: 65
                      n_bought_from_wholesaler_5y: 36
                      n_bought_from_wholesaler_24m: 21
                      share_bought_from_wholesaler: 0.085
                      last_bought_from_wholesaler_on: '2026-07-15'
                      buys_wholesale: true
                      n_bought_from_investor: 104
                      n_distressed_buys: 17
                      auction:
                        n_auction_buys: 202
                        n_auction_buys_24m: 0
                        last_auction_buy_on: '2016-06-30'
                        is_active_auction_buyer: false
                        auction_resale_share: 0.935
                        n_reo_buys: 4
                        n_reo_buys_24m: 0
                        last_reo_buy_on: '2013-06-19'
                        is_active_reo_buyer: false
                        auction_kinds:
                          - TRUSTEE_SALE
                          - SHERIFF_SALE
                        n_auction_by_kind:
                          SHERIFF_SALE: 1
                          TRUSTEE_SALE: 201
                        n_auction_by_venue: {}
                        n_auction_events: 202
                        n_auction_resold_12m: 157
                        n_auction_transferred_12m: 34
                        n_auction_lost: 1
                        n_auction_held: 10
                        n_auction_parcels: 202
                        median_auction_discount: 0.236
                        lender_note: null
                        n_reo_by_grantor:
                          SERVICER: 4
                        n_reo_resold_12m: 1
                        n_reo_transferred_12m: 1
                        n_reo_lost: 0
                        n_reo_held: 2
                        reo_resale_share: 0.333
                      members: null
                      member_names:
                        - ZAK VENTURES LLC
                        - JSB HOMES LLC
                        - LLC ZAK VENTURES
                        - AZ CAPITAL PARTNERS LLC
                        - HANSON INDUSTRIES LLC
                      n_members: 18
                      n_addresses_by_kind:
                        house: 40
                        suite: 58
                        pobox: 0
                      has_mailing_address: true
                      buyer_signal:
                        operator_id: inv_0a20a550f33b
                        n_operator_members: 4
                        operator_member_ids:
                          - inv_0a20a550f33b
                          - inv_d096f29ddb8d
                          - inv_ef98e65e5e07
                          - inv_fad3fbd13c56
                        is_anchor: true
                        merge_confidence: MERGED_STRONG
                        activity_p_180: 0.937516
                        activity_p_365: 0.965902
                        cell_n: 1599
                        activity_model: CYCLE_v1
                        cycle_state: FRESH_CASH
                        capital_freed_60d: true
                        days_since_last_purchase: 7
                        days_since_last_resale: 1
                        open_inventory: 305
                        n_purchases_36m: 145
                        median_gap_days: 5
                        share_within_30d_of_resale: 0.931
                        data_end: '2026-08-12'
                      listings:
                        n_active: 2
                        n_pending: 0
                        n_listed: 2
                        n_listed_undated: 0
                        n_holdings_dated: 314
                        n_holdings_undated: 0
                        median_list_price: 536950
                        min_list_price: 449000
                        max_list_price: 624900
                        last_listed_on: '2026-07-24'
                        n_listed_12m: 27
                        listings_data_end: '2026-08-31'
                      wholesale_purchases:
                        'n': 9
                        n_12m: 1
                        n_24m: 4
                        n_5y: 8
                        n_probable: 8
                        last_on: '2026-04-08'
                        n_wholesalers: 8
                        top_wholesalers:
                          - id: wsr_f142268d0d08
                            name: The Local Investor
                            'n': 2
                          - id: wsr_056aa2c2531e
                            name: Cash For Houses, LLC
                            'n': 1
                          - id: wsr_5314bba2f18b
                            name: OneRoof Real Estate Group
                            'n': 1
                        n_double_closed: 1
                        median_asking_price: 305000
                        data_end: '2026-08-12'
                      str: null
                      has_licensed_member: true
                      agent_links:
                        - agent_id: agt_fdfd4a0f8bae
                          license_number: null
                          link_basis: SELF_LISTING
                          confidence: HIGH
                          n_self_listings: 38
                          party_key: null
                        - agent_id: agt_fdfd4a0f8bae
                          license_number: null
                          link_basis: SELF_LISTING
                          confidence: HIGH
                          n_self_listings: 38
                          party_key: null
                        - agent_id: agt_391971c0904a
                          license_number: null
                          link_basis: SELF_LISTING
                          confidence: HIGH
                          n_self_listings: 1
                          party_key: null
                        - agent_id: agt_391971c0904a
                          license_number: null
                          link_basis: SELF_LISTING
                          confidence: HIGH
                          n_self_listings: 1
                          party_key: null
                        - agent_id: agt_391971c0904a
                          license_number: null
                          link_basis: SELF_LISTING
                          confidence: MEDIUM
                          n_self_listings: 1
                          party_key: null
                      financing:
                        n_loans: 249
                        n_loans_12m: 18
                        n_loans_24m: 30
                        n_lenders: 37
                        lenders_used:
                          - id: len_9f4e246dcf57
                            name: FIRST FIDELITY BANK
                            lender_class: BANK
                            is_hard_money: false
                            'n': 147
                            n_24m: 24
                            last_loan_on: '2025-12-18'
                          - id: len_5f5369213fe0
                            name: GUILD MORTGAGE CO
                            lender_class: NONBANK
                            is_hard_money: false
                            'n': 2
                            n_24m: 1
                            last_loan_on: '2026-01-30'
                          - id: len_95b4c664bb2b
                            name: COPA LENDING LLC
                            lender_class: NONBANK
                            is_hard_money: true
                            'n': 1
                            n_24m: 1
                            last_loan_on: '2025-11-14'
                          - id: len_a173c82df779
                            name: PELHAM INVESTORS LLC
                            lender_class: NONBANK
                            is_hard_money: false
                            'n': 1
                            n_24m: 1
                            last_loan_on: '2026-01-07'
                          - id: len_a81f5348b9c1
                            name: QUICK SOURCE CAPITAL LLC
                            lender_class: NONBANK
                            is_hard_money: true
                            'n': 1
                            n_24m: 1
                            last_loan_on: '2024-11-26'
                          - id: len_b2c2b5ed925e
                            name: ROCKET MORTGAGE LLC
                            lender_class: NONBANK
                            is_hard_money: false
                            'n': 1
                            n_24m: 1
                            last_loan_on: '2025-06-05'
                          - id: len_d4f8215629de
                            name: BOOMERANG ACCEPTANCE LLC
                            lender_class: NONBANK
                            is_hard_money: true
                            'n': 1
                            n_24m: 1
                            last_loan_on: '2026-01-02'
                          - id: len_ef6fbe48c59b
                            name: GRANDPOINT BANK
                            lender_class: BANK
                            is_hard_money: false
                            'n': 35
                            n_24m: 0
                            last_loan_on: '2016-09-28'
                          - id: len_f5d8bf160316
                            name: COUNTRYWIDE INVESTMENTS LLC
                            lender_class: NONBANK
                            is_hard_money: false
                            'n': 12
                            n_24m: 0
                            last_loan_on: '2013-10-17'
                          - id: len_1c7b0443baa5
                            name: THE BILTMORE BANK OF ARIZONA
                            lender_class: BANK
                            is_hard_money: false
                            'n': 10
                            n_24m: 0
                            last_loan_on: '2013-10-01'
                        last_loan:
                          lender_id: len_5f5369213fe0
                          name: GUILD MORTGAGE CO
                          lender_class: NONBANK
                          is_hard_money: false
                          property_id: prop_3d21514c580d7565deb9f932659a5134
                          recording_date: '2026-01-30'
                          amount: 100000
                          purpose: PURCHASE
                        n_deals_measured_24m: 83
                        n_deals_financed_24m: 2
                        share_deals_financed_24m: 0.024096
                        uses_hard_money: true
                        as_of: '2026-06-25'
                        dated: true
                      data_end: '2026-08-12'
                    meta:
                      generated_at: '2026-09-04T12:00:00.000Z'
                      coverage:
                        - market: phx
                          state: AZ
                          counties:
                            - fips: '04013'
                              name: Maricopa
                              data_end: '2026-08-12'
                            - fips: '04021'
                              name: Pinal
                              data_end: '2026-08-06'
                          bbox:
                            - -113.332773
                            - 32.46915
                            - -110.455491
                            - 33.999503
                          data_end: '2026-08-12'
                          build_run_id: 1
                          registry_run: 8
                          registry_version: v4-metro-review-fixes
                          dataset_version: 1788521834
                          loaded_at: '2026-09-04T11:37:14.263Z'
                          metro_buy_to_resale_ratio: 0.7192
                          universe_kind: metro
                          universe_zips: null
                          point_tolerance_miles: 20
                          n_parcels: 1836307
                          listings_data_end: '2026-08-31'
                          agents_data_end: '2026-08-31'
                          wholesale_as_of: '2026-09-09'
                          str_as_of: null
                          str: null
                          auction_counted: true
                          parcel_as_of: null
                          address_as_of: null
                          parcel: null
                          lenders: null
                      terms: >-
                        Data: Investorlift Data Services. Public-record and MLS
                        listing data licensed through BatchData; municipal
                        short-term rental registries; Investorlift marketplace
                        records. Attribution and data-use terms:
                        https://developers.investorlift.com/guides/terms
                str_operator:
                  summary: >-
                    An investor with 17 licensed short-term rental holdings (the
                    str roll-up; recorded 2026-09-10 from stage)
                  value:
                    data:
                      id: inv_91b085a8d797
                      market: phx
                      name: SPSTR 1 LLC
                      display_name: SPSTR 1 LLC
                      state: AZ
                      kind: LANDLORD
                      confidence: STRONG
                      scale: mid
                      institutional: false
                      is_public: false
                      last_bought_on: '2023-02-01'
                      n_deals: 20
                      buyer_status: registered
                      mailing_states:
                        - CA
                        - OR
                        - TX
                      registry_version: v4-metro-review-fixes
                      registry_run: 8
                      id_history:
                        - registry_run: 1
                          assign_method: NEW
                          jaccard: null
                          prev_group_id: null
                        - registry_run: 2
                          assign_method: INHERITED
                          jaccard: 1
                          prev_group_id: 5428340
                        - registry_run: 3
                          assign_method: INHERITED
                          jaccard: 1
                          prev_group_id: 5428340
                        - registry_run: 4
                          assign_method: INHERITED
                          jaccard: 1
                          prev_group_id: 5428343
                        - registry_run: 5
                          assign_method: INHERITED
                          jaccard: 1
                          prev_group_id: 5428343
                        - registry_run: 6
                          assign_method: INHERITED
                          jaccard: 1
                          prev_group_id: 5428343
                        - registry_run: 7
                          assign_method: INHERITED
                          jaccard: 1
                          prev_group_id: 5455094
                        - registry_run: 8
                          assign_method: INHERITED
                          jaccard: 1
                          prev_group_id: 5455094
                      kinds:
                        - LANDLORD
                      confidence_by_kind:
                        LANDLORD:
                          'n': 17
                          confidence: STRONG
                      classification_reasons:
                        - LANDLORD:HOLDINGS_2P_RENTAL
                        - LANDLORD:ENTITY_LONG_HOLD_RENTAL_REG
                      is_entity: true
                      flipper_first: false
                      holdings_first: false
                      flipper_demoted: false
                      has_builder_name: false
                      is_ibuyer: false
                      n_strict_flips: 0
                      n_quick_resales: 0
                      n_lot_to_build_built: 0
                      n_sales_new_construction: 0
                      n_current_holdings: 17
                      is_production_builder: false
                      is_sfr_bulk_holder: false
                      institutional_reason: null
                      institutional_reasons: []
                      public_name: null
                      n_flips: 0
                      n_wholesales: 0
                      n_long_holds: 1
                      n_holds: 18
                      median_purchase_year: 2022
                      n_other: 1
                      n_builds: 0
                      n_acquisitions: 19
                      n_priced_deals: 20
                      n_unpriced_deals: 0
                      n_purchases: 20
                      n_sales: 2
                      first_deed: '2021-12-06'
                      last_deed: '2025-09-26'
                      last_sold_on: '2025-09-26'
                      last_flip_sold_on: null
                      last_deal_on: '2025-09-26'
                      days_since_last_purchase: 1288
                      n_purchase_events_12m: 0
                      n_purchase_events_24m: 0
                      n_flips_24m: 0
                      n_holds_24m: 0
                      n_sales_12m: 1
                      bought_12m: false
                      bought_24m: false
                      price_band:
                        window: 5y
                        p25: 803750
                        p50: 863500
                        p75: 906750
                        n_priced_purchases: 20
                      p50_flip_sold_price: null
                      p50_buy_to_resale_ratio: null
                      median_hold_days: 857.5
                      median_spread_ratio: 0.2366
                      median_gross_profit: 230000
                      median_bought_price: 863500
                      segment_mix:
                        sfr: 1
                        condo_th: 0
                        other: 0
                      segment_sfr_share: 1
                      cities_active:
                        - SCOTTSDALE
                        - FOUNTAIN HILLS
                        - GILBERT
                      n_bought_from_wholesaler: 3
                      n_bought_from_wholesaler_5y: 3
                      n_bought_from_wholesaler_24m: 0
                      share_bought_from_wholesaler: 0.15
                      last_bought_from_wholesaler_on: '2023-01-31'
                      buys_wholesale: false
                      n_bought_from_investor: 6
                      n_distressed_buys: 0
                      auction:
                        n_auction_buys: 0
                        n_auction_buys_24m: 0
                        last_auction_buy_on: null
                        is_active_auction_buyer: false
                        auction_resale_share: null
                        n_reo_buys: 0
                        n_reo_buys_24m: 0
                        last_reo_buy_on: null
                        is_active_reo_buyer: false
                        auction_kinds: []
                        n_auction_by_kind: {}
                        n_auction_by_venue: {}
                        n_auction_events: 0
                        n_auction_resold_12m: 0
                        n_auction_transferred_12m: 0
                        n_auction_lost: 0
                        n_auction_held: 0
                        n_auction_parcels: 0
                        median_auction_discount: null
                        lender_note: null
                        n_reo_by_grantor: {}
                        n_reo_resold_12m: 0
                        n_reo_transferred_12m: 0
                        n_reo_lost: 0
                        n_reo_held: 0
                        reo_resale_share: null
                      members: null
                      member_names:
                        - SPSTR 1 LLC
                        - SPRUCE CAPITAL LLC
                      n_members: 2
                      n_addresses_by_kind:
                        house: 3
                        suite: 2
                        pobox: 0
                      has_mailing_address: true
                      buyer_signal:
                        operator_id: inv_91b085a8d797
                        n_operator_members: 1
                        operator_member_ids:
                          - inv_91b085a8d797
                        is_anchor: true
                        merge_confidence: SINGLE
                        activity_p_180: null
                        activity_p_365: null
                        cell_n: null
                        activity_model: null
                        cycle_state: LOADED
                        capital_freed_60d: false
                        days_since_last_purchase: 1288
                        days_since_last_resale: 320
                        open_inventory: 18
                        n_purchases_36m: 0
                        median_gap_days: 13.5
                        share_within_30d_of_resale: null
                        data_end: '2026-08-12'
                      listings:
                        n_active: 0
                        n_pending: 0
                        n_listed: 0
                        n_listed_undated: 0
                        n_holdings_dated: 18
                        n_holdings_undated: 0
                        median_list_price: null
                        min_list_price: null
                        max_list_price: null
                        last_listed_on: null
                        n_listed_12m: 0
                        listings_data_end: '2026-08-31'
                      has_licensed_member: false
                      agent_links: []
                      wholesale_purchases:
                        'n': 0
                        n_12m: 0
                        n_24m: 0
                        n_5y: 0
                        n_probable: 0
                        last_on: null
                        n_wholesalers: 0
                        top_wholesalers: []
                        n_double_closed: 0
                        median_asking_price: null
                        data_end: '2026-08-12'
                      str:
                        n_holdings: 17
                        n_permits: 17
                        n_at_purchase: 4
                        n_assumed: 0
                        n_owner_occupied_licences: 0
                        n_managed: 0
                        share: 0.9444
                        manager_companies: []
                        jurisdictions:
                          - PHOENIX
                          - SCOTTSDALE
                        stale_jurisdictions: []
                        last_application_on: '2025-12-08'
                      financing: null
                      data_end: '2026-08-12'
                    meta:
                      generated_at: '2026-09-10T14:50:00.000Z'
                      coverage:
                        - market: phx
                          state: AZ
                          counties:
                            - fips: '04013'
                              name: Maricopa
                              data_end: '2026-08-12'
                            - fips: '04021'
                              name: Pinal
                              data_end: '2026-08-06'
                          bbox:
                            - -113.332773
                            - 32.46915
                            - -110.455491
                            - 33.999503
                          data_end: '2026-08-12'
                          build_run_id: 1
                          registry_run: 8
                          registry_version: v4-metro-review-fixes
                          dataset_version: 1789049684
                          loaded_at: '2026-09-10T14:14:43.746Z'
                          metro_buy_to_resale_ratio: 0.7192
                          universe_kind: metro
                          universe_zips: null
                          point_tolerance_miles: 20
                          n_parcels: 1836307
                          listings_data_end: '2026-08-31'
                          agents_data_end: '2026-08-31'
                          wholesale_as_of: '2026-09-09'
                          str_as_of: '2026-09-10'
                          str:
                            jurisdictions:
                              - name: APACHE_JUNCTION
                                regime: NOT_REQUIRED
                                coverage_reason: NO_REQUIREMENT
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: AVONDALE
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: BUCKEYE
                                regime: NOT_REQUIRED
                                coverage_reason: NO_REQUIREMENT
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: CAREFREE
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: CASA_GRANDE
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: CAVE_CREEK
                                regime: REQUIRED
                                coverage_reason: LOADED_UNVALIDATED
                                served: false
                                snapshot_only: true
                                licence_start: '2023-11-06'
                                snapshot_date: null
                                feed_stale: true
                                sources:
                                  - source: DECKARD
                                    snapshot_date: null
                                    stale: false
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: CHANDLER
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: CITY_OF_MARICOPA
                                regime: NOT_REQUIRED
                                coverage_reason: NO_REQUIREMENT
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: COOLIDGE
                                regime: NOT_REQUIRED
                                coverage_reason: NO_REQUIREMENT
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: EL_MIRAGE
                                regime: NOT_REQUIRED
                                coverage_reason: NO_REQUIREMENT
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: ELOY
                                regime: NOT_REQUIRED
                                coverage_reason: NO_REQUIREMENT
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: FLORENCE
                                regime: NOT_REQUIRED
                                coverage_reason: NO_REQUIREMENT
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: FOUNTAIN_HILLS
                                regime: REQUIRED
                                coverage_reason: LOADED_UNVALIDATED
                                served: false
                                snapshot_only: true
                                licence_start: '2022-11-15'
                                snapshot_date: null
                                feed_stale: true
                                sources:
                                  - source: DECKARD
                                    snapshot_date: null
                                    stale: false
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: GILA_BEND
                                regime: NOT_REQUIRED
                                coverage_reason: NO_REQUIREMENT
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: GILBERT
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: GLENDALE
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: GOODYEAR
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: GUADALUPE
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: LITCHFIELD_PARK
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: MARICOPA_UNINCORPORATED
                                regime: NOT_REQUIRED
                                coverage_reason: NO_REQUIREMENT
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: MESA
                                regime: REQUIRED
                                coverage_reason: LOADED_COUNTS_ONLY
                                served: false
                                snapshot_only: false
                                licence_start: '2023-02-01'
                                snapshot_date: '2026-09-10'
                                feed_stale: false
                                sources:
                                  - source: MESA
                                    snapshot_date: '2026-09-10'
                                    stale: false
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: PARADISE_VALLEY
                                regime: REQUIRED
                                coverage_reason: LOADED_UNVALIDATED
                                served: false
                                snapshot_only: false
                                licence_start: '2022-11-13'
                                snapshot_date: '2026-09-10'
                                feed_stale: false
                                sources:
                                  - source: PV
                                    snapshot_date: '2026-09-10'
                                    stale: false
                                n_licensed: 95
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: 0.0104
                                share_assumed: null
                              - name: PEORIA
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: PHOENIX
                                regime: REQUIRED
                                coverage_reason: LOADED_SERVED
                                served: true
                                snapshot_only: false
                                licence_start: '2023-10-26'
                                snapshot_date: '2026-09-10'
                                feed_stale: false
                                sources:
                                  - source: PHX_GIS
                                    snapshot_date: '2026-09-10'
                                    stale: false
                                  - source: PHX_SHAPE
                                    snapshot_date: null
                                    stale: true
                                n_licensed: 1750
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: 0.0793
                                share_assumed: 0
                              - name: PINAL_UNINCORPORATED
                                regime: NOT_REQUIRED
                                coverage_reason: NO_REQUIREMENT
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: QUEEN_CREEK
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: SCOTTSDALE
                                regime: REQUIRED
                                coverage_reason: LOADED_SERVED
                                served: true
                                snapshot_only: false
                                licence_start: '2022-11-28'
                                snapshot_date: '2026-09-10'
                                feed_stale: false
                                sources:
                                  - source: COS_EXPIRED
                                    snapshot_date: '2026-09-10'
                                    stale: false
                                  - source: COS_LEGACY
                                    snapshot_date: '2026-09-10'
                                    stale: false
                                  - source: COS_LICENSED
                                    snapshot_date: '2026-09-10'
                                    stale: false
                                  - source: COS_PENDING
                                    snapshot_date: '2026-09-10'
                                    stale: false
                                  - source: COS_STAFF
                                    snapshot_date: '2026-09-10'
                                    stale: false
                                  - source: COS_UNLICENSED
                                    snapshot_date: '2026-09-10'
                                    stale: false
                                n_licensed: 2708
                                n_pending: 41
                                n_expired: 2
                                n_advertised: 671
                                share_unmatched: 0.0265
                                share_assumed: 0.0008
                              - name: SURPRISE
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: TEMPE
                                regime: REQUIRED
                                coverage_reason: LOADED_UNVALIDATED
                                served: false
                                snapshot_only: false
                                licence_start: '2023-03-06'
                                snapshot_date: '2026-09-10'
                                feed_stale: false
                                sources:
                                  - source: TEMPE
                                    snapshot_date: '2026-09-10'
                                    stale: false
                                n_licensed: 110
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: 0.676
                                share_assumed: null
                              - name: TOLLESON
                                regime: NOT_REQUIRED
                                coverage_reason: NO_REQUIREMENT
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: WICKENBURG
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                              - name: YOUNGTOWN
                                regime: REQUIRED
                                coverage_reason: REQUIRED_NOT_PUBLISHED
                                served: false
                                snapshot_only: false
                                licence_start: null
                                snapshot_date: null
                                feed_stale: false
                                sources: []
                                n_licensed: 0
                                n_pending: 0
                                n_expired: 0
                                n_advertised: 0
                                share_unmatched: null
                                share_assumed: null
                          auction_counted: true
                          parcel_as_of: 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/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                geometry_required:
                  summary: Geometry required
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#geometry_required
                    title: Geometry required
                    status: 400
                    code: geometry_required
                    detail: >-
                      The request needs one geometry: lat and lng with
                      radius_miles, bbox, property_id, zip (a list) or city.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                invalid_cursor:
                  summary: Invalid cursor
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#invalid_cursor
                    title: Invalid cursor
                    status: 400
                    code: invalid_cursor
                    detail: >-
                      The API issued the cursor for another query. Restart from
                      page 1.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                invalid_id:
                  summary: Invalid id
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#invalid_id
                    title: Invalid id
                    status: 400
                    code: invalid_id
                    detail: >-
                      An investor id is inv_ followed by 12 hex characters. The
                      prefix is part of the id.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                market_required:
                  summary: Market required
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#market_required
                    title: Market required
                    status: 400
                    code: market_required
                    detail: >-
                      inv_0a20a550f33b exists in 2 loaded markets. Pass market=.
                      The codes are in markets[].
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    markets:
                      - phx
                      - hou
                    errors:
                      - param: market
                        message: one of phx, hou
                        code: market_required
                sort_requires_point:
                  summary: Sort requires a reference point
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#sort_requires_point
                    title: Sort requires a reference point
                    status: 400
                    code: sort_requires_point
                    detail: >-
                      sort=distance needs a reference point: add lat and lng, or
                      property_id.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                unknown_parameter:
                  summary: Unknown parameter
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#unknown_parameter
                    title: Unknown parameter
                    status: 400
                    code: unknown_parameter
                    detail: >-
                      The query carries a parameter this endpoint does not
                      define: kind[]. Write the list as kind=flip,hold or as
                      repeated keys.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    errors:
                      - param: kind[]
                        message: unknown parameter
                        code: unknown_parameter
                validation_error:
                  summary: Validation error
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#validation_error
                    title: Validation error
                    status: 400
                    code: validation_error
                    detail: radius_miles must be 20 or less.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    errors:
                      - param: radius_miles
                        message: must be 20 or less
                        code: too_big
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '401':
          description: Unauthorized (unauthorized)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                unauthorized:
                  summary: Unauthorized
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#unauthorized
                    title: Unauthorized
                    status: 401
                    code: unauthorized
                    detail: 'Send Authorization: Bearer with a current key.'
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '403':
          description: >-
            Forbidden (payment_overdue, plan_limit, quota_exceeded,
            subscription_required)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                plan_limit:
                  summary: Plan limit
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#plan_limit
                    title: Plan limit
                    status: 403
                    code: plan_limit
                    detail: >-
                      The free plan searches within 5 miles of a point, a
                      viewport up to 10 miles across, or one ZIP code. Your zip
                      parameter lists 2 ZIP codes. Upgrade in the developer
                      console for city-wide and multi-ZIP searches.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    tier: free
                    limit: geometry
                    max_radius_miles: 5
                    max_bbox_diagonal_miles: 10
                    max_zips: 1
                quota_exceeded:
                  summary: Quota exceeded
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#quota_exceeded
                    title: Quota exceeded
                    status: 403
                    code: quota_exceeded
                    detail: >-
                      Your requests spent the plan's credits for this billing
                      period (5000 of 5000). Wait for the period to reset on the
                      subscription's billing date, or upgrade in the developer
                      console.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    used: 5000
                    line: 5000
                subscription_required:
                  summary: Subscription required
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#subscription_required
                    title: Subscription required
                    status: 403
                    code: subscription_required
                    detail: >-
                      This key has no active plan subscription. Subscribe in the
                      developer console.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                payment_overdue:
                  summary: Payment overdue
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#payment_overdue
                    title: Payment overdue
                    status: 403
                    code: payment_overdue
                    detail: >-
                      The subscription's payment is overdue and the grace period
                      passed. Update the card under Manage Billing in the
                      developer console.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '404':
          description: Not found (not_found)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                not_found:
                  summary: Not found
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#not_found
                    title: Not found
                    status: 404
                    code: not_found
                    detail: No such deal in any loaded market.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '406':
          description: Not acceptable (not_acceptable)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                not_acceptable:
                  summary: Not acceptable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#not_acceptable
                    title: Not acceptable
                    status: 406
                    code: not_acceptable
                    detail: >-
                      Accept text/html names no representation this endpoint
                      produces (application/json).
                    instance: /v1/investors/{id}
                    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/investors/{id}
                    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/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                auction_unavailable:
                  summary: Auction counts unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#auction_unavailable
                    title: Auction counts unavailable
                    status: 422
                    code: auction_unavailable
                    detail: >-
                      This market has no published foreclosure-auction counts:
                      its registry predates them. So the API cannot answer
                      buys_at_auction, buys_reo and bought_auction_kind there,
                      and meta.coverage[].auction_counted is false for it. Drop
                      the parameter to list every row.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                lenders_unavailable:
                  summary: Lenders unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#lenders_unavailable
                    title: Lenders unavailable
                    status: 422
                    code: lenders_unavailable
                    detail: >-
                      Market hou has no published lender registry
                      (meta.coverage[].lenders is null there). The API still
                      serves the financing block on parcels where the slice is.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    markets:
                      - hou
                listings_unavailable:
                  summary: Listings unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#listings_unavailable
                    title: Listings unavailable
                    status: 422
                    code: listings_unavailable
                    detail: >-
                      You gave listing_status for a market with no published
                      listing tables. See meta.coverage[].listings_data_end.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                outside_coverage:
                  summary: Outside coverage
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#outside_coverage
                    title: Outside coverage
                    status: 422
                    code: outside_coverage
                    detail: >-
                      The point 40.712776, -74.005974 is outside every loaded
                      market's point tolerance (loaded: phx, hou). See
                      meta.coverage[].bbox and point_tolerance_miles on any list
                      response.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                str_unavailable:
                  summary: Short-term rental data unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#str_unavailable
                    title: Short-term rental data unavailable
                    status: 422
                    code: str_unavailable
                    detail: >-
                      This market has no published short-term rental tables. See
                      meta.coverage[].str_as_of.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                wholesale_unavailable:
                  summary: Wholesale transactions unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#wholesale_unavailable
                    title: Wholesale transactions unavailable
                    status: 422
                    code: wholesale_unavailable
                    detail: >-
                      This market has no published Investorlift wholesale
                      tables. See meta.coverage[].wholesale_as_of.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '429':
          description: Rate limited, with Retry-After (rate_limited)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                rate_limited:
                  summary: Rate limited
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#rate_limited
                    title: Rate limited
                    status: 429
                    code: rate_limited
                    detail: >-
                      The request exceeded the per-key budget. Retry in 12
                      seconds.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    retry_after: 12
                    bucket: key
          headers:
            Retry-After:
              $ref: '#/components/headers/Retry-After'
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '500':
          description: Internal error (internal_error)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                internal_error:
                  summary: Internal error
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#internal_error
                    title: Internal error
                    status: 500
                    code: internal_error
                    detail: The request failed. Quote request_id when you report it.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '503':
          description: >-
            Unavailable, with Retry-After on pool_saturated and
            ledger_unavailable (database_unavailable, ledger_unavailable,
            pool_saturated)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                database_unavailable:
                  summary: Database unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#database_unavailable
                    title: Database unavailable
                    status: 503
                    code: database_unavailable
                    detail: >-
                      The service failed to reach the database and did not run
                      the request.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                ledger_unavailable:
                  summary: Ledger unavailable
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#ledger_unavailable
                    title: Ledger unavailable
                    status: 503
                    code: ledger_unavailable
                    detail: >-
                      The credit ledger is unreachable. The API charged nothing.
                      Retry in 5 seconds.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
                    retry_after: 5
                pool_saturated:
                  summary: Pool saturated
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#pool_saturated
                    title: Pool saturated
                    status: 503
                    code: pool_saturated
                    detail: >-
                      No pooled connection was free. The service did not run the
                      request.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            Retry-After:
              $ref: '#/components/headers/Retry-After'
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
        '504':
          description: Statement timeout (statement_timeout)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              examples:
                statement_timeout:
                  summary: Statement timeout
                  value:
                    type: >-
                      https://developers.investorlift.com/guides/concepts/errors#statement_timeout
                    title: Statement timeout
                    status: 504
                    code: statement_timeout
                    detail: >-
                      The query exceeded the 10 second statement timeout. Narrow
                      the geometry or filters.
                    instance: /v1/investors/{id}
                    request_id: 6f1c2a8e-3b7d-4f21-9a0c-2e5b81d7a4f3
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
components:
  schemas:
    InvestorProfile:
      type: object
      properties:
        id:
          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.
        market:
          type: string
          description: >-
            Market code, for example phx. The loaded markets are in
            meta.coverage[].
        name:
          type: string
          description: >-
            The deed spelling, the one most often on their deeds, upper case,
            SURNAME GIVEN for a person, for example "ZAK VENTURES LLC" or
            "RIVERA DANA". Never a key. Print display_name.
        display_name:
          type: string
          description: >-
            The name to print. For 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. Display only: match, join and search on name.
        state:
          type: string
          description: >-
            2-letter state of the market. The loaded markets and their states
            are in meta.coverage[].
        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.
        mailing_states:
          type: array
          items:
            type: string
            description: A 2-letter state.
          description: >-
            Distinct states of their non-generic mailing addresses, most deeds
            first, for example ["AZ","CA"].
        registry_version:
          description: >-
            Which registry code version produced this profile. Informational:
            use meta.coverage[].dataset_version for caching. Null when not
            recorded.
          type:
            - string
            - 'null'
        registry_run:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Which data refresh (registry run number) produced this profile
            (informational). Null when not recorded.
        id_history:
          type: array
          items:
            $ref: '#/components/schemas/IdHistoryEntry'
          description: What each data refresh did to this id, oldest first.
        kinds:
          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.
          description: Every kind the investor qualifies for.
        confidence_by_kind:
          anyOf:
            - type: object
              propertyNames:
                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.
              additionalProperties:
                type: object
                properties:
                  'n':
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                    description: Deals that support this kind.
                  confidence:
                    type: string
                    enum:
                      - STRONG
                      - PROBABLE
                      - WEAK
                    description: >-
                      Confidence in this kind. 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.
                required:
                  - 'n'
                  - confidence
                additionalProperties: false
                description: The evidence for one kind.
              description: >-
                Per-kind evidence: how many deals support each kind and the
                confidence in it.
            - type: 'null'
          description: >-
            Per-kind evidence: how many deals support each kind and the
            confidence in it. Null when the registry recorded none.
        classification_reasons:
          type: array
          items:
            type: string
            description: One classifier code.
          description: >-
            Diagnostic codes from the classifier, for example
            "FLIPPER:STRICT_FLIPS_2P". Not for display, and distinct from the
            match reasons[]. You can ignore them.
        is_entity:
          type: boolean
          description: >-
            True when the investor's main name is an entity (an LLC, corporation
            or partnership), not a person.
        flipper_first:
          type: boolean
          description: >-
            Diagnostic: when the classifier chose the primary kind, the flipping
            evidence outranked the holdings. You can ignore it.
        holdings_first:
          type: boolean
          description: >-
            Diagnostic: when the classifier chose the primary kind, the holdings
            outranked the flipping evidence. You can ignore it.
        flipper_demoted:
          type: boolean
          description: >-
            Diagnostic: the investor looked like a flipper first, but the
            classifier made another kind primary. You can ignore it.
        has_builder_name:
          type: boolean
          description: >-
            True when one of their names carries builder vocabulary (HOMES,
            CONSTRUCTION, DEVELOPMENT).
        is_ibuyer:
          type: boolean
          description: True for an iBuyer brand (Opendoor, Offerpad, Zillow).
        n_strict_flips:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Diagnostic: flips that met the strict flip test, as the classifier
            counted them. The strict test is a resale within a year at a
            profit-shaped margin. You can ignore it: n_flips is the number to
            show.
        n_quick_resales:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Diagnostic: resales in under 30 days, or a chain resale or round
            trip within 90 days, as the classifier counted them. You can ignore
            it: n_wholesales is the number to show.
        n_lot_to_build_built:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Lots they bought and then built on, as the registry's builder test
            counts them. That test also counts a finished home bought in its
            completion year, and it applies none of the build kind's bounds. The
            count can exceed n_builds, the served count of build deals.
        n_sales_new_construction:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Sales of newly built homes (the production-builder test).
        n_current_holdings:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Diagnostic: the holdings at data_end as the classifier counted them
            (the bulk-holder test at 500). You can ignore it: n_holds is the
            number to show.
        is_production_builder:
          type: boolean
          description: >-
            True for a volume homebuilder. The test: 100+ new-construction
            sales, or a builder name with 10+, and at least twice their flips.
        is_sfr_bulk_holder:
          type: boolean
          description: True at 500 or more holdings at data_end.
        institutional_reason:
          description: >-
            Diagnostic: the rule that made them institutional, for example
            "IBUYER" or "PATTERN:PRODUCTION_BUILDER:FULTON HOMES CORP". Null
            when not institutional.
          type:
            - string
            - 'null'
        institutional_reasons:
          type: array
          items:
            type: string
            description: One institutional rule.
          description: >-
            Diagnostic: every institutional rule that applied. Empty when not
            institutional.
        public_name:
          description: >-
            The deed name that marked them as a public body (county, city,
            housing authority). Null when not public.
          type:
            - string
            - 'null'
        n_flips:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Flips inside the area loaded for the market. Every count on the
            profile covers that area only (meta.coverage[].universe_kind). In a
            ZIP market the count is a floor.
        n_wholesales:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Wholesale resales inside the area loaded for the market.
        n_long_holds:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Long holds (held over a year, resold).
        n_holds:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Parcels they still own at data_end.
        median_purchase_year:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            The median year the investor bought the parcels it still holds at
            data_end, a whole year, for example 2021. The API computes this
            holdings statistic over the n_holds rows inside the area loaded for
            the market, from their purchase dates at request time. For an even
            count whose two middle years differ, the API rounds the midpoint up
            to the later year: 2020 and 2021 read 2021. Null when the investor
            holds nothing or when no holding carries a purchase date. The median
            leaves out holdings without a purchase date. Read it with n_holds:
            300 parcels bought around 2021 is a young portfolio, around 2009 a
            seasoned one.
        n_other:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Other investor resales: a loss, a thin margin, a builder's new home
            resold, or an iBuyer resale.
        n_builds:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Builds: lots or teardowns bought, built on, then sold, under the
            bounds of the build kind. 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.
        n_acquisitions:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            All-time distinct purchase events inside the area loaded for the
            market. A purchase event is a day on which the investor bought.
        n_priced_deals:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Deals with a purchase price on the deed.
        n_unpriced_deals:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Deals without a purchase price. These are holdings, builder lots,
            and most off-market purchases in a non-disclosure state such as
            Texas.
        n_purchases:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Deeds as buyer, every parcel and kind. This is a deed count, larger
            than n_deals.
        n_sales:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Deeds as seller. Seller-only builders have n_deals = 0 and n_sales >
            0.
        first_deed:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: First deed under any member name, YYYY-MM-DD.
        last_deed:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: Last deed under any member name.
        last_sold_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: Their last sale of any kind.
        last_flip_sold_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: Their last flip resale (a just-sold flipper has cash).
        last_deal_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: Last purchase, sale or transfer (display only).
        days_since_last_purchase:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Days from last_bought_on to the data end date. Null when they never
            bought.
        n_purchase_events_12m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Distinct purchase days in the 12 months before the data end date.
        n_purchase_events_24m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Distinct purchase days in the 24 months before the data end date.
        n_flips_24m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Flips resold in the 24 months before data_end.
        n_holds_24m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Purchases in the 24 months ending on data_end, still held at it.
        n_sales_12m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Sales in the 12 months before data_end.
        bought_12m:
          type: boolean
          description: True when they bought in the 12 months before the data end date.
        bought_24m:
          type: boolean
          description: True when they bought in the 24 months before the data end date.
        price_band:
          $ref: '#/components/schemas/PriceBand'
          description: 'What they pay: the quartiles of their priced purchases.'
        p50_flip_sold_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            Median flip resale price, whole dollars. Null with fewer than 3
            flips.
        p50_buy_to_resale_ratio:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            Median bought / sold over their priced flips. At 0.72 they pay 72%
            of resale. Null with fewer than 3 priced flips. In a non-disclosure
            state most flips carry no purchase price. The market median is
            meta.coverage[].metro_buy_to_resale_ratio.
        median_hold_days:
          description: Median days between purchase and resale over their resold deals.
          type:
            - number
            - 'null'
        median_spread_ratio:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: Median resale margin as a ratio (0.53 = +53%).
        median_gross_profit:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: Median sold minus bought over their resold deals, whole dollars.
        median_bought_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: Median of what they paid, whole dollars, priced deals only.
        segment_mix:
          anyOf:
            - $ref: '#/components/schemas/SegmentMix'
            - type: 'null'
          description: >-
            Shares of their deals by parcel segment. Null when they have no
            deals.
        segment_sfr_share:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            Share of their deals on single-family houses, 0 to 1. Null when they
            have no deals.
        cities_active:
          type: array
          items:
            type: string
            description: A city name, upper case.
          description: Cities where they have deals, most first, upper case.
        n_bought_from_wholesaler:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: All-time purchases documented as bought from a wholesaler.
        n_bought_from_wholesaler_5y:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Same, the 5 years ending on data_end.
        n_bought_from_wholesaler_24m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Same, the 24 months ending on data_end.
        share_bought_from_wholesaler:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            Share of their purchases documented as bought from a wholesaler, 0
            to 1.
        last_bought_from_wholesaler_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: Last documented wholesale purchase.
        buys_wholesale:
          type: boolean
          description: >-
            True when they bought from a wholesaler in the 36 months before the
            data end date.
        n_bought_from_investor:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Purchases where the seller carried an investor id.
        n_distressed_buys:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Deals whose purchase deed was a distressed instrument of any kind,
            whoever the buyer. The instruments: a trustee's, sheriff's or tax
            deed, a deed in lieu, or a deed the feed flags as REO or
            foreclosure. Wider than auction.n_auction_buys, the third-party
            auction purchases by parcel, and auction.n_reo_buys, the purchases
            from a lender after a foreclosure. None of the three is a subset of
            another.
        auction:
          anyOf:
            - $ref: '#/components/schemas/AuctionBlock'
            - type: 'null'
          description: >-
            The auction and REO block: the list-row summary plus the kinds
            bought at and the platform that ran the sale (Texas). It also
            carries the outcomes of the purchases at 12 months, the median
            discount to the later resale and the lender note. Null where the
            market publishes no auction counts (meta.coverage[].auction_counted
            false). Zeros and empty maps where it does and the investor never
            bought at auction or from a lender.
        member_names:
          type: array
          items:
            type: string
            description: One deed name, raw spelling.
          description: >-
            Every deed name that belongs to this investor, entities first. This
            host omits person names. Raw spelling (SURNAME GIVEN for persons).
        n_members:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Number of deed names that belong to this investor.
        n_addresses_by_kind:
          anyOf:
            - type: object
              properties:
                house:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                  description: 'House addresses: no suite, unit or box marker.'
                suite:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                  description: Suite or unit addresses.
                pobox:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                  description: Post office boxes.
              required:
                - house
                - suite
                - pobox
              additionalProperties: false
            - type: 'null'
          description: Mailing addresses on file by kind. Null when none is on file.
        has_mailing_address:
          type: boolean
          description: True when any mailing address is on file.
        buyer_signal:
          anyOf:
            - $ref: '#/components/schemas/BuyerSignal'
            - type: 'null'
          description: >-
            The operator this investor belongs to, that operator's capital cycle
            and its probability of buying in the next 180 days, measured at
            data_end. Its "days since" values, measured at data_end, are the
            operator's, not this id's alone. Null when the market has no buyer
            signal, or when this investor has no signal row. An id minted after
            the signal build has no signal row.
        listings:
          anyOf:
            - $ref: '#/components/schemas/InvestorListings'
            - type: 'null'
          description: >-
            What the investor has on the market right now, measured at
            listings_data_end (later than data_end). The block carries their
            holdings listed ACTIVE or PENDING in the MLS feed, with the asking
            prices. The per-parcel blocks are on the hold rows of
            `/v1/investors/{id}/deals`, and their counted rows equal n_active +
            n_pending here. The API serves this block to every key. Null when
            the market publishes no listing tables, zeros when it does and no
            holding is listed.
        has_licensed_member:
          description: >-
            True when one of the investor's people is a listing agent keyed on a
            state licence, and agent_links carries the link. Such an investor
            can list its own inventory. False when no such agent has a link.
            Null when the market publishes no agent registry
            (meta.coverage[].agents_data_end is null). The API serves this field
            to every key.
          type:
            - boolean
            - 'null'
        agent_links:
          anyOf:
            - type: array
              items:
                $ref: '#/components/schemas/InvestorAgentLink'
            - type: 'null'
          description: >-
            The listing agents that are, by name, this investor's people, HIGH
            confidence first. Each carries the link basis and how many of the
            investor's parcels the agent listed. Empty when none, null when the
            market publishes no agent registry. Open GET `/v1/agents/{agent_id}`
            for the agent's profile and history. The API serves agent_id,
            link_basis, confidence and n_self_listings to every key.
        wholesale_purchases:
          anyOf:
            - $ref: '#/components/schemas/InvestorWholesale'
            - type: 'null'
          description: >-
            What the investor bought off Investorlift listings per the recorded
            deeds. The block carries counts by window (n, n_12m, n_24m, n_5y)
            and how many at high confidence (n minus n_probable). It also
            carries the last closing and the companies they buy from. The rows
            themselves are GET `/v1/investors/{id}/wholesale-purchases`. The API
            serves this block to every key. Null when the market publishes no
            wholesale tables (meta.coverage[].wholesale_as_of is null), zeros
            when it does and the investor never bought off Investorlift.
        str:
          anyOf:
            - $ref: '#/components/schemas/InvestorStr'
            - type: 'null'
          description: >-
            How many of the investor's holdings carry a business-use
            short-term-rental licence attributed to them, from the cities'
            rolls. The block carries holdings and permits, how many got a
            licence within 180 days of the purchase, and how many rest on an
            assumed attribution. It also carries the share of their holds, the
            property managers named and the cities. The per-parcel blocks are on
            the hold rows of `/v1/investors/{id}/deals`
            (str_status=LICENSED,PENDING lists them). The API serves this block
            to every key. Null when the market publishes no short-term rental
            tables (meta.coverage[].str_as_of is null), zeros when it does and
            the investor holds no such parcel.
        financing:
          anyOf:
            - $ref: '#/components/schemas/InvestorFinancing'
            - type: 'null'
          description: >-
            What the investor borrows, from the lender registry: the loans the
            recorded mortgages and open liens tie to it, and the lenders behind
            them. The block carries the last loan, how many of its recent
            purchases (measured to financing.as_of) had a loan found, and if it
            uses hard money. Every count is a floor of a partial feed, and its
            windows end on the registry's own slice date (financing.as_of), not
            on data_end. The API serves this block to every key. Null when the
            market publishes no lender registry or borrower match:
            meta.coverage[].lenders is null or investor_lending_measured is
            false. Zeros when it does and no loan resolves to the investor.
        data_end:
          type: string
          description: >-
            The date from which the API measures every "days since" value and
            every window (12m, 24m, 5y) on this profile.
      required:
        - id
        - market
        - name
        - display_name
        - state
        - kind
        - confidence
        - scale
        - institutional
        - is_public
        - last_bought_on
        - n_deals
        - buyer_status
        - mailing_states
        - registry_version
        - registry_run
        - id_history
        - kinds
        - confidence_by_kind
        - classification_reasons
        - is_entity
        - flipper_first
        - holdings_first
        - flipper_demoted
        - has_builder_name
        - is_ibuyer
        - n_strict_flips
        - n_quick_resales
        - n_lot_to_build_built
        - n_sales_new_construction
        - n_current_holdings
        - is_production_builder
        - is_sfr_bulk_holder
        - institutional_reason
        - institutional_reasons
        - public_name
        - n_flips
        - n_wholesales
        - n_long_holds
        - n_holds
        - median_purchase_year
        - n_other
        - n_builds
        - n_acquisitions
        - n_priced_deals
        - n_unpriced_deals
        - n_purchases
        - n_sales
        - first_deed
        - last_deed
        - last_sold_on
        - last_flip_sold_on
        - last_deal_on
        - days_since_last_purchase
        - n_purchase_events_12m
        - n_purchase_events_24m
        - n_flips_24m
        - n_holds_24m
        - n_sales_12m
        - bought_12m
        - bought_24m
        - price_band
        - p50_flip_sold_price
        - p50_buy_to_resale_ratio
        - median_hold_days
        - median_spread_ratio
        - median_gross_profit
        - median_bought_price
        - segment_mix
        - segment_sfr_share
        - cities_active
        - n_bought_from_wholesaler
        - n_bought_from_wholesaler_5y
        - n_bought_from_wholesaler_24m
        - share_bought_from_wholesaler
        - last_bought_from_wholesaler_on
        - buys_wholesale
        - n_bought_from_investor
        - n_distressed_buys
        - auction
        - member_names
        - n_members
        - n_addresses_by_kind
        - has_mailing_address
        - buyer_signal
        - listings
        - has_licensed_member
        - agent_links
        - wholesale_purchases
        - str
        - financing
        - data_end
      description: >-
        The full profile of one investor: identity, activity, price band, buyer
        signal and listings. It also carries the linked listing agents,
        Investorlift purchases, short-term rental holdings, financing and id
        history.
    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.
    IdHistoryEntry:
      type: object
      properties:
        registry_run:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: The data refresh (registry run number) this entry describes.
        assign_method:
          type: string
          enum:
            - NEW
            - INHERITED
            - NEW_REHASHED
          description: >-
            How the refresh assigned the id. NEW: the refresh saw this group of
            names for the first time. INHERITED: the refresh kept the id from
            the previous refresh because most of the names stayed together.
            NEW_REHASHED: the names changed too much to inherit, so the refresh
            minted a new id. These are the only three values.
        jaccard:
          description: >-
            How much the set of names overlaps with the previous refresh's
            group, 0 to 1 (1 = identical). Null on a NEW entry.
          type:
            - number
            - 'null'
        prev_group_id:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Diagnostic: the internal group number in the previous refresh, which
            changes between refreshes. Null on a NEW entry. You can ignore it.
      required:
        - registry_run
        - assign_method
        - jaccard
        - prev_group_id
      additionalProperties: false
      description: What one data refresh did to this id.
    PriceBand:
      type: object
      properties:
        window:
          anyOf:
            - type: string
              enum:
                - 5y
                - all
            - type: 'null'
          description: >-
            Which purchases the band covers. The value 5y is the priced
            purchases in the 5 years before the data end date. The value all is
            every priced purchase, all time. The band uses all when fewer than 5
            priced purchases fall in those 5 years. Null when no priced purchase
            exists.
        p25:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: 25th percentile of what they paid, whole dollars.
        p50:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: Median of what they paid, whole dollars, for example 250000.
        p75:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: 75th percentile of what they paid, whole dollars.
        n_priced_purchases:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Priced purchases behind the band. The band ignores a price under
            $20,000 as nominal. With 1 or 2 the band is a single point. Treat it
            as weak evidence.
      required:
        - window
        - p25
        - p50
        - p75
        - n_priced_purchases
      additionalProperties: false
      description: 'What the investor pays: the quartiles of their priced purchases.'
    SegmentMix:
      type: object
      properties:
        sfr:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: Share of their deals on single-family houses, 0 to 1.
        condo_th:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: Share on condos and townhouses, 0 to 1.
        other:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            Share on everything else (manufactured, multi-family, land,
            commercial), 0 to 1. OTHER is a mixed bucket.
      required:
        - sfr
        - condo_th
        - other
      additionalProperties: false
      description: Shares of the investor's deals by parcel segment. The three add up to 1.
    AuctionBlock:
      type: object
      properties:
        n_auction_buys:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Houses bought at a foreclosure auction inside the area loaded for
            the market, all time. The count is of distinct parcels bought at a
            TRUSTEE_SALE or SHERIFF_SALE by a third party. A lender that bids
            its own loan, a trustee and a bulk instrument never count. For
            example 12. The related n_distressed_buys on the profile counts
            deals whose purchase deed was any distressed instrument, deeds in
            lieu and feed-flagged REO included.
        n_auction_buys_24m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            The same over the 24 months before the data end date: what
            is_active_auction_buyer and the buys_at_auction filter read.
        last_auction_buy_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The date of their last auction purchase, YYYY-MM-DD: the sale day,
            when the buyer paid the cash. Null when they never bought at
            auction. The feed records a trustee's deed a median 1 day (Phoenix)
            to 7 days (Harris) after the sale. The 90th percentile in Harris is
            23 days, so the newest purchases can be a few weeks behind.
        is_active_auction_buyer:
          type: boolean
          description: >-
            True when n_auction_buys_24m is at least 1: a cash buyer who bought
            without an inspection in the 24 months before the data end date.
            Within that window the measured lift over other buyers held. The
            buys_at_auction filter reads this flag.
        auction_resale_share:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            The share of their auction purchases resold within 12 months to a
            third party, 0 to 1, for example 0.7 (7 of 10 flipped). The share
            counts only purchases made at least 12 months before the data end
            date. For the rest, the buyer held them through those 12 months,
            transferred them to its own next name, or lost them to a senior
            lender. Null under 3 such purchases.
        n_reo_buys:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Houses bought from a lender, servicer or agency after a foreclosure,
            all time since 2012, inside the area loaded for the market. Such a
            purchase is a bank-owned (REO) sale: the deed after the take-back,
            sold by an institution to a third party. For example 3. A weaker
            cash signal: the buyer had weeks and an inspection, and a loan is
            possible.
        n_reo_buys_24m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            The same over the 24 months before the data end date: what
            is_active_reo_buyer and the buys_reo filter read.
        last_reo_buy_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The date of their last REO purchase, YYYY-MM-DD. Null when they
            never bought REO.
        is_active_reo_buyer:
          type: boolean
          description: True when n_reo_buys_24m is at least 1. The buys_reo filter.
        auction_kinds:
          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.
          description: >-
            Every auction kind the investor bought at, most purchases first, for
            example ["TRUSTEE_SALE","TAX_LIEN_DEED"]. Empty when none.
        n_auction_by_kind:
          type: object
          propertyNames:
            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.
          additionalProperties:
            type: integer
            minimum: -9007199254740991
            maximum: 9007199254740991
            description: Distinct parcels bought at that kind.
          description: >-
            Distinct parcels bought by auction kind, all time, for example
            `{"TRUSTEE_SALE": 11, "TAX_LIEN_DEED": 3}`. The map shows
            HOA_TRUSTEE_SALE, TAX_SALE and TAX_LIEN_DEED here, and
            n_auction_buys never counts them.
        n_auction_by_venue:
          type: object
          propertyNames:
            type: string
            enum:
              - AUCTION_COM
              - SERVICELINK
              - XOME
            description: >-
              The auction platform the lender appointed as trustee, read off the
              deed: AUCTION_COM (Auction.com), SERVICELINK (ServiceLink
              Auction), XOME. Texas only. A Texas servicer can appoint the
              platform as substitute trustee, so the platform signs the deed.
              Arizona deeds name only the trustee, so no Arizona purchase
              carries a venue. The venue changes no count.
          additionalProperties:
            type: integer
            minimum: -9007199254740991
            maximum: 9007199254740991
            description: Counted purchases whose deed names that platform as trustee.
          description: >-
            Counted auction purchases by the platform that ran the sale, for
            example `{"AUCTION_COM": 3}`. Empty when no deed named a platform,
            as on every Arizona purchase: Arizona deeds name only the trustee.
        n_auction_events:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Distinct acquisition events behind n_auction_buys: one sale day and
            instrument, so a bulk buy of 4 houses on one day counts once. For
            example 10.
        n_auction_resold_12m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Auction purchases made 12 months or more before the deed data end
            (meta.coverage[].data_end) and resold within 12 months to a third
            party. The numerator of auction_resale_share.
        n_auction_transferred_12m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Auction purchases made 12 months or more before the deed data end
            (meta.coverage[].data_end), then moved within 12 months without a
            sale. The move is an unpriced transfer, usually to the buyer's own
            next LLC. A group whose transfers always go to different names is a
            bidding service that buys for clients.
        n_auction_lost:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Auction purchases made 12 months or more before the deed data end
            (meta.coverage[].data_end) that a later foreclosure took within 12
            months. That foreclosure is the senior lender's sale after an
            HOA-lien purchase.
        n_auction_held:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Auction purchases made 12 months or more before the deed data end
            (meta.coverage[].data_end) with no later deed on record within 12
            months. "No later deed on record", not "kept": the feed has chain
            gaps.
        n_auction_parcels:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Distinct parcels bought at any auction kind, all time, the
            shown-but-not-counted kinds included: the sum of n_auction_by_kind.
            Equals n_auction_buys for a buyer of trustee and sheriff sales only.
            It stays the raw count when lender_note zeroes the counted fields.
        median_auction_discount:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            The median of 1 minus the winning bid divided by the resale price,
            over their trustee's-sale purchases resold within 12 months. For
            example 0.19: they paid 81% of the resale price. Trustee sales only.
            A sheriff's-sale bid is the price over the HOA judgment and is never
            comparable. Tax deeds carry no price. Null under 3 pairs.
        lender_note:
          description: >-
            "AUCTION_LENDER_BY_BEHAVIOUR" when the group looked like a lender at
            auction. The rule: a lender or servicer other than the group later
            sold off half or more of its auction parcels. Those parcels were
            credit bids and take-backs. Its auction counts above are then 0, and
            it never passes buys_at_auction. Null otherwise.
          type:
            - string
            - 'null'
        n_reo_by_grantor:
          type: object
          propertyNames:
            type: string
            enum:
              - SERVICER
              - GSE_HUD_VA
            description: >-
              Who sold the bank-owned house. SERVICER: a lender, a servicer or a
              securitisation trust that sells its own take-back, often within a
              few months. GSE_HUD_VA: Fannie Mae, Freddie Mac, HUD or the VA,
              which sell through their retail programmes, usually after the
              servicer conveyed the house to them.
          additionalProperties:
            type: integer
            minimum: -9007199254740991
            maximum: 9007199254740991
            description: REO purchases from that class of seller.
          description: >-
            REO purchases by the class of seller, for example `{"SERVICER": 2,
            "GSE_HUD_VA": 1}`. Empty when none.
        n_reo_resold_12m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            REO purchases made 12 months or more before the deed data end
            (meta.coverage[].data_end) and resold within 12 months to a third
            party. The numerator of reo_resale_share.
        n_reo_transferred_12m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            REO purchases made 12 months or more before the deed data end
            (meta.coverage[].data_end), then moved within 12 months without a
            sale.
        n_reo_lost:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            REO purchases made 12 months or more before the deed data end
            (meta.coverage[].data_end) that a later foreclosure took within 12
            months.
        n_reo_held:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            REO purchases made 12 months or more before the deed data end
            (meta.coverage[].data_end) with no later deed on record within 12
            months.
        reo_resale_share:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            The share of their REO purchases resold within 12 months to a third
            party, 0 to 1. The share counts only purchases made at least 12
            months before the data end date. Null under 3 such purchases. Across
            every REO buyer the share measured 10% in Phoenix and 23% in Harris,
            against about 60% for auction buyers. Most REO buyers keep the
            house.
      required:
        - n_auction_buys
        - n_auction_buys_24m
        - last_auction_buy_on
        - is_active_auction_buyer
        - auction_resale_share
        - n_reo_buys
        - n_reo_buys_24m
        - last_reo_buy_on
        - is_active_reo_buyer
        - auction_kinds
        - n_auction_by_kind
        - n_auction_by_venue
        - n_auction_events
        - n_auction_resold_12m
        - n_auction_transferred_12m
        - n_auction_lost
        - n_auction_held
        - n_auction_parcels
        - median_auction_discount
        - lender_note
        - n_reo_by_grantor
        - n_reo_resold_12m
        - n_reo_transferred_12m
        - n_reo_lost
        - n_reo_held
        - reo_resale_share
      additionalProperties: false
      description: >-
        The profile's auction and REO block: the summary every list row carries
        plus the kinds, venues, outcomes and the discount. Null where the market
        publishes no auction counts.
    BuyerSignal:
      type: object
      properties:
        operator_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: >-
            Id of the operator this investor belongs to, always set when the
            block is present. Shared mailing addresses (deed and tax bill) and
            shared names tie LLCs, trusts and people together as one buying
            operation. The operator id is the member id with the most purchases,
            and it equals the investor's own id when no link exists. Rows that
            share an operator_id are the same buyer: collapse them in a list and
            reach them once. The id belongs to the busiest member, so it can
            move to another member after a data refresh: group by it within one
            response. Do not store it as an identity: store the investor ids.
        n_operator_members:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            How many investor ids the operator spans, for example 4: three LLCs
            and the person behind them. 1 for an investor with no links. Always
            set when the block is present.
        operator_member_ids:
          anyOf:
            - type: array
              items:
                type: string
                pattern: ^inv_[0-9a-f]{12}$
                description: One investor id.
            - type: 'null'
          description: >-
            Every investor id of the operator, this one included, sorted. The
            list carries ids only. Open `/v1/investors/{id}` for each to see its
            names. Always set when the block is present.
        is_anchor:
          description: >-
            True on the operator_id row itself: the member with the most
            purchases, the one to show when you collapse the others. Always set
            when the block is present.
          type:
            - boolean
            - 'null'
        merge_confidence:
          anyOf:
            - type: string
              enum:
                - SINGLE
                - MERGED_STRONG
                - MERGED_WEAK
              description: >-
                How sure the operator link is. SINGLE: one investor id, nothing
                linked. MERGED_STRONG: a strong sign backs every linked id as
                the same operation. Such a sign is a shared name token, the ids
                on one deed together, or two entities at the same address.
                MERGED_WEAK: only a shared mailing address links the ids, for
                example a mailbox store. Treat such a collapse with more care.
            - type: 'null'
          description: >-
            Null on a block built without it. How sure the operator link is.
            SINGLE: one investor id, nothing linked. MERGED_STRONG: a strong
            sign backs every linked id as the same operation. Such a sign is a
            shared name token, the ids on one deed together, or two entities at
            the same address. MERGED_WEAK: only a shared mailing address links
            the ids, for example a mailbox store. Treat such a collapse with
            more care.
        activity_p_180:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            Probability, 0 to 1, that the operator buys at least one house in
            the 180 days after the data end date, for example 0.36. The registry
            fitted the model, a cell model with shrinkage to its parent cell, on
            three years of monthly snapshots. The inputs at each snapshot: the
            age of the last purchase and the last sale, the depth of the
            history, the houses held. Null when the operator never bought, or
            last bought more than 3 years before the data end date. Such dormant
            operators re-activated at about 3.4% within 180 days in the Phoenix
            measurement. The w_activity parameter scores a null at that measured
            rate, and its description gives the number.
        activity_p_365:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            The same probability over the 365 days after the data end date. Null
            under the same rule as activity_p_180.
        cell_n:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            How many operator-months the registry fitted the cell behind
            activity_p_180 on, for example 412. Under 50 the probability leans
            on its parent cell. Treat it as weak evidence. Null when
            activity_p_180 is null.
        activity_model:
          description: >-
            Which fitted model produced the probabilities, for example CYCLE_v1.
            The value changes when the registry refits the model. Null when
            activity_p_180 is null.
          type:
            - string
            - 'null'
        cycle_state:
          anyOf:
            - type: string
              enum:
                - FRESH_CASH
                - LOADED
                - STEADY
                - DORMANT
              description: >-
                Where the operator sits in its capital cycle at the data end
                date, the first of these that applies. FRESH_CASH (cash is
                back): the operator sold something in the 60 days before the
                data end date, and a purchase usually follows. For repeat
                flippers the median next purchase lands 14 days after their own
                resale. LOADED (capital tied up): 3 or more houses held at the
                data end date and no resale in the 180 days before it. DORMANT
                (no purchase in a year): no purchase in the 365 days before
                data_end and no resale in the 60 days before it. STEADY (none of
                those): the operator buys and sells without any of those
                signals.
            - type: 'null'
          description: >-
            Null when the operator never bought. Where the operator sits in its
            capital cycle at the data end date, the first of these that applies.
            FRESH_CASH (cash is back): the operator sold something in the 60
            days before the data end date, and a purchase usually follows. For
            repeat flippers the median next purchase lands 14 days after their
            own resale. LOADED (capital tied up): 3 or more houses held at the
            data end date and no resale in the 180 days before it. DORMANT (no
            purchase in a year): no purchase in the 365 days before data_end and
            no resale in the 60 days before it. STEADY (none of those): the
            operator buys and sells without any of those signals.
        capital_freed_60d:
          description: >-
            True when the operator sold a house it held in the 60 days before
            the data end date. Such a sale is a flip resale, a wholesale resale,
            or the exit of an older holding. Cash is then back, and for repeat
            flippers the next purchase usually follows within a month. False
            otherwise. Always set when the block is present.
          type:
            - boolean
            - 'null'
        days_since_last_purchase:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Days from the operator's last purchase (under any of its ids) to the
            data end date, for example 21. Can be smaller than the investor's
            own days_since_last_purchase when a sibling id bought after the
            investor's own last purchase. Null when the operator never bought.
        days_since_last_resale:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Days from the operator's last sale of a house it held to the data
            end date, for example 12. Such a sale is a flip resale, a wholesale
            resale, or the exit of an older holding. Null when it never sold.
        open_inventory:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Houses the operator bought and did not resell by the data end date,
            for example 3. 0 when none. Always set when the block is present.
        n_purchases_36m:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: >-
            Purchases by the operator in the 36 months before the data end date,
            one per house. A bulk buy of 5 houses on one day counts 5. 0 when
            none. Always set when the block is present.
        median_gap_days:
          description: >-
            Median days between the operator's consecutive purchase days, for
            example 45. A same-day bulk buy counts once. Null with fewer than 2
            purchase days.
          type:
            - number
            - 'null'
        share_within_30d_of_resale:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            The share of the operator's purchases that closed within 30 days of
            one of its sales, 0 to 1, for example 0.67. The share counts only
            purchases made after the operator's first sale. It shows how
            strongly its buying follows its selling. Null when it has no such
            purchase: it never sold, or never bought again after its sales.
        data_end:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The market's data end date, YYYY-MM-DD: the API measures every "days
            since" value and probability in this block from it. Always set when
            the block is present.
      required:
        - operator_id
        - n_operator_members
        - operator_member_ids
        - is_anchor
        - merge_confidence
        - activity_p_180
        - activity_p_365
        - cell_n
        - activity_model
        - cycle_state
        - capital_freed_60d
        - days_since_last_purchase
        - days_since_last_resale
        - open_inventory
        - n_purchases_36m
        - median_gap_days
        - share_within_30d_of_resale
        - data_end
      additionalProperties: false
      description: >-
        The buyer signal of an investor: the operator its ids belong to, and
        where that operator sits in its capital cycle. Also how likely the
        operator is to buy again in the 180 or 365 days after the data end date.
        The API measures the block at the data end date. Ids and numbers only,
        no names.
    InvestorListings:
      type: object
      properties:
        n_active:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Holdings of this investor listed ACTIVE at listings_data_end whose
            listing passed the ownership test. 0 when none.
        n_pending:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Holdings of this investor listed PENDING at listings_data_end whose
            listing passed the ownership test. 0 when none.
        n_listed:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            n_active + n_pending: what the investor has on the market at
            listings_data_end.
        n_listed_undated:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Holdings on the market whose purchase date is unknown, so the
            ownership test cannot run. The deal rows show them with owner_test
            UNDATED, and the counts above leave them out. Usually 0.
        n_holdings_dated:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Hold deal rows of this investor with a purchase date: the holdings
            the ownership test can run on.
        n_holdings_undated:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Hold deal rows of this investor without a purchase date.
            n_holdings_dated + n_holdings_undated is the investor's hold count.
        median_list_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            Median asking price over the counted listings that carry one, whole
            dollars. Null when the rollup counts nothing, or when no counted
            listing carries an asking price.
        min_list_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            Lowest asking price among the counted listings that carry one, whole
            dollars. Null when the rollup counts nothing, or when no counted
            listing carries an asking price.
        max_list_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            Highest asking price among the counted listings that carry one,
            whole dollars. Null when the rollup counts nothing, or when no
            counted listing carries an asking price. With min_list_price the
            drawer's "asking $289K to $340K".
        last_listed_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The newest listed_on among the counted listings, YYYY-MM-DD. Null
            when the rollup counts nothing.
        n_listed_12m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Listings of this investor's holdings, any status, that went live in
            the 365 days ending on listings_data_end and passed the ownership
            test. A lower bound: the feed keeps one listing per parcel, the
            latest.
        listings_data_end:
          type: string
          description: >-
            The date the block measures every listing window against,
            YYYY-MM-DD: the newest status update in the market's listing feed.
            Later than the deed data_end.
      required:
        - n_active
        - n_pending
        - n_listed
        - n_listed_undated
        - n_holdings_dated
        - n_holdings_undated
        - median_list_price
        - min_list_price
        - max_list_price
        - last_listed_on
        - n_listed_12m
        - listings_data_end
      additionalProperties: false
      description: >-
        What the investor has on the market at the listing data end date, from
        the MLS listings on the parcels they hold. Null where it sits when the
        market has no published listing tables. Zeros when it has them and
        nothing is listed.
    InvestorAgentLink:
      type: object
      properties:
        agent_id:
          type: string
          pattern: ^agt_[0-9a-f]{12}$
          description: 'The listing agent: the key to GET `/v1/agents/{id}`.'
        link_basis:
          type: string
          enum:
            - SELF_LISTING
            - LICENSE_MAILING
          description: >-
            What ties the agent to the investor. SELF_LISTING: the agent listed
            a parcel held by an investor whose person member carries the agent's
            name, so they sell their own inventory. LICENSE_MAILING: the
            licensee's mailing address on the state roll equals a mailing
            address of a person member with the agent's name.
        confidence:
          type: string
          enum:
            - HIGH
            - MEDIUM
          description: >-
            How sure the link is. HIGH: surname and given name equal, middle
            initials compatible. MEDIUM: surname equal and the given names share
            their first three letters, for example DOUG and DOUGLAS.
        n_self_listings:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Listings by this agent on parcels the investor holds: the inventory
            they list themselves. 0 for a LICENSE_MAILING link with none.
      required:
        - agent_id
        - link_basis
        - confidence
        - n_self_listings
      description: One listing agent who is, by name, one of this investor's people.
    InvestorWholesale:
      type: object
      properties:
        'n':
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Houses the investor bought off an Investorlift listing per a
            recorded deed, all time. The count takes CONFIRMED rows with the
            credit on one listing, as distinct closing deeds. 0 when none.
        n_12m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Of those, closed in the 365 days ending on the deed data_end.
        n_24m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Of those, closed in the 730 days ending on the deed data_end.
        n_5y:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Of those, closed in the 5 years ending on the deed data_end.
        n_probable:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Of the all-time count, the ones matched at MEDIUM or LOW confidence.
            n minus n_probable is the HIGH-confidence count.
        last_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The closing date of the investor's newest Investorlift purchase,
            YYYY-MM-DD. Null when n is 0.
        n_wholesalers:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Distinct listing companies the investor bought from.
        top_wholesalers:
          type: array
          items:
            $ref: '#/components/schemas/TopWholesaler'
          description: >-
            The companies the investor bought from most, most first, at most 3.
            Empty when n is 0.
        n_double_closed:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Of the all-time count, the ones closed through a double close.
        median_asking_price:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: Whole US dollars.
            - type: 'null'
          description: >-
            Median asking price of the listings the investor bought, whole
            dollars. Null when no listing carried a price.
        data_end:
          type: string
          description: >-
            The deed data end date, YYYY-MM-DD, the same as
            meta.coverage[].data_end. The API measures the windows against it.
            The Investorlift export date is meta.coverage[].wholesale_as_of.
      required:
        - 'n'
        - n_12m
        - n_24m
        - n_5y
        - n_probable
        - last_on
        - n_wholesalers
        - top_wholesalers
        - n_double_closed
        - median_asking_price
        - data_end
      additionalProperties: false
      description: >-
        What the investor bought off Investorlift listings, per the recorded
        deeds: counts by window, the last one, and the companies they buy from.
        Null where it sits when the market has no published wholesale tables.
        Zeros when it has them and the investor never bought one.
    InvestorStr:
      type: object
      properties:
        n_holdings:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Holdings of this investor whose parcel carries a business-use
            short-term-rental licence attributed to them, for example 3. A
            licensed 116-unit building is one holding. 0 when none.
        n_permits:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Attributed active licence numbers across those holdings, for example
            3. A building counts every unit here.
        n_at_purchase:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Of the holdings, the ones licensed within 180 days of the purchase:
            bought to be a short-term rental.
        n_assumed:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Of the holdings, the ones attributed on basis ASSUMED: no date, no
            name, no regime bound.
        n_owner_occupied_licences:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Parcels the investor's own people live in that carry a licence, for
            example a casita permit on a home. n_holdings does not count them.
            The block counts them here so the operator's whole footprint is
            visible.
        n_managed:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Of the holdings, the ones whose record names a property-management
            company (short_term_rental.manager).
        share:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            n_holdings divided by the investor's holds inside the loaded area
            (n_holds), 4 decimals, for example 0.5. A share of 0.5 means half of
            what they hold is a licensed short-term rental. Null when n_holds is
            0.
        manager_companies:
          type: array
          items:
            type: string
            description: One company name as the city writes it.
          description: >-
            The property-management companies named across the holdings, for
            example ["VACASA LLC"]. Empty when no record names one. Company
            names only, served to every key.
        jurisdictions:
          type: array
          items:
            type: string
            description: One jurisdiction, upper case.
          description: >-
            The cities the holdings fall in, for example ["SCOTTSDALE",
            "PHOENIX"]. Empty when n_holdings is 0.
        stale_jurisdictions:
          type: array
          items:
            type: string
            description: One jurisdiction, upper case.
          description: >-
            Of those cities, the ones whose feed is stale this week. For them
            the API serves the last good snapshot, and the failed week does not
            change the counts here. Empty when none.
        last_application_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The newest application or issue date across the holdings,
            YYYY-MM-DD. Null when no holding carries one, as for every Houston
            holding.
      required:
        - n_holdings
        - n_permits
        - n_at_purchase
        - n_assumed
        - n_owner_occupied_licences
        - n_managed
        - share
        - manager_companies
        - jurisdictions
        - stale_jurisdictions
        - last_application_on
      additionalProperties: false
      description: >-
        How much of the investor's portfolio is licensed for short-term rental,
        from the cities' own rolls. The block counts holdings, not permits, and
        only where the API attributes the licence to the investor and the use is
        a business. Null where it sits when the market has no published
        short-term rental tables. Zeros when it has them and the investor holds
        no such parcel.
    InvestorFinancing:
      type: object
      properties:
        n_loans:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Loans whose borrowers resolve to this investor, as the main borrower
            or a co-borrower, all time. The registry counts each instrument once
            across the open-lien and recorded-history tables. The count is a
            floor. The recorded history sees about one loan in five. An open
            lien names no borrower unless the owner of record is the investor.
        n_loans_12m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Of those, recorded in the 12 months ending on as_of.
        n_loans_24m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Of those, recorded in the 24 months ending on as_of.
        n_lenders:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Distinct lenders behind those loans, all time.
        lenders_used:
          type: array
          items:
            $ref: '#/components/schemas/InvestorLenderUsed'
          description: >-
            The lenders the investor borrows from, at most 10. The list sorts by
            most loans in the 24 months ending on as_of first, then all time,
            then id. Empty when n_loans is 0.
        last_loan:
          anyOf:
            - $ref: '#/components/schemas/InvestorLastLoan'
            - type: 'null'
          description: >-
            Of those loans, the one with the newest recording date. Null when
            n_loans is 0 or no loan is dated.
        n_deals_measured_24m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            The denominator of share_deals_financed_24m: the investor's deals
            bought in the 24 months ending on as_of whose purchase-loan window
            is inside the slice. The window is inside the slice when the
            purchase date is at least 45 days before the newest recording.
        n_deals_financed_24m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Of those, the deals with a purchase loan found. The deal row then
            carries purchase_loan_status FOUND.
        share_deals_financed_24m:
          anyOf:
            - type: number
              description: Decimal ratio, never a percentage (0.53 = +53%).
            - type: 'null'
          description: >-
            n_deals_financed_24m over n_deals_measured_24m, 0 to 1. Null when
            the investor bought nothing measurable in the window. A floor of the
            investor's financed share, never a cash share. The open-lien table
            sees about one purchase loan in five on holds and one in fifteen on
            flips.
        uses_hard_money:
          type: boolean
          description: >-
            True when a loan in the 24 months ending on as_of came from a
            hard-money lender (is_hard_money). A lender is hard money by name or
            by behaviour. The uses_private_lender filter of the investor routes
            reads a wider rule: a hard-money lender, an INDIVIDUAL or PRIVATE
            lender, or an investor lender by behaviour.
        as_of:
          type: string
          description: >-
            The lender registry's slice date, YYYY-MM-DD. Every window in this
            block ends on it. 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 feed's
            newest delivery: this block is then a snapshot at as_of.
      required:
        - n_loans
        - n_loans_12m
        - n_loans_24m
        - n_lenders
        - lenders_used
        - last_loan
        - n_deals_measured_24m
        - n_deals_financed_24m
        - share_deals_financed_24m
        - uses_hard_money
        - as_of
        - dated
      additionalProperties: false
      description: >-
        What the investor borrows: how many loans the registry ties to it, from
        which lenders, and the last one. Also how many of its purchases in the
        24 months before as_of had a loan found, and if it uses hard money.
        Every count is a floor of a partial feed. The block is null where it
        sits when the market publishes no lender registry or borrower match. It
        carries zeros when the market publishes them and no loan resolves to the
        investor.
    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.
    TopWholesaler:
      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 company's name as it appears on Investorlift.
        'n':
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            How many of the investor's Investorlift purchases this company
            listed.
      required:
        - id
        - name
        - 'n'
      additionalProperties: false
      description: One of the companies this investor buys from most on Investorlift.
    InvestorLenderUsed:
      type: object
      properties:
        id:
          type: string
          pattern: ^len_[0-9a-f]{12}$
          description: 'The lender: the key to GET `/v1/lenders/{id}`.'
        name:
          type: string
          description: >-
            The lender's display name in the market, upper case as the file
            writes it, for example KIAVI FUNDING INC. A business name, which the
            API serves to every key.
        lender_class:
          type: string
          enum:
            - BANK
            - NONBANK
            - PRIVATE
            - INDIVIDUAL
            - GOVERNMENT
          description: >-
            A reading of the name, never a legal status. How the lender name
            reads. BANK: a bank, credit union or thrift. NONBANK: a mortgage
            company or other lending business. PRIVATE: a trust, a seller
            carry-back or another private party, not the hard-money sense of
            private lender, which the Lender object carries as is_hard_money.
            INDIVIDUAL: a person's name. GOVERNMENT: an agency or a public body.
        is_hard_money:
          type: boolean
          description: >-
            True when the name carries hard-money vocabulary or is a known
            hard-money brand, or when the book behaves like one. The profile's
            hard_money_basis says which, and the behaviour test needs the
            market's deed link. A PRIVATE lender_class is a trust or a seller
            carry-back, not a hard-money lender.
        'n':
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Loans from this lender to the investor, all time. The registry
            counts each instrument once across the open-lien and
            recorded-history tables.
        n_24m:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Of those, recorded in the 24 months ending on the registry's slice
            date (as_of on the block).
        last_loan_on:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: >-
            The recording date of the investor's newest loan from this lender,
            YYYY-MM-DD. Null when no loan is dated.
      required:
        - id
        - name
        - lender_class
        - is_hard_money
        - 'n'
        - n_24m
        - last_loan_on
      additionalProperties: false
      description: >-
        One lender the investor borrows from: who it is, how often, and when
        last.
    InvestorLastLoan:
      type: object
      properties:
        lender_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, upper case. The API serves it 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 lender is hard money by name or by behaviour.
        property_id:
          type: string
          pattern: ^prop_[0-9a-f]{32}$
          description: >-
            The parcel the loan is on: the key to GET
            `/v1/properties/{property_id}` and its financing block.
        recording_date:
          anyOf:
            - type: string
              description: Calendar date, YYYY-MM-DD.
            - type: 'null'
          description: The recording date, YYYY-MM-DD. Null when the file carries none.
        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.
        purpose:
          anyOf:
            - type: string
              enum:
                - PURCHASE
                - NOT_PURCHASE
                - UNKNOWN
              description: >-
                The loan's purpose, that is if it financed a purchase, read from
                the recorded deeds and never from the file's label. PURCHASE: a
                priced deed on the parcel, $10,000 or more, is dated in the 45
                days up to and including the recording date. A deed after the
                loan is a later sale, never this loan's purchase. NOT_PURCHASE:
                the deed registry covers those 45 days, the parcel has priced
                deeds, and none falls in them. Such a loan is a refinance, a
                second, a HELOC or a construction draw. UNKNOWN: the deed
                registry does not cover the window: its deeds or the parcel's
                deeds start after the loan, or the market has none.
            - type: 'null'
          description: >-
            Null on a registry built before the deed link. The loan's purpose,
            that is if it financed a purchase, read from the recorded deeds and
            never from the file's label. PURCHASE: a priced deed on the parcel,
            $10,000 or more, is dated in the 45 days up to and including the
            recording date. A deed after the loan is a later sale, never this
            loan's purchase. NOT_PURCHASE: the deed registry covers those 45
            days, the parcel has priced deeds, and none falls in them. Such a
            loan is a refinance, a second, a HELOC or a construction draw.
            UNKNOWN: the deed registry does not cover the window: its deeds or
            the parcel's deeds start after the loan, or the market has none.
      required:
        - lender_id
        - name
        - lender_class
        - is_hard_money
        - property_id
        - recording_date
        - amount
        - purpose
      additionalProperties: false
      description: >-
        The investor's newest loan: the lender, the parcel, the date, the amount
        and if it financed a purchase.
    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 the full profile of one investor](/api-reference/investors/get-the-full-profile-of-one-investor.md)
- [Get one deal](/api-reference/endpoints/deals-get.md)
- [Get one Investorlift listing](/api-reference/endpoints/wholesale-listings-get.md)
- [Get one listing company](/api-reference/endpoints/wholesalers-get.md)
- [Get one Investorlift listing by id](/api-reference/wholesale/get-one-investorlift-listing-by-id.md)
