@model-match/api 3.22.0 → 3.24.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
@@ -4496,6 +4496,11 @@
4496
4496
  }
4497
4497
  ]
4498
4498
  },
4499
+ "namePrefix": {
4500
+ "description": "Prefix name search: every word must start a word of the name (\"jen ro\" → Jennifer Rodriguez). No fuzzy/nickname matching; relevance-ranked unless `sort` is set. Max 100 chars / 6 words (emails, URLs, phones ignored), else 400.",
4501
+ "minLength": 1,
4502
+ "type": "string"
4503
+ },
4499
4504
  "office": {
4500
4505
  "$ref": "#/components/schemas/TextFilterValue"
4501
4506
  },
@@ -4734,6 +4739,692 @@
4734
4739
  ],
4735
4740
  "type": "object"
4736
4741
  },
4742
+ "AgentLoanMixRequest": {
4743
+ "additionalProperties": false,
4744
+ "properties": {
4745
+ "advancedFilters": {
4746
+ "$ref": "#/components/schemas/FilterNode"
4747
+ },
4748
+ "filters": {
4749
+ "$ref": "#/components/schemas/FilterNode"
4750
+ },
4751
+ "flatFilters": {
4752
+ "additionalProperties": false,
4753
+ "properties": {
4754
+ "borrowerStatus": {
4755
+ "$ref": "#/components/schemas/LoanBorrowerStatusFilterValue"
4756
+ },
4757
+ "broker": {
4758
+ "allOf": [
4759
+ {
4760
+ "$ref": "#/components/schemas/TextFilterValue"
4761
+ },
4762
+ {
4763
+ "description": "Broker shop NMLS id (digits only). A broker is a company — resolve a broker name to its NMLS id via instantSearch (or listCompanies)."
4764
+ }
4765
+ ]
4766
+ },
4767
+ "buyerEntityType": {
4768
+ "$ref": "#/components/schemas/BooleanFilterValue"
4769
+ },
4770
+ "city": {
4771
+ "$ref": "#/components/schemas/TextFilterValue"
4772
+ },
4773
+ "conforming": {
4774
+ "$ref": "#/components/schemas/BooleanFilterValue"
4775
+ },
4776
+ "county": {
4777
+ "allOf": [
4778
+ {
4779
+ "$ref": "#/components/schemas/TextFilterValue"
4780
+ },
4781
+ {
4782
+ "description": "County name (e.g. \"Broward\") or 5-digit FIPS code. Names resolve to FIPS server-side; include a `state` filter to disambiguate."
4783
+ }
4784
+ ]
4785
+ },
4786
+ "currentBalance": {
4787
+ "allOf": [
4788
+ {
4789
+ "$ref": "#/components/schemas/NumericFilterValue"
4790
+ },
4791
+ {
4792
+ "description": "Estimated remaining principal balance (~19% populated). Approximate current equity as `homeValue` (AVM) minus this."
4793
+ }
4794
+ ]
4795
+ },
4796
+ "employer": {
4797
+ "allOf": [
4798
+ {
4799
+ "$ref": "#/components/schemas/TextFilterValue"
4800
+ },
4801
+ {
4802
+ "description": "Employer/company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
4803
+ }
4804
+ ]
4805
+ },
4806
+ "equity": {
4807
+ "allOf": [
4808
+ {
4809
+ "$ref": "#/components/schemas/NumericFilterValue"
4810
+ },
4811
+ {
4812
+ "description": "Point-in-time equity recorded on the loan (sparse, ~10%). NOT a live current-equity figure. For HELOC/cash-out targeting on up-to-date equity, use properties search (listProperties) instead — its equity is far better populated and current."
4813
+ }
4814
+ ]
4815
+ },
4816
+ "excludeBroker": {
4817
+ "allOf": [
4818
+ {
4819
+ "$ref": "#/components/schemas/TextFilterValue"
4820
+ },
4821
+ {
4822
+ "description": "Exclude loans brokered by this broker-shop NMLS id (digits only) — the inverse of `broker`."
4823
+ }
4824
+ ]
4825
+ },
4826
+ "excludeCity": {
4827
+ "allOf": [
4828
+ {
4829
+ "$ref": "#/components/schemas/TextFilterValue"
4830
+ },
4831
+ {
4832
+ "description": "Exclude loans in this city — the inverse of `city`."
4833
+ }
4834
+ ]
4835
+ },
4836
+ "excludeLender": {
4837
+ "allOf": [
4838
+ {
4839
+ "$ref": "#/components/schemas/TextFilterValue"
4840
+ },
4841
+ {
4842
+ "description": "Exclude loans from this lender ID (\"everyone but X\") — the inverse of `lender`, same id contract (resolve via instantSearch/listLenders). Loans with no lender stay in the results."
4843
+ }
4844
+ ]
4845
+ },
4846
+ "excludeLoanCompany": {
4847
+ "allOf": [
4848
+ {
4849
+ "$ref": "#/components/schemas/TextFilterValue"
4850
+ },
4851
+ {
4852
+ "description": "Exclude loans funded by this company NMLS id (digits only) — the inverse of `loanCompany`."
4853
+ }
4854
+ ]
4855
+ },
4856
+ "excludeOriginator": {
4857
+ "allOf": [
4858
+ {
4859
+ "$ref": "#/components/schemas/TextFilterValue"
4860
+ },
4861
+ {
4862
+ "description": "Exclude loans with this originator NMLS id (digits only) — the inverse of `originator`. Common for 'everyone but my own shop' lists."
4863
+ }
4864
+ ]
4865
+ },
4866
+ "excludeState": {
4867
+ "allOf": [
4868
+ {
4869
+ "$ref": "#/components/schemas/TextFilterValue"
4870
+ },
4871
+ {
4872
+ "description": "Exclude loans in this state (2-letter code, e.g. \"CA\") — the inverse of `state`. For \"everywhere but this state\" lists."
4873
+ }
4874
+ ]
4875
+ },
4876
+ "excludeZipCode": {
4877
+ "allOf": [
4878
+ {
4879
+ "$ref": "#/components/schemas/TextFilterValue"
4880
+ },
4881
+ {
4882
+ "description": "Exclude loans in this ZIP code — the inverse of `zipCode`."
4883
+ }
4884
+ ]
4885
+ },
4886
+ "fips": {
4887
+ "allOf": [
4888
+ {
4889
+ "$ref": "#/components/schemas/TextFilterValue"
4890
+ },
4891
+ {
4892
+ "description": "Exact 5-digit county FIPS code (no name resolution) — the code-only escape hatch alongside `county`."
4893
+ }
4894
+ ]
4895
+ },
4896
+ "geoPoint": {
4897
+ "$ref": "#/components/schemas/GeoFilterValue"
4898
+ },
4899
+ "homeValue": {
4900
+ "allOf": [
4901
+ {
4902
+ "$ref": "#/components/schemas/NumericFilterValue"
4903
+ },
4904
+ {
4905
+ "description": "AVM (automated valuation) at the linked property (~26%, MLS-linked). Pair with `currentBalance` to approximate current equity."
4906
+ }
4907
+ ]
4908
+ },
4909
+ "includeUnknownOriginator": {
4910
+ "allOf": [
4911
+ {
4912
+ "$ref": "#/components/schemas/BooleanFilterValue"
4913
+ },
4914
+ {
4915
+ "description": "Include loans that have no originator NMLS id. Omitted/false (default): such loans are excluded — the vast majority are pre-2016 public records with no linkable originator. true: include them. Note that the default scopes results to loans with a known originator (~2016+ recordings)."
4916
+ }
4917
+ ]
4918
+ },
4919
+ "interestRate": {
4920
+ "$ref": "#/components/schemas/NumericFilterValue"
4921
+ },
4922
+ "lender": {
4923
+ "allOf": [
4924
+ {
4925
+ "$ref": "#/components/schemas/TextFilterValue"
4926
+ },
4927
+ {
4928
+ "description": "Lender ID — the normalized lender-dictionary key, NOT a fuzzy name match. Resolve a lender via instantSearch (or listLenders) and pass the `id` it returns (e.g. \"mortgage_rocket\" or \"mortgage rocket\"). Underscores and letter case are normalized, so either id surface works. A stored normalized lender name (what the `slice: \"lender\"` chart buckets emit) is also accepted, so a chart bucket key filters directly. A value that is neither returns 400 rather than silently matching nothing — to search by lender NAME, use `lenderName`."
4929
+ }
4930
+ ]
4931
+ },
4932
+ "lenderName": {
4933
+ "allOf": [
4934
+ {
4935
+ "$ref": "#/components/schemas/TextFilterValue"
4936
+ },
4937
+ {
4938
+ "description": "Lender name as recorded on the loan document — fuzzy, all-terms match (e.g. \"Fifth Third\"). The name counterpart to the exact-id `lender` filter; use `lender` when you have a resolved id, and this when you only have a name."
4939
+ }
4940
+ ]
4941
+ },
4942
+ "loanCompany": {
4943
+ "allOf": [
4944
+ {
4945
+ "$ref": "#/components/schemas/TextFilterValue"
4946
+ },
4947
+ {
4948
+ "description": "Funding/loan company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
4949
+ }
4950
+ ]
4951
+ },
4952
+ "loanType": {
4953
+ "$ref": "#/components/schemas/LoanTypeFilterValue"
4954
+ },
4955
+ "ltvAtOrigination": {
4956
+ "allOf": [
4957
+ {
4958
+ "$ref": "#/components/schemas/NumericFilterValue"
4959
+ },
4960
+ {
4961
+ "description": "Loan-to-value at ORIGINATION (sparse), as a PERCENT on a 0-100 scale (`80` = 80% LTV; values above 100 are real underwater loans). This is not a current LTV — there is no stored current-LTV field on loans."
4962
+ }
4963
+ ]
4964
+ },
4965
+ "mode": {
4966
+ "enum": [
4967
+ "and",
4968
+ "or"
4969
+ ],
4970
+ "type": "string"
4971
+ },
4972
+ "mortgageAmount": {
4973
+ "$ref": "#/components/schemas/NumericFilterValue"
4974
+ },
4975
+ "mortgageDate": {
4976
+ "$ref": "#/components/schemas/DateFilterValue"
4977
+ },
4978
+ "originator": {
4979
+ "allOf": [
4980
+ {
4981
+ "$ref": "#/components/schemas/TextFilterValue"
4982
+ },
4983
+ {
4984
+ "description": "Loan originator NMLS id (digits only). To search by name use `originatorName`, or resolve a name to its id via instantSearch."
4985
+ }
4986
+ ]
4987
+ },
4988
+ "originatorName": {
4989
+ "allOf": [
4990
+ {
4991
+ "$ref": "#/components/schemas/TextFilterValue"
4992
+ },
4993
+ {
4994
+ "deprecated": true,
4995
+ "description": "DEPRECATED — fuzzy name matching is unreliable (same originator can return wildly different counts by name string). Resolve the loan officer via instantSearch and filter by `originator` (exact NMLS id) instead. Still functional for now."
4996
+ }
4997
+ ]
4998
+ },
4999
+ "propertyId": {
5000
+ "allOf": [
5001
+ {
5002
+ "$ref": "#/components/schemas/TextFilterValue"
5003
+ },
5004
+ {
5005
+ "description": "Parcel id — returns every loan recorded against one property. Pass the same string this endpoint returns as `mmPropertyId` on a loan row, or the `mmPropertyId` of a property record.\n\nThis is the parcel's FULL recorded loan history, which is deliberately wider than the loans embedded on a property record: that embed is a snapshot of what is still owed (up to five currently-active loans), so paid-off mortgages are absent from it and present here.\n\nMulti-unit caveat: loans carry a unit-blind parcel id, so for one unit of a multi-unit building this selects every unit in the building, not that unit alone."
5006
+ }
5007
+ ]
5008
+ },
5009
+ "saleDate": {
5010
+ "$ref": "#/components/schemas/DateFilterValue"
5011
+ },
5012
+ "salePrice": {
5013
+ "$ref": "#/components/schemas/NumericFilterValue"
5014
+ },
5015
+ "state": {
5016
+ "$ref": "#/components/schemas/TextFilterValue"
5017
+ },
5018
+ "transactionType": {
5019
+ "$ref": "#/components/schemas/LoanTransactionTypeFilterValue"
5020
+ },
5021
+ "zip": {
5022
+ "allOf": [
5023
+ {
5024
+ "$ref": "#/components/schemas/TextFilterValue"
5025
+ },
5026
+ {
5027
+ "description": "Alias of `zipCode` — same ZIP filter, accepted for cross-entity key parity."
5028
+ }
5029
+ ]
5030
+ },
5031
+ "zipCode": {
5032
+ "$ref": "#/components/schemas/TextFilterValue"
5033
+ }
5034
+ },
5035
+ "type": "object"
5036
+ },
5037
+ "period": {
5038
+ "$ref": "#/components/schemas/DatedPeriod"
5039
+ }
5040
+ },
5041
+ "type": "object"
5042
+ },
5043
+ "AgentLoanMixResponse": {
5044
+ "description": "`buyer` + `listing` = `any` (dual deals are counted on `buyer`).",
5045
+ "properties": {
5046
+ "any": {
5047
+ "$ref": "#/components/schemas/AgentLoanMixSide"
5048
+ },
5049
+ "buyer": {
5050
+ "$ref": "#/components/schemas/AgentLoanMixSide"
5051
+ },
5052
+ "listing": {
5053
+ "$ref": "#/components/schemas/AgentLoanMixSide"
5054
+ }
5055
+ },
5056
+ "required": [
5057
+ "any",
5058
+ "buyer",
5059
+ "listing"
5060
+ ],
5061
+ "type": "object"
5062
+ },
5063
+ "AgentLoanMixSide": {
5064
+ "properties": {
5065
+ "loanTypes": {
5066
+ "description": "Loan-type mix of `units`, most deals first. Deals with no recorded loan type are absent, so the rows can sum to less than `units`.",
5067
+ "items": {
5068
+ "$ref": "#/components/schemas/AgentLoanMixType"
5069
+ },
5070
+ "type": "array"
5071
+ },
5072
+ "tpoUnits": {
5073
+ "description": "Of `units`, deals originated through a mortgage broker (a broker NMLS id on the loan) — third-party origination. TPO share = `tpoUnits / units`.",
5074
+ "type": "number"
5075
+ },
5076
+ "tpoVolume": {
5077
+ "description": "Loan amount of the TPO deals.",
5078
+ "type": "number"
5079
+ },
5080
+ "units": {
5081
+ "description": "Financed deals (recorded loans) on this side in the window.",
5082
+ "type": "number"
5083
+ },
5084
+ "volume": {
5085
+ "description": "Total loan amount of those deals (out-of-range fill amounts excluded).",
5086
+ "type": "number"
5087
+ }
5088
+ },
5089
+ "required": [
5090
+ "units",
5091
+ "volume",
5092
+ "tpoUnits",
5093
+ "tpoVolume",
5094
+ "loanTypes"
5095
+ ],
5096
+ "type": "object"
5097
+ },
5098
+ "AgentLoanMixType": {
5099
+ "properties": {
5100
+ "label": {
5101
+ "description": "Loan type (e.g. `conventional`, `fha`, `va`)",
5102
+ "type": "string"
5103
+ },
5104
+ "units": {
5105
+ "type": "number"
5106
+ },
5107
+ "volume": {
5108
+ "type": "number"
5109
+ }
5110
+ },
5111
+ "required": [
5112
+ "label",
5113
+ "units",
5114
+ "volume"
5115
+ ],
5116
+ "type": "object"
5117
+ },
5118
+ "AgentLoansBreakdownRequest": {
5119
+ "additionalProperties": false,
5120
+ "properties": {
5121
+ "advancedFilters": {
5122
+ "$ref": "#/components/schemas/FilterNode"
5123
+ },
5124
+ "filters": {
5125
+ "$ref": "#/components/schemas/FilterNode"
5126
+ },
5127
+ "flatFilters": {
5128
+ "additionalProperties": false,
5129
+ "properties": {
5130
+ "borrowerStatus": {
5131
+ "$ref": "#/components/schemas/LoanBorrowerStatusFilterValue"
5132
+ },
5133
+ "broker": {
5134
+ "allOf": [
5135
+ {
5136
+ "$ref": "#/components/schemas/TextFilterValue"
5137
+ },
5138
+ {
5139
+ "description": "Broker shop NMLS id (digits only). A broker is a company — resolve a broker name to its NMLS id via instantSearch (or listCompanies)."
5140
+ }
5141
+ ]
5142
+ },
5143
+ "buyerEntityType": {
5144
+ "$ref": "#/components/schemas/BooleanFilterValue"
5145
+ },
5146
+ "city": {
5147
+ "$ref": "#/components/schemas/TextFilterValue"
5148
+ },
5149
+ "conforming": {
5150
+ "$ref": "#/components/schemas/BooleanFilterValue"
5151
+ },
5152
+ "county": {
5153
+ "allOf": [
5154
+ {
5155
+ "$ref": "#/components/schemas/TextFilterValue"
5156
+ },
5157
+ {
5158
+ "description": "County name (e.g. \"Broward\") or 5-digit FIPS code. Names resolve to FIPS server-side; include a `state` filter to disambiguate."
5159
+ }
5160
+ ]
5161
+ },
5162
+ "currentBalance": {
5163
+ "allOf": [
5164
+ {
5165
+ "$ref": "#/components/schemas/NumericFilterValue"
5166
+ },
5167
+ {
5168
+ "description": "Estimated remaining principal balance (~19% populated). Approximate current equity as `homeValue` (AVM) minus this."
5169
+ }
5170
+ ]
5171
+ },
5172
+ "employer": {
5173
+ "allOf": [
5174
+ {
5175
+ "$ref": "#/components/schemas/TextFilterValue"
5176
+ },
5177
+ {
5178
+ "description": "Employer/company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
5179
+ }
5180
+ ]
5181
+ },
5182
+ "equity": {
5183
+ "allOf": [
5184
+ {
5185
+ "$ref": "#/components/schemas/NumericFilterValue"
5186
+ },
5187
+ {
5188
+ "description": "Point-in-time equity recorded on the loan (sparse, ~10%). NOT a live current-equity figure. For HELOC/cash-out targeting on up-to-date equity, use properties search (listProperties) instead — its equity is far better populated and current."
5189
+ }
5190
+ ]
5191
+ },
5192
+ "excludeBroker": {
5193
+ "allOf": [
5194
+ {
5195
+ "$ref": "#/components/schemas/TextFilterValue"
5196
+ },
5197
+ {
5198
+ "description": "Exclude loans brokered by this broker-shop NMLS id (digits only) — the inverse of `broker`."
5199
+ }
5200
+ ]
5201
+ },
5202
+ "excludeCity": {
5203
+ "allOf": [
5204
+ {
5205
+ "$ref": "#/components/schemas/TextFilterValue"
5206
+ },
5207
+ {
5208
+ "description": "Exclude loans in this city — the inverse of `city`."
5209
+ }
5210
+ ]
5211
+ },
5212
+ "excludeLender": {
5213
+ "allOf": [
5214
+ {
5215
+ "$ref": "#/components/schemas/TextFilterValue"
5216
+ },
5217
+ {
5218
+ "description": "Exclude loans from this lender ID (\"everyone but X\") — the inverse of `lender`, same id contract (resolve via instantSearch/listLenders). Loans with no lender stay in the results."
5219
+ }
5220
+ ]
5221
+ },
5222
+ "excludeLoanCompany": {
5223
+ "allOf": [
5224
+ {
5225
+ "$ref": "#/components/schemas/TextFilterValue"
5226
+ },
5227
+ {
5228
+ "description": "Exclude loans funded by this company NMLS id (digits only) — the inverse of `loanCompany`."
5229
+ }
5230
+ ]
5231
+ },
5232
+ "excludeOriginator": {
5233
+ "allOf": [
5234
+ {
5235
+ "$ref": "#/components/schemas/TextFilterValue"
5236
+ },
5237
+ {
5238
+ "description": "Exclude loans with this originator NMLS id (digits only) — the inverse of `originator`. Common for 'everyone but my own shop' lists."
5239
+ }
5240
+ ]
5241
+ },
5242
+ "excludeState": {
5243
+ "allOf": [
5244
+ {
5245
+ "$ref": "#/components/schemas/TextFilterValue"
5246
+ },
5247
+ {
5248
+ "description": "Exclude loans in this state (2-letter code, e.g. \"CA\") — the inverse of `state`. For \"everywhere but this state\" lists."
5249
+ }
5250
+ ]
5251
+ },
5252
+ "excludeZipCode": {
5253
+ "allOf": [
5254
+ {
5255
+ "$ref": "#/components/schemas/TextFilterValue"
5256
+ },
5257
+ {
5258
+ "description": "Exclude loans in this ZIP code — the inverse of `zipCode`."
5259
+ }
5260
+ ]
5261
+ },
5262
+ "fips": {
5263
+ "allOf": [
5264
+ {
5265
+ "$ref": "#/components/schemas/TextFilterValue"
5266
+ },
5267
+ {
5268
+ "description": "Exact 5-digit county FIPS code (no name resolution) — the code-only escape hatch alongside `county`."
5269
+ }
5270
+ ]
5271
+ },
5272
+ "geoPoint": {
5273
+ "$ref": "#/components/schemas/GeoFilterValue"
5274
+ },
5275
+ "homeValue": {
5276
+ "allOf": [
5277
+ {
5278
+ "$ref": "#/components/schemas/NumericFilterValue"
5279
+ },
5280
+ {
5281
+ "description": "AVM (automated valuation) at the linked property (~26%, MLS-linked). Pair with `currentBalance` to approximate current equity."
5282
+ }
5283
+ ]
5284
+ },
5285
+ "includeUnknownOriginator": {
5286
+ "allOf": [
5287
+ {
5288
+ "$ref": "#/components/schemas/BooleanFilterValue"
5289
+ },
5290
+ {
5291
+ "description": "Include loans that have no originator NMLS id. Omitted/false (default): such loans are excluded — the vast majority are pre-2016 public records with no linkable originator. true: include them. Note that the default scopes results to loans with a known originator (~2016+ recordings)."
5292
+ }
5293
+ ]
5294
+ },
5295
+ "interestRate": {
5296
+ "$ref": "#/components/schemas/NumericFilterValue"
5297
+ },
5298
+ "lender": {
5299
+ "allOf": [
5300
+ {
5301
+ "$ref": "#/components/schemas/TextFilterValue"
5302
+ },
5303
+ {
5304
+ "description": "Lender ID — the normalized lender-dictionary key, NOT a fuzzy name match. Resolve a lender via instantSearch (or listLenders) and pass the `id` it returns (e.g. \"mortgage_rocket\" or \"mortgage rocket\"). Underscores and letter case are normalized, so either id surface works. A stored normalized lender name (what the `slice: \"lender\"` chart buckets emit) is also accepted, so a chart bucket key filters directly. A value that is neither returns 400 rather than silently matching nothing — to search by lender NAME, use `lenderName`."
5305
+ }
5306
+ ]
5307
+ },
5308
+ "lenderName": {
5309
+ "allOf": [
5310
+ {
5311
+ "$ref": "#/components/schemas/TextFilterValue"
5312
+ },
5313
+ {
5314
+ "description": "Lender name as recorded on the loan document — fuzzy, all-terms match (e.g. \"Fifth Third\"). The name counterpart to the exact-id `lender` filter; use `lender` when you have a resolved id, and this when you only have a name."
5315
+ }
5316
+ ]
5317
+ },
5318
+ "loanCompany": {
5319
+ "allOf": [
5320
+ {
5321
+ "$ref": "#/components/schemas/TextFilterValue"
5322
+ },
5323
+ {
5324
+ "description": "Funding/loan company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
5325
+ }
5326
+ ]
5327
+ },
5328
+ "loanType": {
5329
+ "$ref": "#/components/schemas/LoanTypeFilterValue"
5330
+ },
5331
+ "ltvAtOrigination": {
5332
+ "allOf": [
5333
+ {
5334
+ "$ref": "#/components/schemas/NumericFilterValue"
5335
+ },
5336
+ {
5337
+ "description": "Loan-to-value at ORIGINATION (sparse), as a PERCENT on a 0-100 scale (`80` = 80% LTV; values above 100 are real underwater loans). This is not a current LTV — there is no stored current-LTV field on loans."
5338
+ }
5339
+ ]
5340
+ },
5341
+ "mode": {
5342
+ "enum": [
5343
+ "and",
5344
+ "or"
5345
+ ],
5346
+ "type": "string"
5347
+ },
5348
+ "mortgageAmount": {
5349
+ "$ref": "#/components/schemas/NumericFilterValue"
5350
+ },
5351
+ "mortgageDate": {
5352
+ "$ref": "#/components/schemas/DateFilterValue"
5353
+ },
5354
+ "originator": {
5355
+ "allOf": [
5356
+ {
5357
+ "$ref": "#/components/schemas/TextFilterValue"
5358
+ },
5359
+ {
5360
+ "description": "Loan originator NMLS id (digits only). To search by name use `originatorName`, or resolve a name to its id via instantSearch."
5361
+ }
5362
+ ]
5363
+ },
5364
+ "originatorName": {
5365
+ "allOf": [
5366
+ {
5367
+ "$ref": "#/components/schemas/TextFilterValue"
5368
+ },
5369
+ {
5370
+ "deprecated": true,
5371
+ "description": "DEPRECATED — fuzzy name matching is unreliable (same originator can return wildly different counts by name string). Resolve the loan officer via instantSearch and filter by `originator` (exact NMLS id) instead. Still functional for now."
5372
+ }
5373
+ ]
5374
+ },
5375
+ "propertyId": {
5376
+ "allOf": [
5377
+ {
5378
+ "$ref": "#/components/schemas/TextFilterValue"
5379
+ },
5380
+ {
5381
+ "description": "Parcel id — returns every loan recorded against one property. Pass the same string this endpoint returns as `mmPropertyId` on a loan row, or the `mmPropertyId` of a property record.\n\nThis is the parcel's FULL recorded loan history, which is deliberately wider than the loans embedded on a property record: that embed is a snapshot of what is still owed (up to five currently-active loans), so paid-off mortgages are absent from it and present here.\n\nMulti-unit caveat: loans carry a unit-blind parcel id, so for one unit of a multi-unit building this selects every unit in the building, not that unit alone."
5382
+ }
5383
+ ]
5384
+ },
5385
+ "saleDate": {
5386
+ "$ref": "#/components/schemas/DateFilterValue"
5387
+ },
5388
+ "salePrice": {
5389
+ "$ref": "#/components/schemas/NumericFilterValue"
5390
+ },
5391
+ "state": {
5392
+ "$ref": "#/components/schemas/TextFilterValue"
5393
+ },
5394
+ "transactionType": {
5395
+ "$ref": "#/components/schemas/LoanTransactionTypeFilterValue"
5396
+ },
5397
+ "zip": {
5398
+ "allOf": [
5399
+ {
5400
+ "$ref": "#/components/schemas/TextFilterValue"
5401
+ },
5402
+ {
5403
+ "description": "Alias of `zipCode` — same ZIP filter, accepted for cross-entity key parity."
5404
+ }
5405
+ ]
5406
+ },
5407
+ "zipCode": {
5408
+ "$ref": "#/components/schemas/TextFilterValue"
5409
+ }
5410
+ },
5411
+ "type": "object"
5412
+ },
5413
+ "pagination": {
5414
+ "$ref": "#/components/schemas/Pagination"
5415
+ },
5416
+ "period": {
5417
+ "$ref": "#/components/schemas/DatedPeriod"
5418
+ },
5419
+ "side": {
5420
+ "$ref": "#/components/schemas/AgentSide"
5421
+ },
5422
+ "sort": {
5423
+ "$ref": "#/components/schemas/BreakdownSort"
5424
+ }
5425
+ },
5426
+ "type": "object"
5427
+ },
4737
5428
  "AgentMarket": {
4738
5429
  "properties": {
4739
5430
  "avgSalePrice": {
@@ -5216,6 +5907,9 @@
5216
5907
  "period": {
5217
5908
  "$ref": "#/components/schemas/Period"
5218
5909
  },
5910
+ "side": {
5911
+ "$ref": "#/components/schemas/AgentSide"
5912
+ },
5219
5913
  "sort": {
5220
5914
  "items": {
5221
5915
  "properties": {
@@ -5257,10 +5951,96 @@
5257
5951
  "nullable": true,
5258
5952
  "type": "string"
5259
5953
  },
5954
+ "loan": {
5955
+ "description": "The purchase loan recorded against this sale (matched on the sale id), or `null` when none is recorded — a cash deal, or a loan not yet on file.",
5956
+ "nullable": true,
5957
+ "properties": {
5958
+ "amount": {
5959
+ "nullable": true,
5960
+ "type": "number"
5961
+ },
5962
+ "brokerNmlsId": {
5963
+ "description": "Mortgage broker NMLS id when the loan was third-party originated",
5964
+ "nullable": true,
5965
+ "type": "string"
5966
+ },
5967
+ "companyName": {
5968
+ "description": "Mortgage company the loan was written under",
5969
+ "nullable": true,
5970
+ "type": "string"
5971
+ },
5972
+ "companyNmlsId": {
5973
+ "nullable": true,
5974
+ "type": "string"
5975
+ },
5976
+ "id": {
5977
+ "description": "Loan id (`GET /v1/loans/{id}`)",
5978
+ "type": "string"
5979
+ },
5980
+ "lenderId": {
5981
+ "description": "Normalized lender key — the value the `lender` filter accepts",
5982
+ "nullable": true,
5983
+ "type": "string"
5984
+ },
5985
+ "lenderName": {
5986
+ "description": "Lender as written on the loan document",
5987
+ "nullable": true,
5988
+ "type": "string"
5989
+ },
5990
+ "loanType": {
5991
+ "description": "e.g. `conventional`, `fha`, `va`",
5992
+ "nullable": true,
5993
+ "type": "string"
5994
+ },
5995
+ "originatorName": {
5996
+ "nullable": true,
5997
+ "type": "string"
5998
+ },
5999
+ "originatorNmlsId": {
6000
+ "nullable": true,
6001
+ "type": "string"
6002
+ },
6003
+ "titleCompany": {
6004
+ "nullable": true,
6005
+ "type": "string"
6006
+ },
6007
+ "transactionType": {
6008
+ "description": "e.g. `purchase`, `refinance`",
6009
+ "nullable": true,
6010
+ "type": "string"
6011
+ }
6012
+ },
6013
+ "required": [
6014
+ "id",
6015
+ "amount",
6016
+ "loanType",
6017
+ "transactionType",
6018
+ "lenderName",
6019
+ "lenderId",
6020
+ "originatorName",
6021
+ "originatorNmlsId",
6022
+ "companyName",
6023
+ "companyNmlsId",
6024
+ "brokerNmlsId",
6025
+ "titleCompany"
6026
+ ],
6027
+ "type": "object"
6028
+ },
5260
6029
  "price": {
5261
6030
  "nullable": true,
5262
6031
  "type": "number"
5263
6032
  },
6033
+ "side": {
6034
+ "description": "Which side of this deal the agent was on: `buyer`, `listing`, or `dual` (both). `null` when the sale names the agent under an id this API cannot place on a side.",
6035
+ "enum": [
6036
+ "buyer",
6037
+ "listing",
6038
+ "dual",
6039
+ null
6040
+ ],
6041
+ "nullable": true,
6042
+ "type": "string"
6043
+ },
5264
6044
  "soldAgentName": {
5265
6045
  "nullable": true,
5266
6046
  "type": "string"
@@ -5305,6 +6085,29 @@
5305
6085
  ],
5306
6086
  "type": "object"
5307
6087
  },
6088
+ "AgentScoredBreakdownRequest": {
6089
+ "properties": {
6090
+ "period": {
6091
+ "$ref": "#/components/schemas/Period"
6092
+ },
6093
+ "side": {
6094
+ "$ref": "#/components/schemas/AgentSide"
6095
+ },
6096
+ "sort": {
6097
+ "$ref": "#/components/schemas/BreakdownSort"
6098
+ }
6099
+ },
6100
+ "type": "object"
6101
+ },
6102
+ "AgentSide": {
6103
+ "description": "Which side of the deal the agent was on. `buyer`: the agent represented the buyer — deals where the agent was on BOTH sides (dual) count here. `listing`: the agent represented the seller only (duals are already in `buyer`). `any` (default): either side, each deal once. `buyer` + `listing` = `any`.",
6104
+ "enum": [
6105
+ "any",
6106
+ "buyer",
6107
+ "listing"
6108
+ ],
6109
+ "type": "string"
6110
+ },
5308
6111
  "AgentSummary": {
5309
6112
  "properties": {
5310
6113
  "avgSoldPrice": {
@@ -5448,6 +6251,316 @@
5448
6251
  },
5449
6252
  "type": "object"
5450
6253
  },
6254
+ "AgentTitleCompanyTimeSeriesRequest": {
6255
+ "additionalProperties": false,
6256
+ "properties": {
6257
+ "advancedFilters": {
6258
+ "$ref": "#/components/schemas/FilterNode"
6259
+ },
6260
+ "filters": {
6261
+ "$ref": "#/components/schemas/FilterNode"
6262
+ },
6263
+ "flatFilters": {
6264
+ "additionalProperties": false,
6265
+ "properties": {
6266
+ "borrowerStatus": {
6267
+ "$ref": "#/components/schemas/LoanBorrowerStatusFilterValue"
6268
+ },
6269
+ "broker": {
6270
+ "allOf": [
6271
+ {
6272
+ "$ref": "#/components/schemas/TextFilterValue"
6273
+ },
6274
+ {
6275
+ "description": "Broker shop NMLS id (digits only). A broker is a company — resolve a broker name to its NMLS id via instantSearch (or listCompanies)."
6276
+ }
6277
+ ]
6278
+ },
6279
+ "buyerEntityType": {
6280
+ "$ref": "#/components/schemas/BooleanFilterValue"
6281
+ },
6282
+ "city": {
6283
+ "$ref": "#/components/schemas/TextFilterValue"
6284
+ },
6285
+ "conforming": {
6286
+ "$ref": "#/components/schemas/BooleanFilterValue"
6287
+ },
6288
+ "county": {
6289
+ "allOf": [
6290
+ {
6291
+ "$ref": "#/components/schemas/TextFilterValue"
6292
+ },
6293
+ {
6294
+ "description": "County name (e.g. \"Broward\") or 5-digit FIPS code. Names resolve to FIPS server-side; include a `state` filter to disambiguate."
6295
+ }
6296
+ ]
6297
+ },
6298
+ "currentBalance": {
6299
+ "allOf": [
6300
+ {
6301
+ "$ref": "#/components/schemas/NumericFilterValue"
6302
+ },
6303
+ {
6304
+ "description": "Estimated remaining principal balance (~19% populated). Approximate current equity as `homeValue` (AVM) minus this."
6305
+ }
6306
+ ]
6307
+ },
6308
+ "employer": {
6309
+ "allOf": [
6310
+ {
6311
+ "$ref": "#/components/schemas/TextFilterValue"
6312
+ },
6313
+ {
6314
+ "description": "Employer/company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
6315
+ }
6316
+ ]
6317
+ },
6318
+ "equity": {
6319
+ "allOf": [
6320
+ {
6321
+ "$ref": "#/components/schemas/NumericFilterValue"
6322
+ },
6323
+ {
6324
+ "description": "Point-in-time equity recorded on the loan (sparse, ~10%). NOT a live current-equity figure. For HELOC/cash-out targeting on up-to-date equity, use properties search (listProperties) instead — its equity is far better populated and current."
6325
+ }
6326
+ ]
6327
+ },
6328
+ "excludeBroker": {
6329
+ "allOf": [
6330
+ {
6331
+ "$ref": "#/components/schemas/TextFilterValue"
6332
+ },
6333
+ {
6334
+ "description": "Exclude loans brokered by this broker-shop NMLS id (digits only) — the inverse of `broker`."
6335
+ }
6336
+ ]
6337
+ },
6338
+ "excludeCity": {
6339
+ "allOf": [
6340
+ {
6341
+ "$ref": "#/components/schemas/TextFilterValue"
6342
+ },
6343
+ {
6344
+ "description": "Exclude loans in this city — the inverse of `city`."
6345
+ }
6346
+ ]
6347
+ },
6348
+ "excludeLender": {
6349
+ "allOf": [
6350
+ {
6351
+ "$ref": "#/components/schemas/TextFilterValue"
6352
+ },
6353
+ {
6354
+ "description": "Exclude loans from this lender ID (\"everyone but X\") — the inverse of `lender`, same id contract (resolve via instantSearch/listLenders). Loans with no lender stay in the results."
6355
+ }
6356
+ ]
6357
+ },
6358
+ "excludeLoanCompany": {
6359
+ "allOf": [
6360
+ {
6361
+ "$ref": "#/components/schemas/TextFilterValue"
6362
+ },
6363
+ {
6364
+ "description": "Exclude loans funded by this company NMLS id (digits only) — the inverse of `loanCompany`."
6365
+ }
6366
+ ]
6367
+ },
6368
+ "excludeOriginator": {
6369
+ "allOf": [
6370
+ {
6371
+ "$ref": "#/components/schemas/TextFilterValue"
6372
+ },
6373
+ {
6374
+ "description": "Exclude loans with this originator NMLS id (digits only) — the inverse of `originator`. Common for 'everyone but my own shop' lists."
6375
+ }
6376
+ ]
6377
+ },
6378
+ "excludeState": {
6379
+ "allOf": [
6380
+ {
6381
+ "$ref": "#/components/schemas/TextFilterValue"
6382
+ },
6383
+ {
6384
+ "description": "Exclude loans in this state (2-letter code, e.g. \"CA\") — the inverse of `state`. For \"everywhere but this state\" lists."
6385
+ }
6386
+ ]
6387
+ },
6388
+ "excludeZipCode": {
6389
+ "allOf": [
6390
+ {
6391
+ "$ref": "#/components/schemas/TextFilterValue"
6392
+ },
6393
+ {
6394
+ "description": "Exclude loans in this ZIP code — the inverse of `zipCode`."
6395
+ }
6396
+ ]
6397
+ },
6398
+ "fips": {
6399
+ "allOf": [
6400
+ {
6401
+ "$ref": "#/components/schemas/TextFilterValue"
6402
+ },
6403
+ {
6404
+ "description": "Exact 5-digit county FIPS code (no name resolution) — the code-only escape hatch alongside `county`."
6405
+ }
6406
+ ]
6407
+ },
6408
+ "geoPoint": {
6409
+ "$ref": "#/components/schemas/GeoFilterValue"
6410
+ },
6411
+ "homeValue": {
6412
+ "allOf": [
6413
+ {
6414
+ "$ref": "#/components/schemas/NumericFilterValue"
6415
+ },
6416
+ {
6417
+ "description": "AVM (automated valuation) at the linked property (~26%, MLS-linked). Pair with `currentBalance` to approximate current equity."
6418
+ }
6419
+ ]
6420
+ },
6421
+ "includeUnknownOriginator": {
6422
+ "allOf": [
6423
+ {
6424
+ "$ref": "#/components/schemas/BooleanFilterValue"
6425
+ },
6426
+ {
6427
+ "description": "Include loans that have no originator NMLS id. Omitted/false (default): such loans are excluded — the vast majority are pre-2016 public records with no linkable originator. true: include them. Note that the default scopes results to loans with a known originator (~2016+ recordings)."
6428
+ }
6429
+ ]
6430
+ },
6431
+ "interestRate": {
6432
+ "$ref": "#/components/schemas/NumericFilterValue"
6433
+ },
6434
+ "lender": {
6435
+ "allOf": [
6436
+ {
6437
+ "$ref": "#/components/schemas/TextFilterValue"
6438
+ },
6439
+ {
6440
+ "description": "Lender ID — the normalized lender-dictionary key, NOT a fuzzy name match. Resolve a lender via instantSearch (or listLenders) and pass the `id` it returns (e.g. \"mortgage_rocket\" or \"mortgage rocket\"). Underscores and letter case are normalized, so either id surface works. A stored normalized lender name (what the `slice: \"lender\"` chart buckets emit) is also accepted, so a chart bucket key filters directly. A value that is neither returns 400 rather than silently matching nothing — to search by lender NAME, use `lenderName`."
6441
+ }
6442
+ ]
6443
+ },
6444
+ "lenderName": {
6445
+ "allOf": [
6446
+ {
6447
+ "$ref": "#/components/schemas/TextFilterValue"
6448
+ },
6449
+ {
6450
+ "description": "Lender name as recorded on the loan document — fuzzy, all-terms match (e.g. \"Fifth Third\"). The name counterpart to the exact-id `lender` filter; use `lender` when you have a resolved id, and this when you only have a name."
6451
+ }
6452
+ ]
6453
+ },
6454
+ "loanCompany": {
6455
+ "allOf": [
6456
+ {
6457
+ "$ref": "#/components/schemas/TextFilterValue"
6458
+ },
6459
+ {
6460
+ "description": "Funding/loan company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
6461
+ }
6462
+ ]
6463
+ },
6464
+ "loanType": {
6465
+ "$ref": "#/components/schemas/LoanTypeFilterValue"
6466
+ },
6467
+ "ltvAtOrigination": {
6468
+ "allOf": [
6469
+ {
6470
+ "$ref": "#/components/schemas/NumericFilterValue"
6471
+ },
6472
+ {
6473
+ "description": "Loan-to-value at ORIGINATION (sparse), as a PERCENT on a 0-100 scale (`80` = 80% LTV; values above 100 are real underwater loans). This is not a current LTV — there is no stored current-LTV field on loans."
6474
+ }
6475
+ ]
6476
+ },
6477
+ "mode": {
6478
+ "enum": [
6479
+ "and",
6480
+ "or"
6481
+ ],
6482
+ "type": "string"
6483
+ },
6484
+ "mortgageAmount": {
6485
+ "$ref": "#/components/schemas/NumericFilterValue"
6486
+ },
6487
+ "mortgageDate": {
6488
+ "$ref": "#/components/schemas/DateFilterValue"
6489
+ },
6490
+ "originator": {
6491
+ "allOf": [
6492
+ {
6493
+ "$ref": "#/components/schemas/TextFilterValue"
6494
+ },
6495
+ {
6496
+ "description": "Loan originator NMLS id (digits only). To search by name use `originatorName`, or resolve a name to its id via instantSearch."
6497
+ }
6498
+ ]
6499
+ },
6500
+ "originatorName": {
6501
+ "allOf": [
6502
+ {
6503
+ "$ref": "#/components/schemas/TextFilterValue"
6504
+ },
6505
+ {
6506
+ "deprecated": true,
6507
+ "description": "DEPRECATED — fuzzy name matching is unreliable (same originator can return wildly different counts by name string). Resolve the loan officer via instantSearch and filter by `originator` (exact NMLS id) instead. Still functional for now."
6508
+ }
6509
+ ]
6510
+ },
6511
+ "propertyId": {
6512
+ "allOf": [
6513
+ {
6514
+ "$ref": "#/components/schemas/TextFilterValue"
6515
+ },
6516
+ {
6517
+ "description": "Parcel id — returns every loan recorded against one property. Pass the same string this endpoint returns as `mmPropertyId` on a loan row, or the `mmPropertyId` of a property record.\n\nThis is the parcel's FULL recorded loan history, which is deliberately wider than the loans embedded on a property record: that embed is a snapshot of what is still owed (up to five currently-active loans), so paid-off mortgages are absent from it and present here.\n\nMulti-unit caveat: loans carry a unit-blind parcel id, so for one unit of a multi-unit building this selects every unit in the building, not that unit alone."
6518
+ }
6519
+ ]
6520
+ },
6521
+ "saleDate": {
6522
+ "$ref": "#/components/schemas/DateFilterValue"
6523
+ },
6524
+ "salePrice": {
6525
+ "$ref": "#/components/schemas/NumericFilterValue"
6526
+ },
6527
+ "state": {
6528
+ "$ref": "#/components/schemas/TextFilterValue"
6529
+ },
6530
+ "transactionType": {
6531
+ "$ref": "#/components/schemas/LoanTransactionTypeFilterValue"
6532
+ },
6533
+ "zip": {
6534
+ "allOf": [
6535
+ {
6536
+ "$ref": "#/components/schemas/TextFilterValue"
6537
+ },
6538
+ {
6539
+ "description": "Alias of `zipCode` — same ZIP filter, accepted for cross-entity key parity."
6540
+ }
6541
+ ]
6542
+ },
6543
+ "zipCode": {
6544
+ "$ref": "#/components/schemas/TextFilterValue"
6545
+ }
6546
+ },
6547
+ "type": "object"
6548
+ },
6549
+ "interval": {
6550
+ "$ref": "#/components/schemas/Interval"
6551
+ },
6552
+ "measure": {
6553
+ "$ref": "#/components/schemas/Measure"
6554
+ },
6555
+ "period": {
6556
+ "$ref": "#/components/schemas/DatedPeriod"
6557
+ },
6558
+ "side": {
6559
+ "$ref": "#/components/schemas/AgentSide"
6560
+ }
6561
+ },
6562
+ "type": "object"
6563
+ },
5451
6564
  "AlertConditions": {
5452
6565
  "properties": {
5453
6566
  "epoThresholdDays": {
@@ -11303,12 +12416,30 @@
11303
12416
  },
11304
12417
  "BreakdownItem": {
11305
12418
  "properties": {
12419
+ "company": {
12420
+ "description": "Agent `originators` only: the LO's employer per NMLS licensing as of the agent profile's last refresh — not necessarily the company on the loans, and it can trail a very recent move (`GET /v1/originators/{nmlsId}` is always current). Absent on every other breakdown; `null` leaves when no sponsorship was on file.",
12421
+ "properties": {
12422
+ "name": {
12423
+ "nullable": true,
12424
+ "type": "string"
12425
+ },
12426
+ "nmlsId": {
12427
+ "nullable": true,
12428
+ "type": "string"
12429
+ }
12430
+ },
12431
+ "required": [
12432
+ "name",
12433
+ "nmlsId"
12434
+ ],
12435
+ "type": "object"
12436
+ },
11306
12437
  "excluded": {
11307
12438
  "description": "How many of this bucket's documents the volume guard excluded — documents that carry the money field but whose value is an out-of-range fill. Compare against `units` to see what share of the bucket `volume` was actually computed over: a bucket can show many units and still sum a small fraction of them. Absent when the entity's money column is unguarded (the sales-backed agent breakdowns), where nothing can be excluded.",
11308
12439
  "type": "number"
11309
12440
  },
11310
12441
  "id": {
11311
- "description": "Machine value behind `label` for breakdowns whose bucket key is an id rather than a name (today: `lenders`, where `label` is the dictionary display name and `id` is the normalized lender key). Pass `id` — not `label` — back as a `lender` filter value. Absent on name-keyed breakdowns, where `label` is already the machine value.",
12442
+ "description": "Machine value behind `label` for breakdowns whose bucket key is an id rather than a name (`lenders`, where `label` is the dictionary display name and `id` is the normalized lender key — pass `id`, not `label`, back as a `lender` filter value; agent `originators`, where `id` is the LO's NMLS id; `originatorAgents`, where `id` is the agent id most often recorded under that name; `titleCompanies`, where `id` is the normalized name the spellings were merged under). Absent on name-keyed breakdowns, where `label` is already the machine value.",
11312
12443
  "type": "string"
11313
12444
  },
11314
12445
  "label": {
@@ -12713,78 +13844,388 @@
12713
13844
  "$ref": "#/components/schemas/Pagination"
12714
13845
  },
12715
13846
  "period": {
12716
- "$ref": "#/components/schemas/Period"
12717
- },
12718
- "sort": {
12719
- "items": {
12720
- "properties": {
12721
- "field": {
12722
- "enum": [
12723
- "city",
12724
- "state",
12725
- "zipCode",
12726
- "county",
12727
- "transactionType",
12728
- "loanType",
12729
- "conforming",
12730
- "mortgageAmount",
12731
- "mortgageDate",
12732
- "broker",
12733
- "loanCompany",
12734
- "lender",
12735
- "borrowerStatus",
12736
- "salePrice",
12737
- "saleDate",
12738
- "originator",
12739
- "originatorName",
12740
- "interestRate",
12741
- "equity",
12742
- "homeValue",
12743
- "ltvAtOrigination",
12744
- "currentBalance"
12745
- ],
12746
- "type": "string"
12747
- },
12748
- "order": {
12749
- "$ref": "#/components/schemas/SortOrder"
12750
- }
12751
- },
12752
- "required": [
12753
- "field"
12754
- ],
12755
- "type": "object"
12756
- },
12757
- "type": "array"
12758
- }
12759
- },
12760
- "type": "object"
12761
- },
12762
- "CompanyBranchesResponse": {
12763
- "properties": {
12764
- "cursor": {
12765
- "type": "string"
12766
- },
12767
- "data": {
12768
- "items": {
12769
- "$ref": "#/components/schemas/CompanyBranch"
12770
- },
12771
- "type": "array"
13847
+ "$ref": "#/components/schemas/Period"
13848
+ },
13849
+ "sort": {
13850
+ "items": {
13851
+ "properties": {
13852
+ "field": {
13853
+ "enum": [
13854
+ "city",
13855
+ "state",
13856
+ "zipCode",
13857
+ "county",
13858
+ "transactionType",
13859
+ "loanType",
13860
+ "conforming",
13861
+ "mortgageAmount",
13862
+ "mortgageDate",
13863
+ "broker",
13864
+ "loanCompany",
13865
+ "lender",
13866
+ "borrowerStatus",
13867
+ "salePrice",
13868
+ "saleDate",
13869
+ "originator",
13870
+ "originatorName",
13871
+ "interestRate",
13872
+ "equity",
13873
+ "homeValue",
13874
+ "ltvAtOrigination",
13875
+ "currentBalance"
13876
+ ],
13877
+ "type": "string"
13878
+ },
13879
+ "order": {
13880
+ "$ref": "#/components/schemas/SortOrder"
13881
+ }
13882
+ },
13883
+ "required": [
13884
+ "field"
13885
+ ],
13886
+ "type": "object"
13887
+ },
13888
+ "type": "array"
13889
+ }
13890
+ },
13891
+ "type": "object"
13892
+ },
13893
+ "CompanyBranchesResponse": {
13894
+ "properties": {
13895
+ "cursor": {
13896
+ "type": "string"
13897
+ },
13898
+ "data": {
13899
+ "items": {
13900
+ "$ref": "#/components/schemas/CompanyBranch"
13901
+ },
13902
+ "type": "array"
13903
+ },
13904
+ "locationNormalizations": {
13905
+ "description": "How each location filter value resolved. Present when a `city`/`state`/`zip` filter was supplied.",
13906
+ "items": {
13907
+ "$ref": "#/components/schemas/LocationNormalization"
13908
+ },
13909
+ "type": "array"
13910
+ },
13911
+ "total": {
13912
+ "type": "number"
13913
+ }
13914
+ },
13915
+ "required": [
13916
+ "data",
13917
+ "total"
13918
+ ],
13919
+ "type": "object"
13920
+ },
13921
+ "CompanyBreakdownRequest": {
13922
+ "additionalProperties": false,
13923
+ "properties": {
13924
+ "advancedFilters": {
13925
+ "$ref": "#/components/schemas/FilterNode"
13926
+ },
13927
+ "filters": {
13928
+ "$ref": "#/components/schemas/FilterNode"
13929
+ },
13930
+ "flatFilters": {
13931
+ "additionalProperties": false,
13932
+ "properties": {
13933
+ "borrowerStatus": {
13934
+ "$ref": "#/components/schemas/LoanBorrowerStatusFilterValue"
13935
+ },
13936
+ "broker": {
13937
+ "allOf": [
13938
+ {
13939
+ "$ref": "#/components/schemas/TextFilterValue"
13940
+ },
13941
+ {
13942
+ "description": "Broker shop NMLS id (digits only). A broker is a company — resolve a broker name to its NMLS id via instantSearch (or listCompanies)."
13943
+ }
13944
+ ]
13945
+ },
13946
+ "buyerEntityType": {
13947
+ "$ref": "#/components/schemas/BooleanFilterValue"
13948
+ },
13949
+ "city": {
13950
+ "$ref": "#/components/schemas/TextFilterValue"
13951
+ },
13952
+ "conforming": {
13953
+ "$ref": "#/components/schemas/BooleanFilterValue"
13954
+ },
13955
+ "county": {
13956
+ "allOf": [
13957
+ {
13958
+ "$ref": "#/components/schemas/TextFilterValue"
13959
+ },
13960
+ {
13961
+ "description": "County name (e.g. \"Broward\") or 5-digit FIPS code. Names resolve to FIPS server-side; include a `state` filter to disambiguate."
13962
+ }
13963
+ ]
13964
+ },
13965
+ "currentBalance": {
13966
+ "allOf": [
13967
+ {
13968
+ "$ref": "#/components/schemas/NumericFilterValue"
13969
+ },
13970
+ {
13971
+ "description": "Estimated remaining principal balance (~19% populated). Approximate current equity as `homeValue` (AVM) minus this."
13972
+ }
13973
+ ]
13974
+ },
13975
+ "employer": {
13976
+ "allOf": [
13977
+ {
13978
+ "$ref": "#/components/schemas/TextFilterValue"
13979
+ },
13980
+ {
13981
+ "description": "Employer/company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
13982
+ }
13983
+ ]
13984
+ },
13985
+ "equity": {
13986
+ "allOf": [
13987
+ {
13988
+ "$ref": "#/components/schemas/NumericFilterValue"
13989
+ },
13990
+ {
13991
+ "description": "Point-in-time equity recorded on the loan (sparse, ~10%). NOT a live current-equity figure. For HELOC/cash-out targeting on up-to-date equity, use properties search (listProperties) instead — its equity is far better populated and current."
13992
+ }
13993
+ ]
13994
+ },
13995
+ "excludeBroker": {
13996
+ "allOf": [
13997
+ {
13998
+ "$ref": "#/components/schemas/TextFilterValue"
13999
+ },
14000
+ {
14001
+ "description": "Exclude loans brokered by this broker-shop NMLS id (digits only) — the inverse of `broker`."
14002
+ }
14003
+ ]
14004
+ },
14005
+ "excludeCity": {
14006
+ "allOf": [
14007
+ {
14008
+ "$ref": "#/components/schemas/TextFilterValue"
14009
+ },
14010
+ {
14011
+ "description": "Exclude loans in this city — the inverse of `city`."
14012
+ }
14013
+ ]
14014
+ },
14015
+ "excludeLender": {
14016
+ "allOf": [
14017
+ {
14018
+ "$ref": "#/components/schemas/TextFilterValue"
14019
+ },
14020
+ {
14021
+ "description": "Exclude loans from this lender ID (\"everyone but X\") — the inverse of `lender`, same id contract (resolve via instantSearch/listLenders). Loans with no lender stay in the results."
14022
+ }
14023
+ ]
14024
+ },
14025
+ "excludeLoanCompany": {
14026
+ "allOf": [
14027
+ {
14028
+ "$ref": "#/components/schemas/TextFilterValue"
14029
+ },
14030
+ {
14031
+ "description": "Exclude loans funded by this company NMLS id (digits only) — the inverse of `loanCompany`."
14032
+ }
14033
+ ]
14034
+ },
14035
+ "excludeOriginator": {
14036
+ "allOf": [
14037
+ {
14038
+ "$ref": "#/components/schemas/TextFilterValue"
14039
+ },
14040
+ {
14041
+ "description": "Exclude loans with this originator NMLS id (digits only) — the inverse of `originator`. Common for 'everyone but my own shop' lists."
14042
+ }
14043
+ ]
14044
+ },
14045
+ "excludeState": {
14046
+ "allOf": [
14047
+ {
14048
+ "$ref": "#/components/schemas/TextFilterValue"
14049
+ },
14050
+ {
14051
+ "description": "Exclude loans in this state (2-letter code, e.g. \"CA\") — the inverse of `state`. For \"everywhere but this state\" lists."
14052
+ }
14053
+ ]
14054
+ },
14055
+ "excludeZipCode": {
14056
+ "allOf": [
14057
+ {
14058
+ "$ref": "#/components/schemas/TextFilterValue"
14059
+ },
14060
+ {
14061
+ "description": "Exclude loans in this ZIP code — the inverse of `zipCode`."
14062
+ }
14063
+ ]
14064
+ },
14065
+ "fips": {
14066
+ "allOf": [
14067
+ {
14068
+ "$ref": "#/components/schemas/TextFilterValue"
14069
+ },
14070
+ {
14071
+ "description": "Exact 5-digit county FIPS code (no name resolution) — the code-only escape hatch alongside `county`."
14072
+ }
14073
+ ]
14074
+ },
14075
+ "geoPoint": {
14076
+ "$ref": "#/components/schemas/GeoFilterValue"
14077
+ },
14078
+ "homeValue": {
14079
+ "allOf": [
14080
+ {
14081
+ "$ref": "#/components/schemas/NumericFilterValue"
14082
+ },
14083
+ {
14084
+ "description": "AVM (automated valuation) at the linked property (~26%, MLS-linked). Pair with `currentBalance` to approximate current equity."
14085
+ }
14086
+ ]
14087
+ },
14088
+ "includeUnknownOriginator": {
14089
+ "allOf": [
14090
+ {
14091
+ "$ref": "#/components/schemas/BooleanFilterValue"
14092
+ },
14093
+ {
14094
+ "description": "Include loans that have no originator NMLS id. Omitted/false (default): such loans are excluded — the vast majority are pre-2016 public records with no linkable originator. true: include them. Note that the default scopes results to loans with a known originator (~2016+ recordings)."
14095
+ }
14096
+ ]
14097
+ },
14098
+ "interestRate": {
14099
+ "$ref": "#/components/schemas/NumericFilterValue"
14100
+ },
14101
+ "lender": {
14102
+ "allOf": [
14103
+ {
14104
+ "$ref": "#/components/schemas/TextFilterValue"
14105
+ },
14106
+ {
14107
+ "description": "Lender ID — the normalized lender-dictionary key, NOT a fuzzy name match. Resolve a lender via instantSearch (or listLenders) and pass the `id` it returns (e.g. \"mortgage_rocket\" or \"mortgage rocket\"). Underscores and letter case are normalized, so either id surface works. A stored normalized lender name (what the `slice: \"lender\"` chart buckets emit) is also accepted, so a chart bucket key filters directly. A value that is neither returns 400 rather than silently matching nothing — to search by lender NAME, use `lenderName`."
14108
+ }
14109
+ ]
14110
+ },
14111
+ "lenderName": {
14112
+ "allOf": [
14113
+ {
14114
+ "$ref": "#/components/schemas/TextFilterValue"
14115
+ },
14116
+ {
14117
+ "description": "Lender name as recorded on the loan document — fuzzy, all-terms match (e.g. \"Fifth Third\"). The name counterpart to the exact-id `lender` filter; use `lender` when you have a resolved id, and this when you only have a name."
14118
+ }
14119
+ ]
14120
+ },
14121
+ "loanCompany": {
14122
+ "allOf": [
14123
+ {
14124
+ "$ref": "#/components/schemas/TextFilterValue"
14125
+ },
14126
+ {
14127
+ "description": "Funding/loan company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
14128
+ }
14129
+ ]
14130
+ },
14131
+ "loanType": {
14132
+ "$ref": "#/components/schemas/LoanTypeFilterValue"
14133
+ },
14134
+ "ltvAtOrigination": {
14135
+ "allOf": [
14136
+ {
14137
+ "$ref": "#/components/schemas/NumericFilterValue"
14138
+ },
14139
+ {
14140
+ "description": "Loan-to-value at ORIGINATION (sparse), as a PERCENT on a 0-100 scale (`80` = 80% LTV; values above 100 are real underwater loans). This is not a current LTV — there is no stored current-LTV field on loans."
14141
+ }
14142
+ ]
14143
+ },
14144
+ "mode": {
14145
+ "enum": [
14146
+ "and",
14147
+ "or"
14148
+ ],
14149
+ "type": "string"
14150
+ },
14151
+ "mortgageAmount": {
14152
+ "$ref": "#/components/schemas/NumericFilterValue"
14153
+ },
14154
+ "mortgageDate": {
14155
+ "$ref": "#/components/schemas/DateFilterValue"
14156
+ },
14157
+ "originator": {
14158
+ "allOf": [
14159
+ {
14160
+ "$ref": "#/components/schemas/TextFilterValue"
14161
+ },
14162
+ {
14163
+ "description": "Loan originator NMLS id (digits only). To search by name use `originatorName`, or resolve a name to its id via instantSearch."
14164
+ }
14165
+ ]
14166
+ },
14167
+ "originatorName": {
14168
+ "allOf": [
14169
+ {
14170
+ "$ref": "#/components/schemas/TextFilterValue"
14171
+ },
14172
+ {
14173
+ "deprecated": true,
14174
+ "description": "DEPRECATED — fuzzy name matching is unreliable (same originator can return wildly different counts by name string). Resolve the loan officer via instantSearch and filter by `originator` (exact NMLS id) instead. Still functional for now."
14175
+ }
14176
+ ]
14177
+ },
14178
+ "propertyId": {
14179
+ "allOf": [
14180
+ {
14181
+ "$ref": "#/components/schemas/TextFilterValue"
14182
+ },
14183
+ {
14184
+ "description": "Parcel id — returns every loan recorded against one property. Pass the same string this endpoint returns as `mmPropertyId` on a loan row, or the `mmPropertyId` of a property record.\n\nThis is the parcel's FULL recorded loan history, which is deliberately wider than the loans embedded on a property record: that embed is a snapshot of what is still owed (up to five currently-active loans), so paid-off mortgages are absent from it and present here.\n\nMulti-unit caveat: loans carry a unit-blind parcel id, so for one unit of a multi-unit building this selects every unit in the building, not that unit alone."
14185
+ }
14186
+ ]
14187
+ },
14188
+ "saleDate": {
14189
+ "$ref": "#/components/schemas/DateFilterValue"
14190
+ },
14191
+ "salePrice": {
14192
+ "$ref": "#/components/schemas/NumericFilterValue"
14193
+ },
14194
+ "state": {
14195
+ "$ref": "#/components/schemas/TextFilterValue"
14196
+ },
14197
+ "transactionType": {
14198
+ "$ref": "#/components/schemas/LoanTransactionTypeFilterValue"
14199
+ },
14200
+ "zip": {
14201
+ "allOf": [
14202
+ {
14203
+ "$ref": "#/components/schemas/TextFilterValue"
14204
+ },
14205
+ {
14206
+ "description": "Alias of `zipCode` — same ZIP filter, accepted for cross-entity key parity."
14207
+ }
14208
+ ]
14209
+ },
14210
+ "zipCode": {
14211
+ "$ref": "#/components/schemas/TextFilterValue"
14212
+ }
14213
+ },
14214
+ "type": "object"
14215
+ },
14216
+ "pagination": {
14217
+ "$ref": "#/components/schemas/Pagination"
14218
+ },
14219
+ "period": {
14220
+ "$ref": "#/components/schemas/DatedPeriod"
12772
14221
  },
12773
- "locationNormalizations": {
12774
- "description": "How each location filter value resolved. Present when a `city`/`state`/`zip` filter was supplied.",
12775
- "items": {
12776
- "$ref": "#/components/schemas/LocationNormalization"
12777
- },
12778
- "type": "array"
14222
+ "roleScope": {
14223
+ "$ref": "#/components/schemas/CompanyRoleScope"
12779
14224
  },
12780
- "total": {
12781
- "type": "number"
14225
+ "sort": {
14226
+ "$ref": "#/components/schemas/BreakdownSort"
12782
14227
  }
12783
14228
  },
12784
- "required": [
12785
- "data",
12786
- "total"
12787
- ],
12788
14229
  "type": "object"
12789
14230
  },
12790
14231
  "CompanyChartRequest": {
@@ -13097,6 +14538,9 @@
13097
14538
  "period": {
13098
14539
  "$ref": "#/components/schemas/Period"
13099
14540
  },
14541
+ "roleScope": {
14542
+ "$ref": "#/components/schemas/CompanyRoleScope"
14543
+ },
13100
14544
  "segment": {
13101
14545
  "allOf": [
13102
14546
  {
@@ -13123,6 +14567,25 @@
13123
14567
  },
13124
14568
  {
13125
14569
  "properties": {
14570
+ "builders": {
14571
+ "description": "Top home builders (up to 10) behind the company's period production — the builder of each sold property, ranked by loan count. Units only (no volume is recorded). Empty when none.",
14572
+ "items": {
14573
+ "properties": {
14574
+ "name": {
14575
+ "type": "string"
14576
+ },
14577
+ "units": {
14578
+ "type": "number"
14579
+ }
14580
+ },
14581
+ "required": [
14582
+ "name",
14583
+ "units"
14584
+ ],
14585
+ "type": "object"
14586
+ },
14587
+ "type": "array"
14588
+ },
13126
14589
  "communityLending": {
13127
14590
  "$ref": "#/components/schemas/EntityCommunityLending"
13128
14591
  },
@@ -13445,6 +14908,14 @@
13445
14908
  "nullable": true,
13446
14909
  "type": "string"
13447
14910
  },
14911
+ "companyUnits": {
14912
+ "description": "Loans the loan officer closed while employed here, recorded inside the window. 0 when none.",
14913
+ "type": "number"
14914
+ },
14915
+ "companyVolume": {
14916
+ "description": "Dollar volume the loan officer closed WHILE EMPLOYED HERE (employer at time of loan = this company), recorded inside the window. 0 when none.",
14917
+ "type": "number"
14918
+ },
13448
14919
  "contact": {
13449
14920
  "$ref": "#/components/schemas/EmploymentContact"
13450
14921
  },
@@ -13484,6 +14955,24 @@
13484
14955
  "nmlsId": {
13485
14956
  "type": "string"
13486
14957
  },
14958
+ "previousEmployer": {
14959
+ "description": "The employer whose record ended most recently on or before this loan officer's start here (the same rule `talent-flow` attributes hires by). Both null when none is on file.",
14960
+ "properties": {
14961
+ "name": {
14962
+ "nullable": true,
14963
+ "type": "string"
14964
+ },
14965
+ "nmlsId": {
14966
+ "nullable": true,
14967
+ "type": "string"
14968
+ }
14969
+ },
14970
+ "required": [
14971
+ "nmlsId",
14972
+ "name"
14973
+ ],
14974
+ "type": "object"
14975
+ },
13487
14976
  "startDate": {
13488
14977
  "description": "For current employees, the start of the earliest OPEN record here (current tenure); otherwise the earliest record relevant to the window.",
13489
14978
  "nullable": true,
@@ -13519,6 +15008,9 @@
13519
15008
  "state",
13520
15009
  "volume",
13521
15010
  "units",
15011
+ "companyVolume",
15012
+ "companyUnits",
15013
+ "previousEmployer",
13522
15014
  "contact"
13523
15015
  ],
13524
15016
  "type": "object"
@@ -14065,9 +15557,22 @@
14065
15557
  }
14066
15558
  ]
14067
15559
  },
15560
+ "isBroker": {
15561
+ "allOf": [
15562
+ {
15563
+ "$ref": "#/components/schemas/BooleanFilterValue"
15564
+ },
15565
+ {
15566
+ "description": "`true`: broker shops — non-bank companies that send more of the period's volume to OTHER lenders than they fund themselves. `false`: everyone else. Computed per period from each company's lender mix. Cannot be combined with `mode: \"or\"`."
15567
+ }
15568
+ ]
15569
+ },
14068
15570
  "loCount": {
14069
15571
  "$ref": "#/components/schemas/NumericFilterValue"
14070
15572
  },
15573
+ "loanType": {
15574
+ "$ref": "#/components/schemas/OriginatorLoanTypeFilterValue"
15575
+ },
14071
15576
  "loansWithCommunityData": {
14072
15577
  "allOf": [
14073
15578
  {
@@ -14136,6 +15641,11 @@
14136
15641
  }
14137
15642
  ]
14138
15643
  },
15644
+ "namePrefix": {
15645
+ "description": "Prefix name search: every word must start a word of the name (\"rock mort\" → Rocket Mortgage). No fuzzy/nickname matching; relevance-ranked unless `sort` is set. Max 100 chars / 6 words (emails, URLs, phones ignored), else 400.",
15646
+ "minLength": 1,
15647
+ "type": "string"
15648
+ },
14139
15649
  "nmlsId": {
14140
15650
  "$ref": "#/components/schemas/TextFilterValue"
14141
15651
  },
@@ -14231,6 +15741,9 @@
14231
15741
  "teamSize": {
14232
15742
  "$ref": "#/components/schemas/NumericFilterValue"
14233
15743
  },
15744
+ "transactionType": {
15745
+ "$ref": "#/components/schemas/OriginatorTransactionTypeFilterValue"
15746
+ },
14234
15747
  "units": {
14235
15748
  "allOf": [
14236
15749
  {
@@ -14331,6 +15844,9 @@
14331
15844
  "period": {
14332
15845
  "$ref": "#/components/schemas/Period"
14333
15846
  },
15847
+ "productMix": {
15848
+ "$ref": "#/components/schemas/CompanyProductMixFilter"
15849
+ },
14334
15850
  "sort": {
14335
15851
  "items": {
14336
15852
  "properties": {
@@ -14349,7 +15865,9 @@
14349
15865
  "loCount",
14350
15866
  "rosterJoined",
14351
15867
  "rosterLeft",
14352
- "producersOnly"
15868
+ "producersOnly",
15869
+ "purchaseShare",
15870
+ "refinanceShare"
14353
15871
  ],
14354
15872
  "type": "string"
14355
15873
  },
@@ -14363,6 +15881,9 @@
14363
15881
  "type": "object"
14364
15882
  },
14365
15883
  "type": "array"
15884
+ },
15885
+ "transactionMix": {
15886
+ "$ref": "#/components/schemas/CompanyTransactionMixFilter"
14366
15887
  }
14367
15888
  },
14368
15889
  "type": "object"
@@ -15301,6 +16822,69 @@
15301
16822
  ],
15302
16823
  "type": "object"
15303
16824
  },
16825
+ "CompanyProductMixFilter": {
16826
+ "description": "Loan-product share bands for the selected period, ANDed: `[{product:\"fha\", minShare:30}]` = FHA is at least 30% of the company's period volume. Whole-book shares across all markets.",
16827
+ "items": {
16828
+ "additionalProperties": false,
16829
+ "properties": {
16830
+ "basis": {
16831
+ "description": "`volume` (default) or `units` (loan count).",
16832
+ "enum": [
16833
+ "volume",
16834
+ "units"
16835
+ ],
16836
+ "type": "string"
16837
+ },
16838
+ "maxShare": {
16839
+ "description": "Upper bound, 0–100 percent. No bucket = 0% (passes).",
16840
+ "maximum": 100,
16841
+ "minimum": 0,
16842
+ "type": "number"
16843
+ },
16844
+ "minShare": {
16845
+ "description": "Lower bound, 0–100 percent of the period book.",
16846
+ "maximum": 100,
16847
+ "minimum": 0,
16848
+ "type": "number"
16849
+ },
16850
+ "product": {
16851
+ "enum": [
16852
+ "conventional",
16853
+ "fha",
16854
+ "va",
16855
+ "he",
16856
+ "heloc",
16857
+ "building",
16858
+ "commercial",
16859
+ "stand_alone_refi",
16860
+ "closed_end",
16861
+ "reverse",
16862
+ "usda",
16863
+ "stand_alone_second",
16864
+ "aggregate",
16865
+ "seller_take_back",
16866
+ "sba_participation_trust_deed",
16867
+ "balloon",
16868
+ "opened_end",
16869
+ "assumption",
16870
+ "negative_amortization",
16871
+ "land_contract",
16872
+ "trade",
16873
+ "modification",
16874
+ "unknown"
16875
+ ],
16876
+ "type": "string"
16877
+ }
16878
+ },
16879
+ "required": [
16880
+ "product"
16881
+ ],
16882
+ "type": "object"
16883
+ },
16884
+ "maxItems": 10,
16885
+ "minItems": 1,
16886
+ "type": "array"
16887
+ },
15304
16888
  "CompanyRegistration": {
15305
16889
  "nullable": true,
15306
16890
  "properties": {
@@ -15421,8 +17005,20 @@
15421
17005
  },
15422
17006
  "type": "object"
15423
17007
  },
17008
+ "CompanyRoleScope": {
17009
+ "description": "Which of a loan's party roles make it this company's loan. `loanCompany` (default): the company named on the loan document — one company per loan. `all`: the company appears in ANY role — loan-document company, the originating LO's employer at time of loan, the LO's organization, broker, or funding lender; a loan matching several roles counts once. `employer`: the company employed the originating LO when the loan closed. `broker`: the company brokered the loan. `lender`: the company funded the loan. `tpo`: third-party origination — the company is the loan company or lender but did NOT employ the originating LO (the `channel` dimension's `tpo` bucket as a population; `employer` is its `inHouse` counterpart). Use `all` for a broker shop's full production — its loans are often recorded under the funding lender's name, so `loanCompany` undercounts it.",
17010
+ "enum": [
17011
+ "loanCompany",
17012
+ "all",
17013
+ "employer",
17014
+ "broker",
17015
+ "lender",
17016
+ "tpo"
17017
+ ],
17018
+ "type": "string"
17019
+ },
15424
17020
  "CompanySegment": {
15425
- "description": "Dimension to group by. Most are the loan's own field (`loanType`, `transactionType`, `state`, …). `lender` groups on the normalized lender (label = display name, `id` = filter key). `propertyType` is the recorder's land-use code of the collateral (`SFR` single-family, `PUD` planned unit development, `CND` condo, `RES` residential-other, `MFD` multi-family dwelling, `2ND` second home, `MFG` manufactured, `TWN` townhouse, `LAN` land, `COM` commercial, …); loans with no code are not grouped (≈20% of recent loans). `conforming` splits on the conforming-loan-limit flag: `conforming` vs `nonConforming` (above the county conforming limit — i.e. jumbo, not Non-QM), raw `true`/`false` on `id`. Time-series only: `titleCompany` groups on the title company named on the deed, with spellings of one company merged per bucket (`label` = most-used spelling across the response, `id` = normalized name — match on `id`) and \"none available\"-style placeholders excluded.",
17021
+ "description": "Dimension to group by. Most are the loan's own field (`loanType`, `transactionType`, `state`, …). `lender` groups on the normalized lender (label = display name, `id` = filter key). `propertyType` is the recorder's land-use code of the collateral (`SFR` single-family, `PUD` planned unit development, `CND` condo, `RES` residential-other, `MFD` multi-family dwelling, `2ND` second home, `MFG` manufactured, `TWN` townhouse, `LAN` land, `COM` commercial, …); loans with no code are not grouped (≈20% of recent loans). `conforming` splits on the conforming-loan-limit flag: `conforming` vs `nonConforming` (above the county conforming limit — i.e. jumbo, not Non-QM), raw `true`/`false` on `id`. Time-series only: `titleCompany` groups on the title company named on the deed, with spellings of one company merged per bucket (`label` = most-used spelling across the response, `id` = normalized name — match on `id`) and \"none available\"-style placeholders excluded. `channel` (companies only) splits the company's loans into `inHouse` — the company employed the originating loan officer — and `tpo` — the company is the loan company or funding lender but did NOT employ the LO (third-party origination). The two never overlap; under `roleScope: \"all\"` they need not sum to the total (broker-only and LO-organization-only matches are in neither). Both buckets are always returned.",
15426
17022
  "enum": [
15427
17023
  "transactionType",
15428
17024
  "loanType",
@@ -15433,12 +17029,15 @@
15433
17029
  "lender",
15434
17030
  "propertyType",
15435
17031
  "conforming",
17032
+ "broker",
17033
+ "originator",
17034
+ "channel",
15436
17035
  "titleCompany"
15437
17036
  ],
15438
17037
  "type": "string"
15439
17038
  },
15440
17039
  "CompanySlice": {
15441
- "description": "Dimension to group by. Most are the loan's own field (`loanType`, `transactionType`, `state`, …). `lender` groups on the normalized lender (label = display name, `id` = filter key). `propertyType` is the recorder's land-use code of the collateral (`SFR` single-family, `PUD` planned unit development, `CND` condo, `RES` residential-other, `MFD` multi-family dwelling, `2ND` second home, `MFG` manufactured, `TWN` townhouse, `LAN` land, `COM` commercial, …); loans with no code are not grouped (≈20% of recent loans). `conforming` splits on the conforming-loan-limit flag: `conforming` vs `nonConforming` (above the county conforming limit — i.e. jumbo, not Non-QM), raw `true`/`false` on `id`.",
17040
+ "description": "Dimension to group by. Most are the loan's own field (`loanType`, `transactionType`, `state`, …). `lender` groups on the normalized lender (label = display name, `id` = filter key). `propertyType` is the recorder's land-use code of the collateral (`SFR` single-family, `PUD` planned unit development, `CND` condo, `RES` residential-other, `MFD` multi-family dwelling, `2ND` second home, `MFG` manufactured, `TWN` townhouse, `LAN` land, `COM` commercial, …); loans with no code are not grouped (≈20% of recent loans). `conforming` splits on the conforming-loan-limit flag: `conforming` vs `nonConforming` (above the county conforming limit — i.e. jumbo, not Non-QM), raw `true`/`false` on `id`. `channel` (companies only) splits the company's loans into `inHouse` — the company employed the originating loan officer — and `tpo` — the company is the loan company or funding lender but did NOT employ the LO (third-party origination). The two never overlap; under `roleScope: \"all\"` they need not sum to the total (broker-only and LO-organization-only matches are in neither). Both buckets are always returned.",
15442
17041
  "enum": [
15443
17042
  "transactionType",
15444
17043
  "loanType",
@@ -15448,7 +17047,10 @@
15448
17047
  "zip",
15449
17048
  "lender",
15450
17049
  "propertyType",
15451
- "conforming"
17050
+ "conforming",
17051
+ "broker",
17052
+ "originator",
17053
+ "channel"
15452
17054
  ],
15453
17055
  "type": "string"
15454
17056
  },
@@ -16172,6 +17774,16 @@
16172
17774
  "nullable": true,
16173
17775
  "type": "string"
16174
17776
  },
17777
+ "purchaseShare": {
17778
+ "description": "Purchase loans as a 0–100 percent of the company's period loan COUNT — the value `sort: [{field: \"purchaseShare\"}]` orders by. `null` when it made no purchase loans in the period (sorts as 0).",
17779
+ "nullable": true,
17780
+ "type": "number"
17781
+ },
17782
+ "refinanceShare": {
17783
+ "description": "Refinance loans as a 0–100 percent of the company's period loan COUNT — the value `sort: [{field: \"refinanceShare\"}]` orders by. `null` when none (sorts as 0).",
17784
+ "nullable": true,
17785
+ "type": "number"
17786
+ },
16175
17787
  "rosterJoined": {
16176
17788
  "description": "Loan officers who joined the company during the selected period — individuals whose sponsorship with the company began inside the window. IMPORTANT — this counts LICENSING EVENTS, not confirmed employer moves. A loan officer holds a separate license record for every state they are sponsored in, and this counts each individual whose sponsorship began or ended inside the window, so a single added or lapsed state license registers as an arrival or a departure even when the person's employment did not change. Measured on large lenders: 13-24% of a 12-month `rosterLeft` are still sponsored by the same employer today, and 33-50% of a 12-month `rosterJoined` were already sponsored by it before the window began. Treat both as directional indicators of movement, not as headcounts. `rosterJoined` and `rosterLeft` are measured from the same source on the same window basis, so unlike the retired `loLoss` — which had no arrivals figure computed the same way — the two can legitimately be combined into a churn rate. Both also grow with the window, so a longer period reports more than a shorter one and the periods are comparable in that direction.",
16177
17789
  "nullable": true,
@@ -16526,6 +18138,9 @@
16526
18138
  },
16527
18139
  "period": {
16528
18140
  "$ref": "#/components/schemas/Period"
18141
+ },
18142
+ "roleScope": {
18143
+ "$ref": "#/components/schemas/CompanyRoleScope"
16529
18144
  }
16530
18145
  },
16531
18146
  "type": "object"
@@ -16551,11 +18166,21 @@
16551
18166
  "unattributed": {
16552
18167
  "description": "Hires with no earlier employer on file that ended by their start date — typically new to the industry.",
16553
18168
  "type": "number"
18169
+ },
18170
+ "units": {
18171
+ "description": "Loans behind `volume`.",
18172
+ "type": "number"
18173
+ },
18174
+ "volume": {
18175
+ "description": "Every mover on this side's production AT THIS company (employer at time of loan = this company) recorded inside the window — volume gained (arrivals) / lost (departures). Includes unattributed movers.",
18176
+ "type": "number"
16554
18177
  }
16555
18178
  },
16556
18179
  "required": [
16557
18180
  "total",
16558
18181
  "unattributed",
18182
+ "volume",
18183
+ "units",
16559
18184
  "companies",
16560
18185
  "companiesTruncated"
16561
18186
  ],
@@ -16580,11 +18205,21 @@
16580
18205
  "unattributed": {
16581
18206
  "description": "Exits with no later employer on file — not re-employed yet, or left the industry.",
16582
18207
  "type": "number"
18208
+ },
18209
+ "units": {
18210
+ "description": "Loans behind `volume`.",
18211
+ "type": "number"
18212
+ },
18213
+ "volume": {
18214
+ "description": "Every mover on this side's production AT THIS company (employer at time of loan = this company) recorded inside the window — volume gained (arrivals) / lost (departures). Includes unattributed movers.",
18215
+ "type": "number"
16583
18216
  }
16584
18217
  },
16585
18218
  "required": [
16586
18219
  "total",
16587
18220
  "unattributed",
18221
+ "volume",
18222
+ "units",
16588
18223
  "companies",
16589
18224
  "companiesTruncated"
16590
18225
  ],
@@ -16919,12 +18554,60 @@
16919
18554
  "period": {
16920
18555
  "$ref": "#/components/schemas/Period"
16921
18556
  },
18557
+ "roleScope": {
18558
+ "$ref": "#/components/schemas/CompanyRoleScope"
18559
+ },
16922
18560
  "segment": {
16923
18561
  "$ref": "#/components/schemas/CompanySegment"
16924
18562
  }
16925
18563
  },
16926
18564
  "type": "object"
16927
18565
  },
18566
+ "CompanyTransactionMixFilter": {
18567
+ "description": "Transaction-type share bands for the selected period, ANDed: `[{transactionType:\"purchase\", minShare:60}]` = purchases are at least 60% of the company's period volume.",
18568
+ "items": {
18569
+ "additionalProperties": false,
18570
+ "properties": {
18571
+ "basis": {
18572
+ "description": "`volume` (default) or `units` (loan count).",
18573
+ "enum": [
18574
+ "volume",
18575
+ "units"
18576
+ ],
18577
+ "type": "string"
18578
+ },
18579
+ "maxShare": {
18580
+ "description": "Upper bound, 0–100 percent. No bucket = 0% (passes).",
18581
+ "maximum": 100,
18582
+ "minimum": 0,
18583
+ "type": "number"
18584
+ },
18585
+ "minShare": {
18586
+ "description": "Lower bound, 0–100 percent of the period book.",
18587
+ "maximum": 100,
18588
+ "minimum": 0,
18589
+ "type": "number"
18590
+ },
18591
+ "transactionType": {
18592
+ "enum": [
18593
+ "purchase",
18594
+ "refinance",
18595
+ "construction",
18596
+ "equity",
18597
+ "UNKNOWN"
18598
+ ],
18599
+ "type": "string"
18600
+ }
18601
+ },
18602
+ "required": [
18603
+ "transactionType"
18604
+ ],
18605
+ "type": "object"
18606
+ },
18607
+ "maxItems": 10,
18608
+ "minItems": 1,
18609
+ "type": "array"
18610
+ },
16928
18611
  "CompanyTypeFilterValue": {
16929
18612
  "anyOf": [
16930
18613
  {
@@ -30284,6 +31967,324 @@
30284
31967
  ],
30285
31968
  "type": "object"
30286
31969
  },
31970
+ "OriginatorAgentSide": {
31971
+ "description": "Which agent on the LO's loans to rank. `buyer` (default): the buyer's (selling) agent — the agent who brought the borrower. `listing`: the seller's listing agent.",
31972
+ "enum": [
31973
+ "buyer",
31974
+ "listing"
31975
+ ],
31976
+ "type": "string"
31977
+ },
31978
+ "OriginatorAgentsBreakdownRequest": {
31979
+ "additionalProperties": false,
31980
+ "properties": {
31981
+ "advancedFilters": {
31982
+ "$ref": "#/components/schemas/FilterNode"
31983
+ },
31984
+ "filters": {
31985
+ "$ref": "#/components/schemas/FilterNode"
31986
+ },
31987
+ "flatFilters": {
31988
+ "additionalProperties": false,
31989
+ "properties": {
31990
+ "borrowerStatus": {
31991
+ "$ref": "#/components/schemas/LoanBorrowerStatusFilterValue"
31992
+ },
31993
+ "broker": {
31994
+ "allOf": [
31995
+ {
31996
+ "$ref": "#/components/schemas/TextFilterValue"
31997
+ },
31998
+ {
31999
+ "description": "Broker shop NMLS id (digits only). A broker is a company — resolve a broker name to its NMLS id via instantSearch (or listCompanies)."
32000
+ }
32001
+ ]
32002
+ },
32003
+ "buyerEntityType": {
32004
+ "$ref": "#/components/schemas/BooleanFilterValue"
32005
+ },
32006
+ "city": {
32007
+ "$ref": "#/components/schemas/TextFilterValue"
32008
+ },
32009
+ "conforming": {
32010
+ "$ref": "#/components/schemas/BooleanFilterValue"
32011
+ },
32012
+ "county": {
32013
+ "allOf": [
32014
+ {
32015
+ "$ref": "#/components/schemas/TextFilterValue"
32016
+ },
32017
+ {
32018
+ "description": "County name (e.g. \"Broward\") or 5-digit FIPS code. Names resolve to FIPS server-side; include a `state` filter to disambiguate."
32019
+ }
32020
+ ]
32021
+ },
32022
+ "currentBalance": {
32023
+ "allOf": [
32024
+ {
32025
+ "$ref": "#/components/schemas/NumericFilterValue"
32026
+ },
32027
+ {
32028
+ "description": "Estimated remaining principal balance (~19% populated). Approximate current equity as `homeValue` (AVM) minus this."
32029
+ }
32030
+ ]
32031
+ },
32032
+ "employer": {
32033
+ "allOf": [
32034
+ {
32035
+ "$ref": "#/components/schemas/TextFilterValue"
32036
+ },
32037
+ {
32038
+ "description": "Employer/company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
32039
+ }
32040
+ ]
32041
+ },
32042
+ "equity": {
32043
+ "allOf": [
32044
+ {
32045
+ "$ref": "#/components/schemas/NumericFilterValue"
32046
+ },
32047
+ {
32048
+ "description": "Point-in-time equity recorded on the loan (sparse, ~10%). NOT a live current-equity figure. For HELOC/cash-out targeting on up-to-date equity, use properties search (listProperties) instead — its equity is far better populated and current."
32049
+ }
32050
+ ]
32051
+ },
32052
+ "excludeBroker": {
32053
+ "allOf": [
32054
+ {
32055
+ "$ref": "#/components/schemas/TextFilterValue"
32056
+ },
32057
+ {
32058
+ "description": "Exclude loans brokered by this broker-shop NMLS id (digits only) — the inverse of `broker`."
32059
+ }
32060
+ ]
32061
+ },
32062
+ "excludeCity": {
32063
+ "allOf": [
32064
+ {
32065
+ "$ref": "#/components/schemas/TextFilterValue"
32066
+ },
32067
+ {
32068
+ "description": "Exclude loans in this city — the inverse of `city`."
32069
+ }
32070
+ ]
32071
+ },
32072
+ "excludeLender": {
32073
+ "allOf": [
32074
+ {
32075
+ "$ref": "#/components/schemas/TextFilterValue"
32076
+ },
32077
+ {
32078
+ "description": "Exclude loans from this lender ID (\"everyone but X\") — the inverse of `lender`, same id contract (resolve via instantSearch/listLenders). Loans with no lender stay in the results."
32079
+ }
32080
+ ]
32081
+ },
32082
+ "excludeLoanCompany": {
32083
+ "allOf": [
32084
+ {
32085
+ "$ref": "#/components/schemas/TextFilterValue"
32086
+ },
32087
+ {
32088
+ "description": "Exclude loans funded by this company NMLS id (digits only) — the inverse of `loanCompany`."
32089
+ }
32090
+ ]
32091
+ },
32092
+ "excludeOriginator": {
32093
+ "allOf": [
32094
+ {
32095
+ "$ref": "#/components/schemas/TextFilterValue"
32096
+ },
32097
+ {
32098
+ "description": "Exclude loans with this originator NMLS id (digits only) — the inverse of `originator`. Common for 'everyone but my own shop' lists."
32099
+ }
32100
+ ]
32101
+ },
32102
+ "excludeState": {
32103
+ "allOf": [
32104
+ {
32105
+ "$ref": "#/components/schemas/TextFilterValue"
32106
+ },
32107
+ {
32108
+ "description": "Exclude loans in this state (2-letter code, e.g. \"CA\") — the inverse of `state`. For \"everywhere but this state\" lists."
32109
+ }
32110
+ ]
32111
+ },
32112
+ "excludeZipCode": {
32113
+ "allOf": [
32114
+ {
32115
+ "$ref": "#/components/schemas/TextFilterValue"
32116
+ },
32117
+ {
32118
+ "description": "Exclude loans in this ZIP code — the inverse of `zipCode`."
32119
+ }
32120
+ ]
32121
+ },
32122
+ "fips": {
32123
+ "allOf": [
32124
+ {
32125
+ "$ref": "#/components/schemas/TextFilterValue"
32126
+ },
32127
+ {
32128
+ "description": "Exact 5-digit county FIPS code (no name resolution) — the code-only escape hatch alongside `county`."
32129
+ }
32130
+ ]
32131
+ },
32132
+ "geoPoint": {
32133
+ "$ref": "#/components/schemas/GeoFilterValue"
32134
+ },
32135
+ "homeValue": {
32136
+ "allOf": [
32137
+ {
32138
+ "$ref": "#/components/schemas/NumericFilterValue"
32139
+ },
32140
+ {
32141
+ "description": "AVM (automated valuation) at the linked property (~26%, MLS-linked). Pair with `currentBalance` to approximate current equity."
32142
+ }
32143
+ ]
32144
+ },
32145
+ "includeUnknownOriginator": {
32146
+ "allOf": [
32147
+ {
32148
+ "$ref": "#/components/schemas/BooleanFilterValue"
32149
+ },
32150
+ {
32151
+ "description": "Include loans that have no originator NMLS id. Omitted/false (default): such loans are excluded — the vast majority are pre-2016 public records with no linkable originator. true: include them. Note that the default scopes results to loans with a known originator (~2016+ recordings)."
32152
+ }
32153
+ ]
32154
+ },
32155
+ "interestRate": {
32156
+ "$ref": "#/components/schemas/NumericFilterValue"
32157
+ },
32158
+ "lender": {
32159
+ "allOf": [
32160
+ {
32161
+ "$ref": "#/components/schemas/TextFilterValue"
32162
+ },
32163
+ {
32164
+ "description": "Lender ID — the normalized lender-dictionary key, NOT a fuzzy name match. Resolve a lender via instantSearch (or listLenders) and pass the `id` it returns (e.g. \"mortgage_rocket\" or \"mortgage rocket\"). Underscores and letter case are normalized, so either id surface works. A stored normalized lender name (what the `slice: \"lender\"` chart buckets emit) is also accepted, so a chart bucket key filters directly. A value that is neither returns 400 rather than silently matching nothing — to search by lender NAME, use `lenderName`."
32165
+ }
32166
+ ]
32167
+ },
32168
+ "lenderName": {
32169
+ "allOf": [
32170
+ {
32171
+ "$ref": "#/components/schemas/TextFilterValue"
32172
+ },
32173
+ {
32174
+ "description": "Lender name as recorded on the loan document — fuzzy, all-terms match (e.g. \"Fifth Third\"). The name counterpart to the exact-id `lender` filter; use `lender` when you have a resolved id, and this when you only have a name."
32175
+ }
32176
+ ]
32177
+ },
32178
+ "loanCompany": {
32179
+ "allOf": [
32180
+ {
32181
+ "$ref": "#/components/schemas/TextFilterValue"
32182
+ },
32183
+ {
32184
+ "description": "Funding/loan company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
32185
+ }
32186
+ ]
32187
+ },
32188
+ "loanType": {
32189
+ "$ref": "#/components/schemas/LoanTypeFilterValue"
32190
+ },
32191
+ "ltvAtOrigination": {
32192
+ "allOf": [
32193
+ {
32194
+ "$ref": "#/components/schemas/NumericFilterValue"
32195
+ },
32196
+ {
32197
+ "description": "Loan-to-value at ORIGINATION (sparse), as a PERCENT on a 0-100 scale (`80` = 80% LTV; values above 100 are real underwater loans). This is not a current LTV — there is no stored current-LTV field on loans."
32198
+ }
32199
+ ]
32200
+ },
32201
+ "mode": {
32202
+ "enum": [
32203
+ "and",
32204
+ "or"
32205
+ ],
32206
+ "type": "string"
32207
+ },
32208
+ "mortgageAmount": {
32209
+ "$ref": "#/components/schemas/NumericFilterValue"
32210
+ },
32211
+ "mortgageDate": {
32212
+ "$ref": "#/components/schemas/DateFilterValue"
32213
+ },
32214
+ "originator": {
32215
+ "allOf": [
32216
+ {
32217
+ "$ref": "#/components/schemas/TextFilterValue"
32218
+ },
32219
+ {
32220
+ "description": "Loan originator NMLS id (digits only). To search by name use `originatorName`, or resolve a name to its id via instantSearch."
32221
+ }
32222
+ ]
32223
+ },
32224
+ "originatorName": {
32225
+ "allOf": [
32226
+ {
32227
+ "$ref": "#/components/schemas/TextFilterValue"
32228
+ },
32229
+ {
32230
+ "deprecated": true,
32231
+ "description": "DEPRECATED — fuzzy name matching is unreliable (same originator can return wildly different counts by name string). Resolve the loan officer via instantSearch and filter by `originator` (exact NMLS id) instead. Still functional for now."
32232
+ }
32233
+ ]
32234
+ },
32235
+ "propertyId": {
32236
+ "allOf": [
32237
+ {
32238
+ "$ref": "#/components/schemas/TextFilterValue"
32239
+ },
32240
+ {
32241
+ "description": "Parcel id — returns every loan recorded against one property. Pass the same string this endpoint returns as `mmPropertyId` on a loan row, or the `mmPropertyId` of a property record.\n\nThis is the parcel's FULL recorded loan history, which is deliberately wider than the loans embedded on a property record: that embed is a snapshot of what is still owed (up to five currently-active loans), so paid-off mortgages are absent from it and present here.\n\nMulti-unit caveat: loans carry a unit-blind parcel id, so for one unit of a multi-unit building this selects every unit in the building, not that unit alone."
32242
+ }
32243
+ ]
32244
+ },
32245
+ "saleDate": {
32246
+ "$ref": "#/components/schemas/DateFilterValue"
32247
+ },
32248
+ "salePrice": {
32249
+ "$ref": "#/components/schemas/NumericFilterValue"
32250
+ },
32251
+ "state": {
32252
+ "$ref": "#/components/schemas/TextFilterValue"
32253
+ },
32254
+ "transactionType": {
32255
+ "$ref": "#/components/schemas/LoanTransactionTypeFilterValue"
32256
+ },
32257
+ "zip": {
32258
+ "allOf": [
32259
+ {
32260
+ "$ref": "#/components/schemas/TextFilterValue"
32261
+ },
32262
+ {
32263
+ "description": "Alias of `zipCode` — same ZIP filter, accepted for cross-entity key parity."
32264
+ }
32265
+ ]
32266
+ },
32267
+ "zipCode": {
32268
+ "$ref": "#/components/schemas/TextFilterValue"
32269
+ }
32270
+ },
32271
+ "type": "object"
32272
+ },
32273
+ "pagination": {
32274
+ "$ref": "#/components/schemas/Pagination"
32275
+ },
32276
+ "period": {
32277
+ "$ref": "#/components/schemas/DatedPeriod"
32278
+ },
32279
+ "side": {
32280
+ "$ref": "#/components/schemas/OriginatorAgentSide"
32281
+ },
32282
+ "sort": {
32283
+ "$ref": "#/components/schemas/BreakdownSort"
32284
+ }
32285
+ },
32286
+ "type": "object"
32287
+ },
30287
32288
  "OriginatorBranchLocation": {
30288
32289
  "description": "The NMLS branch the originator is currently registered at. Null when they have no branch location on file.",
30289
32290
  "nullable": true,
@@ -31911,6 +33912,11 @@
31911
33912
  }
31912
33913
  ]
31913
33914
  },
33915
+ "namePrefix": {
33916
+ "description": "Prefix name search: every word must start a word of the name (\"jen ro\" → Jennifer Rodriguez). No fuzzy/nickname matching; relevance-ranked unless `sort` is set. Max 100 chars / 6 words (emails, URLs, phones ignored), else 400.",
33917
+ "minLength": 1,
33918
+ "type": "string"
33919
+ },
31914
33920
  "nmlsId": {
31915
33921
  "$ref": "#/components/schemas/TextFilterValue"
31916
33922
  },
@@ -38335,17 +40341,6 @@
38335
40341
  ],
38336
40342
  "type": "object"
38337
40343
  },
