Skip to main content
GET
List the borrowers of one lender
Early access: while the developer tier is in beta, the API serves this route to Investorlift’s team and trusted partners. Investorlift will restrict the route further before it opens to every key.
A page of lender borrower rows. Every row has 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 follows investor.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_key is a salted hash of the folded name, the same on every lender’s rows. The API serves a company’s name. It does not serve a person’s name on this host (Contact data).
  • period picks the count. 24m (the default) sorts and filters by the loans of the 24 months to the slice date and walks an index. all reads the all-time count and sorts the lender’s whole borrower set in memory. That sort is slower on the largest lenders.
  • The filters. q keeps the company names that carry every word of the query, and a person never matches. registered_only keeps the borrowers that resolve to a registered investor. churned keeps those who moved on, and false keeps the rest. investor_kind keeps those whose investor carries any of the kinds. min_loans keeps those with at least that many loans in the period.
  • The sorts. loans_desc (the default), volume_desc, last_loan_desc and churned_first. Ties end on borrower_key, so a page is stable.
  • Churn is a lower bound. The API reads churned, churn_measured and moved_to_lender_id from 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, and 400 market_required says so. A market= 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_share on the profile).
  • Every row is dated (meta.dated[]). The as_of is the slice date in meta.coverage[].lenders.as_of. With require_current=true the API answers 422 dated_refused.
  • The API answers 400 invalid_id without the len_ prefix, and 404 for an unknown id. It answers 422 lenders_unavailable where the market has no published lender registry, or where the registry is older than the borrower match. It answers 400 invalid_cursor for 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_from and the current lender’s rows. When the registry retired it, the API answers 410 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.
Who is this lender? reads the borrowers and the margins 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
period
enum<string>
default:24m

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

Available options:
24m,
all
q
string

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

Required string length: 1 - 200
registered_only
enum<string>

true keeps only borrowers that resolve to a registered investor (investor not null). false keeps only the rest. Default: every borrower.

Available options:
true,
false
churned
enum<string>

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.

Available options:
true,
false
investor_kind
enum<string>[]

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.

Minimum array length: 1

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

Available options:
FLIPPER,
WHOLESALER,
LANDLORD,
BUILDER,
IBUYER
min_loans
integer
default:1

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.

Required range: 1 <= x <= 9007199254740991
sort
enum<string>
default:loans_desc

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

Available options:
loans_desc,
volume_desc,
last_loan_desc,
churned_first
limit
integer
default:100

Page size, 1-500 (default 100).

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 borrowers in one market, one page in the requested sort.

The lender's borrowers 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.