Skip to main content
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.
One row of GET /v1/lenders/{id}/borrowers: one borrower of one lender, counted over every instrument of the lender that names the borrower.

A borrower is a key

borrower_key is 12 hex characters, hashed from the borrower’s folded name with the dataset’s salt. It is the same key on every lender’s rows and in every market. It is never a name, it is not reversible, and it is stable across data refreshes. You compare borrowers across lenders with this key: other_lender_ids[] and, since 0.19.0, other_lenders[] on this row, and competing_lenders on the profile. The loan row carries the same value in borrower_keys[]. Where the borrower comes from: the names a recorded mortgage carries. On an open lien that names none, the borrower is the parcel’s owner of record (borrower_match: OWNER_OF_RECORD). That applies when the owner held the parcel on the recording date and no sale followed. borrower_match says how the registry resolved the key:
  • DEAL: the deed link ties the loan to a deal whose investor has a member with the key.
  • ENTITY_NAME or PERSON_NAME: a company or a person that is a member of exactly one registered investor.
  • PARTY: a name on a recorded deed that belongs to no investor.
  • MORTGAGE_ONLY: a name on no deed.
  • OWNER_OF_RECORD: the parcel’s owner of record, as above.
investor is the registered investor the key belongs to, as a stub. The stub carries the id, the registry name, the kinds, the scale and the size. Its id opens the investor profile. The profile’s financing block lists every lender the investor borrows from.

What the counts are

  • n_loans, n_loans_12m and n_loans_24m count the lender’s instruments that carry the key, once per instrument across the open-lien and recorded-history tables. volume_24m sums the priced ones of the window, with amounts above $5,000,000 left out. The recorded history names borrowers and sees about one open loan in five. The open-lien table names none. So a borrower is known on a minority of the book, and every count here is a floor. borrowers.borrower_measured_share on the profile says how much of the book.
  • first_loan_on and last_loan_on are the oldest and newest recording. The first is a floor of a history that keeps five slots per parcel.
  • n_lenders_used_24m and other_lender_ids[] are the lenders the borrower took a loan from in the window. The count includes this lender, and the list excludes it. The list has most loans first, at most ten. other_lenders[] (since 0.19.0) is the same list with each lender as a stub (id, name, lender_class, is_hard_money), in the same order. The API reads the stubs from the registry at request time. An id the registry no longer serves stays in the id array and is absent here.
  • On a registry built before the borrower match, the route itself answers 422 lenders_unavailable. So the API serves neither array there.
  • n_deals_financed counts the registered investor’s purchases whose purchase loan was this lender’s and named this borrower.

Churn is a lower bound

churned is true when three conditions hold. The borrower’s last loan here is 12 to 36 months before as_of. A later loan from another lender is in the recorded history. This lender holds no open lien recorded after it on any parcel of the borrower’s investor group. moved_to_lender_id is the lender of the first later loan elsewhere. On a feed that sees one loan in five, that is a lower bound of leaving and an upper bound of nothing. A borrower who stayed reads as gone only when this lender’s later loan is in neither table. A borrower who left can read as one who stayed. churn_measured is false when the group holds open lien positions the history does not carry. An example is a bridge borrower whose later loans the history cannot see. Then the history cannot show churn, and churned is never true there. Every row is dated: as_of is the registry’s slice date, and meta.dated[] on the response names the lenders and financing blocks.

Contact data

name is the borrower’s name as the recorded mortgages write it: upper case, the most frequent spelling. When the borrower is a company (is_entity), the name is a business name on a recorded instrument, and the API serves it to every key. When the borrower is a person (is_person) or a trust, this host does not serve the name. This host also does not serve party_key, the folded name the registry keys people by. Both are null, with contact_redacted: true. The API serves the investor’s registry name in investor.name as the registry serves it on every deal row. A person’s name is never on a list result over MCP.

One borrower of the lender: the key, the name, the registered investor behind it, the loans from this lender by window, the other lenders used. This host serves a company's name. It does not serve a person's name. The row also says if the borrower moved on, as a lower bound. Over MCP a person's name is never on a list.

market
string
required

Market code, for example phx.

lender_id
string
required

The lender: equals the path id on this route.

Pattern: ^len_[0-9a-f]{12}$
borrower_key
string
required

Borrower key: 12 hex characters hashed from the borrower's folded name with the dataset salt. The same key appears on every lender's rows and in every market. It is not a name and not reversible, and it is stable across data refreshes. Use the key to compare borrowers across lenders.

Pattern: ^[0-9a-f]{12}$
name
string | null
required

The borrower's name as the recorded mortgages write it, upper case, the most frequent spelling. For a person it is SURNAME GIVEN, the recorder's order the deeds use, for example "RIVERA DANA". For a company it is the name as recorded, for example "SAGUARO HOLDINGS LLC". When the borrower is a company (is_entity), this is a business name on a recorded instrument, and the API serves it to every key. When the borrower is a person (is_person) or a trust, the name is null on this host. Null when the file names none.