38338
- "ScoredBreakdownRequest": {
38339
- "properties": {
38340
- "period": {
38341
- "$ref": "#/components/schemas/Period"
38342
- },
38343
- "sort": {
38344
- "$ref": "#/components/schemas/BreakdownSort"
38345
- }
38346
- },
38347
- "type": "object"
38348
- },
38349
40344
  "SearchTokenResponse": {
38350
40345
  "properties": {
38351
40346
  "expiresAt": {
@@ -39089,12 +41084,22 @@
39089
41084
  "count": {
39090
41085
  "description": "Loan officers attributed.",
39091
41086
  "type": "number"
41087
+ },
41088
+ "units": {
41089
+ "description": "Loans behind `volume`.",
41090
+ "type": "number"
41091
+ },
41092
+ "volume": {
41093
+ "description": "Those loan officers' production AT THIS company (employer at time of loan = this company) recorded inside the window.",
41094
+ "type": "number"
39092
41095
  }
39093
41096
  },
39094
41097
  "required": [
39095
41098
  "companyNmlsId",
39096
41099
  "companyName",
39097
- "count"
41100
+ "count",
41101
+ "volume",
41102
+ "units"
39098
41103
  ],
39099
41104
  "type": "object"
39100
41105
  },
@@ -39557,7 +41562,7 @@
39557
41562
  "info": {
39558
41563
  "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.",
39559
41564
  "title": "ModelMatch API",
39560
- "version": "3.74.0"
41565
+ "version": "3.76.0"
39561
41566
  },
39562
41567
  "openapi": "3.1.0",
39563
41568
  "paths": {
@@ -40540,28 +42545,191 @@
40540
42545
  }
40541
42546
  },
