@model-match/api 3.40.0 → 3.42.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-BwNk0TIe.d.mts → index-KGy1KIQe.d.mts} +396 -3
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +1 -1
- package/dist/slim/index.d.mts +32 -2
- package/dist/slim/index.mjs +128 -2
- package/dist/{src-CoGt92lf.mjs → src-CCTsE9Lr.mjs} +126 -0
- package/openapi.json +1083 -165
- package/package.json +2 -2
package/openapi.json
CHANGED
|
@@ -35158,6 +35158,47 @@
|
|
|
35158
35158
|
},
|
|
35159
35159
|
"type": "object"
|
|
35160
35160
|
},
|
|
35161
|
+
"OfficeCrmListFilter": {
|
|
35162
|
+
"additionalProperties": false,
|
|
35163
|
+
"description": "Scope the result to the caller's CRM. Resolved against the caller's ACTIVE WORKSPACE at query time — list membership is read server-side, so the request never carries member ids. Only real-estate office members count; people, mortgage companies, branches and manual (unlinked) records on the same list are ignored. `mode: \"in\"` with no matching members returns an empty page (not an unfiltered one). Errors: 400 `crm_list_requires_workspace` when the caller has no active workspace (API-key / OAuth callers must select an organization), 403 / 404 when a named list is not visible to the caller or does not exist, and 400 `crm_list_too_large` when the selected lists hold more than 50,000 offices in total — narrow the selection rather than get a silently partial answer.",
|
|
35164
|
+
"properties": {
|
|
35165
|
+
"lists": {
|
|
35166
|
+
"anyOf": [
|
|
35167
|
+
{
|
|
35168
|
+
"description": "Every list in the caller's workspace that the caller can see (own, org-wide, or shared with them) and that holds this kind of record — People lists for originators and agents, Company lists for companies.",
|
|
35169
|
+
"enum": [
|
|
35170
|
+
"any"
|
|
35171
|
+
],
|
|
35172
|
+
"type": "string"
|
|
35173
|
+
},
|
|
35174
|
+
{
|
|
35175
|
+
"description": "Specific CRM list ids (1–50).",
|
|
35176
|
+
"items": {
|
|
35177
|
+
"minLength": 1,
|
|
35178
|
+
"type": "string"
|
|
35179
|
+
},
|
|
35180
|
+
"maxItems": 50,
|
|
35181
|
+
"minItems": 1,
|
|
35182
|
+
"type": "array"
|
|
35183
|
+
}
|
|
35184
|
+
],
|
|
35185
|
+
"description": "Which lists: `\"any\"` for every Company list the caller can see, or an array of list ids. Membership is the UNION across the selected lists."
|
|
35186
|
+
},
|
|
35187
|
+
"mode": {
|
|
35188
|
+
"description": "`in` — only offices who are a member of the selected list(s). `notIn` — exclude every office who is a member of the selected list(s); everyone else passes, including offices on none of your lists.",
|
|
35189
|
+
"enum": [
|
|
35190
|
+
"in",
|
|
35191
|
+
"notIn"
|
|
35192
|
+
],
|
|
35193
|
+
"type": "string"
|
|
35194
|
+
}
|
|
35195
|
+
},
|
|
35196
|
+
"required": [
|
|
35197
|
+
"mode",
|
|
35198
|
+
"lists"
|
|
35199
|
+
],
|
|
35200
|
+
"type": "object"
|
|
35201
|
+
},
|
|
35161
35202
|
"OfficeDetail": {
|
|
35162
35203
|
"allOf": [
|
|
35163
35204
|
{
|
|
@@ -35165,10 +35206,6 @@
|
|
|
35165
35206
|
},
|
|
35166
35207
|
{
|
|
35167
35208
|
"properties": {
|
|
35168
|
-
"email": {
|
|
35169
|
-
"nullable": true,
|
|
35170
|
-
"type": "string"
|
|
35171
|
-
},
|
|
35172
35209
|
"fullAddress": {
|
|
35173
35210
|
"nullable": true,
|
|
35174
35211
|
"type": "string"
|
|
@@ -35177,10 +35214,6 @@
|
|
|
35177
35214
|
"nullable": true,
|
|
35178
35215
|
"type": "string"
|
|
35179
35216
|
},
|
|
35180
|
-
"phone": {
|
|
35181
|
-
"nullable": true,
|
|
35182
|
-
"type": "string"
|
|
35183
|
-
},
|
|
35184
35217
|
"totalListPriceActive": {
|
|
35185
35218
|
"description": "Total list price of active listings at this office",
|
|
35186
35219
|
"nullable": true,
|
|
@@ -35236,9 +35269,49 @@
|
|
|
35236
35269
|
"avgListPrice": {
|
|
35237
35270
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
35238
35271
|
},
|
|
35272
|
+
"avgMortgagedBuyerLoanAmount": {
|
|
35273
|
+
"allOf": [
|
|
35274
|
+
{
|
|
35275
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
35276
|
+
},
|
|
35277
|
+
{
|
|
35278
|
+
"description": "Mean loan size on the office's financed BUYER-side deals in the period."
|
|
35279
|
+
}
|
|
35280
|
+
]
|
|
35281
|
+
},
|
|
35282
|
+
"avgMortgagedLoanAmount": {
|
|
35283
|
+
"allOf": [
|
|
35284
|
+
{
|
|
35285
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
35286
|
+
},
|
|
35287
|
+
{
|
|
35288
|
+
"description": "Mean loan size on the office's financed deals in the period (either side)."
|
|
35289
|
+
}
|
|
35290
|
+
]
|
|
35291
|
+
},
|
|
35292
|
+
"avgMortgagedSellerLoanAmount": {
|
|
35293
|
+
"allOf": [
|
|
35294
|
+
{
|
|
35295
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
35296
|
+
},
|
|
35297
|
+
{
|
|
35298
|
+
"description": "Mean loan size on the office's financed LISTING-side deals (the buyer's loan) in the period."
|
|
35299
|
+
}
|
|
35300
|
+
]
|
|
35301
|
+
},
|
|
35239
35302
|
"avgSalePrice": {
|
|
35240
35303
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
35241
35304
|
},
|
|
35305
|
+
"builderCount": {
|
|
35306
|
+
"allOf": [
|
|
35307
|
+
{
|
|
35308
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
35309
|
+
},
|
|
35310
|
+
{
|
|
35311
|
+
"description": "Distinct home builders on the office's deals in the period — `{gt: 0}` = works with builders."
|
|
35312
|
+
}
|
|
35313
|
+
]
|
|
35314
|
+
},
|
|
35242
35315
|
"buyerUnits": {
|
|
35243
35316
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
35244
35317
|
},
|
|
@@ -35251,6 +35324,16 @@
|
|
|
35251
35324
|
"company": {
|
|
35252
35325
|
"$ref": "#/components/schemas/TextFilterValue"
|
|
35253
35326
|
},
|
|
35327
|
+
"county": {
|
|
35328
|
+
"allOf": [
|
|
35329
|
+
{
|
|
35330
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
35331
|
+
},
|
|
35332
|
+
{
|
|
35333
|
+
"description": "Office address COUNTY: a name (`Travis`, with `state` when ambiguous), a 5-digit FIPS (`48453`) or a dictionary county id; an array matches any. Matches when the office's geocoded point lies inside the county boundary (no geocode = no match). Unknown county = 400."
|
|
35334
|
+
}
|
|
35335
|
+
]
|
|
35336
|
+
},
|
|
35254
35337
|
"dualUnits": {
|
|
35255
35338
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
35256
35339
|
},
|
|
@@ -35267,6 +35350,17 @@
|
|
|
35267
35350
|
],
|
|
35268
35351
|
"type": "string"
|
|
35269
35352
|
},
|
|
35353
|
+
"msa": {
|
|
35354
|
+
"$ref": "#/components/schemas/OfficeMsaFilterValue"
|
|
35355
|
+
},
|
|
35356
|
+
"namePrefix": {
|
|
35357
|
+
"description": "Prefix name search: every word must start a word of the name (\"keller wil\" → Keller Williams Realty). No fuzzy/nickname matching; relevance-ranked unless `sort` is set. Max 100 chars / 6 words (emails, URLs, phones ignored), else 400. Spelling variants of brokerage names also match (\"remax\" ↔ \"Re/Max\").",
|
|
35358
|
+
"minLength": 1,
|
|
35359
|
+
"type": "string"
|
|
35360
|
+
},
|
|
35361
|
+
"region": {
|
|
35362
|
+
"$ref": "#/components/schemas/OfficeRegionFilterValue"
|
|
35363
|
+
},
|
|
35270
35364
|
"sellerUnits": {
|
|
35271
35365
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
35272
35366
|
},
|
|
@@ -35300,12 +35394,36 @@
|
|
|
35300
35394
|
"advancedFilters": {
|
|
35301
35395
|
"$ref": "#/components/schemas/FilterNode"
|
|
35302
35396
|
},
|
|
35397
|
+
"builderShare": {
|
|
35398
|
+
"additionalProperties": false,
|
|
35399
|
+
"description": "Share of the office's deals in the period that named a home builder, as a 0–100 percent (Σ builder units / total units). Implies `builderCount > 0`.",
|
|
35400
|
+
"properties": {
|
|
35401
|
+
"gte": {
|
|
35402
|
+
"maximum": 100,
|
|
35403
|
+
"minimum": 0,
|
|
35404
|
+
"type": "number"
|
|
35405
|
+
},
|
|
35406
|
+
"lte": {
|
|
35407
|
+
"maximum": 100,
|
|
35408
|
+
"minimum": 0,
|
|
35409
|
+
"type": "number"
|
|
35410
|
+
}
|
|
35411
|
+
},
|
|
35412
|
+
"type": "object"
|
|
35413
|
+
},
|
|
35414
|
+
"crmList": {
|
|
35415
|
+
"$ref": "#/components/schemas/OfficeCrmListFilter"
|
|
35416
|
+
},
|
|
35303
35417
|
"filters": {
|
|
35304
35418
|
"$ref": "#/components/schemas/FilterNode"
|
|
35305
35419
|
},
|
|
35306
35420
|
"flatFilters": {
|
|
35307
35421
|
"$ref": "#/components/schemas/OfficeFlatFilters"
|
|
35308
35422
|
},
|
|
35423
|
+
"includeTopOriginator": {
|
|
35424
|
+
"description": "Add `topOriginator` to every row (the LO on the most buyer-side deals in the period). Off by default — it reads each office's LO list.",
|
|
35425
|
+
"type": "boolean"
|
|
35426
|
+
},
|
|
35309
35427
|
"lenderFilters": {
|
|
35310
35428
|
"items": {
|
|
35311
35429
|
"$ref": "#/components/schemas/LenderFilterEntry"
|
|
@@ -35362,6 +35480,146 @@
|
|
|
35362
35480
|
],
|
|
35363
35481
|
"type": "object"
|
|
35364
35482
|
},
|
|
35483
|
+
"OfficeMsaFilterValue": {
|
|
35484
|
+
"anyOf": [
|
|
35485
|
+
{
|
|
35486
|
+
"type": "string"
|
|
35487
|
+
},
|
|
35488
|
+
{
|
|
35489
|
+
"items": {
|
|
35490
|
+
"type": "string"
|
|
35491
|
+
},
|
|
35492
|
+
"maxItems": 50,
|
|
35493
|
+
"minItems": 1,
|
|
35494
|
+
"type": "array"
|
|
35495
|
+
},
|
|
35496
|
+
{
|
|
35497
|
+
"nullable": true
|
|
35498
|
+
}
|
|
35499
|
+
],
|
|
35500
|
+
"description": "Office address METRO (MSA / CBSA): 5-digit CBSA code (`12420`) or metro name (`Austin Metro`); an array matches any. The office point inside any member county. Unknown/ambiguous = 400 naming candidates."
|
|
35501
|
+
},
|
|
35502
|
+
"OfficeNameSuggestRequest": {
|
|
35503
|
+
"additionalProperties": false,
|
|
35504
|
+
"properties": {
|
|
35505
|
+
"limit": {
|
|
35506
|
+
"description": "Max names (default 20).",
|
|
35507
|
+
"maximum": 50,
|
|
35508
|
+
"minimum": 1,
|
|
35509
|
+
"type": "integer"
|
|
35510
|
+
},
|
|
35511
|
+
"query": {
|
|
35512
|
+
"description": "The start of an office name (≥ 2 chars), matched as a phrase prefix on the name's words.",
|
|
35513
|
+
"maxLength": 100,
|
|
35514
|
+
"minLength": 2,
|
|
35515
|
+
"type": "string"
|
|
35516
|
+
}
|
|
35517
|
+
},
|
|
35518
|
+
"required": [
|
|
35519
|
+
"query"
|
|
35520
|
+
],
|
|
35521
|
+
"type": "object"
|
|
35522
|
+
},
|
|
35523
|
+
"OfficeNameSuggestResponse": {
|
|
35524
|
+
"properties": {
|
|
35525
|
+
"data": {
|
|
35526
|
+
"items": {
|
|
35527
|
+
"properties": {
|
|
35528
|
+
"agentCount": {
|
|
35529
|
+
"description": "Agents across every office with this name",
|
|
35530
|
+
"type": "number"
|
|
35531
|
+
},
|
|
35532
|
+
"name": {
|
|
35533
|
+
"description": "The office name as stored (lowercase) — pass it back as `company` on `listOffices`, or as `currentOffice` / `office` on `listAgents`.",
|
|
35534
|
+
"type": "string"
|
|
35535
|
+
},
|
|
35536
|
+
"officeCount": {
|
|
35537
|
+
"description": "Offices with this name",
|
|
35538
|
+
"type": "number"
|
|
35539
|
+
}
|
|
35540
|
+
},
|
|
35541
|
+
"required": [
|
|
35542
|
+
"name",
|
|
35543
|
+
"agentCount",
|
|
35544
|
+
"officeCount"
|
|
35545
|
+
],
|
|
35546
|
+
"type": "object"
|
|
35547
|
+
},
|
|
35548
|
+
"type": "array"
|
|
35549
|
+
}
|
|
35550
|
+
},
|
|
35551
|
+
"required": [
|
|
35552
|
+
"data"
|
|
35553
|
+
],
|
|
35554
|
+
"type": "object"
|
|
35555
|
+
},
|
|
35556
|
+
"OfficeRegionFilterValue": {
|
|
35557
|
+
"anyOf": [
|
|
35558
|
+
{
|
|
35559
|
+
"enum": [
|
|
35560
|
+
"northeast",
|
|
35561
|
+
"northeast-division-1",
|
|
35562
|
+
"northeast-division-2",
|
|
35563
|
+
"midwest",
|
|
35564
|
+
"midwest-division-3",
|
|
35565
|
+
"midwest-division-4",
|
|
35566
|
+
"south",
|
|
35567
|
+
"south-division-5",
|
|
35568
|
+
"south-division-6",
|
|
35569
|
+
"south-division-7",
|
|
35570
|
+
"west",
|
|
35571
|
+
"west-division-8",
|
|
35572
|
+
"west-division-9"
|
|
35573
|
+
],
|
|
35574
|
+
"type": "string"
|
|
35575
|
+
},
|
|
35576
|
+
{
|
|
35577
|
+
"items": {
|
|
35578
|
+
"enum": [
|
|
35579
|
+
"northeast",
|
|
35580
|
+
"northeast-division-1",
|
|
35581
|
+
"northeast-division-2",
|
|
35582
|
+
"midwest",
|
|
35583
|
+
"midwest-division-3",
|
|
35584
|
+
"midwest-division-4",
|
|
35585
|
+
"south",
|
|
35586
|
+
"south-division-5",
|
|
35587
|
+
"south-division-6",
|
|
35588
|
+
"south-division-7",
|
|
35589
|
+
"west",
|
|
35590
|
+
"west-division-8",
|
|
35591
|
+
"west-division-9"
|
|
35592
|
+
],
|
|
35593
|
+
"type": "string"
|
|
35594
|
+
},
|
|
35595
|
+
"maxItems": 50,
|
|
35596
|
+
"minItems": 1,
|
|
35597
|
+
"type": "array"
|
|
35598
|
+
},
|
|
35599
|
+
{
|
|
35600
|
+
"nullable": true
|
|
35601
|
+
}
|
|
35602
|
+
],
|
|
35603
|
+
"description": "Office address CENSUS REGION / DIVISION (`<region>-division-<n>`, 1–9) — offices in ANY state of it. An array matches any."
|
|
35604
|
+
},
|
|
35605
|
+
"OfficeScoredBreakdownRequest": {
|
|
35606
|
+
"properties": {
|
|
35607
|
+
"bySide": {
|
|
35608
|
+
"description": "Also return the `buyer` and `listing` views under `bySide`, computed in the same query — each identical to calling again with that `side`. Use instead of one call per side. `pagination.cursor` pages every view in step (each view's own `cursor` is absent once it ends).",
|
|
35609
|
+
"type": "boolean"
|
|
35610
|
+
},
|
|
35611
|
+
"period": {
|
|
35612
|
+
"$ref": "#/components/schemas/Period"
|
|
35613
|
+
},
|
|
35614
|
+
"side": {
|
|
35615
|
+
"$ref": "#/components/schemas/AgentSide"
|
|
35616
|
+
},
|
|
35617
|
+
"sort": {
|
|
35618
|
+
"$ref": "#/components/schemas/BreakdownSort"
|
|
35619
|
+
}
|
|
35620
|
+
},
|
|
35621
|
+
"type": "object"
|
|
35622
|
+
},
|
|
35365
35623
|
"OfficeSummary": {
|
|
35366
35624
|
"properties": {
|
|
35367
35625
|
"activeListings": {
|
|
@@ -35426,6 +35684,11 @@
|
|
|
35426
35684
|
"nullable": true,
|
|
35427
35685
|
"type": "number"
|
|
35428
35686
|
},
|
|
35687
|
+
"email": {
|
|
35688
|
+
"description": "Office email (list rows since 2026-10-15; was detail-only)",
|
|
35689
|
+
"nullable": true,
|
|
35690
|
+
"type": "string"
|
|
35691
|
+
},
|
|
35429
35692
|
"id": {
|
|
35430
35693
|
"description": "Office key (mm_office_key)",
|
|
35431
35694
|
"type": "string"
|
|
@@ -35438,6 +35701,11 @@
|
|
|
35438
35701
|
"nullable": true,
|
|
35439
35702
|
"type": "string"
|
|
35440
35703
|
},
|
|
35704
|
+
"phone": {
|
|
35705
|
+
"description": "Office phone (list rows since 2026-10-15; was detail-only)",
|
|
35706
|
+
"nullable": true,
|
|
35707
|
+
"type": "string"
|
|
35708
|
+
},
|
|
35441
35709
|
"sellerUnits": {
|
|
35442
35710
|
"nullable": true,
|
|
35443
35711
|
"type": "number"
|
|
@@ -35459,6 +35727,50 @@
|
|
|
35459
35727
|
"nullable": true,
|
|
35460
35728
|
"type": "number"
|
|
35461
35729
|
},
|
|
35730
|
+
"topOriginator": {
|
|
35731
|
+
"description": "Present only when the request set `includeTopOriginator`: the loan officer on the most of this office's BUYER-side deals in the period (ties → more volume, then lower NMLS id), named from the LO's own profile with their current employer. `null` when no buyer-side deal had a tracked LO.",
|
|
35732
|
+
"nullable": true,
|
|
35733
|
+
"properties": {
|
|
35734
|
+
"buyerUnits": {
|
|
35735
|
+
"type": "number"
|
|
35736
|
+
},
|
|
35737
|
+
"buyerVolume": {
|
|
35738
|
+
"type": "number"
|
|
35739
|
+
},
|
|
35740
|
+
"company": {
|
|
35741
|
+
"nullable": true,
|
|
35742
|
+
"properties": {
|
|
35743
|
+
"name": {
|
|
35744
|
+
"nullable": true,
|
|
35745
|
+
"type": "string"
|
|
35746
|
+
},
|
|
35747
|
+
"nmlsId": {
|
|
35748
|
+
"nullable": true,
|
|
35749
|
+
"type": "string"
|
|
35750
|
+
}
|
|
35751
|
+
},
|
|
35752
|
+
"required": [
|
|
35753
|
+
"name",
|
|
35754
|
+
"nmlsId"
|
|
35755
|
+
],
|
|
35756
|
+
"type": "object"
|
|
35757
|
+
},
|
|
35758
|
+
"name": {
|
|
35759
|
+
"type": "string"
|
|
35760
|
+
},
|
|
35761
|
+
"nmlsId": {
|
|
35762
|
+
"type": "string"
|
|
35763
|
+
}
|
|
35764
|
+
},
|
|
35765
|
+
"required": [
|
|
35766
|
+
"nmlsId",
|
|
35767
|
+
"name",
|
|
35768
|
+
"company",
|
|
35769
|
+
"buyerUnits",
|
|
35770
|
+
"buyerVolume"
|
|
35771
|
+
],
|
|
35772
|
+
"type": "object"
|
|
35773
|
+
},
|
|
35462
35774
|
"units": {
|
|
35463
35775
|
"nullable": true,
|
|
35464
35776
|
"type": "number"
|
|
@@ -46248,7 +46560,7 @@
|
|
|
46248
46560
|
"info": {
|
|
46249
46561
|
"description": "ModelMatch API — mortgage and real-estate market data.\n\n## Bulk delivery limits\n\nThe `POST /{entity}/bulk-delivery` endpoints export a full result set to\nS3 as NDJSON, JSON, CSV, or Parquet.\n\n- **Up to 5,000 rows per delivery: no entitlement required.** Available to\n every authenticated caller.\n- **Above 5,000 rows: requires the entity's `bulk-delivery.{entity}`\n entitlement** (e.g. `bulk-delivery.loans`). The grant's scope sets your\n row ceiling and may also restrict which rows and fields you receive.\n\nA delivery that would exceed the limit available to you is rejected with\n`403 entitlement_missing`, reporting the matched row count and the ceiling\nthat applied. To stay under the limit, pass `limit` — the job then delivers\n(and bills for) only the first `limit` rows of a broader query.\n\n**Need a higher limit?** Email support@modelmatch.com to request the\nentitlement. Limits are raised per organization and per entity.\n\nBulk delivery is billed at 1 credit per delivered row whether or not\nan entitlement is held.\n\nInstead of a download, a delivery can be sent to a push target configured\non your workspace: pass `destination: { type: \"push-target\", targetId }`.\nThe same limits and billing apply.",
|
|
46250
46562
|
"title": "ModelMatch API",
|
|
46251
|
-
"version": "3.
|
|
46563
|
+
"version": "3.102.0"
|
|
46252
46564
|
},
|
|
46253
46565
|
"openapi": "3.1.0",
|
|
46254
46566
|
"paths": {
|
|
@@ -76201,111 +76513,674 @@
|
|
|
76201
76513
|
"description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
|
|
76202
76514
|
}
|
|
76203
76515
|
},
|
|
76204
|
-
"summary": "Search real-estate offices with filters",
|
|
76516
|
+
"summary": "Search real-estate offices with filters",
|
|
76517
|
+
"tags": [
|
|
76518
|
+
"Offices"
|
|
76519
|
+
]
|
|
76520
|
+
}
|
|
76521
|
+
},
|
|
76522
|
+
"/v1/offices/agents": {
|
|
76523
|
+
"post": {
|
|
76524
|
+
"operationId": "officeAgents",
|
|
76525
|
+
"requestBody": {
|
|
76526
|
+
"content": {
|
|
76527
|
+
"application/json": {
|
|
76528
|
+
"schema": {
|
|
76529
|
+
"$ref": "#/components/schemas/OfficeAgentsRequest"
|
|
76530
|
+
}
|
|
76531
|
+
}
|
|
76532
|
+
}
|
|
76533
|
+
},
|
|
76534
|
+
"responses": {
|
|
76535
|
+
"200": {
|
|
76536
|
+
"content": {
|
|
76537
|
+
"application/json": {
|
|
76538
|
+
"schema": {
|
|
76539
|
+
"$ref": "#/components/schemas/AgentListResponse"
|
|
76540
|
+
}
|
|
76541
|
+
}
|
|
76542
|
+
},
|
|
76543
|
+
"description": "Paginated list of agents at the office"
|
|
76544
|
+
},
|
|
76545
|
+
"400": {
|
|
76546
|
+
"content": {
|
|
76547
|
+
"application/json": {
|
|
76548
|
+
"schema": {
|
|
76549
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76550
|
+
}
|
|
76551
|
+
}
|
|
76552
|
+
},
|
|
76553
|
+
"description": "Validation error"
|
|
76554
|
+
},
|
|
76555
|
+
"401": {
|
|
76556
|
+
"content": {
|
|
76557
|
+
"application/json": {
|
|
76558
|
+
"schema": {
|
|
76559
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76560
|
+
}
|
|
76561
|
+
}
|
|
76562
|
+
},
|
|
76563
|
+
"description": "Unauthorized"
|
|
76564
|
+
},
|
|
76565
|
+
"403": {
|
|
76566
|
+
"content": {
|
|
76567
|
+
"application/json": {
|
|
76568
|
+
"schema": {
|
|
76569
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76570
|
+
}
|
|
76571
|
+
}
|
|
76572
|
+
},
|
|
76573
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
76574
|
+
},
|
|
76575
|
+
"404": {
|
|
76576
|
+
"content": {
|
|
76577
|
+
"application/json": {
|
|
76578
|
+
"schema": {
|
|
76579
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76580
|
+
}
|
|
76581
|
+
}
|
|
76582
|
+
},
|
|
76583
|
+
"description": "Not found"
|
|
76584
|
+
},
|
|
76585
|
+
"413": {
|
|
76586
|
+
"content": {
|
|
76587
|
+
"application/json": {
|
|
76588
|
+
"schema": {
|
|
76589
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
76590
|
+
}
|
|
76591
|
+
}
|
|
76592
|
+
},
|
|
76593
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
76594
|
+
},
|
|
76595
|
+
"503": {
|
|
76596
|
+
"content": {
|
|
76597
|
+
"application/json": {
|
|
76598
|
+
"schema": {
|
|
76599
|
+
"$ref": "#/components/schemas/SearchUnavailable"
|
|
76600
|
+
}
|
|
76601
|
+
}
|
|
76602
|
+
},
|
|
76603
|
+
"description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
|
|
76604
|
+
}
|
|
76605
|
+
},
|
|
76606
|
+
"summary": "Agents at an office",
|
|
76607
|
+
"tags": [
|
|
76608
|
+
"Offices"
|
|
76609
|
+
]
|
|
76610
|
+
}
|
|
76611
|
+
},
|
|
76612
|
+
"/v1/offices/count": {
|
|
76613
|
+
"post": {
|
|
76614
|
+
"description": "Return the exact number of offices matching the given filters. Accepts the same request body as `listOffices` (pagination and sort are ignored). Use this when you only need a total; to get the matching offices themselves, send the same request body to `listOffices`.",
|
|
76615
|
+
"operationId": "countOffices",
|
|
76616
|
+
"requestBody": {
|
|
76617
|
+
"content": {
|
|
76618
|
+
"application/json": {
|
|
76619
|
+
"schema": {
|
|
76620
|
+
"$ref": "#/components/schemas/OfficeListRequest"
|
|
76621
|
+
}
|
|
76622
|
+
}
|
|
76623
|
+
}
|
|
76624
|
+
},
|
|
76625
|
+
"responses": {
|
|
76626
|
+
"200": {
|
|
76627
|
+
"content": {
|
|
76628
|
+
"application/json": {
|
|
76629
|
+
"schema": {
|
|
76630
|
+
"$ref": "#/components/schemas/CountResponse"
|
|
76631
|
+
}
|
|
76632
|
+
}
|
|
76633
|
+
},
|
|
76634
|
+
"description": "Exact count of matching offices"
|
|
76635
|
+
},
|
|
76636
|
+
"400": {
|
|
76637
|
+
"content": {
|
|
76638
|
+
"application/json": {
|
|
76639
|
+
"schema": {
|
|
76640
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76641
|
+
}
|
|
76642
|
+
}
|
|
76643
|
+
},
|
|
76644
|
+
"description": "Validation error"
|
|
76645
|
+
},
|
|
76646
|
+
"401": {
|
|
76647
|
+
"content": {
|
|
76648
|
+
"application/json": {
|
|
76649
|
+
"schema": {
|
|
76650
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76651
|
+
}
|
|
76652
|
+
}
|
|
76653
|
+
},
|
|
76654
|
+
"description": "Unauthorized"
|
|
76655
|
+
},
|
|
76656
|
+
"403": {
|
|
76657
|
+
"content": {
|
|
76658
|
+
"application/json": {
|
|
76659
|
+
"schema": {
|
|
76660
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76661
|
+
}
|
|
76662
|
+
}
|
|
76663
|
+
},
|
|
76664
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
76665
|
+
},
|
|
76666
|
+
"404": {
|
|
76667
|
+
"content": {
|
|
76668
|
+
"application/json": {
|
|
76669
|
+
"schema": {
|
|
76670
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76671
|
+
}
|
|
76672
|
+
}
|
|
76673
|
+
},
|
|
76674
|
+
"description": "Not found"
|
|
76675
|
+
},
|
|
76676
|
+
"413": {
|
|
76677
|
+
"content": {
|
|
76678
|
+
"application/json": {
|
|
76679
|
+
"schema": {
|
|
76680
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
76681
|
+
}
|
|
76682
|
+
}
|
|
76683
|
+
},
|
|
76684
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
76685
|
+
},
|
|
76686
|
+
"503": {
|
|
76687
|
+
"content": {
|
|
76688
|
+
"application/json": {
|
|
76689
|
+
"schema": {
|
|
76690
|
+
"$ref": "#/components/schemas/SearchUnavailable"
|
|
76691
|
+
}
|
|
76692
|
+
}
|
|
76693
|
+
},
|
|
76694
|
+
"description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
|
|
76695
|
+
}
|
|
76696
|
+
},
|
|
76697
|
+
"summary": "Count offices matching filters",
|
|
76698
|
+
"tags": [
|
|
76699
|
+
"Offices"
|
|
76700
|
+
],
|
|
76701
|
+
"x-mm-records-via": "listOffices"
|
|
76702
|
+
}
|
|
76703
|
+
},
|
|
76704
|
+
"/v1/offices/names": {
|
|
76705
|
+
"post": {
|
|
76706
|
+
"description": "Distinct real-estate office names starting with `query`, each with the agents and offices behind that name across all its offices — the picker for filters that match by office name (`listOffices` `company`, `listAgents` `currentOffice`). To find one office, use `instantSearch` or `listOffices` instead.",
|
|
76707
|
+
"operationId": "suggestOfficeNames",
|
|
76708
|
+
"requestBody": {
|
|
76709
|
+
"content": {
|
|
76710
|
+
"application/json": {
|
|
76711
|
+
"schema": {
|
|
76712
|
+
"$ref": "#/components/schemas/OfficeNameSuggestRequest"
|
|
76713
|
+
}
|
|
76714
|
+
}
|
|
76715
|
+
}
|
|
76716
|
+
},
|
|
76717
|
+
"responses": {
|
|
76718
|
+
"200": {
|
|
76719
|
+
"content": {
|
|
76720
|
+
"application/json": {
|
|
76721
|
+
"schema": {
|
|
76722
|
+
"$ref": "#/components/schemas/OfficeNameSuggestResponse"
|
|
76723
|
+
}
|
|
76724
|
+
}
|
|
76725
|
+
},
|
|
76726
|
+
"description": "Matching office names"
|
|
76727
|
+
},
|
|
76728
|
+
"400": {
|
|
76729
|
+
"content": {
|
|
76730
|
+
"application/json": {
|
|
76731
|
+
"schema": {
|
|
76732
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76733
|
+
}
|
|
76734
|
+
}
|
|
76735
|
+
},
|
|
76736
|
+
"description": "Validation error"
|
|
76737
|
+
},
|
|
76738
|
+
"401": {
|
|
76739
|
+
"content": {
|
|
76740
|
+
"application/json": {
|
|
76741
|
+
"schema": {
|
|
76742
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76743
|
+
}
|
|
76744
|
+
}
|
|
76745
|
+
},
|
|
76746
|
+
"description": "Unauthorized"
|
|
76747
|
+
},
|
|
76748
|
+
"403": {
|
|
76749
|
+
"content": {
|
|
76750
|
+
"application/json": {
|
|
76751
|
+
"schema": {
|
|
76752
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76753
|
+
}
|
|
76754
|
+
}
|
|
76755
|
+
},
|
|
76756
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
76757
|
+
},
|
|
76758
|
+
"404": {
|
|
76759
|
+
"content": {
|
|
76760
|
+
"application/json": {
|
|
76761
|
+
"schema": {
|
|
76762
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76763
|
+
}
|
|
76764
|
+
}
|
|
76765
|
+
},
|
|
76766
|
+
"description": "Not found"
|
|
76767
|
+
},
|
|
76768
|
+
"413": {
|
|
76769
|
+
"content": {
|
|
76770
|
+
"application/json": {
|
|
76771
|
+
"schema": {
|
|
76772
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
76773
|
+
}
|
|
76774
|
+
}
|
|
76775
|
+
},
|
|
76776
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
76777
|
+
},
|
|
76778
|
+
"503": {
|
|
76779
|
+
"content": {
|
|
76780
|
+
"application/json": {
|
|
76781
|
+
"schema": {
|
|
76782
|
+
"$ref": "#/components/schemas/SearchUnavailable"
|
|
76783
|
+
}
|
|
76784
|
+
}
|
|
76785
|
+
},
|
|
76786
|
+
"description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
|
|
76787
|
+
}
|
|
76788
|
+
},
|
|
76789
|
+
"summary": "Office-name typeahead (distinct names with agent totals)",
|
|
76790
|
+
"tags": [
|
|
76791
|
+
"Offices"
|
|
76792
|
+
]
|
|
76793
|
+
}
|
|
76794
|
+
},
|
|
76795
|
+
"/v1/offices/{id}": {
|
|
76796
|
+
"get": {
|
|
76797
|
+
"operationId": "getOffice",
|
|
76798
|
+
"parameters": [
|
|
76799
|
+
{
|
|
76800
|
+
"description": "Office key (mm_office_key)",
|
|
76801
|
+
"in": "path",
|
|
76802
|
+
"name": "id",
|
|
76803
|
+
"required": true,
|
|
76804
|
+
"schema": {
|
|
76805
|
+
"description": "Office key (mm_office_key)",
|
|
76806
|
+
"type": "string"
|
|
76807
|
+
}
|
|
76808
|
+
},
|
|
76809
|
+
{
|
|
76810
|
+
"description": "Period for production metrics (default: last12Months)",
|
|
76811
|
+
"in": "query",
|
|
76812
|
+
"name": "period",
|
|
76813
|
+
"required": false,
|
|
76814
|
+
"schema": {
|
|
76815
|
+
"allOf": [
|
|
76816
|
+
{
|
|
76817
|
+
"$ref": "#/components/schemas/Period"
|
|
76818
|
+
},
|
|
76819
|
+
{
|
|
76820
|
+
"description": "Period for production metrics (default: last12Months)"
|
|
76821
|
+
}
|
|
76822
|
+
]
|
|
76823
|
+
}
|
|
76824
|
+
}
|
|
76825
|
+
],
|
|
76826
|
+
"responses": {
|
|
76827
|
+
"200": {
|
|
76828
|
+
"content": {
|
|
76829
|
+
"application/json": {
|
|
76830
|
+
"schema": {
|
|
76831
|
+
"$ref": "#/components/schemas/OfficeDetailResponse"
|
|
76832
|
+
}
|
|
76833
|
+
}
|
|
76834
|
+
},
|
|
76835
|
+
"description": "Office detail"
|
|
76836
|
+
},
|
|
76837
|
+
"404": {
|
|
76838
|
+
"content": {
|
|
76839
|
+
"application/json": {
|
|
76840
|
+
"schema": {
|
|
76841
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76842
|
+
}
|
|
76843
|
+
}
|
|
76844
|
+
},
|
|
76845
|
+
"description": "Office not found"
|
|
76846
|
+
}
|
|
76847
|
+
},
|
|
76848
|
+
"summary": "Get office by key with office-level production",
|
|
76849
|
+
"tags": [
|
|
76850
|
+
"Offices"
|
|
76851
|
+
]
|
|
76852
|
+
}
|
|
76853
|
+
},
|
|
76854
|
+
"/v1/offices/{id}/breakdowns/builders": {
|
|
76855
|
+
"post": {
|
|
76856
|
+
"description": "New-construction builders named on the office's deals in the period, ranked by units. Deal COUNT only: every row's `volume` / `pctVolume` is 0 and `pctUnits` is a share of ALL the office's deals. No buyer/listing split: `side` must be `any` (or omitted).",
|
|
76857
|
+
"operationId": "officeBuilders",
|
|
76858
|
+
"parameters": [
|
|
76859
|
+
{
|
|
76860
|
+
"description": "Office id (from `listOffices` / `instantSearch`)",
|
|
76861
|
+
"in": "path",
|
|
76862
|
+
"name": "id",
|
|
76863
|
+
"required": true,
|
|
76864
|
+
"schema": {
|
|
76865
|
+
"description": "Office id (from `listOffices` / `instantSearch`)",
|
|
76866
|
+
"type": "string"
|
|
76867
|
+
}
|
|
76868
|
+
}
|
|
76869
|
+
],
|
|
76870
|
+
"requestBody": {
|
|
76871
|
+
"content": {
|
|
76872
|
+
"application/json": {
|
|
76873
|
+
"schema": {
|
|
76874
|
+
"$ref": "#/components/schemas/OfficeScoredBreakdownRequest"
|
|
76875
|
+
}
|
|
76876
|
+
}
|
|
76877
|
+
}
|
|
76878
|
+
},
|
|
76879
|
+
"responses": {
|
|
76880
|
+
"200": {
|
|
76881
|
+
"content": {
|
|
76882
|
+
"application/json": {
|
|
76883
|
+
"schema": {
|
|
76884
|
+
"$ref": "#/components/schemas/AgentSidedBreakdownResponse"
|
|
76885
|
+
}
|
|
76886
|
+
}
|
|
76887
|
+
},
|
|
76888
|
+
"description": "Pre-aggregated builders breakdown from the office's scored doc"
|
|
76889
|
+
},
|
|
76890
|
+
"400": {
|
|
76891
|
+
"content": {
|
|
76892
|
+
"application/json": {
|
|
76893
|
+
"schema": {
|
|
76894
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76895
|
+
}
|
|
76896
|
+
}
|
|
76897
|
+
},
|
|
76898
|
+
"description": "Validation error"
|
|
76899
|
+
},
|
|
76900
|
+
"401": {
|
|
76901
|
+
"content": {
|
|
76902
|
+
"application/json": {
|
|
76903
|
+
"schema": {
|
|
76904
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76905
|
+
}
|
|
76906
|
+
}
|
|
76907
|
+
},
|
|
76908
|
+
"description": "Unauthorized"
|
|
76909
|
+
},
|
|
76910
|
+
"403": {
|
|
76911
|
+
"content": {
|
|
76912
|
+
"application/json": {
|
|
76913
|
+
"schema": {
|
|
76914
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76915
|
+
}
|
|
76916
|
+
}
|
|
76917
|
+
},
|
|
76918
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
76919
|
+
},
|
|
76920
|
+
"404": {
|
|
76921
|
+
"content": {
|
|
76922
|
+
"application/json": {
|
|
76923
|
+
"schema": {
|
|
76924
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76925
|
+
}
|
|
76926
|
+
}
|
|
76927
|
+
},
|
|
76928
|
+
"description": "Not found"
|
|
76929
|
+
},
|
|
76930
|
+
"413": {
|
|
76931
|
+
"content": {
|
|
76932
|
+
"application/json": {
|
|
76933
|
+
"schema": {
|
|
76934
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
76935
|
+
}
|
|
76936
|
+
}
|
|
76937
|
+
},
|
|
76938
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
76939
|
+
},
|
|
76940
|
+
"503": {
|
|
76941
|
+
"content": {
|
|
76942
|
+
"application/json": {
|
|
76943
|
+
"schema": {
|
|
76944
|
+
"$ref": "#/components/schemas/SearchUnavailable"
|
|
76945
|
+
}
|
|
76946
|
+
}
|
|
76947
|
+
},
|
|
76948
|
+
"description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
|
|
76949
|
+
}
|
|
76950
|
+
},
|
|
76951
|
+
"summary": "Home builders on the office's deals (pre-aggregated)",
|
|
76952
|
+
"tags": [
|
|
76953
|
+
"Offices"
|
|
76954
|
+
]
|
|
76955
|
+
}
|
|
76956
|
+
},
|
|
76957
|
+
"/v1/offices/{id}/breakdowns/lenders": {
|
|
76958
|
+
"post": {
|
|
76959
|
+
"description": "Lenders that financed the office's deals in the period. `id` is the lender id (pass it back as the `lender` filter on the loans routes), `label` its display name. The row for deals with no lender attributed carries no `id`.",
|
|
76960
|
+
"operationId": "officeLenders",
|
|
76961
|
+
"parameters": [
|
|
76962
|
+
{
|
|
76963
|
+
"description": "Office id (from `listOffices` / `instantSearch`)",
|
|
76964
|
+
"in": "path",
|
|
76965
|
+
"name": "id",
|
|
76966
|
+
"required": true,
|
|
76967
|
+
"schema": {
|
|
76968
|
+
"description": "Office id (from `listOffices` / `instantSearch`)",
|
|
76969
|
+
"type": "string"
|
|
76970
|
+
}
|
|
76971
|
+
}
|
|
76972
|
+
],
|
|
76973
|
+
"requestBody": {
|
|
76974
|
+
"content": {
|
|
76975
|
+
"application/json": {
|
|
76976
|
+
"schema": {
|
|
76977
|
+
"$ref": "#/components/schemas/OfficeScoredBreakdownRequest"
|
|
76978
|
+
}
|
|
76979
|
+
}
|
|
76980
|
+
}
|
|
76981
|
+
},
|
|
76982
|
+
"responses": {
|
|
76983
|
+
"200": {
|
|
76984
|
+
"content": {
|
|
76985
|
+
"application/json": {
|
|
76986
|
+
"schema": {
|
|
76987
|
+
"$ref": "#/components/schemas/AgentSidedBreakdownResponse"
|
|
76988
|
+
}
|
|
76989
|
+
}
|
|
76990
|
+
},
|
|
76991
|
+
"description": "Pre-aggregated lenders breakdown from the office's scored doc"
|
|
76992
|
+
},
|
|
76993
|
+
"400": {
|
|
76994
|
+
"content": {
|
|
76995
|
+
"application/json": {
|
|
76996
|
+
"schema": {
|
|
76997
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
76998
|
+
}
|
|
76999
|
+
}
|
|
77000
|
+
},
|
|
77001
|
+
"description": "Validation error"
|
|
77002
|
+
},
|
|
77003
|
+
"401": {
|
|
77004
|
+
"content": {
|
|
77005
|
+
"application/json": {
|
|
77006
|
+
"schema": {
|
|
77007
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
77008
|
+
}
|
|
77009
|
+
}
|
|
77010
|
+
},
|
|
77011
|
+
"description": "Unauthorized"
|
|
77012
|
+
},
|
|
77013
|
+
"403": {
|
|
77014
|
+
"content": {
|
|
77015
|
+
"application/json": {
|
|
77016
|
+
"schema": {
|
|
77017
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
77018
|
+
}
|
|
77019
|
+
}
|
|
77020
|
+
},
|
|
77021
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
77022
|
+
},
|
|
77023
|
+
"404": {
|
|
77024
|
+
"content": {
|
|
77025
|
+
"application/json": {
|
|
77026
|
+
"schema": {
|
|
77027
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
77028
|
+
}
|
|
77029
|
+
}
|
|
77030
|
+
},
|
|
77031
|
+
"description": "Not found"
|
|
77032
|
+
},
|
|
77033
|
+
"413": {
|
|
77034
|
+
"content": {
|
|
77035
|
+
"application/json": {
|
|
77036
|
+
"schema": {
|
|
77037
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
77038
|
+
}
|
|
77039
|
+
}
|
|
77040
|
+
},
|
|
77041
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
77042
|
+
},
|
|
77043
|
+
"503": {
|
|
77044
|
+
"content": {
|
|
77045
|
+
"application/json": {
|
|
77046
|
+
"schema": {
|
|
77047
|
+
"$ref": "#/components/schemas/SearchUnavailable"
|
|
77048
|
+
}
|
|
77049
|
+
}
|
|
77050
|
+
},
|
|
77051
|
+
"description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
|
|
77052
|
+
}
|
|
77053
|
+
},
|
|
77054
|
+
"summary": "Lenders on the office's deals (pre-aggregated)",
|
|
77055
|
+
"tags": [
|
|
77056
|
+
"Offices"
|
|
77057
|
+
]
|
|
77058
|
+
}
|
|
77059
|
+
},
|
|
77060
|
+
"/v1/offices/{id}/breakdowns/loanTypes": {
|
|
77061
|
+
"post": {
|
|
77062
|
+
"description": "The office's financed deals in the period by loan product (`label` = product key, e.g. `conventional`, `fha`, `va`), summed across its lenders. Shares are of the financed deals on the requested side, so rows sum to 1; cash deals are not counted.",
|
|
77063
|
+
"operationId": "officeLoanTypes",
|
|
77064
|
+
"parameters": [
|
|
77065
|
+
{
|
|
77066
|
+
"description": "Office id (from `listOffices` / `instantSearch`)",
|
|
77067
|
+
"in": "path",
|
|
77068
|
+
"name": "id",
|
|
77069
|
+
"required": true,
|
|
77070
|
+
"schema": {
|
|
77071
|
+
"description": "Office id (from `listOffices` / `instantSearch`)",
|
|
77072
|
+
"type": "string"
|
|
77073
|
+
}
|
|
77074
|
+
}
|
|
77075
|
+
],
|
|
77076
|
+
"requestBody": {
|
|
77077
|
+
"content": {
|
|
77078
|
+
"application/json": {
|
|
77079
|
+
"schema": {
|
|
77080
|
+
"$ref": "#/components/schemas/OfficeScoredBreakdownRequest"
|
|
77081
|
+
}
|
|
77082
|
+
}
|
|
77083
|
+
}
|
|
77084
|
+
},
|
|
77085
|
+
"responses": {
|
|
77086
|
+
"200": {
|
|
77087
|
+
"content": {
|
|
77088
|
+
"application/json": {
|
|
77089
|
+
"schema": {
|
|
77090
|
+
"$ref": "#/components/schemas/AgentSidedBreakdownResponse"
|
|
77091
|
+
}
|
|
77092
|
+
}
|
|
77093
|
+
},
|
|
77094
|
+
"description": "Pre-aggregated loanTypes breakdown from the office's scored doc"
|
|
77095
|
+
},
|
|
77096
|
+
"400": {
|
|
77097
|
+
"content": {
|
|
77098
|
+
"application/json": {
|
|
77099
|
+
"schema": {
|
|
77100
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
77101
|
+
}
|
|
77102
|
+
}
|
|
77103
|
+
},
|
|
77104
|
+
"description": "Validation error"
|
|
77105
|
+
},
|
|
77106
|
+
"401": {
|
|
77107
|
+
"content": {
|
|
77108
|
+
"application/json": {
|
|
77109
|
+
"schema": {
|
|
77110
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
77111
|
+
}
|
|
77112
|
+
}
|
|
77113
|
+
},
|
|
77114
|
+
"description": "Unauthorized"
|
|
77115
|
+
},
|
|
77116
|
+
"403": {
|
|
77117
|
+
"content": {
|
|
77118
|
+
"application/json": {
|
|
77119
|
+
"schema": {
|
|
77120
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
77121
|
+
}
|
|
77122
|
+
}
|
|
77123
|
+
},
|
|
77124
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
77125
|
+
},
|
|
77126
|
+
"404": {
|
|
77127
|
+
"content": {
|
|
77128
|
+
"application/json": {
|
|
77129
|
+
"schema": {
|
|
77130
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
77131
|
+
}
|
|
77132
|
+
}
|
|
77133
|
+
},
|
|
77134
|
+
"description": "Not found"
|
|
77135
|
+
},
|
|
77136
|
+
"413": {
|
|
77137
|
+
"content": {
|
|
77138
|
+
"application/json": {
|
|
77139
|
+
"schema": {
|
|
77140
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
77141
|
+
}
|
|
77142
|
+
}
|
|
77143
|
+
},
|
|
77144
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
77145
|
+
},
|
|
77146
|
+
"503": {
|
|
77147
|
+
"content": {
|
|
77148
|
+
"application/json": {
|
|
77149
|
+
"schema": {
|
|
77150
|
+
"$ref": "#/components/schemas/SearchUnavailable"
|
|
77151
|
+
}
|
|
77152
|
+
}
|
|
77153
|
+
},
|
|
77154
|
+
"description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
|
|
77155
|
+
}
|
|
77156
|
+
},
|
|
77157
|
+
"summary": "Loan products on the office's financed deals (pre-aggregated)",
|
|
76205
77158
|
"tags": [
|
|
76206
77159
|
"Offices"
|
|
76207
77160
|
]
|
|
76208
77161
|
}
|
|
76209
77162
|
},
|
|
76210
|
-
"/v1/offices/
|
|
77163
|
+
"/v1/offices/{id}/breakdowns/originators": {
|
|
76211
77164
|
"post": {
|
|
76212
|
-
"
|
|
76213
|
-
"
|
|
76214
|
-
|
|
76215
|
-
|
|
76216
|
-
|
|
76217
|
-
|
|
76218
|
-
|
|
77165
|
+
"description": "Loan officers on the office's deals in the period. `id` is the LO's NMLS id; `label` their registered name and `company` their current employer (both from the LO's own profile, not the deal records). `side: buyer` = deals where this office represented the buyer.",
|
|
77166
|
+
"operationId": "officeOriginators",
|
|
77167
|
+
"parameters": [
|
|
77168
|
+
{
|
|
77169
|
+
"description": "Office id (from `listOffices` / `instantSearch`)",
|
|
77170
|
+
"in": "path",
|
|
77171
|
+
"name": "id",
|
|
77172
|
+
"required": true,
|
|
77173
|
+
"schema": {
|
|
77174
|
+
"description": "Office id (from `listOffices` / `instantSearch`)",
|
|
77175
|
+
"type": "string"
|
|
76219
77176
|
}
|
|
76220
77177
|
}
|
|
76221
|
-
|
|
76222
|
-
"responses": {
|
|
76223
|
-
"200": {
|
|
76224
|
-
"content": {
|
|
76225
|
-
"application/json": {
|
|
76226
|
-
"schema": {
|
|
76227
|
-
"$ref": "#/components/schemas/AgentListResponse"
|
|
76228
|
-
}
|
|
76229
|
-
}
|
|
76230
|
-
},
|
|
76231
|
-
"description": "Paginated list of agents at the office"
|
|
76232
|
-
},
|
|
76233
|
-
"400": {
|
|
76234
|
-
"content": {
|
|
76235
|
-
"application/json": {
|
|
76236
|
-
"schema": {
|
|
76237
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
76238
|
-
}
|
|
76239
|
-
}
|
|
76240
|
-
},
|
|
76241
|
-
"description": "Validation error"
|
|
76242
|
-
},
|
|
76243
|
-
"401": {
|
|
76244
|
-
"content": {
|
|
76245
|
-
"application/json": {
|
|
76246
|
-
"schema": {
|
|
76247
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
76248
|
-
}
|
|
76249
|
-
}
|
|
76250
|
-
},
|
|
76251
|
-
"description": "Unauthorized"
|
|
76252
|
-
},
|
|
76253
|
-
"403": {
|
|
76254
|
-
"content": {
|
|
76255
|
-
"application/json": {
|
|
76256
|
-
"schema": {
|
|
76257
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
76258
|
-
}
|
|
76259
|
-
}
|
|
76260
|
-
},
|
|
76261
|
-
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
76262
|
-
},
|
|
76263
|
-
"404": {
|
|
76264
|
-
"content": {
|
|
76265
|
-
"application/json": {
|
|
76266
|
-
"schema": {
|
|
76267
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
76268
|
-
}
|
|
76269
|
-
}
|
|
76270
|
-
},
|
|
76271
|
-
"description": "Not found"
|
|
76272
|
-
},
|
|
76273
|
-
"413": {
|
|
76274
|
-
"content": {
|
|
76275
|
-
"application/json": {
|
|
76276
|
-
"schema": {
|
|
76277
|
-
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
76278
|
-
}
|
|
76279
|
-
}
|
|
76280
|
-
},
|
|
76281
|
-
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
76282
|
-
},
|
|
76283
|
-
"503": {
|
|
76284
|
-
"content": {
|
|
76285
|
-
"application/json": {
|
|
76286
|
-
"schema": {
|
|
76287
|
-
"$ref": "#/components/schemas/SearchUnavailable"
|
|
76288
|
-
}
|
|
76289
|
-
}
|
|
76290
|
-
},
|
|
76291
|
-
"description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
|
|
76292
|
-
}
|
|
76293
|
-
},
|
|
76294
|
-
"summary": "Agents at an office",
|
|
76295
|
-
"tags": [
|
|
76296
|
-
"Offices"
|
|
76297
|
-
]
|
|
76298
|
-
}
|
|
76299
|
-
},
|
|
76300
|
-
"/v1/offices/count": {
|
|
76301
|
-
"post": {
|
|
76302
|
-
"description": "Return the exact number of offices matching the given filters. Accepts the same request body as `listOffices` (pagination and sort are ignored). Use this when you only need a total; to get the matching offices themselves, send the same request body to `listOffices`.",
|
|
76303
|
-
"operationId": "countOffices",
|
|
77178
|
+
],
|
|
76304
77179
|
"requestBody": {
|
|
76305
77180
|
"content": {
|
|
76306
77181
|
"application/json": {
|
|
76307
77182
|
"schema": {
|
|
76308
|
-
"$ref": "#/components/schemas/
|
|
77183
|
+
"$ref": "#/components/schemas/OfficeScoredBreakdownRequest"
|
|
76309
77184
|
}
|
|
76310
77185
|
}
|
|
76311
77186
|
}
|
|
@@ -76315,11 +77190,11 @@
|
|
|
76315
77190
|
"content": {
|
|
76316
77191
|
"application/json": {
|
|
76317
77192
|
"schema": {
|
|
76318
|
-
"$ref": "#/components/schemas/
|
|
77193
|
+
"$ref": "#/components/schemas/AgentSidedBreakdownResponse"
|
|
76319
77194
|
}
|
|
76320
77195
|
}
|
|
76321
77196
|
},
|
|
76322
|
-
"description": "
|
|
77197
|
+
"description": "Pre-aggregated originators breakdown from the office's scored doc"
|
|
76323
77198
|
},
|
|
76324
77199
|
"400": {
|
|
76325
77200
|
"content": {
|
|
@@ -76382,67 +77257,7 @@
|
|
|
76382
77257
|
"description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
|
|
76383
77258
|
}
|
|
76384
77259
|
},
|
|
76385
|
-
"summary": "
|
|
76386
|
-
"tags": [
|
|
76387
|
-
"Offices"
|
|
76388
|
-
],
|
|
76389
|
-
"x-mm-records-via": "listOffices"
|
|
76390
|
-
}
|
|
76391
|
-
},
|
|
76392
|
-
"/v1/offices/{id}": {
|
|
76393
|
-
"get": {
|
|
76394
|
-
"operationId": "getOffice",
|
|
76395
|
-
"parameters": [
|
|
76396
|
-
{
|
|
76397
|
-
"description": "Office key (mm_office_key)",
|
|
76398
|
-
"in": "path",
|
|
76399
|
-
"name": "id",
|
|
76400
|
-
"required": true,
|
|
76401
|
-
"schema": {
|
|
76402
|
-
"description": "Office key (mm_office_key)",
|
|
76403
|
-
"type": "string"
|
|
76404
|
-
}
|
|
76405
|
-
},
|
|
76406
|
-
{
|
|
76407
|
-
"description": "Period for production metrics (default: last12Months)",
|
|
76408
|
-
"in": "query",
|
|
76409
|
-
"name": "period",
|
|
76410
|
-
"required": false,
|
|
76411
|
-
"schema": {
|
|
76412
|
-
"allOf": [
|
|
76413
|
-
{
|
|
76414
|
-
"$ref": "#/components/schemas/Period"
|
|
76415
|
-
},
|
|
76416
|
-
{
|
|
76417
|
-
"description": "Period for production metrics (default: last12Months)"
|
|
76418
|
-
}
|
|
76419
|
-
]
|
|
76420
|
-
}
|
|
76421
|
-
}
|
|
76422
|
-
],
|
|
76423
|
-
"responses": {
|
|
76424
|
-
"200": {
|
|
76425
|
-
"content": {
|
|
76426
|
-
"application/json": {
|
|
76427
|
-
"schema": {
|
|
76428
|
-
"$ref": "#/components/schemas/OfficeDetailResponse"
|
|
76429
|
-
}
|
|
76430
|
-
}
|
|
76431
|
-
},
|
|
76432
|
-
"description": "Office detail"
|
|
76433
|
-
},
|
|
76434
|
-
"404": {
|
|
76435
|
-
"content": {
|
|
76436
|
-
"application/json": {
|
|
76437
|
-
"schema": {
|
|
76438
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
76439
|
-
}
|
|
76440
|
-
}
|
|
76441
|
-
},
|
|
76442
|
-
"description": "Office not found"
|
|
76443
|
-
}
|
|
76444
|
-
},
|
|
76445
|
-
"summary": "Get office by key with office-level production",
|
|
77260
|
+
"summary": "Loan officers the office's agents worked with (pre-aggregated)",
|
|
76446
77261
|
"tags": [
|
|
76447
77262
|
"Offices"
|
|
76448
77263
|
]
|
|
@@ -77815,6 +78630,109 @@
|
|
|
77815
78630
|
]
|
|
77816
78631
|
}
|
|
77817
78632
|
},
|
|
78633
|
+
"/v1/originators/{nmlsId}/breakdowns/builders": {
|
|
78634
|
+
"post": {
|
|
78635
|
+
"description": "Ranks the home builders behind this LO's new-construction loans, by volume. A loan counts when `originatorLoans` with `flatFilters.hasBuilder: true` keeps it, and is credited to the `builderName` that list shows on its row (the parcel's newest builder-named sale, else the builder named on the loan or its builder seller of record) — so a row's `units` equals that list filtered to the builder. Spellings that differ only in case, spacing or punctuation are one row; `id` is that normalized key and `label` the most common spelling. Percentages are shares of the LO's whole loan population in scope, so rows do not sum to 100. More than 50,000 loans in scope is a 400 (narrow the period); `truncated` is set when the builder loans exceed that cap.",
|
|
78636
|
+
"operationId": "originatorBuilders",
|
|
78637
|
+
"parameters": [
|
|
78638
|
+
{
|
|
78639
|
+
"description": "Originator NMLS ID",
|
|
78640
|
+
"in": "path",
|
|
78641
|
+
"name": "nmlsId",
|
|
78642
|
+
"required": true,
|
|
78643
|
+
"schema": {
|
|
78644
|
+
"description": "Originator NMLS ID",
|
|
78645
|
+
"type": "string"
|
|
78646
|
+
}
|
|
78647
|
+
}
|
|
78648
|
+
],
|
|
78649
|
+
"requestBody": {
|
|
78650
|
+
"content": {
|
|
78651
|
+
"application/json": {
|
|
78652
|
+
"schema": {
|
|
78653
|
+
"$ref": "#/components/schemas/BreakdownRequest"
|
|
78654
|
+
}
|
|
78655
|
+
}
|
|
78656
|
+
}
|
|
78657
|
+
},
|
|
78658
|
+
"responses": {
|
|
78659
|
+
"200": {
|
|
78660
|
+
"content": {
|
|
78661
|
+
"application/json": {
|
|
78662
|
+
"schema": {
|
|
78663
|
+
"$ref": "#/components/schemas/BreakdownResponse"
|
|
78664
|
+
}
|
|
78665
|
+
}
|
|
78666
|
+
},
|
|
78667
|
+
"description": "Breakdown of the LO's builder loans by home builder"
|
|
78668
|
+
},
|
|
78669
|
+
"400": {
|
|
78670
|
+
"content": {
|
|
78671
|
+
"application/json": {
|
|
78672
|
+
"schema": {
|
|
78673
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
78674
|
+
}
|
|
78675
|
+
}
|
|
78676
|
+
},
|
|
78677
|
+
"description": "Validation error"
|
|
78678
|
+
},
|
|
78679
|
+
"401": {
|
|
78680
|
+
"content": {
|
|
78681
|
+
"application/json": {
|
|
78682
|
+
"schema": {
|
|
78683
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
78684
|
+
}
|
|
78685
|
+
}
|
|
78686
|
+
},
|
|
78687
|
+
"description": "Unauthorized"
|
|
78688
|
+
},
|
|
78689
|
+
"403": {
|
|
78690
|
+
"content": {
|
|
78691
|
+
"application/json": {
|
|
78692
|
+
"schema": {
|
|
78693
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
78694
|
+
}
|
|
78695
|
+
}
|
|
78696
|
+
},
|
|
78697
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
78698
|
+
},
|
|
78699
|
+
"404": {
|
|
78700
|
+
"content": {
|
|
78701
|
+
"application/json": {
|
|
78702
|
+
"schema": {
|
|
78703
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
78704
|
+
}
|
|
78705
|
+
}
|
|
78706
|
+
},
|
|
78707
|
+
"description": "Not found"
|
|
78708
|
+
},
|
|
78709
|
+
"413": {
|
|
78710
|
+
"content": {
|
|
78711
|
+
"application/json": {
|
|
78712
|
+
"schema": {
|
|
78713
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
78714
|
+
}
|
|
78715
|
+
}
|
|
78716
|
+
},
|
|
78717
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
78718
|
+
},
|
|
78719
|
+
"503": {
|
|
78720
|
+
"content": {
|
|
78721
|
+
"application/json": {
|
|
78722
|
+
"schema": {
|
|
78723
|
+
"$ref": "#/components/schemas/SearchUnavailable"
|
|
78724
|
+
}
|
|
78725
|
+
}
|
|
78726
|
+
},
|
|
78727
|
+
"description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
|
|
78728
|
+
}
|
|
78729
|
+
},
|
|
78730
|
+
"summary": "Home builders on this LO's new-construction loans",
|
|
78731
|
+
"tags": [
|
|
78732
|
+
"Originators"
|
|
78733
|
+
]
|
|
78734
|
+
}
|
|
78735
|
+
},
|
|
77818
78736
|
"/v1/originators/{nmlsId}/breakdowns/cities": {
|
|
77819
78737
|
"post": {
|
|
77820
78738
|
"operationId": "originatorCitiesBreakdown",
|