curl --request GET \
--url https://api.investorlift.com/v1/investors/{id}/deals \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.investorlift.com/v1/investors/{id}/deals', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.investorlift.com/v1/investors/{id}/deals"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": [
{
"id": "deal_f0908eaa16021b8be474384f19328288",
"market": "phx",
"kind": "flip",
"deal_type": "PAIR",
"deal_kind": "FLIP",
"ownership_confirmed": null,
"buyer_status": "registered",
"buyer_exclusion": null,
"property": {
"id": "prop_e90edc5ea3c0c58ffa80e5cc04eaf0e4",
"market": "phx",
"apn": "207-02-477",
"apn_norm": "20702477",
"county_fips": "04013",
"address_short": "3125 W Charleston Ave",
"street_no_unit": "3125 W Charleston Ave",
"unit": null,
"city": "PHOENIX",
"state": "AZ",
"zip": "85053",
"latitude": 33.648618,
"longitude": -112.126837,
"segment": "SFR",
"bedrooms": null,
"bathrooms": 2,
"sqft": 1055,
"year_built": 1977,
"pool": null
},
"distance_miles": null,
"bought_on": "2026-06-22",
"date_quality": "deed",
"held_since_source": "DEED_ACQUISITION",
"bought_price": 195000,
"sold_on": "2026-07-24",
"sold_price": 270000,
"hold_days": 32,
"gross_profit": 75000,
"spread_ratio": 0.384615,
"price_quality": "BOTH",
"days_held_to_data_end": null,
"sold_to_wholesaler": null,
"round_trip": false,
"is_purchase_event": true,
"n_parcels_in_event": 2,
"bought_from_wholesaler": true,
"bought_from_wholesaler_via": "SELLER_KIND",
"wholesaler_investor_id": "inv_abaf618f44a3",
"bought_from_investor": true,
"bought_distressed": false,
"bought_auction_kind": null,
"holding_kind": null,
"acquisition_kind": null,
"investor": {
"id": "inv_abaf618f44a3",
"market": "phx",
"name": "ZAK VENTURES LLC",
"display_name": "ZAK VENTURES LLC",
"state": "AZ",
"kind": "LANDLORD",
"confidence": "STRONG",
"scale": "large",
"institutional": false,
"is_public": false,
"last_bought_on": "2026-08-05",
"n_deals": 775,
"buyer_status": "registered"
},
"seller": {
"id": "inv_abaf618f44a3",
"name": "ZAK VENTURES LLC",
"display_name": "ZAK VENTURES LLC",
"kind": "ENTITY",
"kinds": [
"LANDLORD",
"FLIPPER",
"BUILDER",
"WHOLESALER"
]
},
"end_buyer": {
"id": "inv_83d86e5dde06",
"name": "BRUCE AND JIM LLC",
"display_name": "BRUCE AND JIM LLC",
"kind": "ENTITY",
"kinds": [
"LANDLORD"
]
},
"owner": null,
"listing": null,
"short_term_rental": null,
"wholesale_listing": null,
"financing": {
"purchase_loan_status": "NOT_MEASURED",
"purchase_loan": null,
"secondary_loans_n": null,
"link_window": null,
"outcome": null,
"as_of": "2026-06-25",
"dated": true
}
},
{
"id": "deal_8c38bc7d253246f85075fdb67e1b0f78",
"market": "phx",
"kind": "flip",
"deal_type": "PAIR",
"deal_kind": "FLIP",
"ownership_confirmed": null,
"buyer_status": "registered",
"buyer_exclusion": null,
"property": {
"id": "prop_c43cecbb42811180448e6ac30b4bfc09",
"market": "phx",
"apn": "145-23-072",
"apn_norm": "14523072",
"county_fips": "04013",
"address_short": "4229 N 48th Ave",
"street_no_unit": "4229 N 48th Ave",
"unit": null,
"city": "PHOENIX",
"state": "AZ",
"zip": "85031",
"latitude": 33.497889,
"longitude": -112.1618,
"segment": "SFR",
"bedrooms": null,
"bathrooms": 2,
"sqft": 1360,
"year_built": 1954,
"pool": null
},
"distance_miles": null,
"bought_on": "2026-06-15",
"date_quality": "deed",
"held_since_source": "DEED_ACQUISITION",
"bought_price": 187500,
"sold_on": "2026-08-11",
"sold_price": 243500,
"hold_days": 57,
"gross_profit": 56000,
"spread_ratio": 0.298667,
"price_quality": "BOTH",
"days_held_to_data_end": null,
"sold_to_wholesaler": false,
"round_trip": false,
"is_purchase_event": true,
"n_parcels_in_event": 1,
"bought_from_wholesaler": true,
"bought_from_wholesaler_via": "SELLER_KIND",
"wholesaler_investor_id": "inv_abaf618f44a3",
"bought_from_investor": true,
"bought_distressed": false,
"bought_auction_kind": null,
"holding_kind": null,
"acquisition_kind": null,
"investor": {
"id": "inv_abaf618f44a3",
"market": "phx",
"name": "ZAK VENTURES LLC",
"display_name": "ZAK VENTURES LLC",
"state": "AZ",
"kind": "LANDLORD",
"confidence": "STRONG",
"scale": "large",
"institutional": false,
"is_public": false,
"last_bought_on": "2026-08-05",
"n_deals": 775,
"buyer_status": "registered"
},
"seller": {
"id": "inv_abaf618f44a3",
"name": "ZAK VENTURES LLC",
"display_name": "ZAK VENTURES LLC",
"kind": "ENTITY",
"kinds": [
"LANDLORD",
"FLIPPER",
"BUILDER",
"WHOLESALER"
]
},
"end_buyer": {
"id": null,
"name": null,
"display_name": null,
"kind": "TRUST",
"kinds": null
},
"owner": null,
"listing": null,
"short_term_rental": null,
"wholesale_listing": null,
"financing": {
"purchase_loan_status": "NOT_MEASURED",
"purchase_loan": null,
"secondary_loans_n": null,
"link_window": null,
"outcome": null,
"as_of": "2026-06-25",
"dated": true
}
}
],
"page": {
"next_cursor": "eyJ2IjoxLCJydW4iOiIxNzg4NDY5ODE5IiwicSI6IjcwMDA1Nzk2YmJjNTg4ZjJiY2U3MGUzMGJiMjYwOTQzMjI4YjhiZWRiMzI2OGU4MjIxNWNjMDBmMTVkOWQ5YTciLCJrIjpbIjIwMjYtMDYtMTUiLCI4YzM4YmM3ZDI1MzI0NmY4NTA3NWZkYjY3ZTFiMGY3OCJdfQ",
"limit": 2,
"returned": 2
},
"meta": {
"generated_at": "2026-09-03T21:40:00.000Z",
"coverage": [
{
"market": "phx",
"state": "AZ",
"counties": [
{
"fips": "04013",
"name": "Maricopa",
"data_end": "2026-08-12"
},
{
"fips": "04021",
"name": "Pinal",
"data_end": "2026-08-06"
}
],
"bbox": [
-113.332773,
32.46915,
-110.455491,
33.999503
],
"data_end": "2026-08-12",
"build_run_id": 1,
"registry_run": 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"
}
}List one investor's deals
Every deal of one investor across the whole market, as rows shaped like /v1/deals, with coordinates.
curl --request GET \
--url https://api.investorlift.com/v1/investors/{id}/deals \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.investorlift.com/v1/investors/{id}/deals', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.investorlift.com/v1/investors/{id}/deals"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": [
{
"id": "deal_f0908eaa16021b8be474384f19328288",
"market": "phx",
"kind": "flip",
"deal_type": "PAIR",
"deal_kind": "FLIP",
"ownership_confirmed": null,
"buyer_status": "registered",
"buyer_exclusion": null,
"property": {
"id": "prop_e90edc5ea3c0c58ffa80e5cc04eaf0e4",
"market": "phx",
"apn": "207-02-477",
"apn_norm": "20702477",
"county_fips": "04013",
"address_short": "3125 W Charleston Ave",
"street_no_unit": "3125 W Charleston Ave",
"unit": null,
"city": "PHOENIX",
"state": "AZ",
"zip": "85053",
"latitude": 33.648618,
"longitude": -112.126837,
"segment": "SFR",
"bedrooms": null,
"bathrooms": 2,
"sqft": 1055,
"year_built": 1977,
"pool": null
},
"distance_miles": null,
"bought_on": "2026-06-22",
"date_quality": "deed",
"held_since_source": "DEED_ACQUISITION",
"bought_price": 195000,
"sold_on": "2026-07-24",
"sold_price": 270000,
"hold_days": 32,
"gross_profit": 75000,
"spread_ratio": 0.384615,
"price_quality": "BOTH",
"days_held_to_data_end": null,
"sold_to_wholesaler": null,
"round_trip": false,
"is_purchase_event": true,
"n_parcels_in_event": 2,
"bought_from_wholesaler": true,
"bought_from_wholesaler_via": "SELLER_KIND",
"wholesaler_investor_id": "inv_abaf618f44a3",
"bought_from_investor": true,
"bought_distressed": false,
"bought_auction_kind": null,
"holding_kind": null,
"acquisition_kind": null,
"investor": {
"id": "inv_abaf618f44a3",
"market": "phx",
"name": "ZAK VENTURES LLC",
"display_name": "ZAK VENTURES LLC",
"state": "AZ",
"kind": "LANDLORD",
"confidence": "STRONG",
"scale": "large",
"institutional": false,
"is_public": false,
"last_bought_on": "2026-08-05",
"n_deals": 775,
"buyer_status": "registered"
},
"seller": {
"id": "inv_abaf618f44a3",
"name": "ZAK VENTURES LLC",
"display_name": "ZAK VENTURES LLC",
"kind": "ENTITY",
"kinds": [
"LANDLORD",
"FLIPPER",
"BUILDER",
"WHOLESALER"
]
},
"end_buyer": {
"id": "inv_83d86e5dde06",
"name": "BRUCE AND JIM LLC",
"display_name": "BRUCE AND JIM LLC",
"kind": "ENTITY",
"kinds": [
"LANDLORD"
]
},
"owner": null,
"listing": null,
"short_term_rental": null,
"wholesale_listing": null,
"financing": {
"purchase_loan_status": "NOT_MEASURED",
"purchase_loan": null,
"secondary_loans_n": null,
"link_window": null,
"outcome": null,
"as_of": "2026-06-25",
"dated": true
}
},
{
"id": "deal_8c38bc7d253246f85075fdb67e1b0f78",
"market": "phx",
"kind": "flip",
"deal_type": "PAIR",
"deal_kind": "FLIP",
"ownership_confirmed": null,
"buyer_status": "registered",
"buyer_exclusion": null,
"property": {
"id": "prop_c43cecbb42811180448e6ac30b4bfc09",
"market": "phx",
"apn": "145-23-072",
"apn_norm": "14523072",
"county_fips": "04013",
"address_short": "4229 N 48th Ave",
"street_no_unit": "4229 N 48th Ave",
"unit": null,
"city": "PHOENIX",
"state": "AZ",
"zip": "85031",
"latitude": 33.497889,
"longitude": -112.1618,
"segment": "SFR",
"bedrooms": null,
"bathrooms": 2,
"sqft": 1360,
"year_built": 1954,
"pool": null
},
"distance_miles": null,
"bought_on": "2026-06-15",
"date_quality": "deed",
"held_since_source": "DEED_ACQUISITION",
"bought_price": 187500,
"sold_on": "2026-08-11",
"sold_price": 243500,
"hold_days": 57,
"gross_profit": 56000,
"spread_ratio": 0.298667,
"price_quality": "BOTH",
"days_held_to_data_end": null,
"sold_to_wholesaler": false,
"round_trip": false,
"is_purchase_event": true,
"n_parcels_in_event": 1,
"bought_from_wholesaler": true,
"bought_from_wholesaler_via": "SELLER_KIND",
"wholesaler_investor_id": "inv_abaf618f44a3",
"bought_from_investor": true,
"bought_distressed": false,
"bought_auction_kind": null,
"holding_kind": null,
"acquisition_kind": null,
"investor": {
"id": "inv_abaf618f44a3",
"market": "phx",
"name": "ZAK VENTURES LLC",
"display_name": "ZAK VENTURES LLC",
"state": "AZ",
"kind": "LANDLORD",
"confidence": "STRONG",
"scale": "large",
"institutional": false,
"is_public": false,
"last_bought_on": "2026-08-05",
"n_deals": 775,
"buyer_status": "registered"
},
"seller": {
"id": "inv_abaf618f44a3",
"name": "ZAK VENTURES LLC",
"display_name": "ZAK VENTURES LLC",
"kind": "ENTITY",
"kinds": [
"LANDLORD",
"FLIPPER",
"BUILDER",
"WHOLESALER"
]
},
"end_buyer": {
"id": null,
"name": null,
"display_name": null,
"kind": "TRUST",
"kinds": null
},
"owner": null,
"listing": null,
"short_term_rental": null,
"wholesale_listing": null,
"financing": {
"purchase_loan_status": "NOT_MEASURED",
"purchase_loan": null,
"secondary_loans_n": null,
"link_window": null,
"outcome": null,
"as_of": "2026-06-25",
"dated": true
}
}
],
"page": {
"next_cursor": "eyJ2IjoxLCJydW4iOiIxNzg4NDY5ODE5IiwicSI6IjcwMDA1Nzk2YmJjNTg4ZjJiY2U3MGUzMGJiMjYwOTQzMjI4YjhiZWRiMzI2OGU4MjIxNWNjMDBmMTVkOWQ5YTciLCJrIjpbIjIwMjYtMDYtMTUiLCI4YzM4YmM3ZDI1MzI0NmY4NTA3NWZkYjY3ZTFiMGY3OCJdfQ",
"limit": 2,
"returned": 2
},
"meta": {
"generated_at": "2026-09-03T21:40:00.000Z",
"coverage": [
{
"market": "phx",
"state": "AZ",
"counties": [
{
"fips": "04013",
"name": "Maricopa",
"data_end": "2026-08-12"
},
{
"fips": "04021",
"name": "Pinal",
"data_end": "2026-08-06"
}
],
"bbox": [
-113.332773,
32.46915,
-110.455491,
33.999503
],
"data_end": "2026-08-12",
"build_run_id": 1,
"registry_run": 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"
}
}Use it when
The drawer’s Bought / Sold / Profit table, or a map of an investor’s whole footprint. For the investor’s deals inside one area, useGET /v1/deals?investor_id= instead.
The role parameter
role | Lists |
|---|---|
buyer (default) | Deals where the investor was the buyer: resold pairs, current holdings and un-resold purchases. |
seller | Deals where the investor sold to the buyer on the row. |
any | Both, plus rows where the investor was the end buyer of a wholesaler’s resale. Each deal once. |
seller or any, the date sort uses the resale date. If the investor never resold the deal, the sort uses
the purchase date. So “most recent first” means the most recent event of this investor. On those rows investor is
the buyer, often a household without an id. This host does not serve its name and state: both are null, with
contact_redacted: true.
Read the response
distance_milesis null: this endpoint takes no geometry.listing_status=keeps holdings by the MLS listing on the parcel, before the API cuts the page.on_marketkeeps a holding whose listing is ACTIVE or PENDING and not a rental.active,pending,soldandoff_marketare the rawlisting.status, rentals included.nonekeeps a holding with no listing record. A comma list keeps a row when any value matches. Rows that are not holdings never match.- The drawer’s “on the market” pane is
role=buyer&listing_status=on_market: every listed holding in one bounded page. The investor’s own inventory is the rows withlisting.countedtrue. The rest are rows a prior owner listed (owner_testFAILED), or undated rows. - The response fills
owneronly on confirmed current holdings, and it carries the contact fields. short_term_rental, on hold rows, is the parcel’s city licence record.str_status=LICENSED,PENDINGkeeps the holdings with a licence or an application at the roll’s as-of date (meta.coverage[].str_as_of).EXPIREDkeeps the lapsed ones.str_business_use=truekeeps the holdings whose licence is a business use attributed to this investor. The rows that last filter keeps are exactly the holdings the profile’sstr.n_holdingscounts.
Gotchas
- The largest investors have more than 25,000 rows, so page to the end. This route has no CSV on
api.investorlift.com. See Give me a spreadsheet. The one public CSV is the loans of a lender. - The API follows old ids as on the profile route: 200 with
meta.resolved_from,410 gonefor a retired id, 404 for an id never issued. - A market with no listing tables answers
422 listings_unavailableforlisting_status. A market with no short-term rental tables answers422 str_unavailablefor thestr_filters. In such a market, an empty page reads as “nothing listed”. So the API answers an error, not zero rows.
Authorizations
API key from the developer console (starts with zpka_). Create one at https://developers.investorlift.com/get-a-key.
Path Parameters
Investor id, inv_ followed by 12 hex characters, for example inv_abaf618f44a3. The API follows an old id from an earlier data refresh to the current investor (meta.resolved_from). It answers 410 for a retired id.
Query Parameters
Market code, for example phx. The loaded markets are in meta.coverage[]. Send it only when the id exists in more than one loaded market. 400 market_required says so. Otherwise the API uses the id's own market.
1 - 16Which side of the deals to list. With buyer (the default) the list holds the purchases, holdings and resales where the investor was the buyer. With seller it holds the deals where the investor sold to the buyer named on the row. With any it holds the buyer, seller and end-buyer rows together, each deal once.
buyer, seller, any 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 Keep only holdings whose MLS listing matches one of these values (comma list or repeated key). The value on_market keeps the holdings listed at listings_data_end: ACTIVE or PENDING and not a rental. The values active, pending, sold and off_market match the record's status, and none keeps holdings with no record. The API applies the filter before it cuts the page, so role=buyer&listing_status=on_market is every listed holding in one page. It answers 422 listings_unavailable when the market has no listing tables (meta.coverage[].listings_data_end null). Default: every row.
1What the MLS listing on a holding must be for the API to keep the row. With on_market, ACTIVE or PENDING and not a rental: the rows whose listing block says on_market, before the ownership test. So the counted ones among them are those with counted true. With active, pending, sold or off_market, the block's status, rentals included, and with none, a holding with no listing record at all. The API keeps a row when any of the values matches. Rows that are not holdings (flips, wholesales, resold purchases) carry no listing and never match.
on_market, active, pending, sold, off_market, none The value investorlift keeps only deals whose closing deed closed an Investorlift listing. Those rows carry a wholesale_listing block: the houses this investor bought off Investorlift. The API applies the filter before it cuts the page. It answers 422 wholesale_unavailable when the market has no wholesale tables (meta.coverage[].wholesale_as_of null). Default: every row.
investorlift Keep 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 The values date_desc (the default) and date_asc sort on the purchase date for role=buyer. For role=seller and role=any they sort on the resale date, or on the purchase date for a deal with no resale. Null dates come last in both directions. The values price_desc and price_asc sort on the bought price, nulls last.
date_desc, date_asc, price_desc, price_asc Page size, 1-500 (default 500).
1 <= x <= 500Opaque cursor from page.next_cursor of the previous page. A change of query, sort, weights or data version invalidates it (400 invalid_cursor). Then restart from page 1.
1 - 4096Response
The investor's deals across the whole market, one page, in the requested sort.
The investor's deals across the whole market, one page, in the requested sort.
The rows of this page.
Show child attributes
Show child attributes
Pagination: the page size, the rows returned and the cursor for the next page. Paged lists carry no total. The summary block does.
Show child attributes
Show child attributes
Response metadata: when the API produced it, which markets it covers, and how fresh they are.
Show child attributes
Show child attributes
Was this page helpful?