40542
42547
  "description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
40543
- },
40544
- "503": {
40545
- "content": {
40546
- "application/json": {
40547
- "schema": {
40548
- "$ref": "#/components/schemas/ErrorResponse"
40549
- }
40550
- }
40551
- },
40552
- "description": "Location dictionary temporarily unavailable. Only returned for a NEGATED location filter (`neq`, or `not`), which cannot be honoured without resolving the excluded value — answering anyway would return the records you asked to exclude. Positive location filters are unaffected. Retry shortly; the filter value itself was not rejected."
42548
+ },
42549
+ "503": {
42550
+ "content": {
42551
+ "application/json": {
42552
+ "schema": {
42553
+ "$ref": "#/components/schemas/ErrorResponse"
42554
+ }
42555
+ }
42556
+ },
42557
+ "description": "Location dictionary temporarily unavailable. Only returned for a NEGATED location filter (`neq`, or `not`), which cannot be honoured without resolving the excluded value — answering anyway would return the records you asked to exclude. Positive location filters are unaffected. Retry shortly; the filter value itself was not rejected."
42558
+ }
42559
+ },
42560
+ "summary": "Count agents matching filters",
42561
+ "tags": [
42562
+ "Agents"
42563
+ ],
42564
+ "x-mm-records-via": "listAgents"
42565
+ }
42566
+ },
42567
+ "/v1/agents/{id}": {
42568
+ "get": {
42569
+ "operationId": "getAgent",
42570
+ "parameters": [
42571
+ {
42572
+ "description": "Agent document ID",
42573
+ "in": "path",
42574
+ "name": "id",
42575
+ "required": true,
42576
+ "schema": {
42577
+ "description": "Agent document ID",
42578
+ "type": "string"
42579
+ }
42580
+ },
42581
+ {
42582
+ "description": "Period for volume/units (default: last12Months)",
42583
+ "in": "query",
42584
+ "name": "period",
42585
+ "required": false,
42586
+ "schema": {
42587
+ "allOf": [
42588
+ {
42589
+ "$ref": "#/components/schemas/Period"
42590
+ },
42591
+ {
42592
+ "description": "Period for volume/units (default: last12Months)"
42593
+ }
42594
+ ]
42595
+ }
42596
+ }
42597
+ ],
42598
+ "responses": {
42599
+ "200": {
42600
+ "content": {
42601
+ "application/json": {
42602
+ "schema": {
42603
+ "$ref": "#/components/schemas/AgentDetailResponse"
42604
+ }
42605
+ }
42606
+ },
42607
+ "description": "Agent detail"
42608
+ },
42609
+ "404": {
42610
+ "content": {
42611
+ "application/json": {
42612
+ "schema": {
42613
+ "$ref": "#/components/schemas/ErrorResponse"
42614
+ }
42615
+ }
42616
+ },
42617
+ "description": "Agent not found"
42618
+ },
42619
+ "413": {
42620
+ "content": {
42621
+ "application/json": {
42622
+ "schema": {
42623
+ "$ref": "#/components/schemas/PayloadTooLarge"
42624
+ }
42625
+ }
42626
+ },
42627
+ "description": "Response payload too large"
42628
+ }
42629
+ },
42630
+ "summary": "Get agent by ID",
42631
+ "tags": [
42632
+ "Agents"
42633
+ ]
42634
+ }
42635
+ },
42636
+ "/v1/agents/{id}/analytics/loan-mix": {
42637
+ "post": {
42638
+ "description": "Scoped to the agent's FINANCED deals: recorded loans on which the agent is the buyer's agent or the listing / co-listing agent, matched through the agent's MLS ids. Cash deals carry no loan and are not counted. The date window is the loan's recording date. Returns, for each side at once (`any`, `buyer`, `listing` — duals on `buyer`): the financed deal count and loan volume, how many were brokered (third-party origination), and the loan-type mix. For the prior period, call again with that period.",
42639
+ "operationId": "agentLoanMix",
42640
+ "parameters": [
42641
+ {
42642
+ "description": "Agent document ID",
42643
+ "in": "path",
42644
+ "name": "id",
42645
+ "required": true,
42646
+ "schema": {
42647
+ "description": "Agent document ID",
42648
+ "type": "string"
42649
+ }
42650
+ }
42651
+ ],
42652
+ "requestBody": {
42653
+ "content": {
42654
+ "application/json": {
42655
+ "schema": {
42656
+ "$ref": "#/components/schemas/AgentLoanMixRequest"
42657
+ }
42658
+ }
42659
+ }
42660
+ },
42661
+ "responses": {
42662
+ "200": {
42663
+ "content": {
42664
+ "application/json": {
42665
+ "schema": {
42666
+ "$ref": "#/components/schemas/AgentLoanMixResponse"
42667
+ }
42668
+ }
42669
+ },
42670
+ "description": "Per-side financing profile"
42671
+ },
42672
+ "400": {
42673
+ "content": {
42674
+ "application/json": {
42675
+ "schema": {
42676
+ "$ref": "#/components/schemas/ErrorResponse"
42677
+ }
42678
+ }
42679
+ },
42680
+ "description": "Validation error"
42681
+ },
42682
+ "401": {
42683
+ "content": {
42684
+ "application/json": {
42685
+ "schema": {
42686
+ "$ref": "#/components/schemas/ErrorResponse"
42687
+ }
42688
+ }
42689
+ },
42690
+ "description": "Unauthorized"
42691
+ },
42692
+ "403": {
42693
+ "content": {
42694
+ "application/json": {
42695
+ "schema": {
42696
+ "$ref": "#/components/schemas/ErrorResponse"
42697
+ }
42698
+ }
42699
+ },
42700
+ "description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
42701
+ },
42702
+ "404": {
42703
+ "content": {
42704
+ "application/json": {
42705
+ "schema": {
42706
+ "$ref": "#/components/schemas/ErrorResponse"
42707
+ }
42708
+ }
42709
+ },
42710
+ "description": "Not found"
42711
+ },
42712
+ "413": {
42713
+ "content": {
42714
+ "application/json": {
42715
+ "schema": {
42716
+ "$ref": "#/components/schemas/PayloadTooLarge"
42717
+ }
42718
+ }
42719
+ },
42720
+ "description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
40553
42721
  }
40554
42722
  },
40555
- "summary": "Count agents matching filters",
42723
+ "summary": "Financing profile of the agent's deals, per side",
40556
42724
  "tags": [
40557
42725
  "Agents"
40558
- ],
40559
- "x-mm-records-via": "listAgents"
42726
+ ]
40560
42727
  }
