> ## Documentation Index
> Fetch the complete documentation index at: https://developers.investorlift.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Which Investorlift listings closed?

> Every Investorlift listing as a wholesale transaction judged by the county deeds.

<Note>
  Early access: while the developer tier is in beta, the API serves the routes on this page to Investorlift's team and trusted partners. Investorlift will restrict them further before they open to every key.
</Note>

Every house listed on Investorlift is on file as a wholesale transaction (0.4.0). The county deeds say its outcome.
**The API never reads the listing's status in the app and never serves it.**

## Around a location

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.investorlift.com/v1/wholesale-listings?lat=33.476917&lng=-111.920385&radius_miles=2&verification=CONFIRMED&known_investor=true" \
    -H "Authorization: Bearer $GM_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const params = new URLSearchParams({
    lat: "33.476917",
    lng: "-111.920385",
    radius_miles: "2",
    verification: "CONFIRMED",
    known_investor: "true",
  });
  const res = await fetch(`https://api.investorlift.com/v1/wholesale-listings?${params}`, {
    headers: { Authorization: `Bearer ${process.env.GM_API_KEY}` },
  });
  if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
  const body = await res.json();
  ```

  ```python Python theme={null}
  import os

  import requests

  r = requests.get(
      "https://api.investorlift.com/v1/wholesale-listings",
      params={
          "lat": 33.476917,
          "lng": -111.920385,
          "radius_miles": 2,
          "verification": "CONFIRMED",
          "known_investor": "true",
      },
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

Each row is one listing:

<ResponseField name="wholesaler" type="object">
  The listing company. The API always names it, because it is a business.
</ResponseField>

<ResponseField name="listing" type="object">
  The published date, the asking price, the ARV estimate and condition the company gave, and the accepted offer
  date on confirmed rows.
</ResponseField>

<ResponseField name="verification" type="string">
  The verdict. `CONFIRMED`, `RETAIL`, `OPEN` or `NONE`. `outcome` is the detail: `ASSIGNED`, `DOUBLE_CLOSED`,
  `LISTER_HELD_THEN_SOLD`, `SOLD_TO_OWNER_OCCUPANT`, `NO_TRANSFER_400`, `PENDING` and the rest.
  `outcome_text` is the name-free sentence to show.
</ResponseField>

<ResponseField name="buyer" type="object">
  The grantee on the closing deed. When the grantee is a registry investor, the block carries `id` and `name`,
  whatever its kind. For a company not yet in the registry, the block carries `name` alone. For a person, a trust
  or an owner-occupant outside the registry, the block carries neither. `tier` says which of those it is.
</ResponseField>

<ResponseField name="deed" type="object">
  The closing date, the deed pattern, the recorded price and its ratio to the asking price.
</ResponseField>

<ResponseField name="registry_deal_id" type="string">
  The deal row the API serves the closing deed as, so you can open it like any other deal.
</ResponseField>

<ResponseField name="confidence, time_fit, deed.chain_certain, lister_attribution, retail_signals[]" type="mixed">
  The uncertainty. **Show them as text, never as a colour alone.**
</ResponseField>

`summary` counts the whole geometry by outcome, verdict and buyer tier. The default `primary_only=true` lists each
closing deed once when several listings of the parcel can claim it.

## From there

One listing, the same row:

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.investorlift.com/v1/wholesale-listings/wl_9a400cf479a21c309a0526e1fd25f1d5" \
    -H "Authorization: Bearer $GM_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const res = await fetch("https://api.investorlift.com/v1/wholesale-listings/wl_9a400cf479a21c309a0526e1fd25f1d5", {
    headers: { Authorization: `Bearer ${process.env.GM_API_KEY}` },
  });
  if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
  const body = await res.json();
  ```

  ```python Python theme={null}
  import os

  import requests

  r = requests.get(
      "https://api.investorlift.com/v1/wholesale-listings/wl_9a400cf479a21c309a0526e1fd25f1d5",
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

The listing company, by name, brand or entity name:

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.investorlift.com/v1/wholesalers/search?q=home%20team" \
    -H "Authorization: Bearer $GM_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const params = new URLSearchParams({ q: "home team" });
  const res = await fetch(`https://api.investorlift.com/v1/wholesalers/search?${params}`, {
    headers: { Authorization: `Bearer ${process.env.GM_API_KEY}` },
  });
  if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
  const body = await res.json();
  ```

  ```python Python theme={null}
  import os

  import requests

  r = requests.get(
      "https://api.investorlift.com/v1/wholesalers/search",
      params={"q": "home team"},
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

Its profile, then its listings. The profile carries its verified transactions, how fast it closes, and the investors
who buy from it most:

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.investorlift.com/v1/wholesalers/wsr_37e2a3dcdf4c" \
    -H "Authorization: Bearer $GM_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const res = await fetch("https://api.investorlift.com/v1/wholesalers/wsr_37e2a3dcdf4c", {
    headers: { Authorization: `Bearer ${process.env.GM_API_KEY}` },
  });
  if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
  const body = await res.json();
  ```

  ```python Python theme={null}
  import os

  import requests

  r = requests.get(
      "https://api.investorlift.com/v1/wholesalers/wsr_37e2a3dcdf4c",
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.investorlift.com/v1/wholesalers/wsr_37e2a3dcdf4c/listings" \
    -H "Authorization: Bearer $GM_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const res = await fetch("https://api.investorlift.com/v1/wholesalers/wsr_37e2a3dcdf4c/listings", {
    headers: { Authorization: `Bearer ${process.env.GM_API_KEY}` },
  });
  if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
  const body = await res.json();
  ```

  ```python Python theme={null}
  import os

  import requests

  r = requests.get(
      "https://api.investorlift.com/v1/wholesalers/wsr_37e2a3dcdf4c/listings",
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

Every listing one investor bought, per the deeds, and the same purchases as deal rows:

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.investorlift.com/v1/investors/inv_0a20a550f33b/wholesale-purchases" \
    -H "Authorization: Bearer $GM_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const res = await fetch("https://api.investorlift.com/v1/investors/inv_0a20a550f33b/wholesale-purchases", {
    headers: { Authorization: `Bearer ${process.env.GM_API_KEY}` },
  });
  if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
  const body = await res.json();
  ```

  ```python Python theme={null}
  import os

  import requests

  r = requests.get(
      "https://api.investorlift.com/v1/investors/inv_0a20a550f33b/wholesale-purchases",
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.investorlift.com/v1/investors/inv_0a20a550f33b/deals?source=investorlift" \
    -H "Authorization: Bearer $GM_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const params = new URLSearchParams({ source: "investorlift" });
  const res = await fetch(`https://api.investorlift.com/v1/investors/inv_0a20a550f33b/deals?${params}`, {
    headers: { Authorization: `Bearer ${process.env.GM_API_KEY}` },
  });
  if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
  const body = await res.json();
  ```

  ```python Python theme={null}
  import os

  import requests

  r = requests.get(
      "https://api.investorlift.com/v1/investors/inv_0a20a550f33b/deals",
      params={"source": "investorlift"},
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

And the deals around a location that closed an Investorlift listing:

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.investorlift.com/v1/deals?lat=33.476917&lng=-111.920385&radius_miles=2&bought_on_investorlift=true" \
    -H "Authorization: Bearer $GM_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const params = new URLSearchParams({
    lat: "33.476917",
    lng: "-111.920385",
    radius_miles: "2",
    bought_on_investorlift: "true",
  });
  const res = await fetch(`https://api.investorlift.com/v1/deals?${params}`, {
    headers: { Authorization: `Bearer ${process.env.GM_API_KEY}` },
  });
  if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
  const body = await res.json();
  ```

  ```python Python theme={null}
  import os

  import requests

  r = requests.get(
      "https://api.investorlift.com/v1/deals",
      params={
          "lat": 33.476917,
          "lng": -111.920385,
          "radius_miles": 2,
          "bought_on_investorlift": "true",
      },
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

## The blocks other rows carry

| Row         | Block                                                                                                                                                                |
| ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| A deal      | `wholesale_listing`: the listing this deed closed. It carries the company, the listed date, the asking price, the verdict and the days from publication to the deed. |
| An investor | `wholesale_purchases`: `n`, `n_12m`, `n_24m`, `n_5y`, `n_probable` for the ones matched below high confidence, `last_on`, and the companies the investor buys from.  |
| A parcel    | `wholesale_listings[]`.                                                                                                                                              |

The buyer rule is the deal rule. The API names a registry investor by its registry name (the deed spelling), whatever
its kind. The API never names a person, a trust or an owner-occupant that is not itself a registry investor, on any
key. The wholesaler's contract price and spread stay in the pipeline. The API never serves them.

A market with no published wholesale tables answers
[`422 wholesale_unavailable`](/guides/concepts/errors#wholesale_unavailable) on the six routes and the two
filters. It serves every block null. `meta.coverage[].wholesale_as_of` tells you in advance.


## Related topics

- [List Investorlift listings](/api-reference/endpoints/wholesale-listings.md)
- [The ideas you need](/guides/ideas.md)
- [The Investorlift listing object](/api-reference/objects/wholesale-listing.md)
- [List one company's Investorlift listings](/api-reference/endpoints/wholesalers-listings.md)
- [Get one listing company](/api-reference/endpoints/wholesalers-get.md)
