@model-match/api 3.57.1 → 3.59.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/openapi.json CHANGED
@@ -11871,6 +11871,161 @@
11871
11871
  ],
11872
11872
  "type": "object"
11873
11873
  },
11874
+ "CompanyActiveListing": {
11875
+ "properties": {
11876
+ "address": {
11877
+ "description": "From the company's loan record on the parcel.",
11878
+ "type": "string"
11879
+ },
11880
+ "lender": {
11881
+ "description": "Lender on that loan — still the borrower's latest loan (retained), so the current lender of record.",
11882
+ "nullable": true,
11883
+ "type": "string"
11884
+ },
11885
+ "listPrice": {
11886
+ "nullable": true,
11887
+ "type": "number"
11888
+ },
11889
+ "listedDate": {
11890
+ "description": "Date of the newest listing event (UTC).",
11891
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
11892
+ "type": "string"
11893
+ },
11894
+ "listingStatus": {
11895
+ "description": "The MLS status of the newest listing event (active).",
11896
+ "type": "string"
11897
+ },
11898
+ "loanAmount": {
11899
+ "type": "number"
11900
+ },
11901
+ "loanDate": {
11902
+ "description": "Date of the company's latest loan on the parcel.",
11903
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
11904
+ "type": "string"
11905
+ },
11906
+ "originatorName": {
11907
+ "type": "string"
11908
+ },
11909
+ "originatorNmlsId": {
11910
+ "description": "The LO who wrote the company's latest loan on the parcel — employed by the company on that loan.",
11911
+ "type": "string"
11912
+ },
11913
+ "propertyId": {
11914
+ "type": "string"
11915
+ }
11916
+ },
11917
+ "required": [
11918
+ "propertyId",
11919
+ "address",
11920
+ "listingStatus",
11921
+ "listPrice",
11922
+ "listedDate",
11923
+ "originatorNmlsId",
11924
+ "originatorName",
11925
+ "loanDate",
11926
+ "loanAmount",
11927
+ "lender"
11928
+ ],
11929
+ "type": "object"
11930
+ },
11931
+ "CompanyActiveListingsResponse": {
11932
+ "properties": {
11933
+ "companyNmlsId": {
11934
+ "type": "string"
11935
+ },
11936
+ "computedAt": {
11937
+ "description": "When the weekly batch checked these listings (ISO-8601). Rows are as of this time, not live.",
11938
+ "type": "string"
11939
+ },
11940
+ "cursor": {
11941
+ "description": "Cursor for the next page; absent on the last page.",
11942
+ "type": "string"
11943
+ },
11944
+ "data": {
11945
+ "items": {
11946
+ "$ref": "#/components/schemas/CompanyActiveListing"
11947
+ },
11948
+ "type": "array"
11949
+ },
11950
+ "status": {
11951
+ "description": "`timeout`: the listing check did not finish in this run, so the previous run's rows and counts are kept (or none, on a first run).",
11952
+ "enum": [
11953
+ "ok",
11954
+ "timeout"
11955
+ ],
11956
+ "type": "string"
11957
+ },
11958
+ "total": {
11959
+ "description": "Rows matching the filter, across all pages.",
11960
+ "type": "integer"
11961
+ }
11962
+ },
11963
+ "required": [
11964
+ "companyNmlsId",
11965
+ "computedAt",
11966
+ "status",
11967
+ "data",
11968
+ "total"
11969
+ ],
11970
+ "type": "object"
11971
+ },
11972
+ "CompanyActiveListingsSummary": {
11973
+ "description": "Retained borrowers listed for sale now, on loans by the company's own LOs: the count and top LOs (rows: `GET /companies/{nmlsId}/retention/active-listings`). Same for every window. Null until the weekly batch has checked listings for this company.",
11974
+ "nullable": true,
11975
+ "properties": {
11976
+ "computedAt": {
11977
+ "description": "When the listings were checked (ISO-8601) — the run that wrote the rows. Listings are as of this time, not live.",
11978
+ "type": "string"
11979
+ },
11980
+ "parcelsChecked": {
11981
+ "description": "Retained parcels whose latest company loan was written by an LO the company employed on it — the population checked for listings.",
11982
+ "type": "integer"
11983
+ },
11984
+ "status": {
11985
+ "description": "`timeout`: the listing check did not finish in this run, so the previous run's rows and counts are kept (or none, on a first run).",
11986
+ "enum": [
11987
+ "ok",
11988
+ "timeout"
11989
+ ],
11990
+ "type": "string"
11991
+ },
11992
+ "topOriginators": {
11993
+ "description": "Top 10 LOs by active listings.",
11994
+ "items": {
11995
+ "properties": {
11996
+ "count": {
11997
+ "type": "integer"
11998
+ },
11999
+ "name": {
12000
+ "type": "string"
12001
+ },
12002
+ "nmlsId": {
12003
+ "type": "string"
12004
+ }
12005
+ },
12006
+ "required": [
12007
+ "nmlsId",
12008
+ "name",
12009
+ "count"
12010
+ ],
12011
+ "type": "object"
12012
+ },
12013
+ "type": "array"
12014
+ },
12015
+ "total": {
12016
+ "description": "Retained borrowers whose home is listed for sale right now, on loans written by the company's own LOs.",
12017
+ "type": "integer"
12018
+ }
12019
+ },
12020
+ "required": [
12021
+ "computedAt",
12022
+ "status",
12023
+ "total",
12024
+ "parcelsChecked",
12025
+ "topOriginators"
12026
+ ],
12027
+ "type": "object"
12028
+ },
11874
12029
  "CompanyBranch": {
11875
12030
  "properties": {
11876
12031
  "branchNmlsId": {
@@ -15691,6 +15846,9 @@
15691
15846
  },
15692
15847
  "CompanyRetentionSnapshot": {
15693
15848
  "properties": {
15849
+ "activeListings": {
15850
+ "$ref": "#/components/schemas/CompanyActiveListingsSummary"
15851
+ },
15694
15852
  "book": {
15695
15853
  "description": "Rows the computation read (sizing / provenance).",
15696
15854
  "properties": {
@@ -16347,6 +16505,7 @@
16347
16505
  "capturingTotals",
16348
16506
  "originatorRetention",
16349
16507
  "previous",
16508
+ "activeListings",
16350
16509
  "book"
16351
16510
  ],
16352
16511
  "type": "object"
@@ -29661,7 +29820,9 @@
29661
29820
  "veteranIndicator",
29662
29821
  "hmdaActionTaken",
29663
29822
  "selfEmployed",
29664
- "currentHomeOwner"
29823
+ "currentHomeOwner",
29824
+ "lenderType",
29825
+ "lenderVolumeClass"
29665
29826
  ],
29666
29827
  "type": "string"
29667
29828
  }
@@ -30616,6 +30777,660 @@
30616
30777
  ],
30617
30778
  "type": "object"
30618
30779
  },
30780
+ "MarketSignalsRequest": {
30781
+ "additionalProperties": false,
30782
+ "properties": {
30783
+ "flatFilters": {
30784
+ "$ref": "#/components/schemas/MarketFlatFilters"
30785
+ },
30786
+ "lookbackMonths": {
30787
+ "maximum": 120,
30788
+ "minimum": 6,
30789
+ "type": "integer"
30790
+ },
30791
+ "previous": {
30792
+ "allOf": [
30793
+ {
30794
+ "$ref": "#/components/schemas/MarketSignalsWindow"
30795
+ },
30796
+ {
30797
+ "description": "Comparison window; defaults to the preceding equal-length one."
30798
+ }
30799
+ ]
30800
+ },
30801
+ "stats": {
30802
+ "items": {
30803
+ "enum": [
30804
+ "funnel",
30805
+ "refiMix",
30806
+ "affordability",
30807
+ "pipeline",
30808
+ "status",
30809
+ "refiOpportunity"
30810
+ ],
30811
+ "type": "string"
30812
+ },
30813
+ "minItems": 1,
30814
+ "type": "array"
30815
+ },
30816
+ "thresholdBps": {
30817
+ "maximum": 500,
30818
+ "minimum": 0,
30819
+ "type": "integer"
30820
+ },
30821
+ "window": {
30822
+ "$ref": "#/components/schemas/MarketSignalsWindow"
30823
+ }
30824
+ },
30825
+ "required": [
30826
+ "window",
30827
+ "stats"
30828
+ ],
30829
+ "type": "object"
30830
+ },
30831
+ "MarketSignalsResponse": {
30832
+ "properties": {
30833
+ "affordability": {
30834
+ "properties": {
30835
+ "current": {
30836
+ "properties": {
30837
+ "medianAnnualIncome": {
30838
+ "nullable": true,
30839
+ "type": "number"
30840
+ },
30841
+ "medianLoanAmount": {
30842
+ "nullable": true,
30843
+ "type": "number"
30844
+ },
30845
+ "sampleCount": {
30846
+ "type": "number"
30847
+ }
30848
+ },
30849
+ "required": [
30850
+ "medianLoanAmount",
30851
+ "medianAnnualIncome",
30852
+ "sampleCount"
30853
+ ],
30854
+ "type": "object"
30855
+ },
30856
+ "monthly": {
30857
+ "items": {
30858
+ "properties": {
30859
+ "medianAnnualIncome": {
30860
+ "nullable": true,
30861
+ "type": "number"
30862
+ },
30863
+ "medianLoanAmount": {
30864
+ "nullable": true,
30865
+ "type": "number"
30866
+ },
30867
+ "month": {
30868
+ "type": "string"
30869
+ },
30870
+ "sampleCount": {
30871
+ "type": "number"
30872
+ }
30873
+ },
30874
+ "required": [
30875
+ "medianLoanAmount",
30876
+ "medianAnnualIncome",
30877
+ "sampleCount",
30878
+ "month"
30879
+ ],
30880
+ "type": "object"
30881
+ },
30882
+ "type": "array"
30883
+ },
30884
+ "previous": {
30885
+ "properties": {
30886
+ "medianAnnualIncome": {
30887
+ "nullable": true,
30888
+ "type": "number"
30889
+ },
30890
+ "medianLoanAmount": {
30891
+ "nullable": true,
30892
+ "type": "number"
30893
+ },
30894
+ "sampleCount": {
30895
+ "type": "number"
30896
+ }
30897
+ },
30898
+ "required": [
30899
+ "medianLoanAmount",
30900
+ "medianAnnualIncome",
30901
+ "sampleCount"
30902
+ ],
30903
+ "type": "object"
30904
+ }
30905
+ },
30906
+ "required": [
30907
+ "current",
30908
+ "previous",
30909
+ "monthly"
30910
+ ],
30911
+ "type": "object"
30912
+ },
30913
+ "funnel": {
30914
+ "properties": {
30915
+ "reLock": {
30916
+ "properties": {
30917
+ "reLockedCount": {
30918
+ "type": "number"
30919
+ },
30920
+ "sampleCount": {
30921
+ "type": "number"
30922
+ }
30923
+ },
30924
+ "required": [
30925
+ "reLockedCount",
30926
+ "sampleCount"
30927
+ ],
30928
+ "type": "object"
30929
+ },
30930
+ "timeToClose": {
30931
+ "properties": {
30932
+ "p25": {
30933
+ "nullable": true,
30934
+ "type": "number"
30935
+ },
30936
+ "p50": {
30937
+ "nullable": true,
30938
+ "type": "number"
30939
+ },
30940
+ "p75": {
30941
+ "nullable": true,
30942
+ "type": "number"
30943
+ },
30944
+ "sampleCount": {
30945
+ "type": "number"
30946
+ }
30947
+ },
30948
+ "required": [
30949
+ "p25",
30950
+ "p50",
30951
+ "p75",
30952
+ "sampleCount"
30953
+ ],
30954
+ "type": "object"
30955
+ }
30956
+ },
30957
+ "required": [
30958
+ "timeToClose",
30959
+ "reLock"
30960
+ ],
30961
+ "type": "object"
30962
+ },
30963
+ "pipeline": {
30964
+ "properties": {
30965
+ "expected": {
30966
+ "properties": {
30967
+ "next30Days": {
30968
+ "type": "number"
30969
+ },
30970
+ "next60Days": {
30971
+ "type": "number"
30972
+ },
30973
+ "next90Days": {
30974
+ "type": "number"
30975
+ },
30976
+ "weekly": {
30977
+ "items": {
30978
+ "properties": {
30979
+ "count": {
30980
+ "type": "number"
30981
+ },
30982
+ "weekStart": {
30983
+ "type": "string"
30984
+ }
30985
+ },
30986
+ "required": [
30987
+ "weekStart",
30988
+ "count"
30989
+ ],
30990
+ "type": "object"
30991
+ },
30992
+ "type": "array"
30993
+ }
30994
+ },
30995
+ "required": [
30996
+ "next30Days",
30997
+ "next60Days",
30998
+ "next90Days",
30999
+ "weekly"
31000
+ ],
31001
+ "type": "object"
31002
+ },
31003
+ "funnel": {
31004
+ "properties": {
31005
+ "application": {
31006
+ "type": "number"
31007
+ },
31008
+ "closing": {
31009
+ "type": "number"
31010
+ },
31011
+ "funded": {
31012
+ "type": "number"
31013
+ },
31014
+ "locked": {
31015
+ "type": "number"
31016
+ }
31017
+ },
31018
+ "required": [
31019
+ "application",
31020
+ "locked",
31021
+ "closing",
31022
+ "funded"
31023
+ ],
31024
+ "type": "object"
31025
+ },
31026
+ "transitions": {
31027
+ "properties": {
31028
+ "appToLock": {
31029
+ "properties": {
31030
+ "converted": {
31031
+ "type": "number"
31032
+ },
31033
+ "p25": {
31034
+ "nullable": true,
31035
+ "type": "number"
31036
+ },
31037
+ "p50": {
31038
+ "nullable": true,
31039
+ "type": "number"
31040
+ },
31041
+ "p75": {
31042
+ "nullable": true,
31043
+ "type": "number"
31044
+ },
31045
+ "priorP50": {
31046
+ "nullable": true,
31047
+ "type": "number"
31048
+ },
31049
+ "priorSampleCount": {
31050
+ "type": "number"
31051
+ },
31052
+ "reached": {
31053
+ "type": "number"
31054
+ },
31055
+ "sampleCount": {
31056
+ "type": "number"
31057
+ }
31058
+ },
31059
+ "required": [
31060
+ "p25",
31061
+ "p50",
31062
+ "p75",
31063
+ "sampleCount",
31064
+ "priorP50",
31065
+ "priorSampleCount",
31066
+ "reached",
31067
+ "converted"
31068
+ ],
31069
+ "type": "object"
31070
+ },
31071
+ "closeToFunding": {
31072
+ "properties": {
31073
+ "converted": {
31074
+ "type": "number"
31075
+ },
31076
+ "p25": {
31077
+ "nullable": true,
31078
+ "type": "number"
31079
+ },
31080
+ "p50": {
31081
+ "nullable": true,
31082
+ "type": "number"
31083
+ },
31084
+ "p75": {
31085
+ "nullable": true,
31086
+ "type": "number"
31087
+ },
31088
+ "priorP50": {
31089
+ "nullable": true,
31090
+ "type": "number"
31091
+ },
31092
+ "priorSampleCount": {
31093
+ "type": "number"
31094
+ },
31095
+ "reached": {
31096
+ "type": "number"
31097
+ },
31098
+ "sampleCount": {
31099
+ "type": "number"
31100
+ }
31101
+ },
31102
+ "required": [
31103
+ "p25",
31104
+ "p50",
31105
+ "p75",
31106
+ "sampleCount",
31107
+ "priorP50",
31108
+ "priorSampleCount",
31109
+ "reached",
31110
+ "converted"
31111
+ ],
31112
+ "type": "object"
31113
+ }
31114
+ },
31115
+ "required": [
31116
+ "appToLock",
31117
+ "closeToFunding"
31118
+ ],
31119
+ "type": "object"
31120
+ }
31121
+ },
31122
+ "required": [
31123
+ "transitions",
31124
+ "funnel",
31125
+ "expected"
31126
+ ],
31127
+ "type": "object"
31128
+ },
31129
+ "refiMix": {
31130
+ "properties": {
31131
+ "cashOut": {
31132
+ "properties": {
31133
+ "medianAmount": {
31134
+ "nullable": true,
31135
+ "type": "number"
31136
+ },
31137
+ "sampleCount": {
31138
+ "type": "number"
31139
+ }
31140
+ },
31141
+ "required": [
31142
+ "medianAmount",
31143
+ "sampleCount"
31144
+ ],
31145
+ "type": "object"
31146
+ },
31147
+ "purposes": {
31148
+ "items": {
31149
+ "properties": {
31150
+ "count": {
31151
+ "type": "number"
31152
+ },
31153
+ "key": {
31154
+ "type": "string"
31155
+ }
31156
+ },
31157
+ "required": [
31158
+ "key",
31159
+ "count"
31160
+ ],
31161
+ "type": "object"
31162
+ },
31163
+ "type": "array"
31164
+ }
31165
+ },
31166
+ "required": [
31167
+ "purposes",
31168
+ "cashOut"
31169
+ ],
31170
+ "type": "object"
31171
+ },
31172
+ "refiOpportunity": {
31173
+ "properties": {
31174
+ "baseline": {
31175
+ "nullable": true,
31176
+ "type": "number"
31177
+ },
31178
+ "byLoanType": {
31179
+ "items": {
31180
+ "properties": {
31181
+ "count": {
31182
+ "type": "number"
31183
+ },
31184
+ "key": {
31185
+ "type": "string"
31186
+ }
31187
+ },
31188
+ "required": [
31189
+ "key",
31190
+ "count"
31191
+ ],
31192
+ "type": "object"
31193
+ },
31194
+ "type": "array"
31195
+ },
31196
+ "byState": {
31197
+ "items": {
31198
+ "properties": {
31199
+ "avgRate": {
31200
+ "nullable": true,
31201
+ "type": "number"
31202
+ },
31203
+ "avgSpreadBps": {
31204
+ "nullable": true,
31205
+ "type": "number"
31206
+ },
31207
+ "count": {
31208
+ "type": "number"
31209
+ },
31210
+ "state": {
31211
+ "type": "string"
31212
+ },
31213
+ "totalVolume": {
31214
+ "type": "number"
31215
+ }
31216
+ },
31217
+ "required": [
31218
+ "state",
31219
+ "count",
31220
+ "totalVolume",
31221
+ "avgRate",
31222
+ "avgSpreadBps"
31223
+ ],
31224
+ "type": "object"
31225
+ },
31226
+ "type": "array"
31227
+ },
31228
+ "byVintage": {
31229
+ "items": {
31230
+ "properties": {
31231
+ "count": {
31232
+ "type": "number"
31233
+ },
31234
+ "year": {
31235
+ "type": "number"
31236
+ }
31237
+ },
31238
+ "required": [
31239
+ "year",
31240
+ "count"
31241
+ ],
31242
+ "type": "object"
31243
+ },
31244
+ "type": "array"
31245
+ },
31246
+ "lookbackMonths": {
31247
+ "type": "number"
31248
+ },
31249
+ "medianSpreadBps": {
31250
+ "nullable": true,
31251
+ "type": "number"
31252
+ },
31253
+ "spreadHistogram": {
31254
+ "items": {
31255
+ "properties": {
31256
+ "count": {
31257
+ "type": "number"
31258
+ },
31259
+ "spreadBps": {
31260
+ "type": "number"
31261
+ }
31262
+ },
31263
+ "required": [
31264
+ "spreadBps",
31265
+ "count"
31266
+ ],
31267
+ "type": "object"
31268
+ },
31269
+ "type": "array"
31270
+ },
31271
+ "thresholdBps": {
31272
+ "type": "number"
31273
+ },
31274
+ "topStateConcentrationPct": {
31275
+ "type": "number"
31276
+ },
31277
+ "totals": {
31278
+ "properties": {
31279
+ "count": {
31280
+ "type": "number"
31281
+ },
31282
+ "medianLoanAmount": {
31283
+ "nullable": true,
31284
+ "type": "number"
31285
+ },
31286
+ "totalVolume": {
31287
+ "type": "number"
31288
+ }
31289
+ },
31290
+ "required": [
31291
+ "count",
31292
+ "totalVolume",
31293
+ "medianLoanAmount"
31294
+ ],
31295
+ "type": "object"
31296
+ }
31297
+ },
31298
+ "required": [
31299
+ "baseline",
31300
+ "thresholdBps",
31301
+ "lookbackMonths",
31302
+ "totals",
31303
+ "byState",
31304
+ "spreadHistogram",
31305
+ "medianSpreadBps",
31306
+ "byVintage",
31307
+ "byLoanType",
31308
+ "topStateConcentrationPct"
31309
+ ],
31310
+ "type": "object"
31311
+ },
31312
+ "status": {
31313
+ "properties": {
31314
+ "applications": {
31315
+ "properties": {
31316
+ "current": {
31317
+ "type": "number"
31318
+ },
31319
+ "prior": {
31320
+ "type": "number"
31321
+ }
31322
+ },
31323
+ "required": [
31324
+ "current",
31325
+ "prior"
31326
+ ],
31327
+ "type": "object"
31328
+ },
31329
+ "approvals": {
31330
+ "properties": {
31331
+ "current": {
31332
+ "type": "number"
31333
+ },
31334
+ "prior": {
31335
+ "type": "number"
31336
+ }
31337
+ },
31338
+ "required": [
31339
+ "current",
31340
+ "prior"
31341
+ ],
31342
+ "type": "object"
31343
+ },
31344
+ "expectedClosings": {
31345
+ "type": "number"
31346
+ },
31347
+ "locks": {
31348
+ "properties": {
31349
+ "current": {
31350
+ "type": "number"
31351
+ },
31352
+ "prior": {
31353
+ "type": "number"
31354
+ }
31355
+ },
31356
+ "required": [
31357
+ "current",
31358
+ "prior"
31359
+ ],
31360
+ "type": "object"
31361
+ },
31362
+ "timeToClose": {
31363
+ "properties": {
31364
+ "current": {
31365
+ "properties": {
31366
+ "median": {
31367
+ "nullable": true,
31368
+ "type": "number"
31369
+ },
31370
+ "sampleCount": {
31371
+ "type": "number"
31372
+ }
31373
+ },
31374
+ "required": [
31375
+ "median",
31376
+ "sampleCount"
31377
+ ],
31378
+ "type": "object"
31379
+ },
31380
+ "prior": {
31381
+ "properties": {
31382
+ "median": {
31383
+ "nullable": true,
31384
+ "type": "number"
31385
+ },
31386
+ "sampleCount": {
31387
+ "type": "number"
31388
+ }
31389
+ },
31390
+ "required": [
31391
+ "median",
31392
+ "sampleCount"
31393
+ ],
31394
+ "type": "object"
31395
+ }
31396
+ },
31397
+ "required": [
31398
+ "current",
31399
+ "prior"
31400
+ ],
31401
+ "type": "object"
31402
+ }
31403
+ },
31404
+ "required": [
31405
+ "applications",
31406
+ "locks",
31407
+ "approvals",
31408
+ "timeToClose",
31409
+ "expectedClosings"
31410
+ ],
31411
+ "type": "object"
31412
+ }
31413
+ },
31414
+ "type": "object"
31415
+ },
31416
+ "MarketSignalsWindow": {
31417
+ "description": "`[gte, lt)` window, YYYY-MM-DD.",
31418
+ "properties": {
31419
+ "gte": {
31420
+ "format": "date",
31421
+ "type": "string"
31422
+ },
31423
+ "lt": {
31424
+ "format": "date",
31425
+ "type": "string"
31426
+ }
31427
+ },
31428
+ "required": [
31429
+ "gte",
31430
+ "lt"
31431
+ ],
31432
+ "type": "object"
31433
+ },
30619
31434
  "MarketSliceDimension": {
30620
31435
  "enum": [
30621
31436
  "state",
@@ -30633,7 +31448,9 @@
30633
31448
  "veteranIndicator",
30634
31449
  "hmdaActionTaken",
30635
31450
  "selfEmployed",
30636
- "currentHomeOwner"
31451
+ "currentHomeOwner",
31452
+ "lenderType",
31453
+ "lenderVolumeClass"
30637
31454
  ],
30638
31455
  "type": "string"
30639
31456
  },
@@ -44803,7 +45620,7 @@
44803
45620
  "info": {
44804
45621
  "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.",
44805
45622
  "title": "ModelMatch API",
44806
- "version": "3.123.1"
45623
+ "version": "3.125.0"
44807
45624
  },
44808
45625
  "openapi": "3.1.0",
44809
45626
  "paths": {
@@ -55618,16 +56435,119 @@
55618
56435
  "description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
55619
56436
  }
55620
56437
  },
