Skip to main content
A deal is one thing an investor did to one parcel: they bought it, and either resold it or still hold it. Everything in it comes from recorded county deeds, joined to the assessor roll for the parcel facts. Where the market has them, the deeds also join to the MLS feed, the Investorlift export and the city short-term rental roll. Every deal has one kind:

Where deals come from

Read a deal

  • Prices can be null. bought_price is null when the deed records no price, and never 0 to mean unknown. In Texas most off-market deeds carry none. price_quality says which of the two prices the row has, and the filters page has the rules that follow from it.
  • Dates are the deed’s, not the listing’s. The API measures every window and “days since” from the market’s data_end, never from today.
  • buyer_status says if the buyer reached the investor registry: registered (it has an investor_id), unclassified, excluded or unknown. A buyer with no id is usually a household, and the API never serves its name.
  • The side blocks are null where the market has no such data, and that is an answer, not an absence. listing, wholesale_listing and short_term_rental each have a matching as-of date in meta.coverage[].
  • bought_auction_kind (since 0.7.0) names the auction the purchase deed came from, when a third party bought the house at one. The counted kinds are TRUSTEE_SALE and SHERIFF_SALE. The API shows HOA_TRUSTEE_SALE, TAX_SALE and TAX_LIEN_DEED but does not count them. The field is null on every other deed, and on every deed of a market whose auction_counted is false. The deal-level filter of the same name keeps only those purchases.

How the purchase was financed

financing (since 0.16.0) is what the lender registry can say about the purchase. purchase_loan_status has three values:
  • FOUND: either mortgage table holds a loan recorded in the 45 days from bought_on. purchase_loan names the lender, the amount, the recording date, loan_to_price against bought_price, and the parcel. secondary_loans_n counts the other loans of the same window, a second or a rehab draw. link_window says if the loan sat in the strict 45-day window or the loose one, 15 days before to 90 after. outcome says what became of the loan, read from the later deeds and mortgages, never from a payment record.
  • NONE_CAPTURED: the registry covers the window and holds no loan in it.
  • NOT_MEASURED: the purchase date is unknown, the deed was not a purchase, or the window is not yet in the slice. The window is not yet in the slice when the purchase is later than 45 days before the registry’s newest recording.
NONE_CAPTURED is not a cash purchase. The open-lien table sees about one purchase loan in five on holdings and one in fifteen on flips. So most financed purchases read NONE_CAPTURED. The cash signal stays where it was, on the parcel’s cash_sale_proxy and the cash-buyer quicklist, and only where the delivery measures it. meta.coverage[].parcel.sale_mortgage_measured says so. Where the delivery does not measure it, the proxy is null and the quicklist answers 422 cash_sale_unavailable. The block carries its own as_of and dated, the registry’s slice date, which is not the deed data end. The API serves the block to every key, because a lender’s name is a business record. The block is null on every row of a market with no published registry or deal link.

One deal: what occurred on a parcel, when, for how much, who took part and how the investor financed it. Every field is present on every row. Fields that apply only to holdings are null elsewhere.

id
string
required

Deal id: deal_ followed by 32 hex characters, for example deal_5d1b2c3d4e5f60718293a4b5c6d7e8f9. The prefix is part of the id.

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

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

kind
enum<string>
required

What occurred on the deal. flip: bought, fixed and resold within about a year at a profit-shaped margin; wholesale: bought and resold in under 30 days, or a chain resale or round trip within 90 (a double close); hold: bought and still owned at data_end, a confirmed holding or an un-resold purchase; long_hold: held over a year, then sold (a landlord exit); other: an investor resale that is not a clean flip. Reasons: a loss, a thin margin, a builder's new home resold, an iBuyer resale, or a chain resale of 3 to 12 months; build: a registered investor bought a lot or teardown, built a house on it during the hold, then sold. A builder's finished home bought and resold is other. On data built after 2026-09-17 the kind keeps only a single-family parcel held over 90 days, its house complete by the sale year. A market built on or before 2026-09-17 (meta.coverage[].loaded_at) counts every lot-to-build resale by a registered investor as a build until its next build.

Available options:
flip,
wholesale,
hold,
long_hold,
other,
build
deal_type
enum<string>
required

