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

# Who owns this house?

> Resolve a parcel from a point, an APN or a street address, read its owner facts and find when the API names the owner.

## 1. Resolve the parcel

From a point, which is what a search box gives you:

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

  ```javascript Node.js theme={null}
  const params = new URLSearchParams({ lat: "33.476917", lng: "-111.920385" });
  const res = await fetch(`https://api.investorlift.com/v1/properties/resolve?${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/properties/resolve",
      params={"lat": 33.476917, "lng": -111.920385},
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

Or from an APN on a seller record:

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.investorlift.com/v1/properties/resolve?apn=131-28-253&county=Maricopa" \
    -H "Authorization: Bearer $GM_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const params = new URLSearchParams({ apn: "131-28-253", county: "Maricopa" });
  const res = await fetch(`https://api.investorlift.com/v1/properties/resolve?${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/properties/resolve",
      params={"apn": "131-28-253", "county": "Maricopa"},
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

Either way you get a `property_id`. For a point inside coverage with no parcel within 100 m, the API answers a 404.
For a point outside every loaded market, the API answers
[`422 outside_coverage`](/guides/concepts/errors#outside_coverage). The two are different answers.

## 2. Read the parcel

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

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

The answer always includes the parcel facts: segment, beds, baths, square feet, year built and pool. It also includes
the owner facts that do not identify the owner: owner-occupied or absentee, a trust, how long held, and
rental-registered. Inside a loaded city, it also includes the `short_term_rental` block.

## When the owner is named

The answer includes the owner's **name and mailing address** in two cases:

1. The parcel is a **confirmed holding of a registry investor**.
2. The city **registered the current owner as the operator of a short-term rental business** there, by a date or a
   name. Then `business_use` is true with `attribution_basis` `PURCHASE_DATE`, `OWNER_NAME` or `LICENCE_START`.
   `PURCHASE_DATE` is a licence applied for or issued after the purchase. `OWNER_NAME` is a name on the record that
   keys to the owner. `LICENCE_START` is a purchase before the city's licence regime began.

You get `names: null` with `redacted_reason: "not_an_investor_hold"` for an ordinary household, for a prior owner's
permit, and for an owner-occupied home with a casita permit. You also get it for a licence attributed only by
assumption (`ASSUMED`).

<Note>
  This is deliberate. The API finds investors and city-registered rental businesses. It is not a people-search tool.
</Note>

Even in those two cases this host does not serve the fields. They come back null with `contact_redacted: true`. A
null `redacted_reason` marks an owner the API names where it serves contact data. A non-null reason marks one it does
not. See [Authentication](/guides/concepts/authentication).


## Related topics

- [The twenty-six tools](/mcp/tools.md)
- [Read one parcel](/api-reference/endpoints/properties-get.md)
- [Find a parcel](/api-reference/endpoints/properties-resolve.md)
- [Connecting a client](/mcp/connect.md)
- [Who should I call?](/guides/walkthroughs/find-buyers.md)