55621
- "summary": "Monthly loan officer headcount, hires and exits for a company",
56438
+ "summary": "Monthly loan officer headcount, hires and exits for a company",
56439
+ "tags": [
56440
+ "Companies"
56441
+ ]
56442
+ }
56443
+ },
56444
+ "/v1/companies/{nmlsId}/markets": {
56445
+ "post": {
56446
+ "description": "The company's market footprint for a period: a units-weighted summary, the ZIP-level markets, and the city / county / state rollups, computed from the company's recorded transactions. Optionally narrow to a set of ZIP codes and/or a custom date window. Shares are percentages on a 0–100 scale. The summary also carries a Community Lending mix — what kind of neighborhood the book lands in, as U.S. Census tract-level aggregates describing whole neighborhoods, never individual or applicant attributes. Unfiltered, it is the company's own whole-period mix; any ZIP, date or transaction filter recomputes it over the markets in scope, and `summary.communityLending.basis` says which you got.",
56447
+ "operationId": "companyMarkets",
56448
+ "parameters": [
56449
+ {
56450
+ "description": "Company NMLS ID",
56451
+ "in": "path",
56452
+ "name": "nmlsId",
56453
+ "required": true,
56454
+ "schema": {
56455
+ "description": "Company NMLS ID",
56456
+ "type": "string"
56457
+ }
56458
+ }
56459
+ ],
56460
+ "requestBody": {
56461
+ "content": {
56462
+ "application/json": {
56463
+ "schema": {
56464
+ "$ref": "#/components/schemas/CompanyMarketsRequest"
56465
+ }
56466
+ }
56467
+ }
56468
+ },
56469
+ "responses": {
56470
+ "200": {
56471
+ "content": {
56472
+ "application/json": {
56473
+ "schema": {
56474
+ "$ref": "#/components/schemas/CompanyMarketsResponse"
56475
+ }
56476
+ }
56477
+ },
56478
+ "description": "Blended market footprint"
56479
+ },
56480
+ "400": {
56481
+ "content": {
56482
+ "application/json": {
56483
+ "schema": {
56484
+ "$ref": "#/components/schemas/ErrorResponse"
56485
+ }
56486
+ }
56487
+ },
56488
+ "description": "Validation error. Includes unresolvable location filters: a `city`/`county`/`state`/`zip` value that does not match a recognized location returns 400 rather than an empty result set. Resolve the name with `instantSearch` (use an id from its `results.locations[]`) or `suggestLocations` (use the `id` of a `source: \"dictionary\"` result), then pass that id back as the filter value."
56489
+ },
56490
+ "401": {
56491
+ "content": {
56492
+ "application/json": {
56493
+ "schema": {
56494
+ "$ref": "#/components/schemas/ErrorResponse"
56495
+ }
56496
+ }
56497
+ },
56498
+ "description": "Unauthorized"
56499
+ },
56500
+ "403": {
56501
+ "content": {
56502
+ "application/json": {
56503
+ "schema": {
56504
+ "$ref": "#/components/schemas/ErrorResponse"
56505
+ }
56506
+ }
56507
+ },
56508
+ "description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
56509
+ },
56510
+ "404": {
56511
+ "content": {
56512
+ "application/json": {
56513
+ "schema": {
56514
+ "$ref": "#/components/schemas/ErrorResponse"
56515
+ }
56516
+ }
56517
+ },
56518
+ "description": "Not found"
56519
+ },
56520
+ "413": {
56521
+ "content": {
56522
+ "application/json": {
56523
+ "schema": {
56524
+ "$ref": "#/components/schemas/PayloadTooLarge"
56525
+ }
56526
+ }
56527
+ },
56528
+ "description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
56529
+ },
56530
+ "503": {
56531
+ "content": {
56532
+ "application/json": {
56533
+ "schema": {
56534
+ "$ref": "#/components/schemas/SearchUnavailable"
56535
+ }
56536
+ }
56537
+ },
56538
+ "description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
56539
+ }
56540
+ },
56541
+ "summary": "Where a company lends — blended market footprint",
55622
56542
  "tags": [
55623
56543
  "Companies"
55624
56544
  ]
55625
56545
  }
55626
56546
  },
