Skip to main content
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.
Every MLS listing block names its listing agents. Each agent carries a stable agent_id (agt_ plus 12 hex). The id is the same on every listing the agent appears on, whatever the spelling of the name or the brokerage.

How an agent is identified

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: agent_is_holder_member is true when the agent is one of the holding investor’s own people. The listing is then the investor’s own inventory, not a client’s. Old agent ids follow the same alias rules as investor ids: a merged id answers 200 with meta.resolved_from, a retired one answers 410 gone.

The two ends of one fact

The agent 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. Since 0.31.0 a link carries investor_display_name beside investor_name. A listing row’s holder carries display_name beside name. Each is the name to print: given-first for a cleanly parsed person, equal to the deed spelling otherwise.

Contact fields

This host does not serve the agent’s name, phones, emails and licence number. They are null, with contact_redacted: true. This host serves the ids, identity_basis, the brokerages and the listing counts.

Availability

A market with no published agent registry answers 422 agents_unavailable on the three agent routes. It serves the agent fields null everywhere else. meta.coverage[].agents_data_end tells you in advance.

The profile of one listing agent: who they are, where they work, what they list, and which investors they belong to as a person. Who they are is the name spellings, the state licence the registry keyed them on and how sure that key is. Where they work is the brokerages, and what they list is the counts by status and year.

id
string
required

Listing agent id: agt_ followed by 12 hex characters, for example agt_fdfd4a0f8bae. The registry mints the id from a matched state licence number, else from the name and the feed's identifying keys. The id is stable across data refreshes. A licence-based id is the same in every market. The API follows an old id through the alias table. Store it as the identity.

Pattern: ^agt_[0-9a-f]{12}$
market
string
required

Market code, for example phx. The loaded markets are in meta.coverage[]. A licence-keyed agent has the same id in every market and a profile per market.

kind
enum<string>
required

What the feed named. PERSON: a named individual, the only kind the registry matches to a licence or links to an investor. TEAM_OR_OFFICE: a team, an office or a builder sales office written into the agent field, for example "The Smith Team" or a brokerage name. The registry groups such a name under one id so you can find its rows, and never licence-matches or links it.

Available options:
PERSON,
TEAM_OR_OFFICE
n_name_variants
integer
required

How many spellings name_variants holds. Served to every key.

Required range: -9007199254740991 <= x <= 9007199254740991
identity_basis
enum<string>
required

How the registry established the agent's identity, strongest first: the four LICENSE_ values are the licence-keyed agents. LICENSE_FEED: the MLS feed carried the agent's state licence number on their listings, so the feed's own attribution keyed the agent on the public record. LICENSE_NAME: exactly one state licence carries this name, and LICENSE_NAME_DISAMBIGUATED: several do, and the middle initial, brokerage, office phone or licence period picked one. LICENSE_NICKNAME: the registry found the licence through a nickname or short form of the given name, for example DOUG for DOUGLAS. Without a licence, the registry merged name spellings through a shared personal phone or email (CONTACT_CLUSTER), or through the name and a common brokerage (NAME_BROKERAGE). NAME_ONLY: the name fold alone, so two people with the same name are one agent here (see license_candidates).

Available options:
LICENSE_FEED,
LICENSE_NAME,
LICENSE_NAME_DISAMBIGUATED,
LICENSE_NICKNAME,
CONTACT_CLUSTER,
NAME_BROKERAGE,
NAME_ONLY
license_candidates
integer
required

How many licensees of the state roll fit the agent's name. 0 means none: the name is not on the roll, or it is a nickname the registry did not resolve. 1 means matched: the API serves the licence. 2 or more means ambiguous: several people share the name and nothing told them apart. The API then serves no licence, and the rows under this name can belong to more than one person.

Required range: -9007199254740991 <= x <= 9007199254740991
brokerages
string[]
required

The brokerages on the agent's listings, newest first, at most 10. Empty when the feed named none. Served to every key.

One brokerage name as the feed writes it.

current_brokerage
string | null
required

The brokerage on the agent's newest listing that names one. Null when none does. Served to every key.

listings
object
required

The agent's listing activity in the market, counted over the MLS listings that name them. The registry counts them at its own listing slice (meta.coverage[].agents_data_end), never at the clock. Served to every key.

n_self_listings
integer
required

Listings of the agent on parcels held by an investor linked to the agent with HIGH confidence: their own inventory, not a client's. 0 when none.

Required range: -9007199254740991 <= x <= 9007199254740991

The investors this agent is a person member of, HIGH confidence first, then by self-listings. Empty when none. This host serves the investor names. It does not serve the member's deed name.

True when investor_links is not empty.