Skip to main content
An investor is a group of names the registry believes are one operator. “ZAK VENTURES LLC”, “JSB HOMES LLC” and the person behind both are one investor with one stable id, inv_ plus 12 hex characters. Store the id, and keep the name for display. After a data refresh, an old id goes one of two ways. Either it redirects: you get the current profile, and meta.resolved_from names the id you asked for. Or the registry retired it: you get 410 gone with superseded_by: null. Then search by name again.

Three counts that are not the same thing

A row can show n_deals: 775 beside in_radius.n_events: 12. Both are right: a large operator with twelve deals in your neighbourhood.

Holdings

n_holds is what the investor still owns across the market: confirmed holdings plus purchases it did not resell. The profile adds median_purchase_year (since 0.26.0), the median year of purchase of those parcels. The API computes it over the dated n_holds rows when you read the profile. A midpoint between two years rounds up: holdings bought in 2020 and 2021 read 2021. The value is null when the API has nothing to measure. Read it with n_holds: 300 holdings bought around 2021 is a recent portfolio, and around 2009 a long-held one. The lists take the count as a filter: holds_min and holds_max, for example holds_min=20 for the larger portfolios. GET /v1/investors sorts on the holdings inside the geometry with sort=holds_desc. See Filters.

Scale, and who is hidden by default

scale is individual, small, mid, large or institutional. Institutional means iBuyers, production homebuilders and bulk single-family landlords with 500 or more houses. They lead every neighbourhood by volume, and they are almost never the buyer for a wholesale deal. So the API hides them by default, together with public bodies: the county, the state land department, a housing authority. Ask for them with scale=individual,small,mid,large,institutional and include_public=true.

Operators: when several ids are one buyer

Many flippers buy through a new LLC per deal. Every list and match row carries investor.operator_id and investor.n_operator_members. The first is the id of the buying operation, the second how many ids it spans. Shared mailing addresses and shared names link those ids. Rows that share an operator_id are one buyer: collapse them in a table and contact them once. The API still ranks and pages each id on its own. So an operator with three ids can appear three times, and across pages. Keep the row whose id equals operator_id as the visible one. operator_id is the busiest member’s id, and it can move after a refresh. So group by it within one response, and store the investor ids. Same buyer, cash right now has the whole rule and the buyer_signal block.

Contact fields

This host does not serve contact: the people behind the entity, their parsed names, their mailing addresses and skip_trace_targets[]. contact_redacted is true, and four of the block’s fields come back null: primary_address, mailing_addresses, person_members and skip_trace_targets. The host serves the block’s counts, n_person_members, has_home_address and the rest, so the block itself is never null. Top-level members is null too, and member_names lists the entity and trust names only. The host serves the rest of the profile as normal. See Authentication. A deed names a person as SURNAME GIVEN (“RIVERA DANA”). Never split members[].name yourself. Use the given and surname fields, which are already in the right order.

Two names: name and display_name

name is the deed spelling: the spelling most often on the investor’s deeds, in upper case. For a person it is SURNAME GIVEN (“RIVERA DANA”). Search matches on name, and you join on it. It can change under a stable id when another of the investor’s spellings overtakes. display_name (since 0.29.0) is the name to print. For a person whose deed spelling parsed cleanly it is GIVEN [MIDDLE] SURNAME [SUFFIX] in upper case (“DANA RIVERA”). For an entity, a trust, a public body, an institutional investor or an ambiguous spelling it equals name. Every investor object on this page carries both fields on every key. Those objects are the deal row’s summary, the list row, the match row, the profile, the search hit, and a deal’s seller and end_buyer. display_name is null exactly when name is null. The investor stubs on lender objects carry name alone. The agent and wholesale stubs carry display_name since 0.31.0. Print display_name. Match, join and search on name. Never reorder a name yourself.

Auction and REO buyers

auction is the foreclosure-auction and REO purchase block (since 0.7.0). On a list row or a match row it is the nine-field summary:
  • n_auction_buys: the houses a third party bought at a trustee’s sale or an Arizona sheriff’s sale, all time.
  • n_auction_buys_24m and is_active_auction_buyer: one or more such purchases in the last two years, the cash-within-a-day buyers.
  • last_auction_buy_on.
  • auction_resale_share: the share resold within a year.
  • The same four for houses bought from a lender after a foreclosure: n_reo_buys, n_reo_buys_24m, is_active_reo_buyer and last_reo_buy_on.