55627
- "/v1/companies/{nmlsId}/markets": {
55628
- "post": {
55629
- "description": "The company's market footprint for a period: a units-weighted summary, the ZIP-level markets, and the city / county / state rollups, computed from the company's recorded transactions. Optionally narrow to a set of ZIP codes and/or a custom date window. Shares are percentages on a 0–100 scale. The summary also carries a Community Lending mix — what kind of neighborhood the book lands in, as U.S. Census tract-level aggregates describing whole neighborhoods, never individual or applicant attributes. Unfiltered, it is the company's own whole-period mix; any ZIP, date or transaction filter recomputes it over the markets in scope, and `summary.communityLending.basis` says which you got.",
55630
- "operationId": "companyMarkets",
56547
+ "/v1/companies/{nmlsId}/mover-production": {
56548
+ "get": {
56549
+ "description": "The window's hires and complete departures, each side's combined production across ALL employers recorded inside the production window (default: the same window). Pass a prior window's movers with the current production window to see how past hires and exits perform now.",
56550
+ "operationId": "companyMoverProduction",
55631
56551
  "parameters": [
55632
56552
  {
55633
56553
  "description": "Company NMLS ID",
@@ -55638,27 +56558,78 @@
55638
56558
  "description": "Company NMLS ID",
55639
56559
  "type": "string"
55640
56560
  }
55641
- }
55642
- ],
55643
- "requestBody": {
55644
- "content": {
55645
- "application/json": {
55646
- "schema": {
55647
- "$ref": "#/components/schemas/CompanyMarketsRequest"
55648
- }
56561
+ },
56562
+ {
56563
+ "description": "Preset window when `from`/`to` are not given (default `last12Months`). Rolling periods start on the FIRST day of the month N months back and end today; a year is Jan 1 – Dec 31; `allTime` starts 2017-01-01, the earliest reliable registration data. Also selects the production period for volume/units.",
56564
+ "in": "query",
56565
+ "name": "period",
56566
+ "required": false,
56567
+ "schema": {
56568
+ "allOf": [
56569
+ {
56570
+ "$ref": "#/components/schemas/Period"
56571
+ },
56572
+ {
56573
+ "description": "Preset window when `from`/`to` are not given (default `last12Months`). Rolling periods start on the FIRST day of the month N months back and end today; a year is Jan 1 – Dec 31; `allTime` starts 2017-01-01, the earliest reliable registration data. Also selects the production period for volume/units."
56574
+ }
56575
+ ]
56576
+ }
56577
+ },
56578
+ {
56579
+ "description": "Window start, inclusive (YYYY-MM-DD). Overrides `period`.",
56580
+ "in": "query",
56581
+ "name": "from",
56582
+ "required": false,
56583
+ "schema": {
56584
+ "description": "Window start, inclusive (YYYY-MM-DD). Overrides `period`.",
56585
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
56586
+ "type": "string"
56587
+ }
56588
+ },
56589
+ {
56590
+ "description": "Window end, inclusive (YYYY-MM-DD). Overrides `period`.",
56591
+ "in": "query",
56592
+ "name": "to",
56593
+ "required": false,
56594
+ "schema": {
56595
+ "description": "Window end, inclusive (YYYY-MM-DD). Overrides `period`.",
56596
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
56597
+ "type": "string"
56598
+ }
56599
+ },
56600
+ {
56601
+ "description": "Production window start, inclusive (YYYY-MM-DD). Defaults to the mover window's start.",
56602
+ "in": "query",
56603
+ "name": "productionFrom",
56604
+ "required": false,
56605
+ "schema": {
56606
+ "description": "Production window start, inclusive (YYYY-MM-DD). Defaults to the mover window's start.",
56607
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
56608
+ "type": "string"
56609
+ }
56610
+ },
56611
+ {
56612
+ "description": "Production window end, inclusive (YYYY-MM-DD). Defaults to the mover window's end.",
56613
+ "in": "query",
56614
+ "name": "productionTo",
56615
+ "required": false,
56616
+ "schema": {
56617
+ "description": "Production window end, inclusive (YYYY-MM-DD). Defaults to the mover window's end.",
56618
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
56619
+ "type": "string"
55649
56620
  }
55650
56621
  }
55651
- },
56622
+ ],
55652
56623
  "responses": {
55653
56624
  "200": {
55654
56625
  "content": {
55655
56626
  "application/json": {
55656
56627
  "schema": {
55657
- "$ref": "#/components/schemas/CompanyMarketsResponse"
56628
+ "$ref": "#/components/schemas/CompanyMoverProductionResponse"
55658
56629
  }
55659
56630
  }
55660
56631
  },
55661
- "description": "Blended market footprint"
56632
+ "description": "Hires' and exits' production"
55662
56633
  },
55663
56634
  "400": {
55664
56635
  "content": {
@@ -55668,7 +56639,7 @@
55668
56639
  }
55669
56640
  }
55670
56641
  },
55671
- "description": "Validation error. Includes unresolvable location filters: a `city`/`county`/`state`/`zip` value that does not match a recognized location returns 400 rather than an empty result set. Resolve the name with `instantSearch` (use an id from its `results.locations[]`) or `suggestLocations` (use the `id` of a `source: \"dictionary\"` result), then pass that id back as the filter value."
56642
+ "description": "Validation error"
55672
56643
  },
55673
56644
  "401": {
55674
56645
  "content": {
@@ -55721,16 +56692,16 @@
55721
56692
  "description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
55722
56693
  }
55723
56694
  },
55724
- "summary": "Where a company lends — blended market footprint",
56695
+ "summary": "Combined production of a company's hires and exits",
55725
56696
  "tags": [
55726
56697
  "Companies"
55727
56698
  ]
55728
56699
  }
55729
56700
  },
