curl --request GET \
--url https://api.investorlift.com/v1/lenders/{id}/loans \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.investorlift.com/v1/lenders/{id}/loans', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.investorlift.com/v1/lenders/{id}/loans"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": [
{
"market": "<string>",
"property_id": "<string>",
"address_short": "<string>",
"city": "<string>",
"zip": "<string>",
"source": "OPEN",
"position": 0,
"loan_key": "<string>",
"in_both": true,
"lender_id": "<string>",
"lender_id_open": "<string>",
"lender_disagrees": true,
"lender_name_as_recorded": "<string>",
"lender_class": "BANK",
"identity_basis": "NAME_FOLD",
"recording_date": "<string>",
"due_date": "<string>",
"loan_amount": 0,
"amount_outlier": true,
"current_balance": 0,
"balance_outlier": true,
"on_resold_parcel": true,
"interest_rate": 123,
"term_months": 0,
"term_band": "LE_24M",
"loan_type": "<string>",
"label": "REFI_OR_SECOND",
"label_as_recorded": "<string>",
"product": "CONSTRUCTION",
"product_proxy": "BRIDGE",
"product_basis": "FILE",
"open_position": 0,
"assigned_lender_name": "<string>",
"blanket_group_id": "<string>",
"blanket_n_parcels": 0,
"county_fips": "<string>",
"property_type_category": "<string>",
"purpose": "PURCHASE",
"deed": {
"dt": "<string>",
"price": 0,
"loan_to_price": 123
},
"deal": {
"deal_id": "<string>",
"kind": "flip",
"link_window": "STRICT",
"is_purchase_loan": true,
"secondary_loans_n": 0,
"investor_id": "<string>",
"investor_name": "<string>",
"investor_display_name": "<string>",
"bought_on": "<string>",
"bought_price": 0,
"sold_on": "<string>",
"sold_price": 0,
"gross_profit": 0,
"hold_days": 0
},
"outcome": "RESOLVED_BY_RESALE",
"months_to_resolution": 123,
"foreclosed": {
"instrument": "TRUSTEES_DEED",
"deed_date": "<string>",
"buyer_is_lender": true
},
"investor_id": "<string>",
"co_borrower_investor_ids": [
"<string>"
],
"borrower_keys": [
"<string>"
],
"borrower_match": "DEAL",
"as_of": "<string>",
"dated": true
}
],
"page": {
"next_cursor": "<string>",
"limit": 0,
"returned": 0
},
"meta": {
"generated_at": "<string>",
"coverage": [
{
"market": "<string>",
"state": "<string>",
"counties": [
{
"fips": "<string>",
"name": "<string>",
"data_end": "<string>"
}
],
"bbox": [
0,
0,
0,
0
],
"data_end": "<string>",
"build_run_id": 0,
"registry_run": 0,
"registry_version": "<string>",
"dataset_version": 0,
"loaded_at": "<string>",
"metro_buy_to_resale_ratio": 123,
"universe_kind": "zip",
"universe_zips": [
"<string>"
],
"point_tolerance_miles": 123,
"n_parcels": 0,
"listings_data_end": "<string>",
"agents_data_end": "<string>",
"wholesale_as_of": "<string>",
"str_as_of": "<string>",
"str": {
"jurisdictions": [
{
"name": "<string>",
"regime": "REQUIRED",
"coverage_reason": "LOADED_SERVED",
"served": true,
"snapshot_only": true,
"licence_start": "<string>",
"snapshot_date": "<string>",
"feed_stale": true,
"sources": [
{
"source": "<string>",
"snapshot_date": "<string>",
"stale": true
}
],
"n_licensed": 0,
"n_pending": 0,
"n_expired": 0,
"n_advertised": 0,
"share_unmatched": 123,
"share_assumed": 123
}
]
},
"auction_counted": true,
"parcel_as_of": "<string>",
"address_as_of": "<string>",
"parcel": {
"parcel_as_of": "<string>",
"n_parcels": 0,
"sale_mortgage_measured": true,
"financing": {
"as_of": "<string>",
"dated": true,
"dated_reason": "<string>",
"n_parcels": 0,
"n_with_open_lien": 0,
"n_free_and_clear": 0,
"n_avm": 0,
"n_involuntary": 0,
"n_lenders": 0
},
"permits": {
"as_of": "<string>",
"n_permits": 0,
"n_parcels": 0,
"n_unmatched": 0,
"jurisdictions": [
{
"jurisdiction": "<string>",
"n_permits": 0,
"last_issue_date": "<string>",
"windows_measured": true
}
]
},
"owner_profile": {
"as_of": "<string>",
"n_parcels": 0,
"n_multi": 0,
"n_portfolio_5": 0
},
"history": {
"first_week": "<string>",
"last_week": "<string>",
"zips": [
"<string>"
],
"n_parcels": 0,
"n_events": 0,
"n_weeks": 0,
"domains": {}
}
},
"lenders": {
"as_of": "<string>",
"recordings_through": "<string>",
"counties": [
"<string>"
],
"history_capture_share": 123,
"n_lender_ids": 0,
"purchase_measured": true,
"investor_lending_measured": true,
"flips_measured": true,
"borrowers_measured": true,
"takebacks_measured": true,
"counties_measured": true,
"dated": true,
"n_parcels_uncovered": 0
}
}
],
"terms": "<string>",
"weights": {},
"reference_point": {
"lat": 0,
"lng": 0
},
"geometry": {
"kind": "radius",
"lat": 0,
"lng": 0,
"radius_miles": 123,
"bbox": {
"[0]": 0,
"[1]": 0,
"[2]": 0,
"[3]": 0
},
"property_id": "<string>",
"zip": [
"<string>"
],
"city": "<string>"
},
"resolved_from": [
"<string>"
],
"dated": [
{
"block": "valuation",
"as_of": "<string>",
"reason": "<string>"
}
]
}
}List every loan of one lender
Every loan of one lender, newest first: the parcel, the source table, the lender as recorded, the amount and terms as filed. Also the deal it financed and its outcome, one row per instrument (source picks one table).
A geometry resolves to the H3 res-8 cells whose centre is inside it: a hex edge, not the circle. This host does not serve the borrowers of a recorded row: the rows omit them. With Accept: text/csv the whole filtered set as a CSV file.
curl --request GET \
--url https://api.investorlift.com/v1/lenders/{id}/loans \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.investorlift.com/v1/lenders/{id}/loans', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.investorlift.com/v1/lenders/{id}/loans"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": [
{
"market": "<string>",
"property_id": "<string>",
"address_short": "<string>",
"city": "<string>",
"zip": "<string>",
"source": "OPEN",
"position": 0,
"loan_key": "<string>",
"in_both": true,
"lender_id": "<string>",
"lender_id_open": "<string>",
"lender_disagrees": true,
"lender_name_as_recorded": "<string>",
"lender_class": "BANK",
"identity_basis": "NAME_FOLD",
"recording_date": "<string>",
"due_date": "<string>",
"loan_amount": 0,
"amount_outlier": true,
"current_balance": 0,
"balance_outlier": true,
"on_resold_parcel": true,
"interest_rate": 123,
"term_months": 0,
"term_band": "LE_24M",
"loan_type": "<string>",
"label": "REFI_OR_SECOND",
"label_as_recorded": "<string>",
"product": "CONSTRUCTION",
"product_proxy": "BRIDGE",
"product_basis": "FILE",
"open_position": 0,
"assigned_lender_name": "<string>",
"blanket_group_id": "<string>",
"blanket_n_parcels": 0,
"county_fips": "<string>",
"property_type_category": "<string>",
"purpose": "PURCHASE",
"deed": {
"dt": "<string>",
"price": 0,
"loan_to_price": 123
},
"deal": {
"deal_id": "<string>",
"kind": "flip",
"link_window": "STRICT",
"is_purchase_loan": true,
"secondary_loans_n": 0,
"investor_id": "<string>",
"investor_name": "<string>",
"investor_display_name": "<string>",
"bought_on": "<string>",
"bought_price": 0,
"sold_on": "<string>",
"sold_price": 0,
"gross_profit": 0,
"hold_days": 0
},
"outcome": "RESOLVED_BY_RESALE",
"months_to_resolution": 123,
"foreclosed": {
"instrument": "TRUSTEES_DEED",
"deed_date": "<string>",
"buyer_is_lender": true
},
"investor_id": "<string>",
"co_borrower_investor_ids": [
"<string>"
],
"borrower_keys": [
"<string>"
],
"borrower_match": "DEAL",
"as_of": "<string>",
"dated": true
}
],
"page": {
"next_cursor": "<string>",
"limit": 0,
"returned": 0
},
"meta": {
"generated_at": "<string>",
"coverage": [
{
"market": "<string>",
"state": "<string>",
"counties": [
{
"fips": "<string>",
"name": "<string>",
"data_end": "<string>"
}
],
"bbox": [
0,
0,
0,
0
],
"data_end": "<string>",
"build_run_id": 0,
"registry_run": 0,
"registry_version": "<string>",
"dataset_version": 0,
"loaded_at": "<string>",
"metro_buy_to_resale_ratio": 123,
"universe_kind": "zip",
"universe_zips": [
"<string>"
],
"point_tolerance_miles": 123,
"n_parcels": 0,
"listings_data_end": "<string>",
"agents_data_end": "<string>",
"wholesale_as_of": "<string>",
"str_as_of": "<string>",
"str": {
"jurisdictions": [
{
"name": "<string>",
"regime": "REQUIRED",
"coverage_reason": "LOADED_SERVED",
"served": true,
"snapshot_only": true,
"licence_start": "<string>",
"snapshot_date": "<string>",
"feed_stale": true,
"sources": [
{
"source": "<string>",
"snapshot_date": "<string>",
"stale": true
}
],
"n_licensed": 0,
"n_pending": 0,
"n_expired": 0,
"n_advertised": 0,
"share_unmatched": 123,
"share_assumed": 123
}
]
},
"auction_counted": true,
"parcel_as_of": "<string>",
"address_as_of": "<string>",
"parcel": {
"parcel_as_of": "<string>",
"n_parcels": 0,
"sale_mortgage_measured": true,
"financing": {
"as_of": "<string>",
"dated": true,
"dated_reason": "<string>",
"n_parcels": 0,
"n_with_open_lien": 0,
"n_free_and_clear": 0,
"n_avm": 0,
"n_involuntary": 0,
"n_lenders": 0
},
"permits": {
"as_of": "<string>",
"n_permits": 0,
"n_parcels": 0,
"n_unmatched": 0,
"jurisdictions": [
{
"jurisdiction": "<string>",
"n_permits": 0,
"last_issue_date": "<string>",
"windows_measured": true
}
]
},
"owner_profile": {
"as_of": "<string>",
"n_parcels": 0,
"n_multi": 0,
"n_portfolio_5": 0
},
"history": {
"first_week": "<string>",
"last_week": "<string>",
"zips": [
"<string>"
],
"n_parcels": 0,
"n_events": 0,
"n_weeks": 0,
"domains": {}
}
},
"lenders": {
"as_of": "<string>",
"recordings_through": "<string>",
"counties": [
"<string>"
],
"history_capture_share": 123,
"n_lender_ids": 0,
"purchase_measured": true,
"investor_lending_measured": true,
"flips_measured": true,
"borrowers_measured": true,
"takebacks_measured": true,
"counties_measured": true,
"dated": true,
"n_parcels_uncovered": 0
}
}
],
"terms": "<string>",
"weights": {},
"reference_point": {
"lat": 0,
"lng": 0
},
"geometry": {
"kind": "radius",
"lat": 0,
"lng": 0,
"radius_miles": 123,
"bbox": {
"[0]": 0,
"[1]": 0,
"[2]": 0,
"[3]": 0
},
"property_id": "<string>",
"zip": [
"<string>"
],
"city": "<string>"
},
"resolved_from": [
"<string>"
],
"dated": [
{
"block": "valuation",
"as_of": "<string>",
"reason": "<string>"
}
]
}
}Authorizations
API key from the developer console (starts with zpka_). Create one at https://developers.investorlift.com/get-a-key.
Path Parameters
Lender id, len_ followed by 12 hex characters, for example len_d2028f0766fc. Take it from a search hit, a ranking row's lender.id or a parcel's financing block. The id is the same in every market and stable across data refreshes. The API follows an id from an earlier registry run to the current lender, and meta.resolved_from lists it. For a retired id with no successor, the API answers 410 gone.
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, and a lender has the same id in every market it lent in. Otherwise the API uses the id's own market.
1 - 16Which rows to list. With open, the API lists open lien positions only. With recorded, it lists recorded history slots only, with duplicates as the history holds them. With both, the default, it lists one row per instrument: the open row where the instrument has one, else its recorded row.
open, recorded, both Keep loans recorded on or after this date, YYYY-MM-DD. With Accept: text/csv on api.investorlift.com you must send it (400 without it). So an export is a window of the book, never the whole of it.
Keep loans recorded on or before this date, YYYY-MM-DD. With recorded_from, one year is recorded_from=2025-01-01&recorded_to=2025-12-31.
Keep only loans of these products (comma list or repeated key): CONSTRUCTION, HELOC, OTHER.
1What the file says the loan is, read from its flags and loan type and never from the label. CONSTRUCTION: the construction flag or a "Building or Construction Loan" type. HELOC: the credit-line flag or a "Credit Line (Revolving)" type. OTHER: everything else, that is a purchase-money or refinance mortgage of any kind.
CONSTRUCTION, HELOC, OTHER Keep only loans in these term bands (comma list or repeated key): LE_24M, 25_TO_120M, 121_TO_359M, GE_360M, UNKNOWN.
1The loan term in months, from the file's term where it carries one, else from the maturity date less the recording date. LE_24M: up to 24 months, the bridge and fix-and-flip range. 25_TO_120M: 25 to 120 months. 121_TO_359M: 121 to 359 months. GE_360M: 30 years and longer. UNKNOWN: neither a term nor a maturity on file, which is most hard-money rows.
LE_24M, 25_TO_120M, 121_TO_359M, GE_360M, UNKNOWN Keep only loans whose loan_type is one of these, as the file writes it (comma list or repeated key), for example "New Conventional" or "FHA".
11 - 80Keep only loans on parcels whose property_type_category is one of these, as the assessor feed writes it (comma list or repeated key), for example "Residential".
11 - 80Keep only loans with loan_amount at or above this, in whole dollars. The filter drops unpriced loans.
0 <= x <= 9007199254740991Keep only loans with loan_amount at or below this, in whole dollars. The filter drops unpriced loans.
0 <= x <= 9007199254740991Keep only loans on parcels in this 5-digit ZIP.
^\d{5}$Keep only loans on parcels in this city, as the parcel table writes it (case does not matter).
1 - 100Keep only loans of these purposes by the deed link (comma list or repeated key): PURCHASE, NOT_PURCHASE, UNKNOWN. While the market's registry predates the deed link, the API answers 422 lenders_unavailable.
1The loan's purpose, that is if it financed a purchase, read from the recorded deeds and never from the file's label. PURCHASE: a priced deed on the parcel, $10,000 or more, is dated in the 45 days up to and including the recording date. A deed after the loan is a later sale, never this loan's purchase. NOT_PURCHASE: the deed registry covers those 45 days, the parcel has priced deeds, and none falls in them. Such a loan is a refinance, a second, a HELOC or a construction draw. UNKNOWN: the deed registry does not cover the window: its deeds or the parcel's deeds start after the loan, or the market has none.
PURCHASE, NOT_PURCHASE, UNKNOWN Keep only loans tied to a deal with these outcomes (comma list or repeated key): RESOLVED_BY_RESALE, REFINANCED, OPEN, FORECLOSED, UNKNOWN. A loan tied to no deal has no outcome, and the filter drops it. While the registry predates the deal link, the API answers 422 lenders_unavailable.
1What became of a loan tied to a deal: a performance proxy read from the deed chain, never from a delinquency record or payment history. RESOLVED_BY_RESALE is a priced deed on the parcel after the loan, and REFINANCED is a later mortgage on it in either table before any resale. OPEN is an open lien position at the slice date and nothing later, and UNKNOWN is none of these because the chain runs out. FORECLOSED: a take-back deed on the parcel more than 90 days after the loan's recording, before any priced resale and any later mortgage. A take-back deed is a trustee's deed, a sheriff's deed or a deed in lieu, and the foreclosed block on the loan row carries it. A shorter gap is the auction buyer's own deed, not a foreclosure of this loan.
RESOLVED_BY_RESALE, REFINANCED, OPEN, FORECLOSED, UNKNOWN Keep only loans tied to a deal of these kinds (comma list or repeated key): flip, wholesale, hold, long_hold, other, build. While the registry predates the deal link, the API answers 422 lenders_unavailable.
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 loans whose main borrower resolves to this registered investor: the investor's loans from this lender. The id is inv_ followed by 12 hex characters, the loan row's investor_id. While the registry predates the borrower match, the API answers 422 lenders_unavailable.
^inv_[0-9a-f]{12}$true keeps only loans followed by a take-back deed on the parcel (foreclosed set on the row). false keeps the rest. Default: every loan. A take-back deed is a trustee's deed, a sheriff's deed or a deed in lieu after the recording. While the registry predates the take-back join, the API answers 422 lenders_unavailable.
true, false Keep only loans on parcels in this H3 cell. Send the index as a hex string at res 7 or 8, for example 8848eba59dfffff, as GET /v1/lenders/{id}/cells and /v1/deals/cells serve them. The API reads the resolution off the index (400 validation_error, code invalid_cell, otherwise). Do not send it with zip, city or a geometry (400 geography_conflict). While the registry predates the place rankings, the API answers 422 lenders_unavailable.
^[0-9a-f]{15}$Point latitude (with lng). With radius_miles it is the geometry. The API resolves the circle to the H3 res-8 cells whose centre lies inside it, so its edge is a hex boundary. Do not send it with zip, city or county (400 geography_conflict). On a registry built before the place rankings, the API answers 422 lenders_unavailable.
-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}$Row order of a lender's loans: recorded_desc, the default, puts the newest recording first and undated rows last. With recorded_asc, the oldest recording comes first. With amount_desc, the largest loan amount comes first and unpriced rows last. This sort is slower on the largest lenders, which have no index in that order.
recorded_desc, recorded_asc, amount_desc Page size, 1-500 (default 100). Ignored by CSV.
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 - 4096true refuses the request with 422 dated_refused while the registry's source, the financing slice, is a dated snapshot. The default false serves it, and meta.dated[] carries the lenders and financing blocks.
true, false Response
The lender's loans in one market, one page in the requested sort. With Accept: text/csv every filtered row as a CSV file. On api.investorlift.com the CSV needs a recorded_from window.
The lender's loans in one 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?