The profile carries the full block:
  • auction_kinds and n_auction_by_kind. These include the kinds the API shows but does not count, HOA_TRUSTEE_SALE, TAX_SALE and TAX_LIEN_DEED, so n_auction_parcels can exceed n_auction_buys.
  • n_auction_by_venue: the Texas platform the servicer appointed, Auction.com, ServiceLink or Xome.
  • The outcomes of those purchases at 12 months: n_auction_resold_12m, n_auction_transferred_12m, n_auction_lost and n_auction_held.
  • median_auction_discount against the later resale.
  • lender_note.
  • The REO half by grantor class (n_reo_by_grantor: SERVICER, GSE_HUD_VA), with its own outcomes and reo_resale_share.
The block is null where the market has no published counts, that is, where meta.coverage[].auction_counted is false. That null is an answer, not a zero. Two filters read the block, buys_at_auction and buys_reo. See Filters.

The financing block

financing (since 0.16.0) is what the lender registry ties to the investor:
  • The loans whose borrowers resolve to it, as the main borrower or a co-borrower: n_loans, n_loans_12m and n_loans_24m. The API counts each loan once across the open-lien and recorded-history tables.
  • The lenders behind them: n_lenders, and lenders_used[] with each lender’s id, name, class and hard-money flag, how many loans, and the date of the last.
  • The most recent loan, last_loan: the lender, the parcel, the date, the amount, and a flag that says if it financed a purchase.
  • How many of the investor’s purchases in the registry’s 24-month window have a purchase loan the registry found: n_deals_financed_24m over n_deals_measured_24m, and share_deals_financed_24m.
  • uses_hard_money: a flag that says if a hard-money lender was among the recent ones.
Every count is a floor of a partial feed. The recorded history sees about one loan in five. The open-lien table sees one purchase loan in five on holdings, and one in fifteen on flips. So share_deals_financed_24m is never a cash share. The block carries its own as_of and dated: the registry’s slice date, not the deed data end. The host serves the block to every key, because lender names are business records. The block is null where the market has no published registry or no published borrower match. It reads zeros where the market has both and no loan resolves to the investor. Two filters read it, financed_by and uses_private_lender, and the buyers match adds a financing reason at weight 0. See Filters.

Where investors come from

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.

id
string
required

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.

Pattern: ^inv_[0-9a-f]{12}$
market
string
required

Market code, for example phx. The loaded markets are in meta.coverage[].

name
string
required

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
string
required

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
string
required

2-letter state of the market. The loaded markets and their states are in meta.coverage[].

kind
enum<string> | null
required

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.

Available options:
FLIPPER,
WHOLESALER,
LANDLORD,
BUILDER,
IBUYER
confidence
enum<string> | null
required

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.

Available options:
STRONG,
PROBABLE,
WEAK
scale
enum<string> | null
required

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.

Available options:
individual,
small,
mid,
large,
institutional
institutional
boolean | null
required

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.

is_public
boolean | null
required

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.

last_bought_on
string | null
required

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
integer | null
required

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.

Required range: -9007199254740991 <= x <= 9007199254740991
buyer_status
enum<string>
required

registered when the row carries an id. Otherwise why the buyer has no id.

Available options:
registered,
unclassified,
excluded,
unknown
mailing_states
string[]
required

Distinct states of their non-generic mailing addresses, most deeds first, for example ["AZ","CA"].

A 2-letter state.

registry_version
string | null
required

Which registry code version produced this profile. Informational: use meta.coverage[].dataset_version for caching. Null when not recorded.

registry_run
integer | null
required

Which data refresh (registry run number) produced this profile (informational). Null when not recorded.

Required range: -9007199254740991 <= x <= 9007199254740991
id_history
object[]
required

What each data refresh did to this id, oldest first.

kinds
enum<string>[]
required

Every kind the investor qualifies for.

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.