55730
- "/v1/companies/{nmlsId}/mover-production": {
56701
+ "/v1/companies/{nmlsId}/retention": {
55731
56702
  "get": {
55732
- "description": "The window's hires and complete departures, each side's combined production across ALL employers recorded inside the production window (default: the same window). Pass a prior window's movers with the current production window to see how past hires and exits perform now.",
55733
- "operationId": "companyMoverProduction",
56703
+ "description": "How well a company keeps its borrowers when they refinance: kept (refinanced again by ANY LO at the company) vs lost to other companies, with the capturing companies and LOs, timing, the trend, a verdict, and per-LO retention for the company's own loan officers. Precomputed weekly — `computedAt` says when. 404 means not computed (no loans since 2017, or not reached yet), never zero retention.",
56704
+ "operationId": "companyRetention",
55734
56705
  "parameters": [
55735
56706
  {
55736
56707
  "description": "Company NMLS ID",
@@ -55743,62 +56714,17 @@
55743
56714
  }
55744
56715
  },
55745
56716
  {
55746
- "description": "Preset window when `from`/`to` are not given (default `last12Months`). Rolling periods start on the FIRST day of the month N months back and end today; a year is Jan 1 – Dec 31; `allTime` starts 2017-01-01, the earliest reliable registration data. Also selects the production period for volume/units.",
55747
- "in": "query",
55748
- "name": "period",
55749
- "required": false,
55750
- "schema": {
55751
- "allOf": [
55752
- {
55753
- "$ref": "#/components/schemas/Period"
55754
- },
55755
- {
55756
- "description": "Preset window when `from`/`to` are not given (default `last12Months`). Rolling periods start on the FIRST day of the month N months back and end today; a year is Jan 1 – Dec 31; `allTime` starts 2017-01-01, the earliest reliable registration data. Also selects the production period for volume/units."
55757
- }
55758
- ]
55759
- }
55760
- },
55761
- {
55762
- "description": "Window start, inclusive (YYYY-MM-DD). Overrides `period`.",
55763
- "in": "query",
55764
- "name": "from",
55765
- "required": false,
55766
- "schema": {
55767
- "description": "Window start, inclusive (YYYY-MM-DD). Overrides `period`.",
55768
- "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
55769
- "type": "string"
55770
- }
55771
- },
55772
- {
55773
- "description": "Window end, inclusive (YYYY-MM-DD). Overrides `period`.",
55774
- "in": "query",
55775
- "name": "to",
55776
- "required": false,
55777
- "schema": {
55778
- "description": "Window end, inclusive (YYYY-MM-DD). Overrides `period`.",
55779
- "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
55780
- "type": "string"
55781
- }
55782
- },
55783
- {
55784
- "description": "Production window start, inclusive (YYYY-MM-DD). Defaults to the mover window's start.",
55785
- "in": "query",
55786
- "name": "productionFrom",
55787
- "required": false,
55788
- "schema": {
55789
- "description": "Production window start, inclusive (YYYY-MM-DD). Defaults to the mover window's start.",
55790
- "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
55791
- "type": "string"
55792
- }
55793
- },
55794
- {
55795
- "description": "Production window end, inclusive (YYYY-MM-DD). Defaults to the mover window's end.",
56717
+ "description": "`last12Months` (the trailing 12 months to the computation date, with the 12 months before as `previous`) or `allTime` (2017-01-01 on). Default `last12Months`.",
55796
56718
  "in": "query",
55797
- "name": "productionTo",
56719
+ "name": "window",
55798
56720
  "required": false,
55799
56721
  "schema": {
55800
- "description": "Production window end, inclusive (YYYY-MM-DD). Defaults to the mover window's end.",
55801
- "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
56722
+ "default": "last12Months",
56723
+ "description": "`last12Months` (the trailing 12 months to the computation date, with the 12 months before as `previous`) or `allTime` (2017-01-01 on). Default `last12Months`.",
56724
+ "enum": [
56725
+ "last12Months",
56726
+ "allTime"
56727
+ ],
55802
56728
  "type": "string"
55803
56729
  }
55804
56730
  }
@@ -55808,11 +56734,11 @@
55808
56734
  "content": {
55809
56735
  "application/json": {
55810
56736
  "schema": {
55811
- "$ref": "#/components/schemas/CompanyMoverProductionResponse"
56737
+ "$ref": "#/components/schemas/CompanyRetentionSnapshot"
55812
56738
  }
55813
56739
  }
55814
56740
  },
55815
- "description": "Hires' and exits' production"
56741
+ "description": "The stored snapshot"
55816
56742
  },
55817
56743
  "400": {
55818
56744
  "content": {
@@ -55875,16 +56801,16 @@
55875
56801
  "description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
55876
56802
  }
55877
56803
  },
55878
- "summary": "Combined production of a company's hires and exits",
56804
+ "summary": "Company borrower retention (weekly snapshot)",
55879
56805
  "tags": [
55880
56806
  "Companies"
55881
56807
  ]
55882
56808
  }
55883
56809
  },
