Skip to main content
GET
List Investorlift listings around a location with what the deeds show
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.
Each row is one Investorlift listing. The row says which company listed it, when and for how much, if a recorded deed closed it, and who bought it.

Use it when

The Investorlift layer of the map and the table beside it: every listing, whatever its status in the app, with the deed’s verdict beside it.

Read the response

  • verification is the verdict and outcome is the detail. outcome_text is the name-free sentence to show. The listing’s status in the Investorlift app has no part in the verdict: the deed is the evidence.
  • The row names buyer only when the deed names a registry investor (buyer.id set) or an unregistered company. buyer.tier describes a person, a trust or an owner-occupant, and the row never names them. registry_deal_id is the Deal that the API serves the closing deed as.
  • confidence, time_fit, deed.chain_certain, lister_attribution and retail_signals[] are the uncertainty. Show them as text, never as a colour alone. In lister_attribution, SHARED(n) means n companies listed the house.
  • meta.geometry echoes the location that ran. The envelope describes it.
  • deed.price is the recorded consideration, or an MLS-derived price where the state does not record one, and price_basis says which. price_ratio is the deed price divided by the asking price. The API never serves the wholesaler’s own purchase price and spread.
  • property is null on a hidden-address listing with no closing deed yet. Such rows never match a geometry and appear only under their wholesaler.
  • summary counts the whole location after the filters. n_listings is the number of rows over every page.
  • The location is a point with radius_miles, a bbox, a property_id, or a place. A place is zip, as a comma list or a repeated key, or city. The city is the parcel’s postal city as the county records it. The API ignores letter case. lat + lng beside a bbox or a place is the reference point for distance_miles only. For a ZIP or a city that no loaded market’s parcels carry, the API answers 422 outside_coverage and names it.

Gotchas

  • primary_only defaults to true: the list shows a deed shared by several listings of the parcel once, and drops the SUPERSEDED duplicates. Pass primary_only=false for every row.
  • closed_after and closed_before drop rows without a deed. asking_min and asking_max drop unpriced rows. sort=closed_on (the default) puts rows without a deed last.
  • This route has no CSV on api.investorlift.com. Page the JSON list instead, as Give me a spreadsheet shows. The one public CSV is the loans of a lender.
  • In a market with no published wholesale tables, the API answers 422 wholesale_unavailable.
  • For buyer_investor_id with an old id, the API follows the id to the current investor and echoes the old id in meta.resolved_from. For a retired id, the API answers 410 gone.
Which Investorlift listings closed?.

Authorizations

Authorization
string
header
required

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

Query Parameters

lat
number

Point latitude (with lng). With radius_miles it is the search geometry. With bbox it is the reference point only.

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}$
zip
string[]

Place geometry: the parcels of these 5-digit ZIP codes, as a comma list or a repeated key, up to 50. On the deal and investor routes the Free and Starter plans take exactly one ZIP, and more is 403 plan_limit. You can add lat + lng as the reference point for distances. Not with radius_miles, bbox, property_id or city. A ZIP that no parcel of a loaded market carries is 422 outside_coverage (zips_unknown in the body).

Required array length: 1 - 50 elements
Pattern: ^\d{5}$
city
string

Place geometry: the parcels whose postal city is this one, as the county records it ("Scottsdale"). Case does not matter: the API compares the value folded upper case. Never the short-term rental jurisdiction (meta.coverage[].str.jurisdictions[]). You can add lat + lng as the reference point, but not radius_miles, bbox, property_id or zip. On the deal and investor routes of the Free and Starter plans a city-wide search is 403 plan_limit. A city that no parcel of a loaded market carries is 422 outside_coverage.

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

Outcomes to keep (comma list or repeated key). Default: every outcome.

Minimum array length: 1

What the county deeds record for the listing, in detail. The one-word verdict is verification. ASSIGNED: one deed from the homeowner to the buyer, and the listing company is not on title, so a contract assignment. DOUBLE_CLOSED: two chained deeds 0 to 14 days apart, with the company or its buyer in the middle. LISTER_HELD_THEN_SOLD: the company took title and resold within 90 days. LISTER_SOLD_FROM_INVENTORY: the company already owned the house and sold it. SOLD_OFF_MARKET_GRANTOR: one deed from a seller who is neither the homeowner of record nor the company, so an unrecorded step came before it. SOLD_TO_OWNER_OCCUPANT: the buyer moved in, so not an investor sale. FAILED_THEN_RETAIL_MLS: the homeowner sold on the MLS instead. DISTRESSED_TRANSFER: a sheriff's, trustee's or REO deed. LATE_TRANSFER: a deed 180 to 400 days after the listing that nothing ties to it. NO_TRANSFER_400: no deed within 400 days. NO_DEED_120: no deed by the deed data end, 120 to 400 days after the listing, so provisional. PENDING: the company listed the house fewer than 120 days before the deed data end, and no deed exists yet. SUPERSEDED: another Investorlift listing of the same parcel holds the credit for the deed. AMBIGUOUS_DEEDS: two or more unrelated sales that the rules cannot order.