investor
object | null
required

The registered investor the borrower belongs to. The API serves it to every key. Null when the key resolves to none.

is_entity
boolean
required

True when the name reads as a company: an LLC, a corporation, a partnership or a similar entity. The API then serves the name to every key. A trust is neither this nor a person.

is_person
boolean
required

True when the name reads as a person's: the name is then null on this host.

borrower_match
enum<string>
required

How the registry resolved the borrower, by the first rule that applied. DEAL: the loan has a deal whose investor has a member with the borrower's key, or the deal's investor when no key matched. ENTITY_NAME: the key is an entity member of exactly one investor, and PERSON_NAME means a person member of exactly one investor. PARTY: the key is on a recorded deed but belongs to no investor, while MORTGAGE_ONLY means the key is on no deed. OWNER_OF_RECORD: an open lien that names no borrower resolves to the parcel's owner of record. The registry takes the owner only when the owner held the parcel on the recording date and no sale followed.

Available options:
DEAL,
ENTITY_NAME,
PERSON_NAME,
PARTY,
MORTGAGE_ONLY,
OWNER_OF_RECORD
n_loans
integer
required

Loans from this lender carrying this borrower, all time, counted once per instrument.

Required range: -9007199254740991 <= x <= 9007199254740991
n_loans_12m
integer
required

The same over the 12 months ending on as_of (365 days, inclusive), as of as_of, the slice date, never the clock.

Required range: -9007199254740991 <= x <= 9007199254740991
n_loans_24m
integer
required

The same over the 24 months ending on as_of (730 days, inclusive), as of as_of, the slice date, never the clock: what period=24m counts and sorts by.

Required range: -9007199254740991 <= x <= 9007199254740991
volume_24m
integer
required

Sum of the loan amounts of those in the 24 months ending on as_of (730 days, inclusive), as of as_of, the slice date, never the clock, whole dollars, with amounts above $5,000,000 left out. 0 when none carries a price.

Required range: -9007199254740991 <= x <= 9007199254740991
first_loan_on
string | null
required

The recording date of the borrower's oldest loan from this lender, YYYY-MM-DD. A floor, because the history keeps 5 slots per parcel. Null when none is dated.

last_loan_on
string | null
required

The recording date of the borrower's newest loan from this lender, YYYY-MM-DD. Null when none is dated.

n_lenders_used_24m
integer
required

Distinct lenders, this one included, the borrower took a loan from in the 24 months ending on as_of (730 days, inclusive), as of as_of, the slice date, never the clock.

Required range: -9007199254740991 <= x <= 9007199254740991
other_lender_ids
string[]
required

The other lenders the borrower took a loan from in the 24 months ending on as_of (730 days, inclusive), as of as_of, the slice date, never the clock, most loans first, at most 10. Empty when none. Each is the key to GET /v1/lenders/{id}.

Lender id: len_ followed by 12 hex characters, for example len_3f9a1c27b4e0. The registry mints the id from the lender's folded name, so the same lender carries the same id in every market, stable across data refreshes. A hand-kept dictionary row can merge two spellings into one lender. The API then follows the old id from the earlier registry run to that lender and lists it in meta.resolved_from. A retired id with no successor answers 410 gone. Store the whole id, prefix included, as the identity.

Pattern: ^len_[0-9a-f]{12}$
other_lenders
object[]
required

The same lenders as other_lender_ids, in the same order, each with its display name, class and hard-money flag. The API reads them from the registry at request time and leaves out a lender the market no longer serves. Empty when none.

churned
boolean
required

True when the borrower's last loan here is 12 to 36 months before as_of and the recorded history holds a later loan from another lender. A third condition: this lender holds no open lien recorded after that later loan on any parcel of the borrower's investor group. A lower bound of leaving, because the history sees one loan in five. A borrower who stayed can read as gone only when this lender's later loan is in neither table. A borrower who left can read as staying. Never true when churn_measured is false.

churn_measured
boolean
required

False when the borrower's investor group holds open lien positions the recorded history does not carry. That is a bridge borrower whose loans the history misses: the registry cannot read churn, and churned is false. True otherwise.

moved_to_lender_id
string | null
required

When churned is true, the lender of the borrower's first later loan elsewhere. Null otherwise.

Pattern: ^len_[0-9a-f]{12}$
n_deals_financed
integer
required

Deals (purchases by a registered investor) whose purchase loan is this lender's and names this borrower, all time.

Required range: -9007199254740991 <= x <= 9007199254740991
as_of
string
required

The slice date, YYYY-MM-DD. The API measures the counts at it. Dated: see meta.dated[].

dated
boolean
required

True while the datasets are not in the current delivery, so the row is a snapshot at as_of.