Model MatchHelp
Changelog
DevelopersAPI

Predictive Signals: know who to call first

Three ranked priority lists in the Model Match API: loan officers worth a recruiting conversation, past clients to call before their next loan goes elsewhere, and the agent relationships to reconnect with. Every row tells you why.

Every loan officer and recruiter has the same problem on Monday morning: a long list of people they could call, and time for a few of them. Predictive Signals reorders that list for you. Each signal looks at the loan officer, company, loan and transaction history Model Match already tracks, and hands back the people to reach first, with the reasons in plain English.

Why Loan Officer A ranks first

Loan officers leaving Example Mortgage Co., by month

24 left in the last 6 monthsabout 20% of the company

Show data
MonthLeft
17 mo ago2
16 mo ago1
15 mo ago2
14 mo ago1
13 mo ago2
12 mo ago2
11 mo ago1
10 mo ago2
9 mo ago1
8 mo ago2
7 mo ago1
6 mo ago2
5 mo ago3
4 mo ago4
3 mo ago4
2 mo ago5
1 mo ago4
This month4

Loan officers in CO, highest recruiting priority first

  1. 1

    Loan Officer A

    Example Mortgage Co. · Denver, CO

    99th

    percentile

    About 20% of their company's loan officers moved to another company in the last 6 months

  2. 2

    Loan Officer B

    Sample Home Loans · Boulder, CO

    97th

    percentile

    Joined their current company about 8 months ago

  3. 3

    Loan Officer C

    Placeholder Lending · Aurora, CO

    95th

    percentile

    Has changed companies about once every 2 years

Illustrative example. Names, addresses and numbers are placeholders.

Three signals, three questions

Recruiting Radar

Which loan officers in this state should I talk to about a move?

Recruiters and branch managerslo-move

Client Retention Risk

Which past clients should I call before their next loan goes to someone else?

Loan officersclient-retention

Relationship Pulse

Which buyer's agents should I reconnect with for another closed deal?

Loan officersagent-pulse

Recruiting Radar ranks the loan officers active in a state by how strongly their history and their company’s recent movement point to a move to a new company in the next six months. You can also look up one loan officer’s priority.

Client Retention Risk takes one loan officer’s past clients, the properties they financed between six months and ten years ago, and puts first the ones most at risk of taking their next refinance or equity loan to someone else.

Relationship Pulse takes the buyer’s agents a loan officer has closed with and puts first the relationships most worth working toward another closed deal in the next six months.

Scores are recomputed on a regular schedule, so the lists move as the market does.

Why it matters

For recruiters, the best time to start a conversation is before a loan officer is on the market. Recruiting Radar surfaces the people whose situation has changed, such as a short stint at their current company or a wave of departures from their team, so outreach starts with the people most worth a call.

For loan officers, your past clients are some of the best repeat business you have, and that book erodes quietly. Client Retention Risk tells you whose next refinance is most at risk of going elsewhere, so you can call them first. Relationship Pulse does the same for your referral partners: it notices when an agent you usually close with every couple of months has gone quiet.

For everyone, the reasons do the explaining. You don’t have to trust a number. Each row says why it ranks where it does, in sentences you could repeat on the call.

Reading a signal

Every row carries the same three things:

FieldWhat it means
scoreA priority score from 0 to 1. Higher means higher priority. Use it to order and to set a cutoff.
percentileWhere that score sits, from 0 to 100, among everyone scored for this signal nationally. 100 is the highest priority. On the state list it is still the national percentile.
reasonsUp to three plain-language sentences explaining why this row is a priority, for example “Joined their current company about 8 months ago”.

Ranked lists also include rank (1 is the highest priority), and every row has scoredAt, the time its score was computed.

A priority, not a promise

Signals rank who to reach out to first. They don’t tell you what anyone will do, so read a high score as “call this person early”, not as a certainty.

Get started

Rolling out now

Predictive Signals are rolling out to the API, the TypeScript SDK and the MCP server. If a signal answers 503 while its first scores land, try again a little later. The endpoints appear in the API reference as they go live.

Get an API key

Create a personal API key under Settings → Security & Access in Model Match. See Authentication for the details. Prefer to skip code? Connect the MCP server to Claude or ChatGPT instead.

Pick a market for recruiting

Call GET /v1/signals/lo-move?state=CO to get the loan officers in a state, highest recruiting priority first. Page through with limit and cursor.

Drill into one loan officer

GET /v1/originators/{nmlsId}/signals/lo-move returns one loan officer’s recruiting priority and reasons. Pair it with the originator profile you already pull.

Work a loan officer's book

