curl --request GET \
--url https://api.investorlift.com/v1/lenders/{id}/borrowers \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.investorlift.com/v1/lenders/{id}/borrowers', 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}/borrowers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)List one lender's borrowers
Every borrower of a lender in one market, most loans first, with the investor behind each, the other lenders used and who moved on.
curl --request GET \
--url https://api.investorlift.com/v1/lenders/{id}/borrowers \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.investorlift.com/v1/lenders/{id}/borrowers', 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}/borrowers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)lender_id equal to the path
id. The rows say who borrows from this lender, how often, and which registered investor each one is. They also say who
else funds them, and who moved on.
Use it when
The lender card’s borrowers table, the “which investors does this lender fund” question, and the competitor’s book. A lender customer reads a rival’s borrowers by key. Then the customer followsinvestor.id to the
investor profile, whose financing block lists every lender the investor
uses. The customer follows other_lenders[] to the lenders they also borrow from. Since 0.19.0 each entry carries its
id, name, class and hard-money flag, and other_lender_ids[] stays beside it.
For the loans behind a borrower, use GET /v1/lenders/{id}/loans with
investor_id=. For a short view of the ten largest borrowers and the competing lenders, read the profile’s
borrowers block.
Read the response
- One row per borrower key.
borrower_keyis a salted hash of the folded name, the same on every lender’s rows. The API serves a company’sname. It does not serve a person’s name on this host (Contact data). periodpicks the count.24m(the default) sorts and filters by the loans of the 24 months to the slice date and walks an index.allreads the all-time count and sorts the lender’s whole borrower set in memory. That sort is slower on the largest lenders.- The filters.
qkeeps the company names that carry every word of the query, and a person never matches.registered_onlykeeps the borrowers that resolve to a registered investor.churnedkeeps those who moved on, andfalsekeeps the rest.investor_kindkeeps those whose investor carries any of the kinds.min_loanskeeps those with at least that many loans in the period. - The sorts.
loans_desc(the default),volume_desc,last_loan_descandchurned_first. Ties end onborrower_key, so a page is stable. - Churn is a lower bound. The API reads
churned,churn_measuredandmoved_to_lender_idfrom a feed that sees one loan in five: Churn is a lower bound.
Gotchas
market=is necessary when the lender is in more than one loaded market, and400 market_requiredsays so. Amarket=the lender has no profile in is a 404.- Every count is a floor. The recorded history names borrowers and sees about one open loan in five. The open-lien
table names none. So most of a lender’s book has no borrower at all (
borrowers.borrower_measured_shareon the profile). - Every row is dated (
meta.dated[]). Theas_ofis the slice date inmeta.coverage[].lenders.as_of. Withrequire_current=truethe API answers422 dated_refused. - The API answers
400 invalid_idwithout thelen_prefix, and 404 for an unknown id. It answers422 lenders_unavailablewhere the market has no published lender registry, or where the registry is older than the borrower match. It answers400 invalid_cursorfor a cursor from another query or an older dataset. - The API follows old ids as on the profile route (since 0.17.0). When the registry merged the id, the API answers 200
with
meta.resolved_fromand the current lender’s rows. When the registry retired it, the API answers410 gone. When the registry never issued it, the API answers 404 (Retired ids). - This route has no CSV. Page the JSON list (Give me a spreadsheet). The one public CSV is the loans of a lender.
Related
Who is this lender? reads the borrowers and the margins of one lender.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 count min_loans and the loans_desc sort read. 24m, the default, counts loans from this lender in the 24 months ending on the slice date, and the API walks it through an index. The value all counts every loan on record, and the API sorts it in memory, slower on the largest lenders.
24m, all An entity name to look for among the borrowers, as the recorded mortgages write it ("Saguaro Holdings", "SAGUARO HOLDINGS LLC"). Every word of the query of 3 or more characters must be a word of the borrower's name. The match ignores LLC, INC and similar suffixes. It matches company borrowers alone: a person's name never matches, on any key. Send at least 3 letters or digits (400 otherwise).
1 - 200true keeps only borrowers that resolve to a registered investor (investor not null). false keeps only the rest. Default: every borrower.
true, false true keeps only churned borrowers (churned true). false keeps only the rest. Default: every borrower. A churned borrower took a later loan elsewhere and none here since, a lower bound.
true, false Keep only borrowers whose registered investor carries at least one of these kinds (comma list or repeated key). The filter drops borrowers without an investor.
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 Keep only borrowers with at least this many loans from this lender in the period, default 1. The count is n_loans_24m under period=24m and n_loans under period=all.
1 <= x <= 9007199254740991Row order of a lender's borrowers: loans_desc, the default, puts the most loans from this lender in the period first. With volume_desc, the largest loan total in the period comes first. With last_loan_desc, the newest loan from this lender comes first. With churned_first, borrowers who moved to another lender come first, then the rest by loans. Ties end on borrower_key.
loans_desc, volume_desc, last_loan_desc, churned_first Page size, 1-500 (default 100).
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 borrowers in one market, one page in the requested sort.
The lender's borrowers 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?