40561
42728
  },
40562
- "/v1/agents/{id}": {
40563
- "get": {
40564
- "operationId": "getAgent",
42729
+ "/v1/agents/{id}/breakdowns/builders": {
42730
+ "post": {
42731
+ "description": "New-construction builders named on the agent's deals in the period, ranked by units. The pre-aggregated builder list carries a deal COUNT only, so every row's `volume` and `pctVolume` are 0 — rank and share by `units` / `pctUnits` (a share of ALL the agent's deals in the period, so the rows sum to the builder-sold share, not to 1). It carries no buyer/listing split either: `side` must be `any` (or omitted); `buyer`/`listing` return 400.",
42732
+ "operationId": "agentBuilders",
40565
42733
  "parameters": [
40566
42734
  {
40567
42735
  "description": "Agent document ID",
@@ -40572,34 +42740,57 @@
40572
42740
  "description": "Agent document ID",
40573
42741
  "type": "string"
40574
42742
  }
40575
- },
40576
- {
40577
- "description": "Period for volume/units (default: last12Months)",
40578
- "in": "query",
40579
- "name": "period",
40580
- "required": false,
40581
- "schema": {
40582
- "allOf": [
40583
- {
40584
- "$ref": "#/components/schemas/Period"
40585
- },
40586
- {
40587
- "description": "Period for volume/units (default: last12Months)"
40588
- }
40589
- ]
40590
- }
40591
42743
  }
40592
42744
  ],
42745
+ "requestBody": {
42746
+ "content": {
42747
+ "application/json": {
42748
+ "schema": {
42749
+ "$ref": "#/components/schemas/AgentScoredBreakdownRequest"
42750
+ }
42751
+ }
42752
+ }
42753
+ },
40593
42754
  "responses": {
40594
42755
  "200": {
40595
42756
  "content": {
40596
42757
  "application/json": {
40597
42758
  "schema": {
40598
- "$ref": "#/components/schemas/AgentDetailResponse"
42759
+ "$ref": "#/components/schemas/BreakdownResponse"
40599
42760
  }
40600
42761
  }
40601
42762
  },
40602
- "description": "Agent detail"
42763
+ "description": "Pre-aggregated builders breakdown from the agent's scored doc"
42764
+ },
42765
+ "400": {
42766
+ "content": {
42767
+ "application/json": {
42768
+ "schema": {
42769
+ "$ref": "#/components/schemas/ErrorResponse"
42770
+ }
42771
+ }
42772
+ },
42773
+ "description": "Validation error"
42774
+ },
42775
+ "401": {
42776
+ "content": {
42777
+ "application/json": {
42778
+ "schema": {
42779
+ "$ref": "#/components/schemas/ErrorResponse"
42780
+ }
42781
+ }
42782
+ },
42783
+ "description": "Unauthorized"
42784
+ },
42785
+ "403": {
42786
+ "content": {
42787
+ "application/json": {
42788
+ "schema": {
42789
+ "$ref": "#/components/schemas/ErrorResponse"
42790
+ }
42791
+ }
42792
+ },
42793
+ "description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
40603
42794
  },
40604
42795
  "404": {
40605
42796
  "content": {
@@ -40609,7 +42800,7 @@
40609
42800
  }
40610
42801
  }
40611
42802
  },
40612
- "description": "Agent not found"
42803
+ "description": "Not found"
40613
42804
  },
40614
42805
  "413": {
40615
42806
  "content": {
@@ -40619,10 +42810,10 @@
40619
42810
  }
40620
42811
  }
40621
42812
  },
40622
- "description": "Response payload too large"
42813
+ "description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
40623
42814
  }
