> ## 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 is this listing agent?

> Stable agent ids, the agent profile, their listings and the link to the investors they belong to.

<Note>
  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.
</Note>

Every MLS listing block names its listing agents. The block is `listing.agents[]` on a hold deal row or a property.
Since 0.3.0 each agent carries a stable `agent_id`, `agt_` plus 12 hex. It is the same id on every listing the agent
appears on, whatever the spelling of the name or the brokerage. The registry keys agents on the state real-estate
licence roll where a licence matches, and on the name and contact keys otherwise.

`identity_basis` says which, and it is the field to read before you trust a row. The registry keys the four
`LICENSE_` values on the public record. `LICENSE_FEED` means the feed itself carried the licence number. `NAME_ONLY`
is the name alone, and `license_candidates` tells you how many licensees share it. `agent_is_holder_member` is true
when the agent is one of the holding investor's own people. Then the listing is their own inventory, not a client's.

## Find the agent

<CodeGroup>
  ```bash curl theme={null}
  curl "https://api.investorlift.com/v1/agents/search?q=Dana%20Rivera&market=phx" \
    -H "Authorization: Bearer $GM_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const params = new URLSearchParams({ q: "Dana Rivera", market: "phx" });
  const res = await fetch(`https://api.investorlift.com/v1/agents/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/agents/search",
      params={"q": "Dana Rivera", "market": "phx"},
      headers={"Authorization": f"Bearer {os.environ['GM_API_KEY']}"},
      timeout=30,
  )
  r.raise_for_status()
  body = r.json()
  ```
</CodeGroup>

A licence number also works: `q=SA555000123`, matched exactly.

## Read the profile

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

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

The profile carries name spellings, the licence block, brokerages, listing counts by status and year, and the linked
investors.

## List their listings

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

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

The API pages the list newest first, by keyset.

## The two ends of one fact

The profile's `investor_links[]` and the investor profile's `agent_links[]` are the same fact from either side. This
person both lists houses and buys them through that investor. `has_licensed_member` on the investor says so in one
boolean.

The API does not serve the agent's name, phones, emails or licence number on this host (null,
`contact_redacted: true`). It serves ids, identity basis, brokerages and counts. Old agent ids follow the same alias
rules as investor ids: 200 with `meta.resolved_from`, or [`410 gone`](/guides/concepts/errors#gone).

For a market with no published agent registry, the API answers
[`422 agents_unavailable`](/guides/concepts/errors#agents_unavailable) on these three routes. It serves the agent
fields null everywhere else. `meta.coverage[].agents_data_end` tells you in advance.


## Related topics

- [Find a listing agent](/api-reference/endpoints/agents-search.md)
- [The ideas you need](/guides/ideas.md)
- [List one agent's listings](/api-reference/endpoints/agents-listings.md)
- [Get one listing agent](/api-reference/endpoints/agents-get.md)
- [List every listing of one agent](/api-reference/agents/list-every-listing-of-one-agent.md)