55884
- "/v1/companies/{nmlsId}/retention": {
56810
+ "/v1/companies/{nmlsId}/retention/active-listings": {
55885
56811
  "get": {
55886
- "description": "How well a company keeps its borrowers when they refinance: kept (refinanced again by ANY LO at the company) vs lost to other companies, with the capturing companies and LOs, timing, the trend, a verdict, and per-LO retention for the company's own loan officers. Precomputed weekly — `computedAt` says when. 404 means not computed (no loans since 2017, or not reached yet), never zero retention.",
55887
- "operationId": "companyRetention",
56812
+ "description": "The company's retained borrowers (their latest loan is still the company's) whose home is listed for sale right now, each with the company loan officer who wrote that loan — only LOs the company employed on the loan, not brokers' LOs on loans it only funded. Newest listing first; filter to one LO with `originator`. \"Listed now\" is the LO Borrower Retention tab's rule: an active MLS listing event in the last 90 days, list price at least $20k, not under contract. Checked weekly with the retention snapshot — `computedAt` says when. 404 means not computed for this company yet.",
56813
+ "operationId": "companyRetentionActiveListings",
55888
56814
  "parameters": [
55889
56815
  {
55890
56816
  "description": "Company NMLS ID",
@@ -55897,17 +56823,36 @@
55897
56823
  }
55898
56824
  },
55899
56825
  {
55900
- "description": "`last12Months` (the trailing 12 months to the computation date, with the 12 months before as `previous`) or `allTime` (2017-01-01 on). Default `last12Months`.",
56826
+ "description": "Only rows whose loan was written by this LO (NMLS id) — e.g. one of `activeListings.topOriginators`.",
55901
56827
  "in": "query",
55902
- "name": "window",
56828
+ "name": "originator",
55903
56829
  "required": false,
55904
56830
  "schema": {
55905
- "default": "last12Months",
55906
- "description": "`last12Months` (the trailing 12 months to the computation date, with the 12 months before as `previous`) or `allTime` (2017-01-01 on). Default `last12Months`.",
55907
- "enum": [
55908
- "last12Months",
55909
- "allTime"
55910
- ],
56831
+ "description": "Only rows whose loan was written by this LO (NMLS id) — e.g. one of `activeListings.topOriginators`.",
56832
+ "pattern": "^\\d+$",
56833
+ "type": "string"
56834
+ }
56835
+ },
56836
+ {
56837
+ "description": "Page size (1-100, default 25).",
56838
+ "in": "query",
56839
+ "name": "size",
56840
+ "required": false,
56841
+ "schema": {
56842
+ "description": "Page size (1-100, default 25).",
56843
+ "example": 25,
56844
+ "maximum": 100,
56845
+ "minimum": 1,
56846
+ "type": "integer"
56847
+ }
56848
+ },
56849
+ {
56850
+ "description": "Opaque cursor from the previous page's `cursor`.",
56851
+ "in": "query",
56852
+ "name": "cursor",
56853
+ "required": false,
56854
+ "schema": {
56855
+ "description": "Opaque cursor from the previous page's `cursor`.",
55911
56856
  "type": "string"
55912
56857
  }
55913
56858
  }
@@ -55917,11 +56862,11 @@
55917
56862
  "content": {
55918
56863
  "application/json": {
55919
56864
  "schema": {
55920
- "$ref": "#/components/schemas/CompanyRetentionSnapshot"
56865
+ "$ref": "#/components/schemas/CompanyActiveListingsResponse"
55921
56866
  }
55922
56867
  }
55923
56868
  },
55924
- "description": "The stored snapshot"
56869
+ "description": "One page of listing rows"
55925
56870
  },
55926
56871
  "400": {
55927
56872
  "content": {
@@ -55984,7 +56929,7 @@
55984
56929
  "description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
55985
56930
  }
55986
56931
  },
55987
- "summary": "Company borrower retention (weekly snapshot)",
56932
+ "summary": "Retained borrowers listed for sale now (weekly)",
55988
56933
  "tags": [
55989
56934
  "Companies"
55990
56935
  ]
@@ -74764,6 +75709,96 @@
74764
75709
  ]
74765
75710
  }