What kind of record the row is. PAIR: a purchase and its resale, two deeds. HOLDING: a confirmed current holding, where the owner of record at the deed data end (meta.coverage[].data_end) matches the investor. PURCHASE: an investor purchase deed with no resale and no ownership confirmation at the deed data end.

Available options:
PAIR,
HOLDING,
PURCHASE
deal_kind
enum<string>
required

The label of the classifier behind kind, for diagnostics: use kind for display. FLIP: a clean flip held 30 to 365 days, both deeds priced and resold for 10 to 150% over the purchase price. FLIP also covers an unpriced purchase deed in that window, the usual Texas shape, that a registry investor resold at a price. About one flip in six has no investor id. WHOLESALE: resold in under 30 days, or a chain resale or a round trip within 90 days. INVESTOR_HOLD: held over a year and then sold, or bought and not resold by the deed data end. INVESTOR_OTHER: resold by an investor but not a clean flip. A loss, a margin under 10%, a resale over 150%, a builder's resold new home, an iBuyer resale, a 3 to 12 month chain resale. CURRENT_HOLDING means a confirmed holding at the deed data end. BUILD means a registered investor bought a lot or a teardown, built a house, and sold. The Deal page lists the bounds and their as-of.

Available options:
FLIP,
WHOLESALE,
INVESTOR_HOLD,
INVESTOR_OTHER,
CURRENT_HOLDING,
BUILD
ownership_confirmed
boolean | null
required

True on a confirmed holding: the owner of record at the deed data end matches the investor. False on a purchase with no ownership confirmation at the deed data end. Null on resold rows.

buyer_status
enum<string>
required

The buyer's standing in the registry: registered (has an investor id), unclassified, excluded or unknown (the deed names no buyer). Unclassified: a named buyer the registry did not classify as an investor, usually a household. Excluded: a named buyer the registry deliberately left out. Those are custodian trusts, relocation companies, auction houses and ambiguous surnames.

Available options:
registered,
unclassified,
excluded,
unknown
buyer_exclusion
enum<string> | null
required

Only when buyer_status is excluded. Null otherwise. Why an excluded buyer has no investor id. INSTITUTION: a custodian, a relocation company or an auction house. AMBIGUOUS_NAME: a bare surname. POOLED_NAME: a name that many unrelated people share.

Available options:
INSTITUTION,
AMBIGUOUS_NAME,
POOLED_NAME
property
object
required

The parcel the deal is on: address, coordinates and the assessor facts.

distance_miles
number | null
required

Miles from the reference point, rounded to 2 decimals. The reference point is lat and lng, or the centre of the property_id parcel. Null when the request had no reference point.

bought_on
string | null
required

Purchase date, YYYY-MM-DD. Null on holdings with no dated record (date_quality unknown).

date_quality
enum<string>
required

Where bought_on comes from. With deed it comes from the acquisition or transfer deed, the best source. With ownership_record it comes from the county ownership start, and with assessor from the assessor's last-sold date. With unknown no date exists and bought_on is null. With implausible the source date lay in the future, so bought_on is null.

Available options:
deed,
ownership_record,
assessor,
unknown,
implausible
held_since_source
enum<string>
required

The record bought_on comes from. DEED_ACQUISITION: the purchase deed, on purchases and resales. DEED_TRANSFER: an unpriced transfer deed to the owner. CORE_OWNERSHIP_START means the county ownership start date, and CORE_LAST_SOLD the assessor's last-sold date. SECMASTER_DEED: a deed in the county secondary records. NONE: no dated record, so bought_on is null.

Available options:
DEED_ACQUISITION,
DEED_TRANSFER,
CORE_OWNERSHIP_START,
CORE_LAST_SOLD,
SECMASTER_DEED,
NONE
bought_price
integer | null
required

What the investor paid, whole dollars, for example 610000. Null, never 0, when the deed carries no price: an unpriced transfer or holding, or a deed in a non-disclosure state (Texas). Most off-market purchases in such a state carry no price. The field price_quality says which prices the row has.

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

Resale date. Null while the investor holds the parcel at the deed data end.

sold_price
integer | null
required

