@model-match/api 3.23.0 → 3.25.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
@@ -4739,6 +4739,692 @@
4739
4739
  ],
4740
4740
  "type": "object"
4741
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
+ },
4742
5428
  "AgentMarket": {
4743
5429
  "properties": {
4744
5430
  "avgSalePrice": {
@@ -5221,6 +5907,9 @@
5221
5907
  "period": {
5222
5908
  "$ref": "#/components/schemas/Period"
5223
5909
  },
5910
+ "side": {
5911
+ "$ref": "#/components/schemas/AgentSide"
5912
+ },
5224
5913
  "sort": {
5225
5914
  "items": {
5226
5915
  "properties": {
@@ -5262,10 +5951,96 @@
5262
5951
  "nullable": true,
5263
5952
  "type": "string"
5264
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
+ },
5265
6029
  "price": {
5266
6030
  "nullable": true,
5267
6031
  "type": "number"
5268
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
+ },
5269
6044
  "soldAgentName": {
5270
6045
  "nullable": true,
5271
6046
  "type": "string"
@@ -5310,6 +6085,29 @@
5310
6085
  ],
5311
6086
  "type": "object"
5312
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
+ },
5313
6111
  "AgentSummary": {
5314
6112
  "properties": {
5315
6113
  "avgSoldPrice": {
@@ -5453,6 +6251,316 @@
5453
6251
  },
5454
6252
  "type": "object"
5455
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
+ },
5456
6564
  "AlertConditions": {
5457
6565
  "properties": {
5458
6566
  "epoThresholdDays": {
@@ -11308,12 +12416,30 @@
11308
12416
  },
11309
12417
  "BreakdownItem": {
11310
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
+ },
11311
12437
  "excluded": {
11312
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.",
11313
12439
  "type": "number"
11314
12440
  },
11315
12441
  "id": {
11316
- "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.",
11317
12443
  "type": "string"
11318
12444
  },
11319
12445
  "label": {
@@ -30841,6 +31967,324 @@
30841
31967
  ],
30842
31968
  "type": "object"
30843
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
+ },
30844
32288
  "OriginatorBranchLocation": {
30845
32289
  "description": "The NMLS branch the originator is currently registered at. Null when they have no branch location on file.",
30846
32290
  "nullable": true,
@@ -38897,17 +40341,6 @@
38897
40341
  ],
38898
40342
  "type": "object"
38899
40343
  },
38900
- "ScoredBreakdownRequest": {
38901
- "properties": {
38902
- "period": {
38903
- "$ref": "#/components/schemas/Period"
38904
- },
38905
- "sort": {
38906
- "$ref": "#/components/schemas/BreakdownSort"
38907
- }
38908
- },
38909
- "type": "object"
38910
- },
38911
40344
  "SearchTokenResponse": {
38912
40345
  "properties": {
38913
40346
  "expiresAt": {
@@ -40129,7 +41562,7 @@
40129
41562
  "info": {
40130
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.",
40131
41564
  "title": "ModelMatch API",
40132
- "version": "3.75.0"
41565
+ "version": "3.77.0"
40133
41566
  },
40134
41567
  "openapi": "3.1.0",
40135
41568
  "paths": {
@@ -40761,7 +42194,7 @@
40761
42194
  "$ref": "#/components/schemas/BulkDeliveryDestination"
40762
42195
  },
40763
42196
  "fields": {
40764
- "description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
42197
+ "description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). Agents also offer `email2` / `phone2` (the best-ranked email / phone distinct from `email` / `phone`, admitted by the `email` / `phone` entitlement field), `officePhone` (admitted by `phone`), `activeListings` (current active listings; null when unknown), and the profile-link columns `facebook`, `instagram`, `linkedin`, `twitter`, `youtube`, `tiktok`, `zillow`, `otherLinks` (a `; `-joined list of profile URLs on no known platform) — all admitted by the `links` entitlement field. In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
40765
42198
  "items": {
40766
42199
  "minLength": 1,
40767
42200
  "type": "string"
@@ -41200,6 +42633,192 @@
41200
42633
  ]
41201
42634
  }
41202
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"
42721
+ }
42722
+ },
42723
+ "summary": "Financing profile of the agent's deals, per side",
42724
+ "tags": [
42725
+ "Agents"
42726
+ ]
42727
+ }
42728
+ },
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",
42733
+ "parameters": [
42734
+ {
42735
+ "description": "Agent document ID",
42736
+ "in": "path",
42737
+ "name": "id",
42738
+ "required": true,
42739
+ "schema": {
42740
+ "description": "Agent document ID",
42741
+ "type": "string"
42742
+ }
42743
+ }
42744
+ ],
42745
+ "requestBody": {
42746
+ "content": {
42747
+ "application/json": {
42748
+ "schema": {
42749
+ "$ref": "#/components/schemas/AgentScoredBreakdownRequest"
42750
+ }
42751
+ }
42752
+ }
42753
+ },
42754
+ "responses": {
42755
+ "200": {
42756
+ "content": {
42757
+ "application/json": {
42758
+ "schema": {
42759
+ "$ref": "#/components/schemas/BreakdownResponse"
42760
+ }
42761
+ }
42762
+ },
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)"
42794
+ },
42795
+ "404": {
42796
+ "content": {
42797
+ "application/json": {
42798
+ "schema": {
42799
+ "$ref": "#/components/schemas/ErrorResponse"
42800
+ }
42801
+ }
42802
+ },
42803
+ "description": "Not found"
42804
+ },
42805
+ "413": {
42806
+ "content": {
42807
+ "application/json": {
42808
+ "schema": {
42809
+ "$ref": "#/components/schemas/PayloadTooLarge"
42810
+ }
42811
+ }
42812
+ },
42813
+ "description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
42814
+ }
42815
+ },
42816
+ "summary": "Home builders on the agent's deals (pre-aggregated)",
42817
+ "tags": [
42818
+ "Agents"
42819
+ ]
42820
+ }
42821
+ },
41203
42822
  "/v1/agents/{id}/breakdowns/cities": {
41204
42823
  "post": {
41205
42824
  "operationId": "agentCities",
@@ -41311,7 +42930,7 @@
41311
42930
  "content": {
41312
42931
  "application/json": {
41313
42932
  "schema": {
41314
- "$ref": "#/components/schemas/ScoredBreakdownRequest"
42933
+ "$ref": "#/components/schemas/AgentScoredBreakdownRequest"
41315
42934
  }
41316
42935
  }
41317
42936
  }
@@ -41495,7 +43114,7 @@
41495
43114
  "content": {
41496
43115
  "application/json": {
41497
43116
  "schema": {
41498
- "$ref": "#/components/schemas/ScoredBreakdownRequest"
43117
+ "$ref": "#/components/schemas/AgentScoredBreakdownRequest"
41499
43118
  }
41500
43119
  }
41501
43120
  }
@@ -41679,7 +43298,7 @@
41679
43298
  "content": {
41680
43299
  "application/json": {
41681
43300
  "schema": {
41682
- "$ref": "#/components/schemas/ScoredBreakdownRequest"
43301
+ "$ref": "#/components/schemas/AgentScoredBreakdownRequest"
41683
43302
  }
41684
43303
  }
41685
43304
  }
@@ -41844,6 +43463,192 @@
41844
43463
  ]
41845
43464
  }
41846
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
+ },
41847
43652
  "/v1/agents/{id}/breakdowns/zip-codes": {
41848
43653
  "post": {
41849
43654
  "operationId": "agentZipCodes",
@@ -42233,6 +44038,7 @@
42233
44038
  },
42234
44039
  "/v1/agents/{id}/sales": {
42235
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.",
42236
44042
  "operationId": "agentSales",
42237
44043
  "parameters": [
42238
44044
  {
@@ -45344,7 +47150,7 @@
45344
47150
  "$ref": "#/components/schemas/BulkDeliveryDestination"
45345
47151
  },
45346
47152
  "fields": {
45347
- "description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
47153
+ "description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). Agents also offer `email2` / `phone2` (the best-ranked email / phone distinct from `email` / `phone`, admitted by the `email` / `phone` entitlement field), `officePhone` (admitted by `phone`), `activeListings` (current active listings; null when unknown), and the profile-link columns `facebook`, `instagram`, `linkedin`, `twitter`, `youtube`, `tiktok`, `zillow`, `otherLinks` (a `; `-joined list of profile URLs on no known platform) — all admitted by the `links` entitlement field. In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
45348
47154
  "items": {
45349
47155
  "minLength": 1,
45350
47156
  "type": "string"
@@ -46857,7 +48663,7 @@
46857
48663
  "$ref": "#/components/schemas/BulkDeliveryDestination"
46858
48664
  },
46859
48665
  "fields": {
46860
- "description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
48666
+ "description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). Agents also offer `email2` / `phone2` (the best-ranked email / phone distinct from `email` / `phone`, admitted by the `email` / `phone` entitlement field), `officePhone` (admitted by `phone`), `activeListings` (current active listings; null when unknown), and the profile-link columns `facebook`, `instagram`, `linkedin`, `twitter`, `youtube`, `tiktok`, `zillow`, `otherLinks` (a `; `-joined list of profile URLs on no known platform) — all admitted by the `links` entitlement field. In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
46861
48667
  "items": {
46862
48668
  "minLength": 1,
46863
48669
  "type": "string"
@@ -62798,7 +64604,7 @@
62798
64604
  "$ref": "#/components/schemas/BulkDeliveryDestination"
62799
64605
  },
62800
64606
  "fields": {
62801
- "description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
64607
+ "description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). Agents also offer `email2` / `phone2` (the best-ranked email / phone distinct from `email` / `phone`, admitted by the `email` / `phone` entitlement field), `officePhone` (admitted by `phone`), `activeListings` (current active listings; null when unknown), and the profile-link columns `facebook`, `instagram`, `linkedin`, `twitter`, `youtube`, `tiktok`, `zillow`, `otherLinks` (a `; `-joined list of profile URLs on no known platform) — all admitted by the `links` entitlement field. In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
62802
64608
  "items": {
62803
64609
  "minLength": 1,
62804
64610
  "type": "string"
@@ -66460,7 +68266,7 @@
66460
68266
  "$ref": "#/components/schemas/BulkDeliveryDestination"
66461
68267
  },
66462
68268
  "fields": {
66463
- "description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
68269
+ "description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). Agents also offer `email2` / `phone2` (the best-ranked email / phone distinct from `email` / `phone`, admitted by the `email` / `phone` entitlement field), `officePhone` (admitted by `phone`), `activeListings` (current active listings; null when unknown), and the profile-link columns `facebook`, `instagram`, `linkedin`, `twitter`, `youtube`, `tiktok`, `zillow`, `otherLinks` (a `; `-joined list of profile URLs on no known platform) — all admitted by the `links` entitlement field. In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
66464
68270
  "items": {
66465
68271
  "minLength": 1,
66466
68272
  "type": "string"
@@ -67002,7 +68808,7 @@
67002
68808
  },
67003
68809
  "/v1/originators/{nmlsId}/breakdowns/agents": {
67004
68810
  "post": {
67005
- "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.",
67006
68812
  "operationId": "originatorAgents",
67007
68813
  "parameters": [
67008
68814
  {
@@ -67020,7 +68826,7 @@
67020
68826
  "content": {
67021
68827
  "application/json": {
67022
68828
  "schema": {
67023
- "$ref": "#/components/schemas/BreakdownRequest"
68829
+ "$ref": "#/components/schemas/OriginatorAgentsBreakdownRequest"
67024
68830
  }
67025
68831
  }
67026
68832
  }
@@ -67034,7 +68840,7 @@
67034
68840
  }
67035
68841
  }
67036
68842
  },
67037
- "description": "Breakdown of the LO's loans by agents"
68843
+ "description": "Breakdown of the LO's loans by real-estate agent"
67038
68844
  },
67039
68845
  "400": {
67040
68846
  "content": {
@@ -68561,7 +70367,7 @@
68561
70367
  "$ref": "#/components/schemas/BulkDeliveryDestination"
68562
70368
  },
68563
70369
  "fields": {
68564
- "description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
70370
+ "description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). Agents also offer `email2` / `phone2` (the best-ranked email / phone distinct from `email` / `phone`, admitted by the `email` / `phone` entitlement field), `officePhone` (admitted by `phone`), `activeListings` (current active listings; null when unknown), and the profile-link columns `facebook`, `instagram`, `linkedin`, `twitter`, `youtube`, `tiktok`, `zillow`, `otherLinks` (a `; `-joined list of profile URLs on no known platform) — all admitted by the `links` entitlement field. In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
68565
70371
  "items": {
68566
70372
  "minLength": 1,
68567
70373
  "type": "string"