Skip to main content
GET
List every loan of one lender

Authorizations

Authorization
string
header
required

API key from the developer console (starts with zpka_). Create one at https://developers.investorlift.com/get-a-key.

Path Parameters

id
string
required

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
string

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.

Required string length: 1 - 16
source
enum<string>
default:both

Which 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.

Available options:
open,
recorded,
both
recorded_from
string

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.

recorded_to
string

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.

product
enum<string>[]

Keep only loans of these products (comma list or repeated key): CONSTRUCTION, HELOC, OTHER.

Minimum array length: 1

What 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.

Available options:
CONSTRUCTION,
HELOC,
OTHER
term_band
enum<string>[]

Keep only loans in these term bands (comma list or repeated key): LE_24M, 25_TO_120M, 121_TO_359M, GE_360M, UNKNOWN.

Minimum array length: 1

The 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.

Available options:
LE_24M,
25_TO_120M,
121_TO_359M,
GE_360M,
UNKNOWN
loan_type
string[]

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".

Minimum array length: 1
Required string length: 1 - 80
property_type
string[]

Keep 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".

Minimum array length: 1
Required string length: 1 - 80
amount_min
integer

Keep only loans with loan_amount at or above this, in whole dollars. The filter drops unpriced loans.

Required range: 0 <= x <= 9007199254740991
amount_max
integer

Keep only loans with loan_amount at or below this, in whole dollars. The filter drops unpriced loans.

Required range: 0 <= x <= 9007199254740991
zip
string

Keep only loans on parcels in this 5-digit ZIP.

Pattern: ^\d{5}$
city
string

Keep only loans on parcels in this city, as the parcel table writes it (case does not matter).

Required string length: 1 - 100
purpose
enum<string>[]

Keep 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.

Minimum array length: 1

The 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.

Available options:
PURCHASE,
NOT_PURCHASE,
UNKNOWN
outcome
enum<string>[]

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.

Minimum array length: 1

What 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.

Available options:
RESOLVED_BY_RESALE,
REFINANCED,
OPEN,
FORECLOSED,
UNKNOWN
deal_kind
enum<string>[]

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.

Minimum array length: 1

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
investor_id
string

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.

Pattern: ^inv_[0-9a-f]{12}$
foreclosed
enum<string>

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.

Available options:
true,
false
cell
string

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.

Pattern: ^[0-9a-f]{15}$
lat
number

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.

Required range: -90 <= x <= 90
lng
number

Point longitude (with lat).

Required range: -180 <= x <= 180
radius_miles
number

Search 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.

Required range: 0.25 <= x <= 20
bbox
string

Viewport 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.

property_id
string

Parcel geometry: search around the centre of that parcel, with radius_miles. Not allowed with lat, lng or bbox.

Pattern: ^prop_[0-9a-f]{32}$
sort
enum<string>
default:recorded_desc

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.

Available options:
recorded_desc,
recorded_asc,
amount_desc
limit
integer
default:100

Page size, 1-500 (default 100). Ignored by CSV.

Required range: 1 <= x <= 500
cursor
string

Opaque 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.

Required string length: 1 - 4096
require_current
enum<string>
default:false

true 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.

Available options:
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.

data
object[]
required

The rows of this page.

page
object
required

Pagination: the page size, the rows returned and the cursor for the next page. Paged lists carry no total. The summary block does.

meta
object
required

Response metadata: when the API produced it, which markets it covers, and how fresh they are.