74766
75711
  },
75712
+ "/v1/market/signals": {
75713
+ "post": {
75714
+ "operationId": "marketSignals",
75715
+ "requestBody": {
75716
+ "content": {
75717
+ "application/json": {
75718
+ "schema": {
75719
+ "$ref": "#/components/schemas/MarketSignalsRequest"
75720
+ }
75721
+ }
75722
+ }
75723
+ },
75724
+ "responses": {
75725
+ "200": {
75726
+ "content": {
75727
+ "application/json": {
75728
+ "schema": {
75729
+ "$ref": "#/components/schemas/MarketSignalsResponse"
75730
+ }
75731
+ }
75732
+ },
75733
+ "description": "The requested stats"
75734
+ },
75735
+ "400": {
75736
+ "content": {
75737
+ "application/json": {
75738
+ "schema": {
75739
+ "$ref": "#/components/schemas/ErrorResponse"
75740
+ }
75741
+ }
75742
+ },
75743
+ "description": "Validation error"
75744
+ },
75745
+ "401": {
75746
+ "content": {
75747
+ "application/json": {
75748
+ "schema": {
75749
+ "$ref": "#/components/schemas/ErrorResponse"
75750
+ }
75751
+ }
75752
+ },
75753
+ "description": "Unauthorized"
75754
+ },
75755
+ "403": {
75756
+ "content": {
75757
+ "application/json": {
75758
+ "schema": {
75759
+ "$ref": "#/components/schemas/ErrorResponse"
75760
+ }
75761
+ }
75762
+ },
75763
+ "description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
75764
+ },
75765
+ "404": {
75766
+ "content": {
75767
+ "application/json": {
75768
+ "schema": {
75769
+ "$ref": "#/components/schemas/ErrorResponse"
75770
+ }
75771
+ }
75772
+ },
75773
+ "description": "Not found"
75774
+ },
75775
+ "413": {
75776
+ "content": {
75777
+ "application/json": {
75778
+ "schema": {
75779
+ "$ref": "#/components/schemas/PayloadTooLarge"
75780
+ }
75781
+ }
75782
+ },
75783
+ "description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
75784
+ },
75785
+ "503": {
75786
+ "content": {
75787
+ "application/json": {
75788
+ "schema": {
75789
+ "$ref": "#/components/schemas/SearchUnavailable"
75790
+ }
75791
+ }
75792
+ },
75793
+ "description": "Search timed out or the cluster is overloaded — retry after `Retry-After` seconds."
75794
+ }
75795
+ },
75796
+ "summary": "Market Signals card stats (web app feed)",
75797
+ "tags": [
75798
+ "Market"
75799
+ ]
75800
+ }
75801
+ },
74767
75802
  "/v1/me": {
74768
75803
  "get": {
74769
75804
  "description": "Identity, active organization + membership role, and how the caller authenticated.\n\nExtended profile fields (`nmlsId`, `jobRole`, the contact-card block) are resolved for every caller type — session-cookie, API-key, and OAuth-bearer alike. `auth.profileResolved` is `true` on any successful read; it is retained for compatibility and no longer varies by the credential the caller presented.",