/v1/originators/{nmlsId}/signals/client-retention lists their past clients most at risk first. /v1/originators/{nmlsId}/signals/agent-pulse lists the agent relationships to reconnect with.

Recruiting Radar: loan officers to talk to in a state

curl "https://api.modelmatch.com/v1/signals/lo-move?state=CO&limit=25" \
  -H "x-api-key: mm_your_key_here"
import { createClient } from "@model-match/api";

const client = createClient({ apiKey: process.env.MODEL_MATCH_API_KEY });

const result = await client.signals.listLoMove({
  query: { state: "CO", limit: 25 },
});

const rows = result.data.data; // highest recruiting priority first

With the MCP server connected, ask in plain language:

Which loan officers in Colorado should I prioritize for recruiting right now? Show the top 10 and why.

The assistant uses the predictiveSignals tool.

{
  "data": [
    {
      "nmlsId": "1234567",
      "name": "Loan Officer A",
      "companyName": "Example Mortgage Co.",
      "companyNmlsId": "7654321",
      "city": "Denver",
      "state": "CO",
      "score": 0.42,
      "percentile": 99.1,
      "reasons": [
        "About 20% of their company's loan officers moved to another company in the last 6 months",
        "Joined their current company about 8 months ago"
      ],
      "scoredAt": "2026-11-10T00:00:00.000Z"
    }
  ],
  "cursor": "eyJleGFtcGxlIjoiY3Vyc29yIn0"
}

For one loan officer, call GET /v1/originators/{nmlsId}/signals/lo-move (client.signals.getOriginatorLoMove({ path: { nmlsId } })). It returns the same row under data.

Client Retention Risk: past clients to call first

curl "https://api.modelmatch.com/v1/originators/1234567/signals/client-retention?limit=25" \
  -H "x-api-key: mm_your_key_here"
const result = await client.signals.getOriginatorClientRetention({
  path: { nmlsId: "1234567" },
  query: { limit: 25 },
});

const clients = result.data.data; // most at risk first

Which of my past clients should I call this week before their next refinance goes to someone else? My NMLS ID is 1234567.

{
  "data": [
    {
      "rank": 1,
      "propertyId": "example-property-id",
      "address": "100 Example Ave",
      "city": "Denver",
      "state": "CO",
      "zip": "80202",
      "lastLoanDate": "2021-06-15",
      "lastLoanType": "FHA",
      "score": 0.63,
      "risk": 0.63,
      "percentile": 98.4,
      "reasons": [
        "Their last loan was a home purchase loan, and buyers often refinance elsewhere.",
        "This was their first loan with this loan officer."
      ],
      "scoredAt": "2026-11-10T00:00:00.000Z"
    }
  ],
  "cursor": "eyJleGFtcGxlIjoiY3Vyc29yIn0"
}

risk carries the same value as score here: higher means more at risk of going elsewhere.

Relationship Pulse: agents to reconnect with

curl "https://api.modelmatch.com/v1/originators/1234567/signals/agent-pulse?limit=10" \
  -H "x-api-key: mm_your_key_here"
const result = await client.signals.getOriginatorAgentPulse({
  path: { nmlsId: "1234567" },
  query: { limit: 10 },
});

const agents = result.data.data; // highest priority first, up to 50

Which buyer’s agents should loan officer 1234567 reconnect with first, and why?

{
  "data": [
    {
      "rank": 1,
      "agentId": "example-agent-id",
      "agentName": "Agent A",
      "agentLinked": true,
      "score": 0.37,
      "percentile": 99.3,
      "reasons": [
        "You usually close a deal together every 2 months. It has been 4 months since the last one.",
        "This is one of your top 3 agents by deals closed together this past year."
      ],
      "scoredAt": "2026-11-10T00:00:00.000Z"
    }
  ]
}

When agentLinked is true, pass agentId to the agent routes to pull the full profile. When it is false, the id only identifies the agent within this list.

Good to know

What does it cost?

One credit per row returned, like the rest of the API. A single loan officer’s Recruiting Radar lookup is one credit.

How many rows can I get?

Recruiting Radar and Client Retention Risk return up to 100 rows per page (25 by default) and page with cursor. Pass the cursor from one response to get the next page; it is absent on the last page. Relationship Pulse returns up to 50 rows in one response.

What if a loan officer isn't scored?

A 404 means the loan officer has no predictive scores at all. A 200 with an empty data list means they are scored, but have nothing on that signal, for example no past clients in scope.

What does a 503 mean?

Signals are temporarily unavailable, for example while a signal’s first scores land. Retry later.