Resale price, whole dollars. Null while the investor holds the parcel at the deed data end, or when the resale deed carries no price (non-disclosure states).

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

Days between purchase and resale. Null while the investor holds the parcel at the deed data end.

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

sold_price minus bought_price, whole dollars, on resold rows. Null while the investor holds the parcel at the deed data end. Also null when either price is unknown, price_quality other than BOTH: a Texas flip bought off-market carries only its resale price. Not net of rehab or costs.

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

sold_price / bought_price minus 1, a ratio (0.336 = +33.6%). Null while the investor holds the parcel at the deed data end, or when either price is unknown (price_quality other than BOTH).

price_quality
enum<string>
required

Which of the two prices the deed record carries. BOTH: the purchase and the resale carry a price. SELL_ONLY: the resale carries a price and the purchase does not, the normal shape of a Texas flip bought off-market and sold through the MLS. BUY_ONLY: the purchase carries a price, and the investor holds the parcel at the deed data end or resold it without a price. NONE: neither carries a price. Non-disclosure states (Texas) record no price on most off-market deeds, so bought_price, gross_profit and spread_ratio are null there while sold_price is known.

Available options:
BOTH,
SELL_ONLY,
BUY_ONLY,
NONE
days_held_to_data_end
integer | null
required

On hold rows: days from bought_on to the data end date. Null on resold rows and on undated holdings.

Required range: -9007199254740991 <= x <= 9007199254740991
sold_to_wholesaler
boolean | null
required

True when the end buyer resold within 90 days (180 for an entity): a fact about the counterparty.

round_trip
boolean | null
required

True when the parcel came back to the seller within the window: a financing round trip, not a real sale.

is_purchase_event
boolean
required

True when the row is real purchase evidence, a purchase deed. False for transfers and for undeeded or unmatched holdings, which the map shows too.

n_parcels_in_event
integer | null
required

Parcels the investor bought on the same day: 21 means "1 of 21 bought 2023-12-18", a bulk buy.

Required range: -9007199254740991 <= x <= 9007199254740991
bought_from_wholesaler
boolean | null
required

True when the investor bought through a documented double close from a wholesaler, or from a known wholesaler. Contract assignments leave no deed, so false is not evidence of a retail purchase.

bought_from_wholesaler_via
enum<string> | null
required

Only when bought_from_wholesaler is true. Null otherwise. How the registry detected the wholesale purchase. DOUBLE_CLOSE: a wholesaler bought the parcel and resold it to this investor within 90 days, two deeds. SELLER_KIND: the seller is a registered WHOLESALER.

Available options:
DOUBLE_CLOSE,
SELLER_KIND
wholesaler_investor_id
string | null
required

The wholesaler's investor id when known.

Pattern: ^inv_[0-9a-f]{12}$
bought_from_investor
boolean | null
required

True when the seller carried an investor id.

bought_distressed
boolean | null
required

True when the purchase deed was a distressed sale (foreclosure, trustee, tax). Null when the buy deed is unknown.

bought_auction_kind
enum<string> | null
required

The kind of auction when the purchase deed was a third-party auction purchase, for example TRUSTEE_SALE. A third party is not the lender, the trustee, a bulk instrument or a former owner of the parcel. Null on every other purchase and when the buy deed is unknown. Also null on every row of a market without published auction counts (meta.coverage[].auction_counted false). The bought_auction_kind filter reads it. The kind of auction the purchase deed records: TRUSTEE_SALE and SHERIFF_SALE count toward buys_at_auction, and the API shows the other three but never counts them. TRUSTEE_SALE: a lender's foreclosure sale by the trustee, cash and final on the day, without redemption. In Arizona the buyer pays a $10,000 deposit and the full bid by 5 pm the next business day. In Texas it is the first-Tuesday courthouse sale, in Washington the Friday sale at the county's designated place under RCW 61.24. SHERIFF_SALE: a judicial sale under court order. In Arizona it is an HOA or judgment-lien sale, cash but subject to the first mortgage and to a 30-day or 6-month redemption. In Washington it is a judicial mortgage foreclosure or lien sale under RCW 6.21, with an 8-month or 1-year redemption. In Washington the sale is subject to the senior lien only when it is a lien sale. HOA_TRUSTEE_SALE: a Texas homeowners association foreclosure recorded as a trustee's deed, cash, subject to the first lien and to a 180-day redemption. TAX_SALE: a Texas constable or taxing-unit tax sale, cash, with a 180-day or 2-year redemption. In Washington it is the county treasurer's deed after the tax foreclosure judgment, with no redemption after the sale. TAX_LIEN_DEED: an Arizona treasurer's deed to a tax-lien holder, mostly vacant land, not an auction of the house.

