{
"id": "<string>",
"market": "<string>",
"ownership_confirmed": true,
"property": {
"id": "<string>",
"market": "<string>",
"apn": "<string>",
"apn_norm": "<string>",
"county_fips": "<string>",
"address_short": "<string>",
"street_no_unit": "<string>",
"unit": "<string>",
"city": "<string>",
"state": "<string>",
"zip": "<string>",
"latitude": 0,
"longitude": 0,
"bedrooms": 0,
"bathrooms": 123,
"sqft": 0,
"year_built": 0,
"pool": true
},
"distance_miles": 123,
"bought_on": "<string>",
"bought_price": 0,
"sold_on": "<string>",
"sold_price": 0,
"hold_days": 0,
"gross_profit": 0,
"spread_ratio": 123,
"days_held_to_data_end": 0,
"sold_to_wholesaler": true,
"round_trip": true,
"is_purchase_event": true,
"n_parcels_in_event": 0,
"bought_from_wholesaler": true,
"wholesaler_investor_id": "<string>",
"bought_from_investor": true,
"bought_distressed": true,
"investor": {
"id": "<string>",
"market": "<string>",
"name": "<string>",
"display_name": "<string>",
"state": "<string>",
"institutional": true,
"is_public": true,
"last_bought_on": "<string>",
"n_deals": 0
},
"seller": {
"id": "<string>",
"name": "<string>",
"display_name": "<string>",
"kinds": []
},
"end_buyer": {
"id": "<string>",
"name": "<string>",
"display_name": "<string>",
"kinds": []
},
"owner": {
"is_trust": true,
"is_public": true,
"owner_occupied": true,
"absentee": true,
"rental_registered": true,
"held_since": "<string>",
"months_held": 123,
"permits_last_24m": 0
},
"listing": {
"status_raw": "<string>",
"is_rental": true,
"on_market": true,
"counted": true,
"list_price": 0,
"price_low": 0,
"price_low_on": "<string>",
"price_high": 0,
"price_high_on": "<string>",
"listed_on": "<string>",
"status_updated_on": "<string>",
"off_market_on": "<string>",
"sold_on": "<string>",
"sold_price": 0,
"days_on_market": 0,
"list_to_bought_ratio": 123,
"mls_number": "<string>",
"brokerage_name": "<string>",
"agents": [
{
"role": "<string>",
"agent_id": "<string>",
"agent_is_holder_member": true
}
]
},
"short_term_rental": {
"coverage": {
"jurisdiction": "<string>",
"served": true,
"licence_start": "<string>",
"feed_stale": true
},
"active_permits": 0,
"multi_unit": true,
"building": true,
"first_application": "<string>",
"current_application": "<string>",
"licensed_since": "<string>",
"expires_on": "<string>",
"permit_after_purchase": true,
"days_purchase_to_permit": 0,
"owner_attributed": true,
"business_use": true,
"prior_owner_permit": true,
"manager": "<string>",
"signals": [
"<string>"
],
"data_as_of": "<string>"
},
"wholesale_listing": {
"id": "<string>",
"wholesaler": {
"id": "<string>",
"name": "<string>"
},
"listed_on": "<string>",
"asking_price": 0,
"days_listed_to_deed": 0
},
"financing": {
"purchase_loan": {
"id": "<string>",
"name": "<string>",
"is_hard_money": true,
"amount": 0,
"recording_date": "<string>",
"loan_to_price": 123,
"property_id": "<string>"
},
"secondary_loans_n": 0,
"as_of": "<string>",
"dated": true
}
}The Deal object
One investment purchase, flip, wholesale or current holding on one parcel.
kind:
kind | What the investor did |
|---|---|
flip | Bought, fixed, resold within about a year at a profit-shaped price. |
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. A rental, a land bank, a house under renovation. |
long_hold | Bought, held over a year, then sold. A landlord exiting. |
other | Resold by an investor but not a clean flip: sold at a loss, a thin margin, a builder’s new home resold, an iBuyer resale. |
build | A lot or teardown bought by a registered investor, a house built on it during the hold, then sold. 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. The hold has no upper bound. year_built says when the house on the parcel today was complete, not if a structure stood there at purchase. A finished new home bought from its builder and resold is other. |
Where deals come from
| Endpoint | What it gives you |
|---|---|
GET /v1/deals | Deals around a location, filtered and paged. |
GET /v1/deals/{id} | One deal, for a card. |
GET /v1/investors/{id}/deals | One investor’s deals across the whole market. |
GET /v1/properties/{property_id} | Every deal on one parcel. |
Read a deal
- Prices can be null.
bought_priceis null when the deed records no price, and never0to mean unknown. In Texas most off-market deeds carry none.price_qualitysays 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_statussays if the buyer reached the investor registry:registered(it has aninvestor_id),unclassified,excludedorunknown. 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_listingandshort_term_rentaleach have a matching as-of date inmeta.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 areTRUSTEE_SALEandSHERIFF_SALE. The API showsHOA_TRUSTEE_SALE,TAX_SALEandTAX_LIEN_DEEDbut does not count them. The field is null on every other deed, and on every deed of a market whoseauction_countedisfalse. 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 frombought_on.purchase_loannames the lender, the amount, the recording date,loan_to_priceagainstbought_price, and the parcel.secondary_loans_ncounts the other loans of the same window, a second or a rehab draw.link_windowsays if the loan sat in the strict 45-day window or the loose one, 15 days before to 90 after.outcomesays 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.
Deal id: deal_ followed by 32 hex characters, for example deal_5d1b2c3d4e5f60718293a4b5c6d7e8f9. The prefix is part of the id.
^deal_[0-9a-f]{32}$Market code the deal belongs to, for example phx. The loaded markets are in meta.coverage[].
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.
flip, wholesale, hold, long_hold, other, build 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.
PAIR, HOLDING, PURCHASE 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.
FLIP, WHOLESALE, INVESTOR_HOLD, INVESTOR_OTHER, CURRENT_HOLDING, BUILD 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.
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.
registered, unclassified, excluded, unknown 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.
INSTITUTION, AMBIGUOUS_NAME, POOLED_NAME The parcel the deal is on: address, coordinates and the assessor facts.
Show child attributes
Show child attributes
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.
Purchase date, YYYY-MM-DD. Null on holdings with no dated record (date_quality unknown).
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.
deed, ownership_record, assessor, unknown, implausible 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.
DEED_ACQUISITION, DEED_TRANSFER, CORE_OWNERSHIP_START, CORE_LAST_SOLD, SECMASTER_DEED, NONE 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.
-9007199254740991 <= x <= 9007199254740991Resale date. Null while the investor holds the parcel at the deed data end.
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).
-9007199254740991 <= x <= 9007199254740991Days between purchase and resale. Null while the investor holds the parcel at the deed data end.
-9007199254740991 <= x <= 9007199254740991sold_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.
-9007199254740991 <= x <= 9007199254740991sold_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).
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.
BOTH, SELL_ONLY, BUY_ONLY, NONE On hold rows: days from bought_on to the data end date. Null on resold rows and on undated holdings.
-9007199254740991 <= x <= 9007199254740991True when the end buyer resold within 90 days (180 for an entity): a fact about the counterparty.
True when the parcel came back to the seller within the window: a financing round trip, not a real sale.
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.
Parcels the investor bought on the same day: 21 means "1 of 21 bought 2023-12-18", a bulk buy.
-9007199254740991 <= x <= 9007199254740991True 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.
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.
DOUBLE_CLOSE, SELLER_KIND The wholesaler's investor id when known.
^inv_[0-9a-f]{12}$True when the seller carried an investor id.
True when the purchase deed was a distressed sale (foreclosure, trustee, tax). Null when the buy deed is unknown.
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.
TRUSTEE_SALE, SHERIFF_SALE, HOA_TRUSTEE_SALE, TAX_SALE, TAX_LIEN_DEED 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.
OWNER_OCCUPIED, ABSENTEE_INDIVIDUAL, ABSENTEE_ENTITY, RENTAL_REGISTERED, RENTAL_SIGNAL, UNKNOWN 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.
PURCHASE, TRANSFER, NO_DEED, UNMATCHED The buyer on the deal: the investor when it has an id, otherwise the name and buyer_status only.
Show child attributes
Show child attributes
Who sold to the investor.
Show child attributes
Show child attributes
Who bought from the investor on a resold row. Every field is null while the investor holds the parcel at the deed data end.
Show child attributes
Show child attributes
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.
Show child attributes
Show child attributes
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.
Show child attributes
Show child attributes
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.
Show child attributes
Show child attributes
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.
Show child attributes
Show child attributes
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.
Show child attributes
Show child attributes
Was this page helpful?