40624
42815
  },
40625
- "summary": "Get agent by ID",
42816
+ "summary": "Home builders on the agent's deals (pre-aggregated)",
40626
42817
  "tags": [
40627
42818
  "Agents"
40628
42819
  ]
@@ -40739,7 +42930,7 @@
40739
42930
  "content": {
40740
42931
  "application/json": {
40741
42932
  "schema": {
40742
- "$ref": "#/components/schemas/ScoredBreakdownRequest"
42933
+ "$ref": "#/components/schemas/AgentScoredBreakdownRequest"
40743
42934
  }
40744
42935
  }
40745
42936
  }
@@ -40923,7 +43114,7 @@
40923
43114
  "content": {
40924
43115
  "application/json": {
40925
43116
  "schema": {
40926
- "$ref": "#/components/schemas/ScoredBreakdownRequest"
43117
+ "$ref": "#/components/schemas/AgentScoredBreakdownRequest"
40927
43118
  }
40928
43119
  }
40929
43120
  }
@@ -41107,7 +43298,7 @@
41107
43298
  "content": {
41108
43299
  "application/json": {
41109
43300
  "schema": {
41110
- "$ref": "#/components/schemas/ScoredBreakdownRequest"
43301
+ "$ref": "#/components/schemas/AgentScoredBreakdownRequest"
41111
43302
  }
41112
43303
  }
41113
43304
  }
