curl --request GET \
--url https://api.investorlift.com/v1/deals/summary \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.investorlift.com/v1/deals/summary', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.investorlift.com/v1/deals/summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"n_deals": 1200,
"by_kind": {
"flip": 214,
"wholesale": 92,
"hold": 822,
"long_hold": 31,
"other": 33,
"build": 8
},
"by_buyer_status": {
"registered": 1176,
"unclassified": 14,
"excluded": 9,
"unknown": 1
},
"by_channel": {
"from_wholesaler": 125,
"from_investor": 242,
"distressed": 28,
"auction": 20,
"other_or_unknown": 925
},
"n_investors": 871,
"n_parcels": 1028,
"n_unpriced": 159,
"n_undated": 0,
"median_bought_price": 490000,
"median_sold_price": 569500,
"total_volume": 682783819,
"median_hold_days": 134,
"median_gross_profit": 106000,
"by_year": [
{
"year": 2024,
"n": 461,
"flip": 97,
"wholesale": 32,
"hold": 287,
"long_hold": 24,
"other": 14,
"build": 7
},
{
"year": 2025,
"n": 451,
"flip": 103,
"wholesale": 33,
"hold": 294,
"long_hold": 7,
"other": 13,
"build": 1
},
{
"year": 2026,
"n": 288,
"flip": 14,
"wholesale": 27,
"hold": 241,
"long_hold": 0,
"other": 6,
"build": 0
}
],
"by_scale": [
{
"scale": "individual",
"n": 140
},
{
"scale": "small",
"n": 680
},
{
"scale": "mid",
"n": 243
},
{
"scale": "large",
"n": 113
},
{
"scale": null,
"n": 24
}
],
"by_investor_kind": [
{
"kind": "LANDLORD",
"n": 1089
},
{
"kind": "FLIPPER",
"n": 449
},
{
"kind": "WHOLESALER",
"n": 261
},
{
"kind": "BUILDER",
"n": 152
},
{
"kind": null,
"n": 24
}
]
},
"meta": {
"generated_at": "2026-09-03T21:40:00.000Z",
"reference_point": {
"lat": 33.476917,
"lng": -111.920385
},
"geometry": {
"kind": "radius",
"lat": 33.476917,
"lng": -111.920385,
"radius_miles": 2,
"bbox": null,
"property_id": null,
"zip": null,
"city": null
},
"coverage": [
{
"market": "phx",
"state": "AZ",
"counties": [
{
"fips": "04013",
"name": "Maricopa",
"data_end": "2026-08-12"
},
{
"fips": "04021",
"name": "Pinal",
"data_end": "2026-08-06"
}
],
"bbox": [
-113.332773,
32.46915,
-110.455491,
33.999503
],
"data_end": "2026-08-12",
"build_run_id": 1,
"registry_run": 7,
"registry_version": "v4-metro-review-fixes",
"dataset_version": 1788469819,
"loaded_at": "2026-09-03T21:10:18.682Z",
"metro_buy_to_resale_ratio": 0.7192,
"universe_kind": "metro",
"universe_zips": null,
"point_tolerance_miles": 20,
"n_parcels": null,
"listings_data_end": "2026-08-31",
"agents_data_end": "2026-08-31",
"wholesale_as_of": "2026-09-09",
"str_as_of": null,
"str": null,
"auction_counted": true,
"parcel_as_of": null,
"address_as_of": null,
"parcel": null,
"lenders": null
}
],
"terms": "Data: Investorlift Data Services. Public-record and MLS listing data licensed through BatchData; municipal short-term rental registries; Investorlift marketplace records. Attribution and data-use terms: https://developers.investorlift.com/guides/terms"
}
}Summarise deal activity
One row of totals for an area: counts by kind, buyer status and purchase channel, investors, parcels, typical prices, hold time and profit.
curl --request GET \
--url https://api.investorlift.com/v1/deals/summary \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.investorlift.com/v1/deals/summary', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.investorlift.com/v1/deals/summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"n_deals": 1200,
"by_kind": {
"flip": 214,
"wholesale": 92,
"hold": 822,
"long_hold": 31,
"other": 33,
"build": 8
},
"by_buyer_status": {
"registered": 1176,
"unclassified": 14,
"excluded": 9,
"unknown": 1
},
"by_channel": {
"from_wholesaler": 125,
"from_investor": 242,
"distressed": 28,
"auction": 20,
"other_or_unknown": 925
},
"n_investors": 871,
"n_parcels": 1028,
"n_unpriced": 159,
"n_undated": 0,
"median_bought_price": 490000,
"median_sold_price": 569500,
"total_volume": 682783819,
"median_hold_days": 134,
"median_gross_profit": 106000,
"by_year": [
{
"year": 2024,
"n": 461,
"flip": 97,
"wholesale": 32,
"hold": 287,
"long_hold": 24,
"other": 14,
"build": 7
},
{
"year": 2025,
"n": 451,
"flip": 103,
"wholesale": 33,
"hold": 294,
"long_hold": 7,
"other": 13,
"build": 1
},
{
"year": 2026,
"n": 288,
"flip": 14,
"wholesale": 27,
"hold": 241,
"long_hold": 0,
"other": 6,
"build": 0
}
],
"by_scale": [
{
"scale": "individual",
"n": 140
},
{
"scale": "small",
"n": 680
},
{
"scale": "mid",
"n": 243
},
{
"scale": "large",
"n": 113
},
{
"scale": null,
"n": 24
}
],
"by_investor_kind": [
{
"kind": "LANDLORD",
"n": 1089
},
{
"kind": "FLIPPER",
"n": 449
},
{
"kind": "WHOLESALER",
"n": 261
},
{
"kind": "BUILDER",
"n": 152
},
{
"kind": null,
"n": 24
}
]
},
"meta": {
"generated_at": "2026-09-03T21:40:00.000Z",
"reference_point": {
"lat": 33.476917,
"lng": -111.920385
},
"geometry": {
"kind": "radius",
"lat": 33.476917,
"lng": -111.920385,
"radius_miles": 2,
"bbox": null,
"property_id": null,
"zip": null,
"city": null
},
"coverage": [
{
"market": "phx",
"state": "AZ",
"counties": [
{
"fips": "04013",
"name": "Maricopa",
"data_end": "2026-08-12"
},
{
"fips": "04021",
"name": "Pinal",
"data_end": "2026-08-06"
}
],
"bbox": [
-113.332773,
32.46915,
-110.455491,
33.999503
],
"data_end": "2026-08-12",
"build_run_id": 1,
"registry_run": 7,
"registry_version": "v4-metro-review-fixes",
"dataset_version": 1788469819,
"loaded_at": "2026-09-03T21:10:18.682Z",
"metro_buy_to_resale_ratio": 0.7192,
"universe_kind": "metro",
"universe_zips": null,
"point_tolerance_miles": 20,
"n_parcels": null,
"listings_data_end": "2026-08-31",
"agents_data_end": "2026-08-31",
"wholesale_as_of": "2026-09-09",
"str_as_of": null,
"str": null,
"auction_counted": true,
"parcel_as_of": null,
"address_as_of": null,
"parcel": null,
"lenders": null
}
],
"terms": "Data: Investorlift Data Services. Public-record and MLS listing data licensed through BatchData; municipal short-term rental registries; Investorlift marketplace records. Attribution and data-use terms: https://developers.investorlift.com/guides/terms"
}
}GET /v1/deals takes.
The location is a radius, a viewport, a parcel, a ZIP list or a postal city. So the header and the table below it always
agree.
Use it when
You need the totals above a map or a table, or any total a paged list does not carry. It also costs no credits, so it is a good first request when you check a key.Read the response
-
by_kind,by_buyer_status,by_yearandby_scaleeach sum ton_deals.by_investor_kinddoes not: a deal counts under every kind its investor carries. So a landlord who also flips counts twice. Deals whose buyer has no investor id count in thekind: nullbucket. -
by_channeldoes not sum ton_dealseither. It counts the deals by the channel the investor bought through. Each bucket reads one flag on the deal row:from_wholesaler:bought_from_wholesaleris true.from_investor:bought_from_investoris true, that is, the seller carried an investor id.distressed:bought_distressedis true.auction:bought_auction_kindis not null.
auctionis null, never 0, where a market the location covers hasmeta.coverage[].auction_countedfalse. -
other_or_unknownis the deals in none of the four channel buckets. Deals whose purchase deed is unknown count there too. Son_dealsminus that count is the deals in at least one bucket. It is not a count of purchases from a homeowner, because a contract assignment leaves no deed. -
n_parcelscounts each parcel once even when it carries several deals, so it is at mostn_deals.n_investorscounts registered investors only. -
Medians are exact, not estimated.
median_bought_priceandtotal_volumeuse priced purchases only, andn_unpricedcounts the unpriced purchases the API left out.median_sold_price,median_hold_daysandmedian_gross_profituse resold deals only. Each is null when nothing qualifies. -
meta.geometryechoes the location the API computed the counts over. So you can ask for the header and the list under it with the same shape. The envelope describes it. -
by_yeargroups the deals by purchase date, oldest first. Deals with no purchase date form one bucket withyear: nullat the end.n_undatedcounts them. -
by_scalehas ascale: nullrow andby_investor_kindhas akind: nullrow. Both rows are for buyers without an investor id.
Gotchas
- The same default exclusions as
/v1/dealsapply. So the numbers match the list and the cells under the same parameters. - A 20 mile radius takes one to three seconds: about 400,000 deals and four exact medians. A 2 mile radius takes well under a second, and so does one ZIP. A whole city is a county-sized query and waits in the same queue as the large radii.
price_minandprice_maxdrop unpriced deals unless you passinclude_unpriced=true.bought_afterandbought_beforedrop undated deals unless you passinclude_undated=true. Both flags changen_unpricedandn_undatedto match.
Related
The calls behind a map shows this beside the cells.Authorizations
API key from the developer console (starts with zpka_). Create one at https://developers.investorlift.com/get-a-key.
Query Parameters
Deal kinds to keep (comma list or repeated key). Default: every kind.
1What 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 Minimum bought price, inclusive, integer dollars. When you set price_min or price_max, the API drops null-priced rows unless include_unpriced=true.
0 <= x <= 9007199254740991Maximum bought price, inclusive, integer dollars.
0 <= x <= 9007199254740991Keep deals bought on or after this date. When you set bought_after or bought_before, the API drops null-date rows unless include_undated=true.
Keep deals bought on or before this date.
Resold deals only: sold on or after this date.
Resold deals only: sold on or before this date.
Parcel segments to keep. Default: every segment.
1Parcel segment: SFR, CONDO_TH (condo or townhouse) or OTHER, a mixed bucket of manufactured, multi-family, land and commercial parcels.
SFR, CONDO_TH, OTHER Minimum bedrooms, inclusive.
0 <= x <= 50Minimum living area in square feet, inclusive, 0 to 1,000,000.
0 <= x <= 1000000Maximum living area in square feet, inclusive, 0 to 1,000,000.
0 <= x <= 1000000Keep investors that carry at least one listed kind. The check reads any of their kinds[], never the primary kind. Default: every kind. Buyers without an investor id pass unless registered_only=true.
1Investor 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.
FLIPPER, WHOLESALER, LANDLORD, BUILDER, IBUYER Drop investors that carry any listed kind. The API checks kinds[] after investor_kind. investor_kind_exclude=WHOLESALER removes investors who also wholesale.
1Investor 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.
FLIPPER, WHOLESALER, LANDLORD, BUILDER, IBUYER Minimum registry confidence in the investor kind: STRONG, PROBABLE or WEAK (WEAK admits everything).
STRONG, PROBABLE, WEAK Scale tiers to keep. Default: every tier except institutional. An explicit list replaces the default entirely. scale=institutional alone returns only institutional. scale=individual,small,mid,large,institutional returns everyone.
1Investor 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.
individual, small, mid, large, institutional Include public-body investors (counties, cities, housing authorities) and their deals. Default false: every list endpoint hides them.
true, false Keep null-priced rows when you set price_min or price_max (default false).
true, false Keep null-date rows when you set bought_after or bought_before (default false).
true, false Keep investors whose last purchase is at most this many months before data_end (data_end minus last_bought_on). Sales and transfers do not count. No default.
1 <= x <= 600Minimum purchase events of that investor inside the geometry, 1 to 1,000,000. The API applies it after the other filters.
1 <= x <= 1000000Investor filter: keep investors who hold at least this many parcels across the whole market at the deed data end (meta.coverage[].data_end). The count is the investor's n_holds: confirmed holdings plus un-resold purchases inside the area loaded for the market, not the holdings inside the geometry. Range 0 to 1,000,000, inclusive. For example, holds_min=20 keeps the larger portfolios. Buyers without an investor id pass unless registered_only=true.
0 <= x <= 1000000Investor filter: keep investors who hold at most this many parcels across the whole market at the deed data end (n_holds). Range 0 to 1,000,000, inclusive. holds_max=0 keeps the investors that hold nothing. Beside holds_min the pair is a band. Buyers without an investor id pass unless registered_only=true.
0 <= x <= 1000000Investor filter: at least one bought-from-wholesaler deal in the 36 months before data_end.
true, false Investor filter: true keeps investors who bought at least one house at a foreclosure auction in the 24 months before data_end. A foreclosure auction is a trustee's sale or an Arizona sheriff's sale, and the filter reads investor.auction.is_active_auction_buyer. These buyers pay cash within a day and buy without an inspection. False keeps registered investors who did not. Buyers without an investor id pass unless registered_only=true. The API answers 422 auction_unavailable in a market that does not publish its auction counts (meta.coverage[].auction_counted false).
true, false Investor filter: true keeps investors who bought at least one house from a lender, servicer or agency after a foreclosure. The window is the 24 months before data_end, and the filter reads investor.auction.is_active_reo_buyer. A bank-owned (REO) sale gave the buyer weeks, an inspection and the option to finance: the weaker cash signal beside buys_at_auction. False keeps registered investors who did not, and buys_at_auction=true&buys_reo=false is the cash-only set. Buyers without an investor id pass unless registered_only=true. The API answers 422 auction_unavailable where the market does not publish its auction counts.
true, false Deal filter: keep deals whose purchase deed was a third-party auction purchase of one of the listed kinds (comma list or repeated key). For example, bought_auction_kind=TRUSTEE_SALE keeps houses bought at a foreclosure sale. The API drops deals bought any other way and deals without a buy deed. The API answers 422 auction_unavailable where the market does not publish its auction counts.
1The 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 Deal filter: bought through a documented double close from a wholesaler, or from a known wholesaler. Assignments leave no deed, so absence is not evidence.
true, false Deal filter: the buy leg was a distressed sale. That is a foreclosure, trustee, sheriff or tax instrument, a deed in lieu, or a deed the feed flags as REO. It is wider than bought_auction_kind, which keeps only third-party auction purchases.
true, false Keep only rows whose buyer carries an investor id (investor.id is not null).
true, false Buyer statuses to keep.
1The 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 Investor filter: true keeps investors that hold at least one parcel with a business-use short-term-rental licence attributed to them. That is the str roll-up's n_holdings at 1 or more. False keeps investors with none. Buyers without an investor id pass unless registered_only=true. The API answers 422 str_unavailable when a market in play has no short-term rental tables (meta.coverage[].str_as_of null).
true, false Investor filter: at least this many of the investor's holdings carry a business-use short-term-rental licence attributed to them (the str roll-up's n_holdings), 1 or more. Buyers without an investor id pass unless registered_only=true. The API answers 422 str_unavailable when a market in play has no short-term rental tables.
1 <= x <= 100000Investor filter: keep investors with at least one recorded loan from this lender, as the main borrower of the mortgage or the open lien. The value is a lender id, len_ followed by 12 hex characters, for example len_d2028f0766fc from GET /v1/lenders/search. The match is investor_id on the lender's loan rows. The count is a floor: the recorded history sees about one loan in five. Buyers without an investor id pass unless registered_only=true. The API answers 422 lenders_unavailable when a market in play has no lender registry with the borrower match (meta.coverage[].lenders null or borrowers_measured false).
^len_[0-9a-f]{12}$Investor filter: true keeps investors with a loan from a private lender, recorded in the 24 months before the lender registry's slice date (meta.coverage[].lenders.as_of). A private lender is a hard-money lender by name or behaviour (is_hard_money) or an investor lender by behaviour (is_investor_lender). A lender whose class reads INDIVIDUAL or PRIVATE also counts as private. False keeps registered investors with none such, and the result is a floor of a partial feed. Buyers without an investor id pass unless registered_only=true. The API answers 422 lenders_unavailable when a market in play has no lender registry with the borrower match.
true, false Scope the rows to one buyer (the drawer's "Activity here"). The API follows an old id from an earlier data refresh to the investor that superseded it and echoes the old id in meta.resolved_from. A retired id is 410 gone.
^inv_[0-9a-f]{12}$Scope the rows to one deal.
^deal_[0-9a-f]{32}$Point latitude (with lng). With radius_miles it is the search geometry. With bbox it is the reference point only.
-90 <= x <= 90Point longitude (with lat).
-180 <= x <= 180Search radius in miles around the point or around the centre of the property_id parcel, 0.25 to 20 (default 2). Not allowed with bbox.
0.25 <= x <= 20Viewport as west,south,east,north (WGS84 degrees). West must be less than east, south less than north, and the diagonal at most 40 mi. It must intersect a loaded market's coverage bbox (422 outside_coverage otherwise). It can carry lat + lng (without radius_miles) as the reference point for distances and sort=distance.
Parcel geometry: search around the centre of that parcel, with radius_miles. Not allowed with lat, lng or bbox.
^prop_[0-9a-f]{32}$Place geometry: the parcels of these 5-digit ZIP codes, as a comma list or a repeated key, up to 50. On the deal and investor routes the Free and Starter plans take exactly one ZIP, and more is 403 plan_limit. You can add lat + lng as the reference point for distances. Not with radius_miles, bbox, property_id or city. A ZIP that no parcel of a loaded market carries is 422 outside_coverage (zips_unknown in the body).
1 - 50 elements^\d{5}$Place geometry: the parcels whose postal city is this one, as the county records it ("Scottsdale"). Case does not matter: the API compares the value folded upper case. Never the short-term rental jurisdiction (meta.coverage[].str.jurisdictions[]). You can add lat + lng as the reference point, but not radius_miles, bbox, property_id or zip. On the deal and investor routes of the Free and Starter plans a city-wide search is 403 plan_limit. A city that no parcel of a loaded market carries is 422 outside_coverage.
1 - 100Keep only holdings whose short-term rental status matches one of the values (comma list or repeated key): LICENSED, PENDING or EXPIRED, the block's status. The API serves NONE on rows, but NONE is not filterable in this release (400 for the value). The API applies the filter before it cuts the page. Rows that are not holdings never match. 422 str_unavailable when a market in play has no short-term rental tables (meta.coverage[].str_as_of null). Default: every row.
1The short-term rental status a holding must carry for the API to keep the row: the block's status. LICENSED means an active licence or permit, PENDING an application on file with none active, and EXPIRED every record on the parcel inactive. The API keeps a row when any of the values matches. Rows that are not holdings (flips, wholesales, resold purchases) carry no block and never match. The API serves NONE on rows, but NONE is not filterable in this release (400 for the value).
LICENSED, PENDING, EXPIRED With true, keep only hold rows whose licence is a business use attributed to the current owner: the UI's short-term rental deal type. With false, keep only hold rows whose licence is not one: a person's own home with a casita permit, or a prior owner's permit. Without str_status the test covers LICENSED and PENDING records, the only ones where business_use is true. Combine it with str_status to widen or narrow. The API applies the filter before it cuts the page. Rows that are not holdings never match. 422 str_unavailable when a market in play has no short-term rental tables (meta.coverage[].str_as_of null). Default: every row.
true, false Response
Header statistics for the geometry.
Was this page helpful?