@model-match/api 3.18.0 → 3.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index-CGoyq3QT.d.mts → index-B37G0lV3.d.mts} +5552 -6726
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +1 -1
- package/dist/slim/index.d.mts +82 -251
- package/dist/slim/index.mjs +178 -915
- package/dist/{src-cKUuYWMX.mjs → src-CkGOuklD.mjs} +1518 -2255
- package/openapi.json +1992 -4154
- package/package.json +2 -2
package/dist/slim/index.mjs
CHANGED
|
@@ -1,875 +1,6 @@
|
|
|
1
|
-
import { n as createClient, w as client } from "../src-
|
|
1
|
+
import { n as createClient, w as client } from "../src-CkGOuklD.mjs";
|
|
2
2
|
//#region src/slim/sdk.gen.ts
|
|
3
3
|
/**
|
|
4
|
-
* Search agents with filters
|
|
5
|
-
* Search and list individual real-estate agents with filters — one row per agent. Filter by name, location (state, city, zip), brokerage/office, and production metrics (sales volume, transaction units, price range), with sorting and cursor pagination. LOCATION SEMANTICS: the state/city/zip filters match ANY of an agent's location signals — their listed city/state, their office address(es), AND the markets where they actually closed transactions (production) — combined with OR. So an agent matches a searched location if their office OR their production is there. A search for city "Long Beach" can therefore return agents whose office or displayed primary market is in a different city/state, because they transacted in Long Beach. The `state`/`city` returned on each row reflect the agent's primary market and may differ from the searched location. (Use the `office` filter to match by brokerage/office name, and the per-agent city/county/state breakdown endpoints to rank an agent's volume within a specific market.) RANKING BY DEAL SIDE: combine a location filter with `sort` on `buyerVolume`/`buyerUnits` (or `sellerVolume`/`sellerUnits`, `dualVolume`/`dualUnits`) to rank agents by how active they are representing buyers vs. sellers in that market — e.g. sort `buyerVolume` descending for the most active buyer-side agents in a state or city. This is the per-agent record search: use it to find specific real-estate agents or build a filtered agent list. (For a single agent by ID use the agent detail endpoint.) If you only need how many agents match and not the records themselves, send the same request body to `countAgents`.
|
|
6
|
-
*/
|
|
7
|
-
const listAgents = (options) => {
|
|
8
|
-
return (options?.client ?? client).post({
|
|
9
|
-
security: [{
|
|
10
|
-
name: "x-api-key",
|
|
11
|
-
type: "apiKey"
|
|
12
|
-
}, {
|
|
13
|
-
scheme: "bearer",
|
|
14
|
-
type: "http"
|
|
15
|
-
}],
|
|
16
|
-
url: "/agents",
|
|
17
|
-
...options,
|
|
18
|
-
headers: {
|
|
19
|
-
"Content-Type": "application/json",
|
|
20
|
-
...options?.headers
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
};
|
|
24
|
-
/**
|
|
25
|
-
* Configurable chart (measure × slice) over the agent's sales
|
|
26
|
-
*/
|
|
27
|
-
const agentAnalyticsChart = (options) => {
|
|
28
|
-
return (options?.client ?? client).post({
|
|
29
|
-
security: [{
|
|
30
|
-
name: "x-api-key",
|
|
31
|
-
type: "apiKey"
|
|
32
|
-
}, {
|
|
33
|
-
scheme: "bearer",
|
|
34
|
-
type: "http"
|
|
35
|
-
}],
|
|
36
|
-
url: "/agents/analytics/chart",
|
|
37
|
-
...options,
|
|
38
|
-
headers: {
|
|
39
|
-
"Content-Type": "application/json",
|
|
40
|
-
...options?.headers
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
};
|
|
44
|
-
/**
|
|
45
|
-
* Production summary with buyer/seller/dual split + previous period
|
|
46
|
-
*/
|
|
47
|
-
const agentAnalyticsSummary = (options) => {
|
|
48
|
-
return (options?.client ?? client).post({
|
|
49
|
-
security: [{
|
|
50
|
-
name: "x-api-key",
|
|
51
|
-
type: "apiKey"
|
|
52
|
-
}, {
|
|
53
|
-
scheme: "bearer",
|
|
54
|
-
type: "http"
|
|
55
|
-
}],
|
|
56
|
-
url: "/agents/analytics/summary",
|
|
57
|
-
...options,
|
|
58
|
-
headers: {
|
|
59
|
-
"Content-Type": "application/json",
|
|
60
|
-
...options?.headers
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
};
|
|
64
|
-
/**
|
|
65
|
-
* Agent volume/units over time with buyer/seller/dual split
|
|
66
|
-
*/
|
|
67
|
-
const agentAnalyticsTimeSeries = (options) => {
|
|
68
|
-
return (options?.client ?? client).post({
|
|
69
|
-
security: [{
|
|
70
|
-
name: "x-api-key",
|
|
71
|
-
type: "apiKey"
|
|
72
|
-
}, {
|
|
73
|
-
scheme: "bearer",
|
|
74
|
-
type: "http"
|
|
75
|
-
}],
|
|
76
|
-
url: "/agents/analytics/time-series",
|
|
77
|
-
...options,
|
|
78
|
-
headers: {
|
|
79
|
-
"Content-Type": "application/json",
|
|
80
|
-
...options?.headers
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
};
|
|
84
|
-
/**
|
|
85
|
-
* Submit a bulk-delivery job for agents
|
|
86
|
-
* Queues an ECS task that dumps every matching agents document to S3 in the requested format. Returns 202 with a jobId; poll `GET /v1/agents/bulk-delivery/{jobId}` for status + the signed download URL.
|
|
87
|
-
*
|
|
88
|
-
* **Row limit.** Deliveries of up to 5,000 rows need no entitlement. Above that, the org's `bulk-delivery.agents` entitlement is required and its scope (row ceiling, row filters, allowed fields) governs the delivery; without it the request is rejected with 403 `entitlement_missing`. Pass `limit` at or below the ceiling to deliver a capped subset of a broader query. Email support@modelmatch.com to request a limit increase.
|
|
89
|
-
*
|
|
90
|
-
* Delivery is billed at 1 credit per row regardless of entitlement.
|
|
91
|
-
*
|
|
92
|
-
* **Push-target destination.** Pass `destination: { type: "push-target", targetId }` to have the finished rows sent to a configured push target instead of downloaded. The target is checked before anything is queued; a refusal returns the push target's status and `code` (`TARGET_NOT_FOUND` 404, `FORBIDDEN` 403, `PLAN_REQUIRED` 402, `TARGET_DISABLED` 409, `ENTITY_MISMATCH` 400). Limits and billing are the same as a file delivery, except that push-target deliveries from the ModelMatch web app are not billed.
|
|
93
|
-
*/
|
|
94
|
-
const submitAgentsBulkDelivery = (options) => {
|
|
95
|
-
return (options?.client ?? client).post({
|
|
96
|
-
security: [{
|
|
97
|
-
name: "x-api-key",
|
|
98
|
-
type: "apiKey"
|
|
99
|
-
}, {
|
|
100
|
-
scheme: "bearer",
|
|
101
|
-
type: "http"
|
|
102
|
-
}],
|
|
103
|
-
url: "/agents/bulk-delivery",
|
|
104
|
-
...options,
|
|
105
|
-
headers: {
|
|
106
|
-
"Content-Type": "application/json",
|
|
107
|
-
...options?.headers
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
};
|
|
111
|
-
/**
|
|
112
|
-
* Cancel a bulk-delivery job for agents
|
|
113
|
-
* Cancels a queued or running agents delivery job.
|
|
114
|
-
*
|
|
115
|
-
* The job is marked `cancelled` immediately; the container running it notices on its next page boundary and stops. Because a delivery is billed once, at the end, **a cancelled job is never charged** — no credits are debited and there is nothing to refund. No partial file is written.
|
|
116
|
-
*
|
|
117
|
-
* Idempotent-ish: cancelling a job that has already finished (or was already cancelled) returns 409 and changes nothing. Poll `GET /v1/agents/bulk-delivery/{jobId}` for the settled state.
|
|
118
|
-
*/
|
|
119
|
-
const cancelAgentsBulkDeliveryJob = (options) => {
|
|
120
|
-
return (options.client ?? client).delete({
|
|
121
|
-
security: [{
|
|
122
|
-
name: "x-api-key",
|
|
123
|
-
type: "apiKey"
|
|
124
|
-
}, {
|
|
125
|
-
scheme: "bearer",
|
|
126
|
-
type: "http"
|
|
127
|
-
}],
|
|
128
|
-
url: "/agents/bulk-delivery/{jobId}",
|
|
129
|
-
...options
|
|
130
|
-
});
|
|
131
|
-
};
|
|
132
|
-
/**
|
|
133
|
-
* Get bulk-delivery job status for agents
|
|
134
|
-
*/
|
|
135
|
-
const getAgentsBulkDeliveryJob = (options) => {
|
|
136
|
-
return (options.client ?? client).get({
|
|
137
|
-
security: [{
|
|
138
|
-
name: "x-api-key",
|
|
139
|
-
type: "apiKey"
|
|
140
|
-
}, {
|
|
141
|
-
scheme: "bearer",
|
|
142
|
-
type: "http"
|
|
143
|
-
}],
|
|
144
|
-
url: "/agents/bulk-delivery/{jobId}",
|
|
145
|
-
...options
|
|
146
|
-
});
|
|
147
|
-
};
|
|
148
|
-
/**
|
|
149
|
-
* Count agents matching filters
|
|
150
|
-
* Return the exact number of agents matching the given filters. Accepts the same request body as `listAgents` (pagination and sort are ignored). Use this when you only need a total; to get the matching agents themselves, send the same request body to `listAgents`.
|
|
151
|
-
*/
|
|
152
|
-
const countAgents = (options) => {
|
|
153
|
-
return (options?.client ?? client).post({
|
|
154
|
-
security: [{
|
|
155
|
-
name: "x-api-key",
|
|
156
|
-
type: "apiKey"
|
|
157
|
-
}, {
|
|
158
|
-
scheme: "bearer",
|
|
159
|
-
type: "http"
|
|
160
|
-
}],
|
|
161
|
-
url: "/agents/count",
|
|
162
|
-
...options,
|
|
163
|
-
headers: {
|
|
164
|
-
"Content-Type": "application/json",
|
|
165
|
-
...options?.headers
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
};
|
|
169
|
-
/**
|
|
170
|
-
* Get agent by ID
|
|
171
|
-
*/
|
|
172
|
-
const getAgent = (options) => {
|
|
173
|
-
return (options.client ?? client).get({
|
|
174
|
-
security: [{
|
|
175
|
-
name: "x-api-key",
|
|
176
|
-
type: "apiKey"
|
|
177
|
-
}, {
|
|
178
|
-
scheme: "bearer",
|
|
179
|
-
type: "http"
|
|
180
|
-
}],
|
|
181
|
-
url: "/agents/{id}",
|
|
182
|
-
...options
|
|
183
|
-
});
|
|
184
|
-
};
|
|
185
|
-
/**
|
|
186
|
-
* City volume breakdown across the agent's sales
|
|
187
|
-
*/
|
|
188
|
-
const agentCities = (options) => {
|
|
189
|
-
return (options.client ?? client).post({
|
|
190
|
-
security: [{
|
|
191
|
-
name: "x-api-key",
|
|
192
|
-
type: "apiKey"
|
|
193
|
-
}, {
|
|
194
|
-
scheme: "bearer",
|
|
195
|
-
type: "http"
|
|
196
|
-
}],
|
|
197
|
-
url: "/agents/{id}/breakdowns/cities",
|
|
198
|
-
...options,
|
|
199
|
-
headers: {
|
|
200
|
-
"Content-Type": "application/json",
|
|
201
|
-
...options?.headers
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
};
|
|
205
|
-
/**
|
|
206
|
-
* Mortgage companies the agent dealt with (pre-aggregated)
|
|
207
|
-
*/
|
|
208
|
-
const agentCompanies = (options) => {
|
|
209
|
-
return (options.client ?? client).post({
|
|
210
|
-
security: [{
|
|
211
|
-
name: "x-api-key",
|
|
212
|
-
type: "apiKey"
|
|
213
|
-
}, {
|
|
214
|
-
scheme: "bearer",
|
|
215
|
-
type: "http"
|
|
216
|
-
}],
|
|
217
|
-
url: "/agents/{id}/breakdowns/companies",
|
|
218
|
-
...options,
|
|
219
|
-
headers: {
|
|
220
|
-
"Content-Type": "application/json",
|
|
221
|
-
...options?.headers
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
};
|
|
225
|
-
/**
|
|
226
|
-
* County (FIPS) volume breakdown
|
|
227
|
-
*/
|
|
228
|
-
const agentCounties = (options) => {
|
|
229
|
-
return (options.client ?? client).post({
|
|
230
|
-
security: [{
|
|
231
|
-
name: "x-api-key",
|
|
232
|
-
type: "apiKey"
|
|
233
|
-
}, {
|
|
234
|
-
scheme: "bearer",
|
|
235
|
-
type: "http"
|
|
236
|
-
}],
|
|
237
|
-
url: "/agents/{id}/breakdowns/counties",
|
|
238
|
-
...options,
|
|
239
|
-
headers: {
|
|
240
|
-
"Content-Type": "application/json",
|
|
241
|
-
...options?.headers
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
};
|
|
245
|
-
/**
|
|
246
|
-
* Raw-name lenders encountered (pre-aggregated)
|
|
247
|
-
*/
|
|
248
|
-
const agentLenders = (options) => {
|
|
249
|
-
return (options.client ?? client).post({
|
|
250
|
-
security: [{
|
|
251
|
-
name: "x-api-key",
|
|
252
|
-
type: "apiKey"
|
|
253
|
-
}, {
|
|
254
|
-
scheme: "bearer",
|
|
255
|
-
type: "http"
|
|
256
|
-
}],
|
|
257
|
-
url: "/agents/{id}/breakdowns/lenders",
|
|
258
|
-
...options,
|
|
259
|
-
headers: {
|
|
260
|
-
"Content-Type": "application/json",
|
|
261
|
-
...options?.headers
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
};
|
|
265
|
-
/**
|
|
266
|
-
* Listing offices the agent has closed through
|
|
267
|
-
*/
|
|
268
|
-
const agentOffices = (options) => {
|
|
269
|
-
return (options.client ?? client).post({
|
|
270
|
-
security: [{
|
|
271
|
-
name: "x-api-key",
|
|
272
|
-
type: "apiKey"
|
|
273
|
-
}, {
|
|
274
|
-
scheme: "bearer",
|
|
275
|
-
type: "http"
|
|
276
|
-
}],
|
|
277
|
-
url: "/agents/{id}/breakdowns/offices",
|
|
278
|
-
...options,
|
|
279
|
-
headers: {
|
|
280
|
-
"Content-Type": "application/json",
|
|
281
|
-
...options?.headers
|
|
282
|
-
}
|
|
283
|
-
});
|
|
284
|
-
};
|
|
285
|
-
/**
|
|
286
|
-
* Loan officers the agent worked with (pre-aggregated)
|
|
287
|
-
*/
|
|
288
|
-
const agentOriginators = (options) => {
|
|
289
|
-
return (options.client ?? client).post({
|
|
290
|
-
security: [{
|
|
291
|
-
name: "x-api-key",
|
|
292
|
-
type: "apiKey"
|
|
293
|
-
}, {
|
|
294
|
-
scheme: "bearer",
|
|
295
|
-
type: "http"
|
|
296
|
-
}],
|
|
297
|
-
url: "/agents/{id}/breakdowns/originators",
|
|
298
|
-
...options,
|
|
299
|
-
headers: {
|
|
300
|
-
"Content-Type": "application/json",
|
|
301
|
-
...options?.headers
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
};
|
|
305
|
-
/**
|
|
306
|
-
* State volume breakdown
|
|
307
|
-
*/
|
|
308
|
-
const agentStates = (options) => {
|
|
309
|
-
return (options.client ?? client).post({
|
|
310
|
-
security: [{
|
|
311
|
-
name: "x-api-key",
|
|
312
|
-
type: "apiKey"
|
|
313
|
-
}, {
|
|
314
|
-
scheme: "bearer",
|
|
315
|
-
type: "http"
|
|
316
|
-
}],
|
|
317
|
-
url: "/agents/{id}/breakdowns/states",
|
|
318
|
-
...options,
|
|
319
|
-
headers: {
|
|
320
|
-
"Content-Type": "application/json",
|
|
321
|
-
...options?.headers
|
|
322
|
-
}
|
|
323
|
-
});
|
|
324
|
-
};
|
|
325
|
-
/**
|
|
326
|
-
* Zip-code volume breakdown
|
|
327
|
-
*/
|
|
328
|
-
const agentZipCodes = (options) => {
|
|
329
|
-
return (options.client ?? client).post({
|
|
330
|
-
security: [{
|
|
331
|
-
name: "x-api-key",
|
|
332
|
-
type: "apiKey"
|
|
333
|
-
}, {
|
|
334
|
-
scheme: "bearer",
|
|
335
|
-
type: "http"
|
|
336
|
-
}],
|
|
337
|
-
url: "/agents/{id}/breakdowns/zip-codes",
|
|
338
|
-
...options,
|
|
339
|
-
headers: {
|
|
340
|
-
"Content-Type": "application/json",
|
|
341
|
-
...options?.headers
|
|
342
|
-
}
|
|
343
|
-
});
|
|
344
|
-
};
|
|
345
|
-
/**
|
|
346
|
-
* The ZIP markets this agent works, blended
|
|
347
|
-
* Rank the ZIP markets one real-estate agent works, with volume, transaction counts and mean sale price per market, plus a weighted summary across the whole footprint. Optionally narrow to a ZIP list or a date window. REACH, NOT MARKET SHARE: an agent belongs to every market they touch — where their office is AND everywhere they have transacted — so one agent is counted in several markets at once. Per-market agent counts therefore over-sum: they cannot be added together, and dividing one into a total does not produce a market share. The only percentage returned, `shareOfScope`, is each market's share of this agent's volume across the scope requested and sums to 100 over that scope; there is no share-of-whole-book figure, because the transaction records carry no per-agent total to divide by. TWO COUNTS, ON PURPOSE: `transactions` counts transaction records; `units` counts the ones carrying a price, which are the records behind `volume` and `avgSalePrice`. Roughly half of an agent's records are priced, so dividing volume by `transactions` understates the average by about 2×. Figures are computed live from the agent's transaction records — an agent record carries no stored market rollup — and are ranked across their busiest ZIP markets. When a ZIP scope returns no markets, `reach.presentInScope` distinguishes 'works there, nothing closed in the window' from 'not present at all'. The summary also carries a Community Lending mix: what kind of neighborhood these markets are, weighted by the agent's activity in each. These are U.S. Census tract-level aggregates describing whole neighborhoods — never an individual, household or client attribute — and on this surface the basis is always the markets in scope, since an agent record carries no stored neighborhood rollup.
|
|
348
|
-
*/
|
|
349
|
-
const agentMarkets = (options) => {
|
|
350
|
-
return (options.client ?? client).post({
|
|
351
|
-
security: [{
|
|
352
|
-
name: "x-api-key",
|
|
353
|
-
type: "apiKey"
|
|
354
|
-
}, {
|
|
355
|
-
scheme: "bearer",
|
|
356
|
-
type: "http"
|
|
357
|
-
}],
|
|
358
|
-
url: "/agents/{id}/markets",
|
|
359
|
-
...options,
|
|
360
|
-
headers: {
|
|
361
|
-
"Content-Type": "application/json",
|
|
362
|
-
...options?.headers
|
|
363
|
-
}
|
|
364
|
-
});
|
|
365
|
-
};
|
|
366
|
-
/**
|
|
367
|
-
* Properties this agent has transacted on
|
|
368
|
-
*/
|
|
369
|
-
const agentProperties = (options) => {
|
|
370
|
-
return (options.client ?? client).post({
|
|
371
|
-
security: [{
|
|
372
|
-
name: "x-api-key",
|
|
373
|
-
type: "apiKey"
|
|
374
|
-
}, {
|
|
375
|
-
scheme: "bearer",
|
|
376
|
-
type: "http"
|
|
377
|
-
}],
|
|
378
|
-
url: "/agents/{id}/properties",
|
|
379
|
-
...options,
|
|
380
|
-
headers: {
|
|
381
|
-
"Content-Type": "application/json",
|
|
382
|
-
...options?.headers
|
|
383
|
-
}
|
|
384
|
-
});
|
|
385
|
-
};
|
|
386
|
-
/**
|
|
387
|
-
* Sales transactions where this agent was listing or selling side
|
|
388
|
-
*/
|
|
389
|
-
const agentSales = (options) => {
|
|
390
|
-
return (options.client ?? client).post({
|
|
391
|
-
security: [{
|
|
392
|
-
name: "x-api-key",
|
|
393
|
-
type: "apiKey"
|
|
394
|
-
}, {
|
|
395
|
-
scheme: "bearer",
|
|
396
|
-
type: "http"
|
|
397
|
-
}],
|
|
398
|
-
url: "/agents/{id}/sales",
|
|
399
|
-
...options,
|
|
400
|
-
headers: {
|
|
401
|
-
"Content-Type": "application/json",
|
|
402
|
-
...options?.headers
|
|
403
|
-
}
|
|
404
|
-
});
|
|
405
|
-
};
|
|
406
|
-
/**
|
|
407
|
-
* Search originators with filters
|
|
408
|
-
* Search and list individual loan originators (LOs — NMLS-registered mortgage loan officers) with filters — one row per originator. Filter by name, NMLS ID, location (state, city), employer/company, and production metrics (loan volume, units, product mix), with sorting and cursor pagination. LOCATION SEMANTICS: the state/city filters match an originator's PRODUCTION GEOGRAPHY — the markets where they actually originated loans in the selected period — not where their office or employer sits. An LO who lends across several markets matches a filter for ANY of those markets, while the `state`/`city` returned on each row reflect only their PRIMARY (highest-volume) market. So a search for city "Long Beach" can return an LO whose displayed location is a different city/state (e.g. their top market is in Arizona) — they still originated loans in Long Beach, it just isn't their #1 market. To rank originators by their volume within a specific market, sort by volume after filtering, or use the per-originator city/county/state breakdown endpoints. This is the per-originator record search: use it to find specific loan officers or build a filtered LO list. (For a single originator by NMLS ID use the originator detail endpoint.) If you only need how many originators match and not the records themselves, send the same request body to `countOriginators`.
|
|
409
|
-
*/
|
|
410
|
-
const listOriginators = (options) => {
|
|
411
|
-
return (options?.client ?? client).post({
|
|
412
|
-
security: [{
|
|
413
|
-
name: "x-api-key",
|
|
414
|
-
type: "apiKey"
|
|
415
|
-
}, {
|
|
416
|
-
scheme: "bearer",
|
|
417
|
-
type: "http"
|
|
418
|
-
}],
|
|
419
|
-
url: "/originators",
|
|
420
|
-
...options,
|
|
421
|
-
headers: {
|
|
422
|
-
"Content-Type": "application/json",
|
|
423
|
-
...options?.headers
|
|
424
|
-
}
|
|
425
|
-
});
|
|
426
|
-
};
|
|
427
|
-
/**
|
|
428
|
-
* Configurable chart (measure × slice) over one LO's loans
|
|
429
|
-
*/
|
|
430
|
-
const originatorAnalyticsChart = (options) => {
|
|
431
|
-
return (options?.client ?? client).post({
|
|
432
|
-
security: [{
|
|
433
|
-
name: "x-api-key",
|
|
434
|
-
type: "apiKey"
|
|
435
|
-
}, {
|
|
436
|
-
scheme: "bearer",
|
|
437
|
-
type: "http"
|
|
438
|
-
}],
|
|
439
|
-
url: "/originators/analytics/chart",
|
|
440
|
-
...options,
|
|
441
|
-
headers: {
|
|
442
|
-
"Content-Type": "application/json",
|
|
443
|
-
...options?.headers
|
|
444
|
-
}
|
|
445
|
-
});
|
|
446
|
-
};
|
|
447
|
-
/**
|
|
448
|
-
* Production summary with previous-period comparison
|
|
449
|
-
*/
|
|
450
|
-
const originatorAnalyticsSummary = (options) => {
|
|
451
|
-
return (options?.client ?? client).post({
|
|
452
|
-
security: [{
|
|
453
|
-
name: "x-api-key",
|
|
454
|
-
type: "apiKey"
|
|
455
|
-
}, {
|
|
456
|
-
scheme: "bearer",
|
|
457
|
-
type: "http"
|
|
458
|
-
}],
|
|
459
|
-
url: "/originators/analytics/summary",
|
|
460
|
-
...options,
|
|
461
|
-
headers: {
|
|
462
|
-
"Content-Type": "application/json",
|
|
463
|
-
...options?.headers
|
|
464
|
-
}
|
|
465
|
-
});
|
|
466
|
-
};
|
|
467
|
-
/**
|
|
468
|
-
* Originator volume / units over time
|
|
469
|
-
*/
|
|
470
|
-
const originatorAnalyticsTimeSeries = (options) => {
|
|
471
|
-
return (options?.client ?? client).post({
|
|
472
|
-
security: [{
|
|
473
|
-
name: "x-api-key",
|
|
474
|
-
type: "apiKey"
|
|
475
|
-
}, {
|
|
476
|
-
scheme: "bearer",
|
|
477
|
-
type: "http"
|
|
478
|
-
}],
|
|
479
|
-
url: "/originators/analytics/time-series",
|
|
480
|
-
...options,
|
|
481
|
-
headers: {
|
|
482
|
-
"Content-Type": "application/json",
|
|
483
|
-
...options?.headers
|
|
484
|
-
}
|
|
485
|
-
});
|
|
486
|
-
};
|
|
487
|
-
/**
|
|
488
|
-
* Submit a bulk-delivery job for originators
|
|
489
|
-
* Queues an ECS task that dumps every matching originators document to S3 in the requested format. Returns 202 with a jobId; poll `GET /v1/originators/bulk-delivery/{jobId}` for status + the signed download URL.
|
|
490
|
-
*
|
|
491
|
-
* **Row limit.** Deliveries of up to 5,000 rows need no entitlement. Above that, the org's `bulk-delivery.originators` entitlement is required and its scope (row ceiling, row filters, allowed fields) governs the delivery; without it the request is rejected with 403 `entitlement_missing`. Pass `limit` at or below the ceiling to deliver a capped subset of a broader query. Email support@modelmatch.com to request a limit increase.
|
|
492
|
-
*
|
|
493
|
-
* Delivery is billed at 1 credit per row regardless of entitlement.
|
|
494
|
-
*
|
|
495
|
-
* **Push-target destination.** Pass `destination: { type: "push-target", targetId }` to have the finished rows sent to a configured push target instead of downloaded. The target is checked before anything is queued; a refusal returns the push target's status and `code` (`TARGET_NOT_FOUND` 404, `FORBIDDEN` 403, `PLAN_REQUIRED` 402, `TARGET_DISABLED` 409, `ENTITY_MISMATCH` 400). Limits and billing are the same as a file delivery, except that push-target deliveries from the ModelMatch web app are not billed.
|
|
496
|
-
*/
|
|
497
|
-
const submitOriginatorsBulkDelivery = (options) => {
|
|
498
|
-
return (options?.client ?? client).post({
|
|
499
|
-
security: [{
|
|
500
|
-
name: "x-api-key",
|
|
501
|
-
type: "apiKey"
|
|
502
|
-
}, {
|
|
503
|
-
scheme: "bearer",
|
|
504
|
-
type: "http"
|
|
505
|
-
}],
|
|
506
|
-
url: "/originators/bulk-delivery",
|
|
507
|
-
...options,
|
|
508
|
-
headers: {
|
|
509
|
-
"Content-Type": "application/json",
|
|
510
|
-
...options?.headers
|
|
511
|
-
}
|
|
512
|
-
});
|
|
513
|
-
};
|
|
514
|
-
/**
|
|
515
|
-
* Cancel a bulk-delivery job for originators
|
|
516
|
-
* Cancels a queued or running originators delivery job.
|
|
517
|
-
*
|
|
518
|
-
* The job is marked `cancelled` immediately; the container running it notices on its next page boundary and stops. Because a delivery is billed once, at the end, **a cancelled job is never charged** — no credits are debited and there is nothing to refund. No partial file is written.
|
|
519
|
-
*
|
|
520
|
-
* Idempotent-ish: cancelling a job that has already finished (or was already cancelled) returns 409 and changes nothing. Poll `GET /v1/originators/bulk-delivery/{jobId}` for the settled state.
|
|
521
|
-
*/
|
|
522
|
-
const cancelOriginatorsBulkDeliveryJob = (options) => {
|
|
523
|
-
return (options.client ?? client).delete({
|
|
524
|
-
security: [{
|
|
525
|
-
name: "x-api-key",
|
|
526
|
-
type: "apiKey"
|
|
527
|
-
}, {
|
|
528
|
-
scheme: "bearer",
|
|
529
|
-
type: "http"
|
|
530
|
-
}],
|
|
531
|
-
url: "/originators/bulk-delivery/{jobId}",
|
|
532
|
-
...options
|
|
533
|
-
});
|
|
534
|
-
};
|
|
535
|
-
/**
|
|
536
|
-
* Get bulk-delivery job status for originators
|
|
537
|
-
*/
|
|
538
|
-
const getOriginatorsBulkDeliveryJob = (options) => {
|
|
539
|
-
return (options.client ?? client).get({
|
|
540
|
-
security: [{
|
|
541
|
-
name: "x-api-key",
|
|
542
|
-
type: "apiKey"
|
|
543
|
-
}, {
|
|
544
|
-
scheme: "bearer",
|
|
545
|
-
type: "http"
|
|
546
|
-
}],
|
|
547
|
-
url: "/originators/bulk-delivery/{jobId}",
|
|
548
|
-
...options
|
|
549
|
-
});
|
|
550
|
-
};
|
|
551
|
-
/**
|
|
552
|
-
* Count originators matching filters
|
|
553
|
-
* Return the exact number of originators matching the given filters. Accepts the same request body as `listOriginators` (pagination and sort are ignored). Use this when you only need a total; to get the matching originators themselves, send the same request body to `listOriginators`.
|
|
554
|
-
*/
|
|
555
|
-
const countOriginators = (options) => {
|
|
556
|
-
return (options?.client ?? client).post({
|
|
557
|
-
security: [{
|
|
558
|
-
name: "x-api-key",
|
|
559
|
-
type: "apiKey"
|
|
560
|
-
}, {
|
|
561
|
-
scheme: "bearer",
|
|
562
|
-
type: "http"
|
|
563
|
-
}],
|
|
564
|
-
url: "/originators/count",
|
|
565
|
-
...options,
|
|
566
|
-
headers: {
|
|
567
|
-
"Content-Type": "application/json",
|
|
568
|
-
...options?.headers
|
|
569
|
-
}
|
|
570
|
-
});
|
|
571
|
-
};
|
|
572
|
-
/**
|
|
573
|
-
* Get originator by NMLS ID
|
|
574
|
-
*/
|
|
575
|
-
const getOriginator = (options) => {
|
|
576
|
-
return (options.client ?? client).get({
|
|
577
|
-
security: [{
|
|
578
|
-
name: "x-api-key",
|
|
579
|
-
type: "apiKey"
|
|
580
|
-
}, {
|
|
581
|
-
scheme: "bearer",
|
|
582
|
-
type: "http"
|
|
583
|
-
}],
|
|
584
|
-
url: "/originators/{nmlsId}",
|
|
585
|
-
...options
|
|
586
|
-
});
|
|
587
|
-
};
|
|
588
|
-
/**
|
|
589
|
-
* Real-estate agents this LO co-closed with
|
|
590
|
-
* Ranks the real-estate agents on the selling side of this LO's loans, by volume. Buckets whose name is an MLS placeholder for "no selling agent recorded" (`non member`, `non listed agent`, and ~140 board-specific spellings) are excluded rather than ranked as agents — they are not people and cannot be resolved with `GET /v1/agents/{id}`. Percentages are shares of the LO's whole loan population, so they do not sum to 100 across the page.
|
|
591
|
-
*/
|
|
592
|
-
const originatorAgents = (options) => {
|
|
593
|
-
return (options.client ?? client).post({
|
|
594
|
-
security: [{
|
|
595
|
-
name: "x-api-key",
|
|
596
|
-
type: "apiKey"
|
|
597
|
-
}, {
|
|
598
|
-
scheme: "bearer",
|
|
599
|
-
type: "http"
|
|
600
|
-
}],
|
|
601
|
-
url: "/originators/{nmlsId}/breakdowns/agents",
|
|
602
|
-
...options,
|
|
603
|
-
headers: {
|
|
604
|
-
"Content-Type": "application/json",
|
|
605
|
-
...options?.headers
|
|
606
|
-
}
|
|
607
|
-
});
|
|
608
|
-
};
|
|
609
|
-
/**
|
|
610
|
-
* Branch (broker) history for this LO
|
|
611
|
-
*/
|
|
612
|
-
const originatorBranches = (options) => {
|
|
613
|
-
return (options.client ?? client).post({
|
|
614
|
-
security: [{
|
|
615
|
-
name: "x-api-key",
|
|
616
|
-
type: "apiKey"
|
|
617
|
-
}, {
|
|
618
|
-
scheme: "bearer",
|
|
619
|
-
type: "http"
|
|
620
|
-
}],
|
|
621
|
-
url: "/originators/{nmlsId}/breakdowns/branches",
|
|
622
|
-
...options,
|
|
623
|
-
headers: {
|
|
624
|
-
"Content-Type": "application/json",
|
|
625
|
-
...options?.headers
|
|
626
|
-
}
|
|
627
|
-
});
|
|
628
|
-
};
|
|
629
|
-
/**
|
|
630
|
-
* Broker shops this LO originated loans through (name-resolved)
|
|
631
|
-
*/
|
|
632
|
-
const originatorBrokers = (options) => {
|
|
633
|
-
return (options.client ?? client).post({
|
|
634
|
-
security: [{
|
|
635
|
-
name: "x-api-key",
|
|
636
|
-
type: "apiKey"
|
|
637
|
-
}, {
|
|
638
|
-
scheme: "bearer",
|
|
639
|
-
type: "http"
|
|
640
|
-
}],
|
|
641
|
-
url: "/originators/{nmlsId}/breakdowns/brokers",
|
|
642
|
-
...options,
|
|
643
|
-
headers: {
|
|
644
|
-
"Content-Type": "application/json",
|
|
645
|
-
...options?.headers
|
|
646
|
-
}
|
|
647
|
-
});
|
|
648
|
-
};
|
|
649
|
-
/**
|
|
650
|
-
* City volume breakdown across this LO's loans
|
|
651
|
-
*/
|
|
652
|
-
const originatorCitiesBreakdown = (options) => {
|
|
653
|
-
return (options.client ?? client).post({
|
|
654
|
-
security: [{
|
|
655
|
-
name: "x-api-key",
|
|
656
|
-
type: "apiKey"
|
|
657
|
-
}, {
|
|
658
|
-
scheme: "bearer",
|
|
659
|
-
type: "http"
|
|
660
|
-
}],
|
|
661
|
-
url: "/originators/{nmlsId}/breakdowns/cities",
|
|
662
|
-
...options,
|
|
663
|
-
headers: {
|
|
664
|
-
"Content-Type": "application/json",
|
|
665
|
-
...options?.headers
|
|
666
|
-
}
|
|
667
|
-
});
|
|
668
|
-
};
|
|
669
|
-
/**
|
|
670
|
-
* Funding companies (employer history) for this LO
|
|
671
|
-
*/
|
|
672
|
-
const originatorCompanies = (options) => {
|
|
673
|
-
return (options.client ?? client).post({
|
|
674
|
-
security: [{
|
|
675
|
-
name: "x-api-key",
|
|
676
|
-
type: "apiKey"
|
|
677
|
-
}, {
|
|
678
|
-
scheme: "bearer",
|
|
679
|
-
type: "http"
|
|
680
|
-
}],
|
|
681
|
-
url: "/originators/{nmlsId}/breakdowns/companies",
|
|
682
|
-
...options,
|
|
683
|
-
headers: {
|
|
684
|
-
"Content-Type": "application/json",
|
|
685
|
-
...options?.headers
|
|
686
|
-
}
|
|
687
|
-
});
|
|
688
|
-
};
|
|
689
|
-
/**
|
|
690
|
-
* County (FIPS) volume breakdown across this LO's loans
|
|
691
|
-
*/
|
|
692
|
-
const originatorCountiesBreakdown = (options) => {
|
|
693
|
-
return (options.client ?? client).post({
|
|
694
|
-
security: [{
|
|
695
|
-
name: "x-api-key",
|
|
696
|
-
type: "apiKey"
|
|
697
|
-
}, {
|
|
698
|
-
scheme: "bearer",
|
|
699
|
-
type: "http"
|
|
700
|
-
}],
|
|
701
|
-
url: "/originators/{nmlsId}/breakdowns/counties",
|
|
702
|
-
...options,
|
|
703
|
-
headers: {
|
|
704
|
-
"Content-Type": "application/json",
|
|
705
|
-
...options?.headers
|
|
706
|
-
}
|
|
707
|
-
});
|
|
708
|
-
};
|
|
709
|
-
/**
|
|
710
|
-
* Lenders this LO has originated through
|
|
711
|
-
*/
|
|
712
|
-
const originatorLenders = (options) => {
|
|
713
|
-
return (options.client ?? client).post({
|
|
714
|
-
security: [{
|
|
715
|
-
name: "x-api-key",
|
|
716
|
-
type: "apiKey"
|
|
717
|
-
}, {
|
|
718
|
-
scheme: "bearer",
|
|
719
|
-
type: "http"
|
|
720
|
-
}],
|
|
721
|
-
url: "/originators/{nmlsId}/breakdowns/lenders",
|
|
722
|
-
...options,
|
|
723
|
-
headers: {
|
|
724
|
-
"Content-Type": "application/json",
|
|
725
|
-
...options?.headers
|
|
726
|
-
}
|
|
727
|
-
});
|
|
728
|
-
};
|
|
729
|
-
/**
|
|
730
|
-
* Real-estate offices this LO closed through (with sponsoring company)
|
|
731
|
-
*/
|
|
732
|
-
const originatorOffices = (options) => {
|
|
733
|
-
return (options.client ?? client).post({
|
|
734
|
-
security: [{
|
|
735
|
-
name: "x-api-key",
|
|
736
|
-
type: "apiKey"
|
|
737
|
-
}, {
|
|
738
|
-
scheme: "bearer",
|
|
739
|
-
type: "http"
|
|
740
|
-
}],
|
|
741
|
-
url: "/originators/{nmlsId}/breakdowns/offices",
|
|
742
|
-
...options,
|
|
743
|
-
headers: {
|
|
744
|
-
"Content-Type": "application/json",
|
|
745
|
-
...options?.headers
|
|
746
|
-
}
|
|
747
|
-
});
|
|
748
|
-
};
|
|
749
|
-
/**
|
|
750
|
-
* State volume breakdown across this LO's loans
|
|
751
|
-
*/
|
|
752
|
-
const originatorStatesBreakdown = (options) => {
|
|
753
|
-
return (options.client ?? client).post({
|
|
754
|
-
security: [{
|
|
755
|
-
name: "x-api-key",
|
|
756
|
-
type: "apiKey"
|
|
757
|
-
}, {
|
|
758
|
-
scheme: "bearer",
|
|
759
|
-
type: "http"
|
|
760
|
-
}],
|
|
761
|
-
url: "/originators/{nmlsId}/breakdowns/states",
|
|
762
|
-
...options,
|
|
763
|
-
headers: {
|
|
764
|
-
"Content-Type": "application/json",
|
|
765
|
-
...options?.headers
|
|
766
|
-
}
|
|
767
|
-
});
|
|
768
|
-
};
|
|
769
|
-
/**
|
|
770
|
-
* Title companies on this LO's loans (spellings merged)
|
|
771
|
-
* Ranks the title companies on this entity's loans (recorded deeds, `recording_date` window — the same population and period axis as every other loans breakdown). Spellings of one company are MERGED: `label` is its most-used spelling, `id` the normalized name every spelling was grouped under (legal-form and filler words such as `inc`, `llc`, `co`, `company`, `title`, `escrow` removed; `natl` → `national`). Placeholder entries meaning "no title company recorded" (`none available` and its misspellings, `unknown`, `n/a`, …) and names shorter than 3 characters are excluded rather than ranked. `attorney` and `accommodation` are kept: they say who closed. `pctUnits` / `pctVolume` are shares of the entity's WHOLE loan population in the window, including loans with no title company, so they do not sum to 100 across the page. Pages of up to 100 via `pagination`.
|
|
772
|
-
*/
|
|
773
|
-
const originatorTitleCompanies = (options) => {
|
|
774
|
-
return (options.client ?? client).post({
|
|
775
|
-
security: [{
|
|
776
|
-
name: "x-api-key",
|
|
777
|
-
type: "apiKey"
|
|
778
|
-
}, {
|
|
779
|
-
scheme: "bearer",
|
|
780
|
-
type: "http"
|
|
781
|
-
}],
|
|
782
|
-
url: "/originators/{nmlsId}/breakdowns/title-companies",
|
|
783
|
-
...options,
|
|
784
|
-
headers: {
|
|
785
|
-
"Content-Type": "application/json",
|
|
786
|
-
...options?.headers
|
|
787
|
-
}
|
|
788
|
-
});
|
|
789
|
-
};
|
|
790
|
-
/**
|
|
791
|
-
* Zip-code volume breakdown
|
|
792
|
-
*/
|
|
793
|
-
const originatorZipCodes = (options) => {
|
|
794
|
-
return (options.client ?? client).post({
|
|
795
|
-
security: [{
|
|
796
|
-
name: "x-api-key",
|
|
797
|
-
type: "apiKey"
|
|
798
|
-
}, {
|
|
799
|
-
scheme: "bearer",
|
|
800
|
-
type: "http"
|
|
801
|
-
}],
|
|
802
|
-
url: "/originators/{nmlsId}/breakdowns/zip-codes",
|
|
803
|
-
...options,
|
|
804
|
-
headers: {
|
|
805
|
-
"Content-Type": "application/json",
|
|
806
|
-
...options?.headers
|
|
807
|
-
}
|
|
808
|
-
});
|
|
809
|
-
};
|
|
810
|
-
/**
|
|
811
|
-
* Loans originated by this LO
|
|
812
|
-
*/
|
|
813
|
-
const originatorLoans = (options) => {
|
|
814
|
-
return (options.client ?? client).post({
|
|
815
|
-
security: [{
|
|
816
|
-
name: "x-api-key",
|
|
817
|
-
type: "apiKey"
|
|
818
|
-
}, {
|
|
819
|
-
scheme: "bearer",
|
|
820
|
-
type: "http"
|
|
821
|
-
}],
|
|
822
|
-
url: "/originators/{nmlsId}/loans",
|
|
823
|
-
...options,
|
|
824
|
-
headers: {
|
|
825
|
-
"Content-Type": "application/json",
|
|
826
|
-
...options?.headers
|
|
827
|
-
}
|
|
828
|
-
});
|
|
829
|
-
};
|
|
830
|
-
/**
|
|
831
|
-
* The markets this LO lends in
|
|
832
|
-
* One blended view of a loan officer's lending footprint: the ZIP codes they originated in, city / county / state rollups of the same scope, and the period totals those markets are a share of. AVERAGES ARE VOLUME-WEIGHTED: the summary loan size is Σ volume ÷ Σ units, not an unweighted mean of the per-market averages (on a real footprint the two differ by thousands of dollars). Sending `zipCodes` narrows every grain to those ZIPs; sending a `dateRange` re-cuts the window. Either switches the response from the LO's pre-aggregated footprint to a live aggregation of their loans — `source` and `sourceReasons` say which was used, and bucket `key` forms differ between them (use `name` for display). All shares on this response are 0–100 percentages. A summary can cover less than the whole book: production that could not be attributed to a place is held out and reported in `summary.unresolved` rather than being folded in or silently dropped. The summary also carries a Community Lending mix — what kind of neighborhood this book lands in. These are U.S. Census tract-level aggregates describing whole neighborhoods, never individual, household or applicant attributes. Unscoped it is the LO's own whole-period mix; a ZIP or date scope recomputes it over the markets in scope, and `summary.communityLending.basis` says which you got.
|
|
833
|
-
*/
|
|
834
|
-
const originatorMarkets = (options) => {
|
|
835
|
-
return (options.client ?? client).post({
|
|
836
|
-
security: [{
|
|
837
|
-
name: "x-api-key",
|
|
838
|
-
type: "apiKey"
|
|
839
|
-
}, {
|
|
840
|
-
scheme: "bearer",
|
|
841
|
-
type: "http"
|
|
842
|
-
}],
|
|
843
|
-
url: "/originators/{nmlsId}/markets",
|
|
844
|
-
...options,
|
|
845
|
-
headers: {
|
|
846
|
-
"Content-Type": "application/json",
|
|
847
|
-
...options?.headers
|
|
848
|
-
}
|
|
849
|
-
});
|
|
850
|
-
};
|
|
851
|
-
/**
|
|
852
|
-
* Properties this loan officer has touched
|
|
853
|
-
* Returns the parcels this loan officer is attributed to in public record — the reverse of the `parties` block on `GET /v1/properties/{id}`. Accepts the same filters, sorts and pagination as the main property search, so a caller can ask 'this LO's parcels in Travis County built after 2015' in one request. Attribution is ALL-TIME: a parcel stays in this LO's set after the loan is paid off, because the question is career reach rather than current book. An LO with no attributed parcels returns an empty page, not a 404 — the LO may be real and simply have nothing in the public record yet.
|
|
854
|
-
*/
|
|
855
|
-
const originatorProperties = (options) => {
|
|
856
|
-
return (options.client ?? client).post({
|
|
857
|
-
security: [{
|
|
858
|
-
name: "x-api-key",
|
|
859
|
-
type: "apiKey"
|
|
860
|
-
}, {
|
|
861
|
-
scheme: "bearer",
|
|
862
|
-
type: "http"
|
|
863
|
-
}],
|
|
864
|
-
url: "/originators/{nmlsId}/properties",
|
|
865
|
-
...options,
|
|
866
|
-
headers: {
|
|
867
|
-
"Content-Type": "application/json",
|
|
868
|
-
...options?.headers
|
|
869
|
-
}
|
|
870
|
-
});
|
|
871
|
-
};
|
|
872
|
-
/**
|
|
873
4
|
* An LO's sponsorship / registration links (admin)
|
|
874
5
|
* Diagnostic: the LO's indexed employment union (sponsorships + registrations), split by source with active counts. `indexGaps` lists what the former database diagnostic showed that the index does not carry.
|
|
875
6
|
*/
|
|
@@ -945,7 +76,7 @@ const adminGetBulkJob = (options) => {
|
|
|
945
76
|
* Search agents with filters
|
|
946
77
|
* Search and list individual real-estate agents with filters — one row per agent. Filter by name, location (state, city, zip), brokerage/office, and production metrics (sales volume, transaction units, price range), with sorting and cursor pagination. LOCATION SEMANTICS: the state/city/zip filters match ANY of an agent's location signals — their listed city/state, their office address(es), AND the markets where they actually closed transactions (production) — combined with OR. So an agent matches a searched location if their office OR their production is there. A search for city "Long Beach" can therefore return agents whose office or displayed primary market is in a different city/state, because they transacted in Long Beach. The `state`/`city` returned on each row reflect the agent's primary market and may differ from the searched location. (Use the `office` filter to match by brokerage/office name, and the per-agent city/county/state breakdown endpoints to rank an agent's volume within a specific market.) RANKING BY DEAL SIDE: combine a location filter with `sort` on `buyerVolume`/`buyerUnits` (or `sellerVolume`/`sellerUnits`, `dualVolume`/`dualUnits`) to rank agents by how active they are representing buyers vs. sellers in that market — e.g. sort `buyerVolume` descending for the most active buyer-side agents in a state or city. This is the per-agent record search: use it to find specific real-estate agents or build a filtered agent list. (For a single agent by ID use the agent detail endpoint.) If you only need how many agents match and not the records themselves, send the same request body to `countAgents`.
|
|
947
78
|
*/
|
|
948
|
-
const
|
|
79
|
+
const listAgents = (options) => {
|
|
949
80
|
return (options?.client ?? client).post({
|
|
950
81
|
security: [{
|
|
951
82
|
name: "x-api-key",
|
|
@@ -965,7 +96,7 @@ const listAgents2 = (options) => {
|
|
|
965
96
|
/**
|
|
966
97
|
* Configurable chart (measure × slice) over the agent's sales
|
|
967
98
|
*/
|
|
968
|
-
const
|
|
99
|
+
const agentAnalyticsChart = (options) => {
|
|
969
100
|
return (options?.client ?? client).post({
|
|
970
101
|
security: [{
|
|
971
102
|
name: "x-api-key",
|
|
@@ -985,7 +116,7 @@ const agentAnalyticsChart2 = (options) => {
|
|
|
985
116
|
/**
|
|
986
117
|
* Production summary with buyer/seller/dual split + previous period
|
|
987
118
|
*/
|
|
988
|
-
const
|
|
119
|
+
const agentAnalyticsSummary = (options) => {
|
|
989
120
|
return (options?.client ?? client).post({
|
|
990
121
|
security: [{
|
|
991
122
|
name: "x-api-key",
|
|
@@ -1005,7 +136,7 @@ const agentAnalyticsSummary2 = (options) => {
|
|
|
1005
136
|
/**
|
|
1006
137
|
* Agent volume/units over time with buyer/seller/dual split
|
|
1007
138
|
*/
|
|
1008
|
-
const
|
|
139
|
+
const agentAnalyticsTimeSeries = (options) => {
|
|
1009
140
|
return (options?.client ?? client).post({
|
|
1010
141
|
security: [{
|
|
1011
142
|
name: "x-api-key",
|
|
@@ -1032,7 +163,7 @@ const agentAnalyticsTimeSeries2 = (options) => {
|
|
|
1032
163
|
*
|
|
1033
164
|
* **Push-target destination.** Pass `destination: { type: "push-target", targetId }` to have the finished rows sent to a configured push target instead of downloaded. The target is checked before anything is queued; a refusal returns the push target's status and `code` (`TARGET_NOT_FOUND` 404, `FORBIDDEN` 403, `PLAN_REQUIRED` 402, `TARGET_DISABLED` 409, `ENTITY_MISMATCH` 400). Limits and billing are the same as a file delivery, except that push-target deliveries from the ModelMatch web app are not billed.
|
|
1034
165
|
*/
|
|
1035
|
-
const
|
|
166
|
+
const submitAgentsBulkDelivery = (options) => {
|
|
1036
167
|
return (options?.client ?? client).post({
|
|
1037
168
|
security: [{
|
|
1038
169
|
name: "x-api-key",
|
|
@@ -1057,7 +188,7 @@ const submitAgentsBulkDelivery2 = (options) => {
|
|
|
1057
188
|
*
|
|
1058
189
|
* Idempotent-ish: cancelling a job that has already finished (or was already cancelled) returns 409 and changes nothing. Poll `GET /v1/agents/bulk-delivery/{jobId}` for the settled state.
|
|
1059
190
|
*/
|
|
1060
|
-
const
|
|
191
|
+
const cancelAgentsBulkDeliveryJob = (options) => {
|
|
1061
192
|
return (options.client ?? client).delete({
|
|
1062
193
|
security: [{
|
|
1063
194
|
name: "x-api-key",
|
|
@@ -1073,7 +204,7 @@ const cancelAgentsBulkDeliveryJob2 = (options) => {
|
|
|
1073
204
|
/**
|
|
1074
205
|
* Get bulk-delivery job status for agents
|
|
1075
206
|
*/
|
|
1076
|
-
const
|
|
207
|
+
const getAgentsBulkDeliveryJob = (options) => {
|
|
1077
208
|
return (options.client ?? client).get({
|
|
1078
209
|
security: [{
|
|
1079
210
|
name: "x-api-key",
|
|
@@ -1090,7 +221,7 @@ const getAgentsBulkDeliveryJob2 = (options) => {
|
|
|
1090
221
|
* Count agents matching filters
|
|
1091
222
|
* Return the exact number of agents matching the given filters. Accepts the same request body as `listAgents` (pagination and sort are ignored). Use this when you only need a total; to get the matching agents themselves, send the same request body to `listAgents`.
|
|
1092
223
|
*/
|
|
1093
|
-
const
|
|
224
|
+
const countAgents = (options) => {
|
|
1094
225
|
return (options?.client ?? client).post({
|
|
1095
226
|
security: [{
|
|
1096
227
|
name: "x-api-key",
|
|
@@ -1110,7 +241,7 @@ const countAgents2 = (options) => {
|
|
|
1110
241
|
/**
|
|
1111
242
|
* Get agent by ID
|
|
1112
243
|
*/
|
|
1113
|
-
const
|
|
244
|
+
const getAgent = (options) => {
|
|
1114
245
|
return (options.client ?? client).get({
|
|
1115
246
|
security: [{
|
|
1116
247
|
name: "x-api-key",
|
|
@@ -1126,7 +257,7 @@ const getAgent2 = (options) => {
|
|
|
1126
257
|
/**
|
|
1127
258
|
* City volume breakdown across the agent's sales
|
|
1128
259
|
*/
|
|
1129
|
-
const
|
|
260
|
+
const agentCities = (options) => {
|
|
1130
261
|
return (options.client ?? client).post({
|
|
1131
262
|
security: [{
|
|
1132
263
|
name: "x-api-key",
|
|
@@ -1146,7 +277,7 @@ const agentCities2 = (options) => {
|
|
|
1146
277
|
/**
|
|
1147
278
|
* Mortgage companies the agent dealt with (pre-aggregated)
|
|
1148
279
|
*/
|
|
1149
|
-
const
|
|
280
|
+
const agentCompanies = (options) => {
|
|
1150
281
|
return (options.client ?? client).post({
|
|
1151
282
|
security: [{
|
|
1152
283
|
name: "x-api-key",
|
|
@@ -1166,7 +297,7 @@ const agentCompanies2 = (options) => {
|
|
|
1166
297
|
/**
|
|
1167
298
|
* County (FIPS) volume breakdown
|
|
1168
299
|
*/
|
|
1169
|
-
const
|
|
300
|
+
const agentCounties = (options) => {
|
|
1170
301
|
return (options.client ?? client).post({
|
|
1171
302
|
security: [{
|
|
1172
303
|
name: "x-api-key",
|
|
@@ -1186,7 +317,7 @@ const agentCounties2 = (options) => {
|
|
|
1186
317
|
/**
|
|
1187
318
|
* Raw-name lenders encountered (pre-aggregated)
|
|
1188
319
|
*/
|
|
1189
|
-
const
|
|
320
|
+
const agentLenders = (options) => {
|
|
1190
321
|
return (options.client ?? client).post({
|
|
1191
322
|
security: [{
|
|
1192
323
|
name: "x-api-key",
|
|
@@ -1206,7 +337,7 @@ const agentLenders2 = (options) => {
|
|
|
1206
337
|
/**
|
|
1207
338
|
* Listing offices the agent has closed through
|
|
1208
339
|
*/
|
|
1209
|
-
const
|
|
340
|
+
const agentOffices = (options) => {
|
|
1210
341
|
return (options.client ?? client).post({
|
|
1211
342
|
security: [{
|
|
1212
343
|
name: "x-api-key",
|
|
@@ -1226,7 +357,7 @@ const agentOffices2 = (options) => {
|
|
|
1226
357
|
/**
|
|
1227
358
|
* Loan officers the agent worked with (pre-aggregated)
|
|
1228
359
|
*/
|
|
1229
|
-
const
|
|
360
|
+
const agentOriginators = (options) => {
|
|
1230
361
|
return (options.client ?? client).post({
|
|
1231
362
|
security: [{
|
|
1232
363
|
name: "x-api-key",
|
|
@@ -1246,7 +377,7 @@ const agentOriginators2 = (options) => {
|
|
|
1246
377
|
/**
|
|
1247
378
|
* State volume breakdown
|
|
1248
379
|
*/
|
|
1249
|
-
const
|
|
380
|
+
const agentStates = (options) => {
|
|
1250
381
|
return (options.client ?? client).post({
|
|
1251
382
|
security: [{
|
|
1252
383
|
name: "x-api-key",
|
|
@@ -1266,7 +397,7 @@ const agentStates2 = (options) => {
|
|
|
1266
397
|
/**
|
|
1267
398
|
* Zip-code volume breakdown
|
|
1268
399
|
*/
|
|
1269
|
-
const
|
|
400
|
+
const agentZipCodes = (options) => {
|
|
1270
401
|
return (options.client ?? client).post({
|
|
1271
402
|
security: [{
|
|
1272
403
|
name: "x-api-key",
|
|
@@ -1287,7 +418,7 @@ const agentZipCodes2 = (options) => {
|
|
|
1287
418
|
* The ZIP markets this agent works, blended
|
|
1288
419
|
* Rank the ZIP markets one real-estate agent works, with volume, transaction counts and mean sale price per market, plus a weighted summary across the whole footprint. Optionally narrow to a ZIP list or a date window. REACH, NOT MARKET SHARE: an agent belongs to every market they touch — where their office is AND everywhere they have transacted — so one agent is counted in several markets at once. Per-market agent counts therefore over-sum: they cannot be added together, and dividing one into a total does not produce a market share. The only percentage returned, `shareOfScope`, is each market's share of this agent's volume across the scope requested and sums to 100 over that scope; there is no share-of-whole-book figure, because the transaction records carry no per-agent total to divide by. TWO COUNTS, ON PURPOSE: `transactions` counts transaction records; `units` counts the ones carrying a price, which are the records behind `volume` and `avgSalePrice`. Roughly half of an agent's records are priced, so dividing volume by `transactions` understates the average by about 2×. Figures are computed live from the agent's transaction records — an agent record carries no stored market rollup — and are ranked across their busiest ZIP markets. When a ZIP scope returns no markets, `reach.presentInScope` distinguishes 'works there, nothing closed in the window' from 'not present at all'. The summary also carries a Community Lending mix: what kind of neighborhood these markets are, weighted by the agent's activity in each. These are U.S. Census tract-level aggregates describing whole neighborhoods — never an individual, household or client attribute — and on this surface the basis is always the markets in scope, since an agent record carries no stored neighborhood rollup.
|
|
1289
420
|
*/
|
|
1290
|
-
const
|
|
421
|
+
const agentMarkets = (options) => {
|
|
1291
422
|
return (options.client ?? client).post({
|
|
1292
423
|
security: [{
|
|
1293
424
|
name: "x-api-key",
|
|
@@ -1307,7 +438,7 @@ const agentMarkets2 = (options) => {
|
|
|
1307
438
|
/**
|
|
1308
439
|
* Properties this agent has transacted on
|
|
1309
440
|
*/
|
|
1310
|
-
const
|
|
441
|
+
const agentProperties = (options) => {
|
|
1311
442
|
return (options.client ?? client).post({
|
|
1312
443
|
security: [{
|
|
1313
444
|
name: "x-api-key",
|
|
@@ -1344,7 +475,7 @@ const agentRelated = (options) => {
|
|
|
1344
475
|
/**
|
|
1345
476
|
* Sales transactions where this agent was listing or selling side
|
|
1346
477
|
*/
|
|
1347
|
-
const
|
|
478
|
+
const agentSales = (options) => {
|
|
1348
479
|
return (options.client ?? client).post({
|
|
1349
480
|
security: [{
|
|
1350
481
|
name: "x-api-key",
|
|
@@ -1379,6 +510,7 @@ const getAlertConditions = (options) => {
|
|
|
1379
510
|
};
|
|
1380
511
|
/**
|
|
1381
512
|
* Update your alert settings
|
|
513
|
+
* Saves your NMLS id, contact identity and tunables. The per-trigger `enabled` flags are deprecated: subscribe to alert recipes or manage subscriptions instead. While still accepted, `enabled[type]: true` turns the trigger on for every watched subject that supports it, and `false` turns it off everywhere.
|
|
1382
514
|
*/
|
|
1383
515
|
const updateAlertConditions = (options) => {
|
|
1384
516
|
return (options?.client ?? client).put({
|
|
@@ -1499,6 +631,137 @@ const previewAlerts = (options) => {
|
|
|
1499
631
|
});
|
|
1500
632
|
};
|
|
1501
633
|
/**
|
|
634
|
+
* List alert recipes
|
|
635
|
+
* The alert recipes — named bundles of alert triggers — with the inputs each needs and whether you are subscribed.
|
|
636
|
+
*/
|
|
637
|
+
const listAlertRecipes = (options) => {
|
|
638
|
+
return (options?.client ?? client).get({
|
|
639
|
+
security: [{
|
|
640
|
+
name: "x-api-key",
|
|
641
|
+
type: "apiKey"
|
|
642
|
+
}, {
|
|
643
|
+
scheme: "bearer",
|
|
644
|
+
type: "http"
|
|
645
|
+
}],
|
|
646
|
+
url: "/v1/alerts/recipes",
|
|
647
|
+
...options
|
|
648
|
+
});
|
|
649
|
+
};
|
|
650
|
+
/**
|
|
651
|
+
* Unsubscribe from an alert recipe
|
|
652
|
+
* Turns the recipe's alert triggers off. Saved agents, areas and records stay; remove them with the watch-list endpoints.
|
|
653
|
+
*/
|
|
654
|
+
const unsubscribeAlertRecipe = (options) => {
|
|
655
|
+
return (options.client ?? client).delete({
|
|
656
|
+
security: [{
|
|
657
|
+
name: "x-api-key",
|
|
658
|
+
type: "apiKey"
|
|
659
|
+
}, {
|
|
660
|
+
scheme: "bearer",
|
|
661
|
+
type: "http"
|
|
662
|
+
}],
|
|
663
|
+
url: "/v1/alerts/recipes/{id}",
|
|
664
|
+
...options
|
|
665
|
+
});
|
|
666
|
+
};
|
|
667
|
+
/**
|
|
668
|
+
* Subscribe to an alert recipe
|
|
669
|
+
* Turns on the recipe's alert triggers, saves its inputs (NMLS id, agents, areas or a record), and backfills recent matches. For watch-record, empty rules apply the default for the record type: property — foreclosure status changes, or sale propensity reaches 50; sale — listing status changes; loan — interest rate moves by 0.125 points or more.
|
|
670
|
+
*/
|
|
671
|
+
const subscribeAlertRecipe = (options) => {
|
|
672
|
+
return (options.client ?? client).post({
|
|
673
|
+
security: [{
|
|
674
|
+
name: "x-api-key",
|
|
675
|
+
type: "apiKey"
|
|
676
|
+
}, {
|
|
677
|
+
scheme: "bearer",
|
|
678
|
+
type: "http"
|
|
679
|
+
}],
|
|
680
|
+
url: "/v1/alerts/recipes/{id}",
|
|
681
|
+
...options,
|
|
682
|
+
headers: {
|
|
683
|
+
"Content-Type": "application/json",
|
|
684
|
+
...options?.headers
|
|
685
|
+
}
|
|
686
|
+
});
|
|
687
|
+
};
|
|
688
|
+
/**
|
|
689
|
+
* Preview an alert recipe
|
|
690
|
+
* Dry-run the recipe over the last 30 days for you, with the given inputs applied on top of your saved ones. Writes nothing.
|
|
691
|
+
*/
|
|
692
|
+
const previewAlertRecipe = (options) => {
|
|
693
|
+
return (options.client ?? client).post({
|
|
694
|
+
security: [{
|
|
695
|
+
name: "x-api-key",
|
|
696
|
+
type: "apiKey"
|
|
697
|
+
}, {
|
|
698
|
+
scheme: "bearer",
|
|
699
|
+
type: "http"
|
|
700
|
+
}],
|
|
701
|
+
url: "/v1/alerts/recipes/{id}/preview",
|
|
702
|
+
...options,
|
|
703
|
+
headers: {
|
|
704
|
+
"Content-Type": "application/json",
|
|
705
|
+
...options?.headers
|
|
706
|
+
}
|
|
707
|
+
});
|
|
708
|
+
};
|
|
709
|
+
/**
|
|
710
|
+
* List your alert subscriptions
|
|
711
|
+
* Every subject you watch — agents, areas, your NMLS id, records — with the alert kinds that fire on it and the recipes that turned them on.
|
|
712
|
+
*/
|
|
713
|
+
const listAlertSubscriptions = (options) => {
|
|
714
|
+
return (options?.client ?? client).get({
|
|
715
|
+
security: [{
|
|
716
|
+
name: "x-api-key",
|
|
717
|
+
type: "apiKey"
|
|
718
|
+
}, {
|
|
719
|
+
scheme: "bearer",
|
|
720
|
+
type: "http"
|
|
721
|
+
}],
|
|
722
|
+
url: "/v1/alerts/subscriptions",
|
|
723
|
+
...options
|
|
724
|
+
});
|
|
725
|
+
};
|
|
726
|
+
/**
|
|
727
|
+
* Subscribe to alerts on a subject
|
|
728
|
+
* Watch a subject (an agent, an area, your NMLS id, or a sale / property / loan with rules) for the given alert kinds. Re-posting the same subject replaces the kinds you set directly; kinds a recipe turned on stay. Recent matches are backfilled when kinds are added.
|
|
729
|
+
*/
|
|
730
|
+
const createAlertSubscription = (options) => {
|
|
731
|
+
return (options?.client ?? client).post({
|
|
732
|
+
security: [{
|
|
733
|
+
name: "x-api-key",
|
|
734
|
+
type: "apiKey"
|
|
735
|
+
}, {
|
|
736
|
+
scheme: "bearer",
|
|
737
|
+
type: "http"
|
|
738
|
+
}],
|
|
739
|
+
url: "/v1/alerts/subscriptions",
|
|
740
|
+
...options,
|
|
741
|
+
headers: {
|
|
742
|
+
"Content-Type": "application/json",
|
|
743
|
+
...options?.headers
|
|
744
|
+
}
|
|
745
|
+
});
|
|
746
|
+
};
|
|
747
|
+
/**
|
|
748
|
+
* Remove an alert subscription
|
|
749
|
+
* Stops watching the subject (idempotent). For a record watch this also forgets its baseline, so watching it again starts fresh.
|
|
750
|
+
*/
|
|
751
|
+
const deleteAlertSubscription = (options) => {
|
|
752
|
+
return (options.client ?? client).delete({
|
|
753
|
+
security: [{
|
|
754
|
+
name: "x-api-key",
|
|
755
|
+
type: "apiKey"
|
|
756
|
+
}, {
|
|
757
|
+
scheme: "bearer",
|
|
758
|
+
type: "http"
|
|
759
|
+
}],
|
|
760
|
+
url: "/v1/alerts/subscriptions/{id}",
|
|
761
|
+
...options
|
|
762
|
+
});
|
|
763
|
+
};
|
|
764
|
+
/**
|
|
1502
765
|
* Get your unread alert count
|
|
1503
766
|
*/
|
|
1504
767
|
const getAlertUnreadCount = (options) => {
|
|
@@ -4956,7 +4219,7 @@ const lenderCounties = (options) => {
|
|
|
4956
4219
|
};
|
|
4957
4220
|
/**
|
|
4958
4221
|
* Loan officers who send business to this lender
|
|
4959
|
-
* Ranks the loan officers whose loans funded through this lender, by volume. Each label is the loan officer's NMLS ID, so it chains straight into `GET /originators/{nmlsId}`. Loans with no identified loan officer are excluded rather than collapsed into one unnavigable bucket.
|
|
4222
|
+
* Ranks the loan officers whose loans funded through this lender, by volume. Each label is the loan officer's NMLS ID, so it chains straight into `GET /v1/originators/{nmlsId}`. Loans with no identified loan officer are excluded rather than collapsed into one unnavigable bucket.
|
|
4960
4223
|
*/
|
|
4961
4224
|
const lenderOriginators = (options) => {
|
|
4962
4225
|
return (options.client ?? client).post({
|
|
@@ -5647,7 +4910,7 @@ const getOffice = (options) => {
|
|
|
5647
4910
|
* Search originators with filters
|
|
5648
4911
|
* Search and list individual loan originators (LOs — NMLS-registered mortgage loan officers) with filters — one row per originator. Filter by name, NMLS ID, location (state, city), employer/company, and production metrics (loan volume, units, product mix), with sorting and cursor pagination. LOCATION SEMANTICS: the state/city filters match an originator's PRODUCTION GEOGRAPHY — the markets where they actually originated loans in the selected period — not where their office or employer sits. An LO who lends across several markets matches a filter for ANY of those markets, while the `state`/`city` returned on each row reflect only their PRIMARY (highest-volume) market. So a search for city "Long Beach" can return an LO whose displayed location is a different city/state (e.g. their top market is in Arizona) — they still originated loans in Long Beach, it just isn't their #1 market. To rank originators by their volume within a specific market, sort by volume after filtering, or use the per-originator city/county/state breakdown endpoints. This is the per-originator record search: use it to find specific loan officers or build a filtered LO list. (For a single originator by NMLS ID use the originator detail endpoint.) If you only need how many originators match and not the records themselves, send the same request body to `countOriginators`.
|
|
5649
4912
|
*/
|
|
5650
|
-
const
|
|
4913
|
+
const listOriginators = (options) => {
|
|
5651
4914
|
return (options?.client ?? client).post({
|
|
5652
4915
|
security: [{
|
|
5653
4916
|
name: "x-api-key",
|
|
@@ -5667,7 +4930,7 @@ const listOriginators2 = (options) => {
|
|
|
5667
4930
|
/**
|
|
5668
4931
|
* Configurable chart (measure × slice) over one LO's loans
|
|
5669
4932
|
*/
|
|
5670
|
-
const
|
|
4933
|
+
const originatorAnalyticsChart = (options) => {
|
|
5671
4934
|
return (options?.client ?? client).post({
|
|
5672
4935
|
security: [{
|
|
5673
4936
|
name: "x-api-key",
|
|
@@ -5687,7 +4950,7 @@ const originatorAnalyticsChart2 = (options) => {
|
|
|
5687
4950
|
/**
|
|
5688
4951
|
* Production summary with previous-period comparison
|
|
5689
4952
|
*/
|
|
5690
|
-
const
|
|
4953
|
+
const originatorAnalyticsSummary = (options) => {
|
|
5691
4954
|
return (options?.client ?? client).post({
|
|
5692
4955
|
security: [{
|
|
5693
4956
|
name: "x-api-key",
|
|
@@ -5707,7 +4970,7 @@ const originatorAnalyticsSummary2 = (options) => {
|
|
|
5707
4970
|
/**
|
|
5708
4971
|
* Originator volume / units over time
|
|
5709
4972
|
*/
|
|
5710
|
-
const
|
|
4973
|
+
const originatorAnalyticsTimeSeries = (options) => {
|
|
5711
4974
|
return (options?.client ?? client).post({
|
|
5712
4975
|
security: [{
|
|
5713
4976
|
name: "x-api-key",
|
|
@@ -5734,7 +4997,7 @@ const originatorAnalyticsTimeSeries2 = (options) => {
|
|
|
5734
4997
|
*
|
|
5735
4998
|
* **Push-target destination.** Pass `destination: { type: "push-target", targetId }` to have the finished rows sent to a configured push target instead of downloaded. The target is checked before anything is queued; a refusal returns the push target's status and `code` (`TARGET_NOT_FOUND` 404, `FORBIDDEN` 403, `PLAN_REQUIRED` 402, `TARGET_DISABLED` 409, `ENTITY_MISMATCH` 400). Limits and billing are the same as a file delivery, except that push-target deliveries from the ModelMatch web app are not billed.
|
|
5736
4999
|
*/
|
|
5737
|
-
const
|
|
5000
|
+
const submitOriginatorsBulkDelivery = (options) => {
|
|
5738
5001
|
return (options?.client ?? client).post({
|
|
5739
5002
|
security: [{
|
|
5740
5003
|
name: "x-api-key",
|
|
@@ -5759,7 +5022,7 @@ const submitOriginatorsBulkDelivery2 = (options) => {
|
|
|
5759
5022
|
*
|
|
5760
5023
|
* Idempotent-ish: cancelling a job that has already finished (or was already cancelled) returns 409 and changes nothing. Poll `GET /v1/originators/bulk-delivery/{jobId}` for the settled state.
|
|
5761
5024
|
*/
|
|
5762
|
-
const
|
|
5025
|
+
const cancelOriginatorsBulkDeliveryJob = (options) => {
|
|
5763
5026
|
return (options.client ?? client).delete({
|
|
5764
5027
|
security: [{
|
|
5765
5028
|
name: "x-api-key",
|
|
@@ -5775,7 +5038,7 @@ const cancelOriginatorsBulkDeliveryJob2 = (options) => {
|
|
|
5775
5038
|
/**
|
|
5776
5039
|
* Get bulk-delivery job status for originators
|
|
5777
5040
|
*/
|
|
5778
|
-
const
|
|
5041
|
+
const getOriginatorsBulkDeliveryJob = (options) => {
|
|
5779
5042
|
return (options.client ?? client).get({
|
|
5780
5043
|
security: [{
|
|
5781
5044
|
name: "x-api-key",
|
|
@@ -5792,7 +5055,7 @@ const getOriginatorsBulkDeliveryJob2 = (options) => {
|
|
|
5792
5055
|
* Count originators matching filters
|
|
5793
5056
|
* Return the exact number of originators matching the given filters. Accepts the same request body as `listOriginators` (pagination and sort are ignored). Use this when you only need a total; to get the matching originators themselves, send the same request body to `listOriginators`.
|
|
5794
5057
|
*/
|
|
5795
|
-
const
|
|
5058
|
+
const countOriginators = (options) => {
|
|
5796
5059
|
return (options?.client ?? client).post({
|
|
5797
5060
|
security: [{
|
|
5798
5061
|
name: "x-api-key",
|
|
@@ -5829,7 +5092,7 @@ const originatorRelated = (options) => {
|
|
|
5829
5092
|
/**
|
|
5830
5093
|
* Get originator by NMLS ID
|
|
5831
5094
|
*/
|
|
5832
|
-
const
|
|
5095
|
+
const getOriginator = (options) => {
|
|
5833
5096
|
return (options.client ?? client).get({
|
|
5834
5097
|
security: [{
|
|
5835
5098
|
name: "x-api-key",
|
|
@@ -5846,7 +5109,7 @@ const getOriginator2 = (options) => {
|
|
|
5846
5109
|
* Real-estate agents this LO co-closed with
|
|
5847
5110
|
* Ranks the real-estate agents on the selling side of this LO's loans, by volume. Buckets whose name is an MLS placeholder for "no selling agent recorded" (`non member`, `non listed agent`, and ~140 board-specific spellings) are excluded rather than ranked as agents — they are not people and cannot be resolved with `GET /v1/agents/{id}`. Percentages are shares of the LO's whole loan population, so they do not sum to 100 across the page.
|
|
5848
5111
|
*/
|
|
5849
|
-
const
|
|
5112
|
+
const originatorAgents = (options) => {
|
|
5850
5113
|
return (options.client ?? client).post({
|
|
5851
5114
|
security: [{
|
|
5852
5115
|
name: "x-api-key",
|
|
@@ -5866,7 +5129,7 @@ const originatorAgents2 = (options) => {
|
|
|
5866
5129
|
/**
|
|
5867
5130
|
* Branch (broker) history for this LO
|
|
5868
5131
|
*/
|
|
5869
|
-
const
|
|
5132
|
+
const originatorBranches = (options) => {
|
|
5870
5133
|
return (options.client ?? client).post({
|
|
5871
5134
|
security: [{
|
|
5872
5135
|
name: "x-api-key",
|
|
@@ -5886,7 +5149,7 @@ const originatorBranches2 = (options) => {
|
|
|
5886
5149
|
/**
|
|
5887
5150
|
* Broker shops this LO originated loans through (name-resolved)
|
|
5888
5151
|
*/
|
|
5889
|
-
const
|
|
5152
|
+
const originatorBrokers = (options) => {
|
|
5890
5153
|
return (options.client ?? client).post({
|
|
5891
5154
|
security: [{
|
|
5892
5155
|
name: "x-api-key",
|
|
@@ -5906,7 +5169,7 @@ const originatorBrokers2 = (options) => {
|
|
|
5906
5169
|
/**
|
|
5907
5170
|
* City volume breakdown across this LO's loans
|
|
5908
5171
|
*/
|
|
5909
|
-
const
|
|
5172
|
+
const originatorCitiesBreakdown = (options) => {
|
|
5910
5173
|
return (options.client ?? client).post({
|
|
5911
5174
|
security: [{
|
|
5912
5175
|
name: "x-api-key",
|
|
@@ -5926,7 +5189,7 @@ const originatorCitiesBreakdown2 = (options) => {
|
|
|
5926
5189
|
/**
|
|
5927
5190
|
* Funding companies (employer history) for this LO
|
|
5928
5191
|
*/
|
|
5929
|
-
const
|
|
5192
|
+
const originatorCompanies = (options) => {
|
|
5930
5193
|
return (options.client ?? client).post({
|
|
5931
5194
|
security: [{
|
|
5932
5195
|
name: "x-api-key",
|
|
@@ -5946,7 +5209,7 @@ const originatorCompanies2 = (options) => {
|
|
|
5946
5209
|
/**
|
|
5947
5210
|
* County (FIPS) volume breakdown across this LO's loans
|
|
5948
5211
|
*/
|
|
5949
|
-
const
|
|
5212
|
+
const originatorCountiesBreakdown = (options) => {
|
|
5950
5213
|
return (options.client ?? client).post({
|
|
5951
5214
|
security: [{
|
|
5952
5215
|
name: "x-api-key",
|
|
@@ -5966,7 +5229,7 @@ const originatorCountiesBreakdown2 = (options) => {
|
|
|
5966
5229
|
/**
|
|
5967
5230
|
* Lenders this LO has originated through
|
|
5968
5231
|
*/
|
|
5969
|
-
const
|
|
5232
|
+
const originatorLenders = (options) => {
|
|
5970
5233
|
return (options.client ?? client).post({
|
|
5971
5234
|
security: [{
|
|
5972
5235
|
name: "x-api-key",
|
|
@@ -5986,7 +5249,7 @@ const originatorLenders2 = (options) => {
|
|
|
5986
5249
|
/**
|
|
5987
5250
|
* Real-estate offices this LO closed through (with sponsoring company)
|
|
5988
5251
|
*/
|
|
5989
|
-
const
|
|
5252
|
+
const originatorOffices = (options) => {
|
|
5990
5253
|
return (options.client ?? client).post({
|
|
5991
5254
|
security: [{
|
|
5992
5255
|
name: "x-api-key",
|
|
@@ -6006,7 +5269,7 @@ const originatorOffices2 = (options) => {
|
|
|
6006
5269
|
/**
|
|
6007
5270
|
* State volume breakdown across this LO's loans
|
|
6008
5271
|
*/
|
|
6009
|
-
const
|
|
5272
|
+
const originatorStatesBreakdown = (options) => {
|
|
6010
5273
|
return (options.client ?? client).post({
|
|
6011
5274
|
security: [{
|
|
6012
5275
|
name: "x-api-key",
|
|
@@ -6027,7 +5290,7 @@ const originatorStatesBreakdown2 = (options) => {
|
|
|
6027
5290
|
* Title companies on this LO's loans (spellings merged)
|
|
6028
5291
|
* Ranks the title companies on this entity's loans (recorded deeds, `recording_date` window — the same population and period axis as every other loans breakdown). Spellings of one company are MERGED: `label` is its most-used spelling, `id` the normalized name every spelling was grouped under (legal-form and filler words such as `inc`, `llc`, `co`, `company`, `title`, `escrow` removed; `natl` → `national`). Placeholder entries meaning "no title company recorded" (`none available` and its misspellings, `unknown`, `n/a`, …) and names shorter than 3 characters are excluded rather than ranked. `attorney` and `accommodation` are kept: they say who closed. `pctUnits` / `pctVolume` are shares of the entity's WHOLE loan population in the window, including loans with no title company, so they do not sum to 100 across the page. Pages of up to 100 via `pagination`.
|
|
6029
5292
|
*/
|
|
6030
|
-
const
|
|
5293
|
+
const originatorTitleCompanies = (options) => {
|
|
6031
5294
|
return (options.client ?? client).post({
|
|
6032
5295
|
security: [{
|
|
6033
5296
|
name: "x-api-key",
|
|
@@ -6047,7 +5310,7 @@ const originatorTitleCompanies2 = (options) => {
|
|
|
6047
5310
|
/**
|
|
6048
5311
|
* Zip-code volume breakdown
|
|
6049
5312
|
*/
|
|
6050
|
-
const
|
|
5313
|
+
const originatorZipCodes = (options) => {
|
|
6051
5314
|
return (options.client ?? client).post({
|
|
6052
5315
|
security: [{
|
|
6053
5316
|
name: "x-api-key",
|
|
@@ -6067,7 +5330,7 @@ const originatorZipCodes2 = (options) => {
|
|
|
6067
5330
|
/**
|
|
6068
5331
|
* Loans originated by this LO
|
|
6069
5332
|
*/
|
|
6070
|
-
const
|
|
5333
|
+
const originatorLoans = (options) => {
|
|
6071
5334
|
return (options.client ?? client).post({
|
|
6072
5335
|
security: [{
|
|
6073
5336
|
name: "x-api-key",
|
|
@@ -6088,7 +5351,7 @@ const originatorLoans2 = (options) => {
|
|
|
6088
5351
|
* The markets this LO lends in
|
|
6089
5352
|
* One blended view of a loan officer's lending footprint: the ZIP codes they originated in, city / county / state rollups of the same scope, and the period totals those markets are a share of. AVERAGES ARE VOLUME-WEIGHTED: the summary loan size is Σ volume ÷ Σ units, not an unweighted mean of the per-market averages (on a real footprint the two differ by thousands of dollars). Sending `zipCodes` narrows every grain to those ZIPs; sending a `dateRange` re-cuts the window. Either switches the response from the LO's pre-aggregated footprint to a live aggregation of their loans — `source` and `sourceReasons` say which was used, and bucket `key` forms differ between them (use `name` for display). All shares on this response are 0–100 percentages. A summary can cover less than the whole book: production that could not be attributed to a place is held out and reported in `summary.unresolved` rather than being folded in or silently dropped. The summary also carries a Community Lending mix — what kind of neighborhood this book lands in. These are U.S. Census tract-level aggregates describing whole neighborhoods, never individual, household or applicant attributes. Unscoped it is the LO's own whole-period mix; a ZIP or date scope recomputes it over the markets in scope, and `summary.communityLending.basis` says which you got.
|
|
6090
5353
|
*/
|
|
6091
|
-
const
|
|
5354
|
+
const originatorMarkets = (options) => {
|
|
6092
5355
|
return (options.client ?? client).post({
|
|
6093
5356
|
security: [{
|
|
6094
5357
|
name: "x-api-key",
|
|
@@ -6109,7 +5372,7 @@ const originatorMarkets2 = (options) => {
|
|
|
6109
5372
|
* Properties this loan officer has touched
|
|
6110
5373
|
* Returns the parcels this loan officer is attributed to in public record — the reverse of the `parties` block on `GET /v1/properties/{id}`. Accepts the same filters, sorts and pagination as the main property search, so a caller can ask 'this LO's parcels in Travis County built after 2015' in one request. Attribution is ALL-TIME: a parcel stays in this LO's set after the loan is paid off, because the question is career reach rather than current book. An LO with no attributed parcels returns an empty page, not a 404 — the LO may be real and simply have nothing in the public record yet.
|
|
6111
5374
|
*/
|
|
6112
|
-
const
|
|
5375
|
+
const originatorProperties = (options) => {
|
|
6113
5376
|
return (options.client ?? client).post({
|
|
6114
5377
|
security: [{
|
|
6115
5378
|
name: "x-api-key",
|
|
@@ -6700,4 +5963,4 @@ const getSearchToken = (options) => {
|
|
|
6700
5963
|
});
|
|
6701
5964
|
};
|
|
6702
5965
|
//#endregion
|
|
6703
|
-
export { client as _heyApiClient, actionCrmCallerId, addCrmContactMethod, addCrmListMember, addCrmListMembersBulk, addCrmNote, addCrmRecord, addCrmRecordsBulk, addWatchedAgent, addWatchedArea, addWatchedDocument, adminGetBulkJob, adminGetCadLinks, adminGetCadLoadTask, adminLaunchCadLoad, agentAnalyticsChart,
|
|
5966
|
+
export { client as _heyApiClient, actionCrmCallerId, addCrmContactMethod, addCrmListMember, addCrmListMembersBulk, addCrmNote, addCrmRecord, addCrmRecordsBulk, addWatchedAgent, addWatchedArea, addWatchedDocument, adminGetBulkJob, adminGetCadLinks, adminGetCadLoadTask, adminLaunchCadLoad, agentAnalyticsChart, agentAnalyticsSummary, agentAnalyticsTimeSeries, agentCities, agentCompanies, agentCounties, agentLenders, agentMarkets, agentOffices, agentOriginators, agentProperties, agentRelated, agentSales, agentStates, agentZipCodes, analyzeCrmCall, applyCrmEnrichment, applyCrmListTemplate, applyCrmMiUpdates, branchAnalyticsChart, branchAnalyticsSummary, branchAnalyticsTimeSeries, branchCities, branchCounties, branchLenders, branchLoans, branchOriginators, branchRoster, branchStates, branchTitleCompanies, cancelAgentsBulkDeliveryJob, cancelBranchesBulkDeliveryJob, cancelCompaniesBulkDeliveryJob, cancelEnrichBulkJob, cancelLoansBulkDeliveryJob, cancelOriginatorsBulkDeliveryJob, cancelPropertiesBulkDeliveryJob, companyAgents, companyAnalyticsChart, companyAnalyticsSummary, companyAnalyticsTimeSeries, companyBranches, companyBrokers, companyCities, companyCounties, companyEarlyExits, companyEmployeeStats, companyEmployment, companyHeadcount, companyLenders, companyMarkets, companyOffices, companyOriginators, companyRelated, companySponsoredIndividuals, companySponsorshipMovement, companyStates, companyTalentFlow, companyTitleCompanies, companyZipCodes, countAgents, countBranches, countCompanies, countLenders, countLoans, countOffices, countOriginators, countProperties, countSales, createAlertSubscription, createClient, createCrmList, createCrmListField, createCrmManualRecord, createCrmMeeting, createCrmObjectField, createCrmRecord, createCrmTask, createCrmTemplate, createSavedFilter, crmLenderChannels, crmLoLoanMix, crmLoMomentum, crmLoSponsorLocation, crmSimilarOriginators, declineCrmMiUpdate, deleteAlertSubscription, deleteCrmCallerId, deleteCrmList, deleteCrmListField, deleteCrmMeeting, deleteCrmNote, deleteCrmObjectField, deleteCrmRecord, deleteCrmRecords, deleteCrmTask, deleteCrmTemplate, deleteSavedFilter, describeCrmRecordsOnAdd, dismissCrmMiUpdates, editCrmLoggedActivity, editCrmNote, enrichPropertiesBatch, enrichPropertiesBulk, enrichProperty, filterCrmListMembers, findCrmRecordByNmls, generateCrmRecordDescription, getAgent, getAgentsBulkDeliveryJob, getAlertConditions, getAlertUnreadCount, getBranch, getBranchesBulkDeliveryJob, getCompaniesBulkDeliveryJob, getCompany, getCrmActiveCall, getCrmActivityReport, getCrmCall, getCrmCallTranscript, getCrmCustomValues, getCrmImportJob, getCrmList, getCrmListMemberIds, getCrmListShares, getCrmMiUpdates, getCrmOutcomesReport, getCrmOverrides, getCrmProductionEnrichJob, getCrmRecordAccess, getCrmRecordAccessRequest, getCrmRecordConnections, getCrmRecordMemberIds, getCrmRecordProfile, getCrmTemplate, getCrmTemplateShares, getEnrichBulkJob, getHubspotPushStatus, getLender, getLoan, getLoansBulkDeliveryJob, getMe, getMeCredits, getMePlan, getOffice, getOriginator, getOriginatorsBulkDeliveryJob, getPropertiesBulkDeliveryJob, getProperty, getRealtimeConfig, getSale, getSavedFilter, getSearchToken, grantCrmListAccess, grantCrmRecordAccess, grantCrmRecordAccessRequest, hangupCrmCall, importCrmRecords, instantSearch, lenderCities, lenderCompanies, lenderCounties, lenderOriginators, lenderStates, linkCrmRecord, listAgents, listAlertDigests, listAlertLog, listAlertRecipes, listAlertSubscriptions, listBranches, listCompanies, listCrmActivity, listCrmCallerIds, listCrmCustomFields, listCrmListAssignees, listCrmListFields, listCrmListMemberships, listCrmListShareableMembers, listCrmLists, listCrmMeetings, listCrmMembers, listCrmOrgMembers, listCrmRecordShareableMembers, listCrmRecordShares, listCrmReferencedActivity, listCrmTasks, listCrmTemplates, listCrmWorkspaceMeetings, listCrmWorkspaceTasks, listEnrichments, listLenders, listLoans, listMarket, listOffices, listOriginators, listProperties, listSales, listSavedFilters, listWatchedAgents, listWatchedAreas, listWatchedDocuments, loanRelated, loansAnalyticsChart, loansAnalyticsSummary, loansAnalyticsTimeSeries, logCrmActivity, lookupCompanies, markAlertDigestRead, markAlertRead, markAllAlertsRead, marketAnalyticsChart, marketAnalyticsSummary, marketAnalyticsTimeSeries, marketCommunityLending, marketMovementActivity, marketMovementByState, marketMovementCohortPayoff, marketMovementMostGained, marketMovementMostLost, marketMovementMovers, marketMovementRankings, marketMovementStats, marketMovementTransitions, officeAgents, originatorAgents, originatorAnalyticsChart, originatorAnalyticsSummary, originatorAnalyticsTimeSeries, originatorBranches, originatorBrokers, originatorCitiesBreakdown, originatorCompanies, originatorCountiesBreakdown, originatorLenders, originatorLoans, originatorMarkets, originatorOffices, originatorProperties, originatorRelated, originatorStatesBreakdown, originatorTitleCompanies, originatorZipCodes, placeCrmCall, previewAlertRecipe, previewAlerts, propertiesAnalyticsChart, propertiesAnalyticsSummary, propertyRelated, pushToHubspot, reconcileCrmMeetings, refreshCrmRecordMirror, removeCrmContactMethod, removeCrmListMember, removeWatchedAgent, removeWatchedArea, removeWatchedDocument, requestCrmAccess, requestCrmRecordAccess, retrieveLocation, revokeCrmListAccess, revokeCrmRecordAccess, saleRelated, salesAnalyticsChart, salesAnalyticsSummary, salesAnalyticsTimeSeries, searchCrmEmailRecipients, searchCrmMatchCandidates, searchCrmMentionRecords, searchCrmRecords, searchProperties, sendCrmEmail, setCrmCallAnalysis, setCrmCustomValue, setCrmOverride, setCrmRecordOwner, setDefaultCrmCallerId, shareCrmTemplate, submitAgentsBulkDelivery, submitBranchesBulkDelivery, submitCompaniesBulkDelivery, submitLoansBulkDelivery, submitOriginatorsBulkDelivery, submitPropertiesBulkDelivery, subscribeAlertRecipe, suggestLocations, transcribeCrmCall, transferCrmListOwnership, unshareCrmTemplate, unsubscribeAlertRecipe, updateAlertConditions, updateCrmContactMethod, updateCrmList, updateCrmListField, updateCrmMeeting, updateCrmObjectField, updateCrmTask, updateCrmTemplate, updateMe, updateSavedFilter };
|