@model-match/api 3.18.0 → 3.19.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-Jxa7eF3K.d.mts} +5129 -7018
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +1 -1
- package/dist/slim/index.d.mts +46 -251
- package/dist/slim/index.mjs +46 -915
- package/dist/{src-cKUuYWMX.mjs → src-CjmGJZ9U.mjs} +1485 -2354
- package/openapi.json +98 -3876
- 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-CjmGJZ9U.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",
|
|
@@ -4956,7 +4087,7 @@ const lenderCounties = (options) => {
|
|
|
4956
4087
|
};
|
|
4957
4088
|
/**
|
|
4958
4089
|
* 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.
|
|
4090
|
+
* 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
4091
|
*/
|
|
4961
4092
|
const lenderOriginators = (options) => {
|
|
4962
4093
|
return (options.client ?? client).post({
|
|
@@ -5647,7 +4778,7 @@ const getOffice = (options) => {
|
|
|
5647
4778
|
* Search originators with filters
|
|
5648
4779
|
* 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
4780
|
*/
|
|
5650
|
-
const
|
|
4781
|
+
const listOriginators = (options) => {
|
|
5651
4782
|
return (options?.client ?? client).post({
|
|
5652
4783
|
security: [{
|
|
5653
4784
|
name: "x-api-key",
|
|
@@ -5667,7 +4798,7 @@ const listOriginators2 = (options) => {
|
|
|
5667
4798
|
/**
|
|
5668
4799
|
* Configurable chart (measure × slice) over one LO's loans
|
|
5669
4800
|
*/
|
|
5670
|
-
const
|
|
4801
|
+
const originatorAnalyticsChart = (options) => {
|
|
5671
4802
|
return (options?.client ?? client).post({
|
|
5672
4803
|
security: [{
|
|
5673
4804
|
name: "x-api-key",
|
|
@@ -5687,7 +4818,7 @@ const originatorAnalyticsChart2 = (options) => {
|
|
|
5687
4818
|
/**
|
|
5688
4819
|
* Production summary with previous-period comparison
|
|
5689
4820
|
*/
|
|
5690
|
-
const
|
|
4821
|
+
const originatorAnalyticsSummary = (options) => {
|
|
5691
4822
|
return (options?.client ?? client).post({
|
|
5692
4823
|
security: [{
|
|
5693
4824
|
name: "x-api-key",
|
|
@@ -5707,7 +4838,7 @@ const originatorAnalyticsSummary2 = (options) => {
|
|
|
5707
4838
|
/**
|
|
5708
4839
|
* Originator volume / units over time
|
|
5709
4840
|
*/
|
|
5710
|
-
const
|
|
4841
|
+
const originatorAnalyticsTimeSeries = (options) => {
|
|
5711
4842
|
return (options?.client ?? client).post({
|
|
5712
4843
|
security: [{
|
|
5713
4844
|
name: "x-api-key",
|
|
@@ -5734,7 +4865,7 @@ const originatorAnalyticsTimeSeries2 = (options) => {
|
|
|
5734
4865
|
*
|
|
5735
4866
|
* **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
4867
|
*/
|
|
5737
|
-
const
|
|
4868
|
+
const submitOriginatorsBulkDelivery = (options) => {
|
|
5738
4869
|
return (options?.client ?? client).post({
|
|
5739
4870
|
security: [{
|
|
5740
4871
|
name: "x-api-key",
|
|
@@ -5759,7 +4890,7 @@ const submitOriginatorsBulkDelivery2 = (options) => {
|
|
|
5759
4890
|
*
|
|
5760
4891
|
* 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
4892
|
*/
|
|
5762
|
-
const
|
|
4893
|
+
const cancelOriginatorsBulkDeliveryJob = (options) => {
|
|
5763
4894
|
return (options.client ?? client).delete({
|
|
5764
4895
|
security: [{
|
|
5765
4896
|
name: "x-api-key",
|
|
@@ -5775,7 +4906,7 @@ const cancelOriginatorsBulkDeliveryJob2 = (options) => {
|
|
|
5775
4906
|
/**
|
|
5776
4907
|
* Get bulk-delivery job status for originators
|
|
5777
4908
|
*/
|
|
5778
|
-
const
|
|
4909
|
+
const getOriginatorsBulkDeliveryJob = (options) => {
|
|
5779
4910
|
return (options.client ?? client).get({
|
|
5780
4911
|
security: [{
|
|
5781
4912
|
name: "x-api-key",
|
|
@@ -5792,7 +4923,7 @@ const getOriginatorsBulkDeliveryJob2 = (options) => {
|
|
|
5792
4923
|
* Count originators matching filters
|
|
5793
4924
|
* 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
4925
|
*/
|
|
5795
|
-
const
|
|
4926
|
+
const countOriginators = (options) => {
|
|
5796
4927
|
return (options?.client ?? client).post({
|
|
5797
4928
|
security: [{
|
|
5798
4929
|
name: "x-api-key",
|
|
@@ -5829,7 +4960,7 @@ const originatorRelated = (options) => {
|
|
|
5829
4960
|
/**
|
|
5830
4961
|
* Get originator by NMLS ID
|
|
5831
4962
|
*/
|
|
5832
|
-
const
|
|
4963
|
+
const getOriginator = (options) => {
|
|
5833
4964
|
return (options.client ?? client).get({
|
|
5834
4965
|
security: [{
|
|
5835
4966
|
name: "x-api-key",
|
|
@@ -5846,7 +4977,7 @@ const getOriginator2 = (options) => {
|
|
|
5846
4977
|
* Real-estate agents this LO co-closed with
|
|
5847
4978
|
* 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
4979
|
*/
|
|
5849
|
-
const
|
|
4980
|
+
const originatorAgents = (options) => {
|
|
5850
4981
|
return (options.client ?? client).post({
|
|
5851
4982
|
security: [{
|
|
5852
4983
|
name: "x-api-key",
|
|
@@ -5866,7 +4997,7 @@ const originatorAgents2 = (options) => {
|
|
|
5866
4997
|
/**
|
|
5867
4998
|
* Branch (broker) history for this LO
|
|
5868
4999
|
*/
|
|
5869
|
-
const
|
|
5000
|
+
const originatorBranches = (options) => {
|
|
5870
5001
|
return (options.client ?? client).post({
|
|
5871
5002
|
security: [{
|
|
5872
5003
|
name: "x-api-key",
|
|
@@ -5886,7 +5017,7 @@ const originatorBranches2 = (options) => {
|
|
|
5886
5017
|
/**
|
|
5887
5018
|
* Broker shops this LO originated loans through (name-resolved)
|
|
5888
5019
|
*/
|
|
5889
|
-
const
|
|
5020
|
+
const originatorBrokers = (options) => {
|
|
5890
5021
|
return (options.client ?? client).post({
|
|
5891
5022
|
security: [{
|
|
5892
5023
|
name: "x-api-key",
|
|
@@ -5906,7 +5037,7 @@ const originatorBrokers2 = (options) => {
|
|
|
5906
5037
|
/**
|
|
5907
5038
|
* City volume breakdown across this LO's loans
|
|
5908
5039
|
*/
|
|
5909
|
-
const
|
|
5040
|
+
const originatorCitiesBreakdown = (options) => {
|
|
5910
5041
|
return (options.client ?? client).post({
|
|
5911
5042
|
security: [{
|
|
5912
5043
|
name: "x-api-key",
|
|
@@ -5926,7 +5057,7 @@ const originatorCitiesBreakdown2 = (options) => {
|
|
|
5926
5057
|
/**
|
|
5927
5058
|
* Funding companies (employer history) for this LO
|
|
5928
5059
|
*/
|
|
5929
|
-
const
|
|
5060
|
+
const originatorCompanies = (options) => {
|
|
5930
5061
|
return (options.client ?? client).post({
|
|
5931
5062
|
security: [{
|
|
5932
5063
|
name: "x-api-key",
|
|
@@ -5946,7 +5077,7 @@ const originatorCompanies2 = (options) => {
|
|
|
5946
5077
|
/**
|
|
5947
5078
|
* County (FIPS) volume breakdown across this LO's loans
|
|
5948
5079
|
*/
|
|
5949
|
-
const
|
|
5080
|
+
const originatorCountiesBreakdown = (options) => {
|
|
5950
5081
|
return (options.client ?? client).post({
|
|
5951
5082
|
security: [{
|
|
5952
5083
|
name: "x-api-key",
|
|
@@ -5966,7 +5097,7 @@ const originatorCountiesBreakdown2 = (options) => {
|
|
|
5966
5097
|
/**
|
|
5967
5098
|
* Lenders this LO has originated through
|
|
5968
5099
|
*/
|
|
5969
|
-
const
|
|
5100
|
+
const originatorLenders = (options) => {
|
|
5970
5101
|
return (options.client ?? client).post({
|
|
5971
5102
|
security: [{
|
|
5972
5103
|
name: "x-api-key",
|
|
@@ -5986,7 +5117,7 @@ const originatorLenders2 = (options) => {
|
|
|
5986
5117
|
/**
|
|
5987
5118
|
* Real-estate offices this LO closed through (with sponsoring company)
|
|
5988
5119
|
*/
|
|
5989
|
-
const
|
|
5120
|
+
const originatorOffices = (options) => {
|
|
5990
5121
|
return (options.client ?? client).post({
|
|
5991
5122
|
security: [{
|
|
5992
5123
|
name: "x-api-key",
|
|
@@ -6006,7 +5137,7 @@ const originatorOffices2 = (options) => {
|
|
|
6006
5137
|
/**
|
|
6007
5138
|
* State volume breakdown across this LO's loans
|
|
6008
5139
|
*/
|
|
6009
|
-
const
|
|
5140
|
+
const originatorStatesBreakdown = (options) => {
|
|
6010
5141
|
return (options.client ?? client).post({
|
|
6011
5142
|
security: [{
|
|
6012
5143
|
name: "x-api-key",
|
|
@@ -6027,7 +5158,7 @@ const originatorStatesBreakdown2 = (options) => {
|
|
|
6027
5158
|
* Title companies on this LO's loans (spellings merged)
|
|
6028
5159
|
* 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
5160
|
*/
|
|
6030
|
-
const
|
|
5161
|
+
const originatorTitleCompanies = (options) => {
|
|
6031
5162
|
return (options.client ?? client).post({
|
|
6032
5163
|
security: [{
|
|
6033
5164
|
name: "x-api-key",
|
|
@@ -6047,7 +5178,7 @@ const originatorTitleCompanies2 = (options) => {
|
|
|
6047
5178
|
/**
|
|
6048
5179
|
* Zip-code volume breakdown
|
|
6049
5180
|
*/
|
|
6050
|
-
const
|
|
5181
|
+
const originatorZipCodes = (options) => {
|
|
6051
5182
|
return (options.client ?? client).post({
|
|
6052
5183
|
security: [{
|
|
6053
5184
|
name: "x-api-key",
|
|
@@ -6067,7 +5198,7 @@ const originatorZipCodes2 = (options) => {
|
|
|
6067
5198
|
/**
|
|
6068
5199
|
* Loans originated by this LO
|
|
6069
5200
|
*/
|
|
6070
|
-
const
|
|
5201
|
+
const originatorLoans = (options) => {
|
|
6071
5202
|
return (options.client ?? client).post({
|
|
6072
5203
|
security: [{
|
|
6073
5204
|
name: "x-api-key",
|
|
@@ -6088,7 +5219,7 @@ const originatorLoans2 = (options) => {
|
|
|
6088
5219
|
* The markets this LO lends in
|
|
6089
5220
|
* 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
5221
|
*/
|
|
6091
|
-
const
|
|
5222
|
+
const originatorMarkets = (options) => {
|
|
6092
5223
|
return (options.client ?? client).post({
|
|
6093
5224
|
security: [{
|
|
6094
5225
|
name: "x-api-key",
|
|
@@ -6109,7 +5240,7 @@ const originatorMarkets2 = (options) => {
|
|
|
6109
5240
|
* Properties this loan officer has touched
|
|
6110
5241
|
* 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
5242
|
*/
|
|
6112
|
-
const
|
|
5243
|
+
const originatorProperties = (options) => {
|
|
6113
5244
|
return (options.client ?? client).post({
|
|
6114
5245
|
security: [{
|
|
6115
5246
|
name: "x-api-key",
|
|
@@ -6700,4 +5831,4 @@ const getSearchToken = (options) => {
|
|
|
6700
5831
|
});
|
|
6701
5832
|
};
|
|
6702
5833
|
//#endregion
|
|
6703
|
-
export { client as _heyApiClient, actionCrmCallerId, addCrmContactMethod, addCrmListMember, addCrmListMembersBulk, addCrmNote, addCrmRecord, addCrmRecordsBulk, addWatchedAgent, addWatchedArea, addWatchedDocument, adminGetBulkJob, adminGetCadLinks, adminGetCadLoadTask, adminLaunchCadLoad, agentAnalyticsChart,
|
|
5834
|
+
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, createClient, createCrmList, createCrmListField, createCrmManualRecord, createCrmMeeting, createCrmObjectField, createCrmRecord, createCrmTask, createCrmTemplate, createSavedFilter, crmLenderChannels, crmLoLoanMix, crmLoMomentum, crmLoSponsorLocation, crmSimilarOriginators, declineCrmMiUpdate, 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, 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, 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, suggestLocations, transcribeCrmCall, transferCrmListOwnership, unshareCrmTemplate, updateAlertConditions, updateCrmContactMethod, updateCrmList, updateCrmListField, updateCrmMeeting, updateCrmObjectField, updateCrmTask, updateCrmTemplate, updateMe, updateSavedFilter };
|