@@ -41272,6 +43463,192 @@
41272
43463
  ]
41273
43464
  }
41274
43465
  },
43466
+ "/v1/agents/{id}/breakdowns/title-companies": {
43467
+ "post": {
43468
+ "description": "Scoped to the agent's FINANCED deals: recorded loans on which the agent is the buyer's agent or the listing / co-listing agent, matched through the agent's MLS ids. Cash deals carry no loan and are not counted. The date window is the loan's recording date. Ranks the title companies named on those loans. Spellings of one company are MERGED: `label` is its most-used spelling, `id` the normalized name every spelling was grouped under. \"None available\"-style placeholders and names shorter than 3 characters are excluded. `pctUnits` / `pctVolume` are shares of ALL the side's financed deals in the window, including those with no title company, so they do not sum to 1. `side` defaults to `any`; title company is usually picked on the buyer side, so `buyer` is the view that reads as \"who this agent's buyers close with\".",
43469
+ "operationId": "agentTitleCompanies",
43470
+ "parameters": [
43471
+ {
43472
+ "description": "Agent document ID",
43473
+ "in": "path",
43474
+ "name": "id",
43475
+ "required": true,
43476
+ "schema": {
43477
+ "description": "Agent document ID",
43478
+ "type": "string"
43479
+ }
43480
+ }
43481
+ ],
43482
+ "requestBody": {
43483
+ "content": {
43484
+ "application/json": {
43485
+ "schema": {
43486
+ "$ref": "#/components/schemas/AgentLoansBreakdownRequest"
43487
+ }
43488
+ }
43489
+ }
43490
+ },
43491
+ "responses": {
43492
+ "200": {
43493
+ "content": {
43494
+ "application/json": {
43495
+ "schema": {
43496
+ "$ref": "#/components/schemas/BreakdownResponse"
43497
+ }
43498
+ }
43499
+ },
43500
+ "description": "Breakdown of the agent's financed deals by title company"
43501
+ },
43502
+ "400": {
43503
+ "content": {
43504
+ "application/json": {
43505
+ "schema": {
43506
+ "$ref": "#/components/schemas/ErrorResponse"
43507
+ }
43508
+ }
43509
+ },
43510
+ "description": "Validation error"
43511
+ },
43512
+ "401": {
43513
+ "content": {
43514
+ "application/json": {
43515
+ "schema": {
43516
+ "$ref": "#/components/schemas/ErrorResponse"
43517
+ }
43518
+ }
43519
+ },
43520
+ "description": "Unauthorized"
43521
+ },
43522
+ "403": {
43523
+ "content": {
43524
+ "application/json": {
43525
+ "schema": {
43526
+ "$ref": "#/components/schemas/ErrorResponse"
43527
+ }
43528
+ }
43529
+ },
43530
+ "description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
43531
+ },
43532
+ "404": {
43533
+ "content": {
43534
+ "application/json": {
43535
+ "schema": {
43536
+ "$ref": "#/components/schemas/ErrorResponse"
43537
+ }
43538
+ }
43539
+ },
43540
+ "description": "Not found"
43541
+ },
43542
+ "413": {
43543
+ "content": {
43544
+ "application/json": {
43545
+ "schema": {
43546
+ "$ref": "#/components/schemas/PayloadTooLarge"
43547
+ }
43548
+ }
43549
+ },
43550
+ "description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
43551
+ }
43552
+ },
43553
+ "summary": "Title companies on the agent's financed deals (spellings merged)",
43554
+ "tags": [
43555
+ "Agents"
43556
+ ]
43557
+ }
43558
+ },
43559
+ "/v1/agents/{id}/breakdowns/title-companies/time-series": {
43560
+ "post": {
43561
+ "description": "Scoped to the agent's FINANCED deals: recorded loans on which the agent is the buyer's agent or the listing / co-listing agent, matched through the agent's MLS ids. Cash deals carry no loan and are not counted. The date window is the loan's recording date. One bucket per `interval` (default monthly), each segmented by title company with spellings merged per bucket: `segments[].label` is the company's most-used spelling across the whole response and `segments[].id` the normalized name — match a company across buckets on `id`. `previous` is the same series for the prior window. `side` defaults to `any`.",
43562
+ "operationId": "agentTitleCompaniesTimeSeries",
43563
+ "parameters": [
43564
+ {
43565
+ "description": "Agent document ID",
43566
+ "in": "path",
43567
+ "name": "id",
43568
+ "required": true,
43569
+ "schema": {
43570
+ "description": "Agent document ID",
43571
+ "type": "string"
43572
+ }
43573
+ }
43574
+ ],
43575
+ "requestBody": {
43576
+ "content": {
43577
+ "application/json": {
43578
+ "schema": {
43579
+ "$ref": "#/components/schemas/AgentTitleCompanyTimeSeriesRequest"
43580
+ }
43581
+ }
43582
+ }
43583
+ },
43584
+ "responses": {
43585
+ "200": {
43586
+ "content": {
43587
+ "application/json": {
43588
+ "schema": {
43589
+ "$ref": "#/components/schemas/SimpleTimeSeriesResponse"
43590
+ }
43591
+ }
43592
+ },
43593
+ "description": "Title-company-segmented time series"
43594
+ },
43595
+ "400": {
43596
+ "content": {
43597
+ "application/json": {
43598
+ "schema": {
43599
+ "$ref": "#/components/schemas/ErrorResponse"
43600
+ }
43601
+ }
43602
+ },
43603
+ "description": "Validation error"
43604
+ },
43605
+ "401": {
43606
+ "content": {
43607
+ "application/json": {
43608
+ "schema": {
43609
+ "$ref": "#/components/schemas/ErrorResponse"
43610
+ }
43611
+ }
43612
+ },
43613
+ "description": "Unauthorized"
43614
+ },
43615
+ "403": {
43616
+ "content": {
43617
+ "application/json": {
43618
+ "schema": {
43619
+ "$ref": "#/components/schemas/ErrorResponse"
43620
+ }
43621
+ }
43622
+ },
43623
+ "description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
43624
+ },
43625
+ "404": {
43626
+ "content": {
43627
+ "application/json": {
43628
+ "schema": {
43629
+ "$ref": "#/components/schemas/ErrorResponse"
43630
+ }
43631
+ }
43632
+ },
43633
+ "description": "Not found"
43634
+ },
43635
+ "413": {
43636
+ "content": {
43637
+ "application/json": {
43638
+ "schema": {
43639
+ "$ref": "#/components/schemas/PayloadTooLarge"
43640
+ }
43641
+ }
43642
+ },
43643
+ "description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
43644
+ }
43645
+ },
43646
+ "summary": "Title companies on the agent's financed deals, over time",
43647
+ "tags": [
43648
+ "Agents"
43649
+ ]
43650
+ }
43651
+ },
41275
43652
  "/v1/agents/{id}/breakdowns/zip-codes": {
41276
43653
  "post": {
41277
43654
  "operationId": "agentZipCodes",
@@ -41661,6 +44038,7 @@
41661
44038
  },
41662
44039
  "/v1/agents/{id}/sales": {
41663
44040
  "post": {
44041
+ "description": "The agent's deals, newest first: every sale on which the agent is the buyer's agent or the listing / co-listing agent. `side` narrows to one half (`buyer` includes deals where the agent was on both sides; `listing` excludes them). Each row says which `side` the agent was on and carries the sale's recorded purchase `loan` — lender, loan officer, loan type, amount, title company — or `null` for a cash deal or a loan not yet on file. Pass `flatFilters.mlsStatus: \"SLD\"` for closed deals only.",
41664
44042
  "operationId": "agentSales",
41665
44043
  "parameters": [
41666
44044
  {
@@ -47018,7 +49396,7 @@
47018
49396
  "content": {
47019
49397
  "application/json": {
47020
49398
  "schema": {
47021
- "$ref": "#/components/schemas/BreakdownRequest"
49399
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47022
49400
  }
47023
49401
  }
47024
49402
  }
@@ -47110,7 +49488,7 @@
47110
49488
  "content": {
47111
49489
  "application/json": {
47112
49490
  "schema": {
47113
- "$ref": "#/components/schemas/BreakdownRequest"
49491
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47114
49492
  }
47115
49493
  }
47116
49494
  }
@@ -47202,7 +49580,7 @@
47202
49580
  "content": {
47203
49581
  "application/json": {
47204
49582
  "schema": {
47205
- "$ref": "#/components/schemas/BreakdownRequest"
49583
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47206
49584
  }
47207
49585
  }
47208
49586
  }
@@ -47294,7 +49672,7 @@
47294
49672
  "content": {
47295
49673
  "application/json": {
47296
49674
  "schema": {
47297
- "$ref": "#/components/schemas/BreakdownRequest"
49675
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47298
49676
  }
47299
49677
  }
47300
49678
  }
@@ -47386,7 +49764,7 @@
47386
49764
  "content": {
47387
49765
  "application/json": {
47388
49766
  "schema": {
47389
- "$ref": "#/components/schemas/BreakdownRequest"
49767
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47390
49768
  }
47391
49769
  }
47392
49770
  }
@@ -47478,7 +49856,7 @@
47478
49856
  "content": {
47479
49857
  "application/json": {
47480
49858
  "schema": {
47481
- "$ref": "#/components/schemas/BreakdownRequest"
49859
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47482
49860
  }
47483
49861
  }
47484
49862
  }
@@ -47570,7 +49948,7 @@
47570
49948
  "content": {
47571
49949
  "application/json": {
47572
49950
  "schema": {
47573
- "$ref": "#/components/schemas/BreakdownRequest"
49951
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47574
49952
  }
47575
49953
  }
47576
49954
  }
@@ -47662,7 +50040,7 @@
47662
50040
  "content": {
47663
50041
  "application/json": {
47664
50042
  "schema": {
47665
- "$ref": "#/components/schemas/BreakdownRequest"
50043
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47666
50044
  }
47667
50045
  }
47668
50046
  }
@@ -47755,7 +50133,7 @@
47755
50133
  "content": {
47756
50134
  "application/json": {
47757
50135
  "schema": {
47758
- "$ref": "#/components/schemas/BreakdownRequest"
50136
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47759
50137
  }
47760
50138
  }
47761
50139
  }
@@ -47847,7 +50225,7 @@
47847
50225
  "content": {
47848
50226
  "application/json": {
47849
50227
  "schema": {
47850
- "$ref": "#/components/schemas/BreakdownRequest"
50228
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47851
50229
  }
47852
50230
  }
47853
50231
  }
@@ -48300,30 +50678,32 @@
48300
50678
  }
48301
50679
  },
48302
50680
  {
48303
- "description": "Sort key (default `name`). `volume`/`units` rank by the loan officer's production in `period` across all employers.",
50681
+ "description": "Sort key (default `name`). `volume`/`units` rank by the loan officer's production in `period` across all employers; `companyVolume`/`companyUnits` by their production AT this company inside the window.",
48304
50682
  "in": "query",
48305
50683
  "name": "sort",
48306
50684
  "required": false,
48307
50685
  "schema": {
48308
- "description": "Sort key (default `name`). `volume`/`units` rank by the loan officer's production in `period` across all employers.",
50686
+ "description": "Sort key (default `name`). `volume`/`units` rank by the loan officer's production in `period` across all employers; `companyVolume`/`companyUnits` by their production AT this company inside the window.",
48309
50687
  "enum": [
48310
50688
  "name",
48311
50689
  "nmlsId",
48312
50690
  "startDate",
48313
50691
  "exitDate",
48314
50692
  "volume",
48315
- "units"
50693
+ "units",
50694
+ "companyVolume",
50695
+ "companyUnits"
48316
50696
  ],
48317
50697
  "type": "string"
48318
50698
  }
48319
50699
  },
48320
50700
  {
48321
- "description": "Default `asc` for text/date keys, `desc` for volume/units.",
50701
+ "description": "Default `asc` for text/date keys, `desc` for the production keys.",
48322
50702
  "in": "query",
48323
50703
  "name": "order",
48324
50704
  "required": false,
48325
50705
  "schema": {
48326
- "description": "Default `asc` for text/date keys, `desc` for volume/units.",
50706
+ "description": "Default `asc` for text/date keys, `desc` for the production keys.",
48327
50707
  "enum": [
48328
50708
  "asc",
48329
50709
  "desc"
@@ -66428,7 +68808,7 @@
66428
68808
  },
66429
68809
  "/v1/originators/{nmlsId}/breakdowns/agents": {
66430
68810
  "post": {
66431
- "description": "Ranks the real-estate agents on the selling side of this LO's loans, by volume. Buckets whose name is an MLS placeholder for \"no selling agent recorded\" (`non member`, `non listed agent`, and ~140 board-specific spellings) are excluded rather than ranked as agents — they are not people and cannot be resolved with `GET /v1/agents/{id}`. Percentages are shares of the LO's whole loan population, so they do not sum to 100 across the page.",
68811
+ "description": "Ranks the real-estate agents on this LO's loans, by volume — the buyer's agent by default, the listing agent with `side: \"listing\"`. Buckets whose name is an MLS placeholder for \"no agent recorded\" (`non member`, `non listed agent`, and ~140 board-specific spellings) are excluded rather than ranked as agents — they are not people. `id` is the agent id most often recorded under the name on these loans (pass it to `GET /v1/agents/{id}`); absent when none is recorded. Percentages are shares of the LO's whole loan population, so they do not sum to 100 across the page.",
66432
68812
  "operationId": "originatorAgents",
66433
68813
  "parameters": [
66434
68814
  {
@@ -66446,7 +68826,7 @@
66446
68826
  "content": {
66447
68827
  "application/json": {
66448
68828
  "schema": {
66449
- "$ref": "#/components/schemas/BreakdownRequest"
68829
+ "$ref": "#/components/schemas/OriginatorAgentsBreakdownRequest"
66450
68830
  }
66451
68831
  }
66452
68832
  }
@@ -66460,7 +68840,7 @@
66460
68840
  }
66461
68841
  }
66462
68842
  },
66463
- "description": "Breakdown of the LO's loans by agents"
68843
+ "description": "Breakdown of the LO's loans by real-estate agent"
66464
68844
  },
66465
68845
  "400": {
66466
68846
  "content": {