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

# Tell me about this investor

> The full profile, the deal history, and what an old id answers after a data refresh.

## The profile

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

  ```javascript Node.js theme={null}
  const res = await fetch("https://api.investorlift.com/v1/investors/inv_0a20a550f33b", {
    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",
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

That returns the whole profile. It has every member name with `given` and `surname` split out, and every mailing
address with the generic ones flagged. It has counts by kind for the whole market, the first and last deed, the
median hold and profit, and the price band. It also has the cities the investor works and the full
`skip_trace_targets[]`.

Know two things before you render it:

<ResponseField name="members[].name" type="string">
  A deed writes a name as SURNAME GIVEN ("RIVERA DANA"). **Never split this yourself.** Use the `given` and
  `surname` fields, which are already in the right order. Show the raw name when `is_ambiguous` is true.
</ResponseField>

<ResponseField name="display_name" type="string">
  The name to print for the investor, since 0.29.0. For a person whose deed spelling parsed cleanly it is given name
  first: "DANA RIVERA" from the deed spelling "RIVERA DANA". For an entity, a trust, a public body or an ambiguous
  spelling it equals `name`. Keep `name` for matching and joining.
</ResponseField>

<ResponseField name="contact.primary_address" type="object">
  The best guess for where this investor actually is: the most-used address that is not a title company or a
  registered agent. For an individual it is usually their home.
</ResponseField>

## The deal history

For the drawer's Bought / Sold / Profit table:

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.investorlift.com/v1/investors/inv_0a20a550f33b/deals?role=buyer&sort=date_desc&limit=50" \
    -H "Authorization: Bearer $GM_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const params = new URLSearchParams({ role: "buyer", sort: "date_desc", limit: "50" });
  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={"role": "buyer", "sort": "date_desc", "limit": 50},
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

Each row is a full deal (address, dates, prices, `gross_profit`, coordinates), so the same call also plots every
deal of the investor on a map. For only their deals near the subject property, filter the deals list instead:

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

  ```javascript Node.js theme={null}
  const params = new URLSearchParams({
    lat: "33.476917",
    lng: "-111.920385",
    radius_miles: "2",
    investor_id: "inv_0a20a550f33b",
  });
  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,
          "investor_id": "inv_0a20a550f33b",
      },
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

## After a data refresh

An old id goes one of two ways. Handle both:

| What you get                                                          | What occurred                                | What to do                                                                                     |
| --------------------------------------------------------------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| `200` with `meta.resolved_from: ["inv_old..."]`                       | The registry **merged** the id into another. | Store the new `id`. Not an error.                                                              |
| [`410 gone`](/guides/concepts/errors#gone) with `superseded_by: null` | The registry **retired** the id.             | Search by name again with [`/v1/investors/search`](/api-reference/endpoints/investors-search). |

For example `inv_003c1db2782c` now answers with the profile of `inv_8fc820cada96`.


## Related topics

- [Get one investor](/api-reference/endpoints/investors-get.md)
- [The twenty-six tools](/mcp/tools.md)
- [Give me a spreadsheet](/guides/walkthroughs/spreadsheet.md)
- [Privacy notice](/guides/privacy.md)
- [Terms and attribution](/guides/terms.md)