Available options:
FLIPPER,
WHOLESALER,
LANDLORD,
BUILDER,
IBUYER
confidence_by_kind
object | null
required

Per-kind evidence: how many deals support each kind and the confidence in it. Null when the registry recorded none.

classification_reasons
string[]
required

Diagnostic codes from the classifier, for example "FLIPPER:STRICT_FLIPS_2P". Not for display, and distinct from the match reasons[]. You can ignore them.

One classifier code.

is_entity
boolean
required

True when the investor's main name is an entity (an LLC, corporation or partnership), not a person.

flipper_first
boolean
required

Diagnostic: when the classifier chose the primary kind, the flipping evidence outranked the holdings. You can ignore it.

holdings_first
boolean
required

Diagnostic: when the classifier chose the primary kind, the holdings outranked the flipping evidence. You can ignore it.

flipper_demoted
boolean
required

Diagnostic: the investor looked like a flipper first, but the classifier made another kind primary. You can ignore it.

has_builder_name
boolean
required

True when one of their names carries builder vocabulary (HOMES, CONSTRUCTION, DEVELOPMENT).

is_ibuyer
boolean
required

True for an iBuyer brand (Opendoor, Offerpad, Zillow).

n_strict_flips
integer
required

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.

Required range: -9007199254740991 <= x <= 9007199254740991
n_quick_resales
integer
required

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.

Required range: -9007199254740991 <= x <= 9007199254740991
n_lot_to_build_built
integer
required

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.

Required range: -9007199254740991 <= x <= 9007199254740991
n_sales_new_construction
integer
required

Sales of newly built homes (the production-builder test).

Required range: -9007199254740991 <= x <= 9007199254740991
n_current_holdings
integer
required

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.

Required range: -9007199254740991 <= x <= 9007199254740991
is_production_builder
boolean
required

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
boolean
required

True at 500 or more holdings at data_end.

institutional_reason
string | null
required

Diagnostic: the rule that made them institutional, for example "IBUYER" or "PATTERN:PRODUCTION_BUILDER:FULTON HOMES CORP". Null when not institutional.

institutional_reasons
string[]
required

Diagnostic: every institutional rule that applied. Empty when not institutional.

One institutional rule.

public_name
string | null
required

The deed name that marked them as a public body (county, city, housing authority). Null when not public.

n_flips
integer
required

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.

Required range: -9007199254740991 <= x <= 9007199254740991
n_wholesales
integer
required

Wholesale resales inside the area loaded for the market.

Required range: -9007199254740991 <= x <= 9007199254740991
n_long_holds
integer
required

Long holds (held over a year, resold).

Required range: -9007199254740991 <= x <= 9007199254740991
n_holds
integer
required

Parcels they still own at data_end.

Required range: -9007199254740991 <= x <= 9007199254740991
median_purchase_year
integer | null
required

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.

Required range: -9007199254740991 <= x <= 9007199254740991
n_other
integer
required

Other investor resales: a loss, a thin margin, a builder's new home resold, or an iBuyer resale.

Required range: -9007199254740991 <= x <= 9007199254740991
n_builds
integer
required

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.

Required range: -9007199254740991 <= x <= 9007199254740991
n_acquisitions
integer
required

All-time distinct purchase events inside the area loaded for the market. A purchase event is a day on which the investor bought.

Required range: -9007199254740991 <= x <= 9007199254740991
n_priced_deals
integer
required

Deals with a purchase price on the deed.

Required range: -9007199254740991 <= x <= 9007199254740991
n_unpriced_deals
integer
required

Deals without a purchase price. These are holdings, builder lots, and most off-market purchases in a non-disclosure state such as Texas.

Required range: -9007199254740991 <= x <= 9007199254740991
n_purchases
integer
required

Deeds as buyer, every parcel and kind. This is a deed count, larger than n_deals.

Required range: -9007199254740991 <= x <= 9007199254740991
n_sales
integer
required

Deeds as seller. Seller-only builders have n_deals = 0 and n_sales > 0.

Required range: -9007199254740991 <= x <= 9007199254740991
first_deed
string | null
required

First deed under any member name, YYYY-MM-DD.