Available options:
ASSIGNED,
DOUBLE_CLOSED,
LISTER_HELD_THEN_SOLD,
LISTER_SOLD_FROM_INVENTORY,
SOLD_OFF_MARKET_GRANTOR,
SOLD_TO_OWNER_OCCUPANT,
FAILED_THEN_RETAIL_MLS,
DISTRESSED_TRANSFER,
LATE_TRANSFER,
NO_TRANSFER_400,
NO_DEED_120,
PENDING,
SUPERSEDED,
AMBIGUOUS_DEEDS
verification
enum<string>[]

Verdicts to keep (comma list or repeated key): CONFIRMED for verified transactions, OPEN for listings without a closing deed by the deed data_end. Default: every verdict.

Minimum array length: 1

The API derives the one-word verdict of the deeds on the listing from outcome alone, and the Investorlift status plays no part. CONFIRMED: a recorded deed closed it to a buyer, so a verified wholesale transaction. RETAIL: it closed, but to an owner-occupant or through the MLS, so not an investor sale. OPEN: the deeds record no transfer yet, up to the deed data_end. NONE: no transfer within 400 days, a distressed deed, or a transfer the rules cannot tie to this listing. NONE also when the credit went to another listing of the parcel.

Available options:
CONFIRMED,
RETAIL,
OPEN,
NONE
buyer_tier
enum<string>[]

Buyer tiers to keep (comma list or repeated key). Default: every tier.

Minimum array length: 1

Who the buyer on the closing deed is, strongest first. REGISTRY_STRONG: a registry investor at STRONG or PROBABLE confidence, named, with an investor id. REGISTRY_WEAK: a registry investor at WEAK confidence, named, with an id. IL_BUYER_CONFIRMED: not in the registry, but the accepted offer's buyer or an Investorlift buyer account keys to the deed. On that tier the API names an entity and never a person. ENTITY_UNREGISTERED: an LLC or corporation not yet in the registry, often a fresh single-deed entity, named, no id. PERSON_ABSENTEE: a person whose mailing address is not the house, never named: show "individual buyer, not a known investor". OWNER_OCCUPANT: the buyer moved in, never named. UNRESOLVED: no closing deed. The first three count as a known investor.

Available options:
REGISTRY_STRONG,
REGISTRY_WEAK,
IL_BUYER_CONFIRMED,
ENTITY_UNREGISTERED,
PERSON_ABSENTEE,
OWNER_OCCUPANT,
UNRESOLVED
known_investor
enum<string>

Keep only listings bought by a known investor (buyer_tier REGISTRY_STRONG, REGISTRY_WEAK or IL_BUYER_CONFIRMED).

Available options:
true,
false
listed_after
string

Keep listings published on or after this date.

listed_before
string

Keep listings published on or before this date.

closed_after
string

Keep listings whose closing deed is on or after this date. Once you set closed_after or closed_before, the list drops rows without a deed.

closed_before
string

Keep listings whose closing deed is on or before this date.

asking_min
integer

Minimum asking price, inclusive, whole dollars. Once you set asking_min or asking_max, the list drops unpriced rows.

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

Maximum asking price, inclusive, whole dollars.

Required range: 0 <= x <= 9007199254740991
primary_only
enum<string>
default:true

Default true: drop SUPERSEDED rows and the non-credited members of a SHARED(n) group, so the list shows one closing deed once. The filter does not touch rows without a closing deed, so the list keeps every listing. primary_only=false lists every row, duplicates included.

Available options:
true,
false
sort
enum<string>

The row order. The default closed_on puts the newest closing deed first, rows without a deed last, then the newest listing first. With listed_on, the newest listing comes first. With asking_price, the highest asking price comes first and unpriced rows last. Every sort breaks ties on the listing id.

Available options:
closed_on,
listed_on,
asking_price
limit
integer
default:500

Page size, 1-500 (default 500).

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

Scope the rows to one listing company.

Pattern: ^wsr_[0-9a-f]{12}$
buyer_investor_id
string

Scope the rows to listings bought by one registry investor, the buyer on the closing deed. The API follows an old id from an earlier data refresh to the investor id that replaced it, and echoes the old id in meta.resolved_from. A retired id answers 410 gone.

Pattern: ^inv_[0-9a-f]{12}$

Response

One page of Investorlift listings inside the geometry after the filters, in the requested sort, with the summary and the cursor for the next page.

Investorlift listings inside the geometry after the filters, one page, with the counts over the whole geometry.

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.

summary
object
required

Counts for the whole geometry after the filters (not just the page).