Available options:
TRUSTEE_SALE,
SHERIFF_SALE,
HOA_TRUSTEE_SALE,
TAX_SALE,
TAX_LIEN_DEED
holding_kind
enum<string> | null
required

Only on confirmed holdings. Null otherwise. How the owner holds the parcel at the deed data end (meta.coverage[].data_end), read from the county owner roll behind the row. OWNER_OCCUPIED means the owner lives there, ABSENTEE_INDIVIDUAL a person whose mailing address is elsewhere, and ABSENTEE_ENTITY an LLC or trust. RENTAL_REGISTERED means the parcel is on the county rental registry. RENTAL_SIGNAL means an owner-attributed business-use short-term-rental licence in any market. In Texas it also means an absentee owner with no homestead exemption or a rental listing. The short_term_rental block says which. UNKNOWN means the county roll does not say.

Available options:
OWNER_OCCUPIED,
ABSENTEE_INDIVIDUAL,
ABSENTEE_ENTITY,
RENTAL_REGISTERED,
RENTAL_SIGNAL,
UNKNOWN
acquisition_kind
enum<string> | null
required

Only on confirmed holdings. Null otherwise. How the owner at the deed data end got the parcel. PURCHASE (an arm's-length deed, priced where the state records prices). TRANSFER (an unpriced deed between related parties). NO_DEED: no deed found. UNMATCHED: a deed exists but its buyer name does not match the owner.

Available options:
PURCHASE,
TRANSFER,
NO_DEED,
UNMATCHED
investor
object
required

The buyer on the deal: the investor when it has an id, otherwise the name and buyer_status only.

seller
object
required

Who sold to the investor.

end_buyer
object
required

Who bought from the investor on a resold row. Every field is null while the investor holds the parcel at the deed data end.

owner
object | null
required

The owner of record at the deed data end, only on a confirmed holding. Null on every other row. This host never names the holder.

listing
object | null
required

The MLS listing on the parcel, on hold rows only (kind hold). It carries the latest listing the feed knows at listings_data_end, its status and prices, if it belongs to this investor (owner_test) and the listing agent. Null on resold rows, where a listing belongs to the end buyer, and on hold rows whose parcel carries no listing record. Also null on every row of a market without published listing tables: meta.coverage[].listings_data_end is null then. This host does not name the agents.

short_term_rental
object | null
required

The short-term rental licence facts of the parcel, on hold rows only (kind hold), served to every key. It says if the parcel is licensed on the city roll and since when. It also says if the licence belongs to this investor and is a business use. Null on resold rows and on hold rows whose parcel lies outside every loaded city. Also null on every row of a market without published short-term rental tables: meta.coverage[].str_as_of is null then. NONE, not null, inside a served city with no record.

wholesale_listing
object | null
required

The Investorlift listing this deal closed, served to every key. The API fills it when a wholesaler listed the house on Investorlift and the deed of this deal closed the listing. It carries the listing company, the listed date and asking price, and what the deeds show (outcome, verification). Null when no Investorlift listing links to the deed. Also null on every row of a market without published wholesale tables: meta.coverage[].wholesale_as_of is null then. Open GET /v1/wholesale-listings/{id} for the whole record.

financing
object | null
required

How the investor financed the purchase, from the lender registry, served to every key. It says if a purchase loan has a recording date in the 45 days from bought_on. It names the lender, the loan against the price and the outcome. NONE_CAPTURED is not evidence of cash: the open-lien table sees about one purchase loan in five. A deal bought after 45 days before the newest recording is NOT_MEASURED. Null on every row of a market without a published lender registry or deal link: meta.coverage[].lenders is null or investor_lending_measured is false.