last_deed
string | null
required

Last deed under any member name.

last_sold_on
string | null
required

Their last sale of any kind.

last_flip_sold_on
string | null
required

Their last flip resale (a just-sold flipper has cash).

last_deal_on
string | null
required

Last purchase, sale or transfer (display only).

days_since_last_purchase
integer | null
required

Days from last_bought_on to the data end date. Null when they never bought.

Required range: -9007199254740991 <= x <= 9007199254740991
n_purchase_events_12m
integer
required

Distinct purchase days in the 12 months before the data end date.

Required range: -9007199254740991 <= x <= 9007199254740991
n_purchase_events_24m
integer
required

Distinct purchase days in the 24 months before the data end date.

Required range: -9007199254740991 <= x <= 9007199254740991
n_flips_24m
integer
required

Flips resold in the 24 months before data_end.

Required range: -9007199254740991 <= x <= 9007199254740991
n_holds_24m
integer
required

Purchases in the 24 months ending on data_end, still held at it.

Required range: -9007199254740991 <= x <= 9007199254740991
n_sales_12m
integer
required

Sales in the 12 months before data_end.

Required range: -9007199254740991 <= x <= 9007199254740991
bought_12m
boolean
required

True when they bought in the 12 months before the data end date.

bought_24m
boolean
required

True when they bought in the 24 months before the data end date.

price_band
object
required

What they pay: the quartiles of their priced purchases.

p50_flip_sold_price
integer | null
required

Median flip resale price, whole dollars. Null with fewer than 3 flips.

Required range: -9007199254740991 <= x <= 9007199254740991
p50_buy_to_resale_ratio
number | null
required

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
number | null
required

Median days between purchase and resale over their resold deals.

median_spread_ratio
number | null
required

Median resale margin as a ratio (0.53 = +53%).

median_gross_profit
integer | null
required

Median sold minus bought over their resold deals, whole dollars.

Required range: -9007199254740991 <= x <= 9007199254740991
median_bought_price
integer | null
required

Median of what they paid, whole dollars, priced deals only.

Required range: -9007199254740991 <= x <= 9007199254740991
segment_mix
object | null
required

Shares of their deals by parcel segment. Null when they have no deals.

segment_sfr_share
number | null
required

Share of their deals on single-family houses, 0 to 1. Null when they have no deals.

cities_active
string[]
required

Cities where they have deals, most first, upper case.

A city name, upper case.

n_bought_from_wholesaler
integer
required

All-time purchases documented as bought from a wholesaler.

Required range: -9007199254740991 <= x <= 9007199254740991
n_bought_from_wholesaler_5y
integer
required

Same, the 5 years ending on data_end.

Required range: -9007199254740991 <= x <= 9007199254740991
n_bought_from_wholesaler_24m
integer
required

Same, the 24 months ending on data_end.

Required range: -9007199254740991 <= x <= 9007199254740991
share_bought_from_wholesaler
number | null
required

Share of their purchases documented as bought from a wholesaler, 0 to 1.

last_bought_from_wholesaler_on
string | null
required

Last documented wholesale purchase.

buys_wholesale
boolean
required

True when they bought from a wholesaler in the 36 months before the data end date.

n_bought_from_investor
integer
required

Purchases where the seller carried an investor id.

Required range: -9007199254740991 <= x <= 9007199254740991
n_distressed_buys
integer
required

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.

Required range: -9007199254740991 <= x <= 9007199254740991
auction
object | null
required

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
string[]
required

Every deed name that belongs to this investor, entities first. This host omits person names. Raw spelling (SURNAME GIVEN for persons).

One deed name, raw spelling.

n_members
integer
required

Number of deed names that belong to this investor.

Required range: -9007199254740991 <= x <= 9007199254740991
n_addresses_by_kind
object | null
required

Mailing addresses on file by kind. Null when none is on file.

has_mailing_address
boolean
required

True when any mailing address is on file.

buyer_signal
object | null
required

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
object | null
required

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
boolean | null
required

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.

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
object | null
required

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
object | null
required

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
object | null
required

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
string
required

The date from which the API measures every "days since" value and every window (12m, 24m, 5y) on this profile.