@model-match/api 3.22.0 → 3.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/openapi.json CHANGED
@@ -4496,6 +4496,11 @@
4496
4496
  }
4497
4497
  ]
4498
4498
  },
4499
+ "namePrefix": {
4500
+ "description": "Prefix name search: every word must start a word of the name (\"jen ro\" → Jennifer Rodriguez). No fuzzy/nickname matching; relevance-ranked unless `sort` is set. Max 100 chars / 6 words (emails, URLs, phones ignored), else 400.",
4501
+ "minLength": 1,
4502
+ "type": "string"
4503
+ },
4499
4504
  "office": {
4500
4505
  "$ref": "#/components/schemas/TextFilterValue"
4501
4506
  },
@@ -12787,6 +12792,316 @@
12787
12792
  ],
12788
12793
  "type": "object"
12789
12794
  },
12795
+ "CompanyBreakdownRequest": {
12796
+ "additionalProperties": false,
12797
+ "properties": {
12798
+ "advancedFilters": {
12799
+ "$ref": "#/components/schemas/FilterNode"
12800
+ },
12801
+ "filters": {
12802
+ "$ref": "#/components/schemas/FilterNode"
12803
+ },
12804
+ "flatFilters": {
12805
+ "additionalProperties": false,
12806
+ "properties": {
12807
+ "borrowerStatus": {
12808
+ "$ref": "#/components/schemas/LoanBorrowerStatusFilterValue"
12809
+ },
12810
+ "broker": {
12811
+ "allOf": [
12812
+ {
12813
+ "$ref": "#/components/schemas/TextFilterValue"
12814
+ },
12815
+ {
12816
+ "description": "Broker shop NMLS id (digits only). A broker is a company — resolve a broker name to its NMLS id via instantSearch (or listCompanies)."
12817
+ }
12818
+ ]
12819
+ },
12820
+ "buyerEntityType": {
12821
+ "$ref": "#/components/schemas/BooleanFilterValue"
12822
+ },
12823
+ "city": {
12824
+ "$ref": "#/components/schemas/TextFilterValue"
12825
+ },
12826
+ "conforming": {
12827
+ "$ref": "#/components/schemas/BooleanFilterValue"
12828
+ },
12829
+ "county": {
12830
+ "allOf": [
12831
+ {
12832
+ "$ref": "#/components/schemas/TextFilterValue"
12833
+ },
12834
+ {
12835
+ "description": "County name (e.g. \"Broward\") or 5-digit FIPS code. Names resolve to FIPS server-side; include a `state` filter to disambiguate."
12836
+ }
12837
+ ]
12838
+ },
12839
+ "currentBalance": {
12840
+ "allOf": [
12841
+ {
12842
+ "$ref": "#/components/schemas/NumericFilterValue"
12843
+ },
12844
+ {
12845
+ "description": "Estimated remaining principal balance (~19% populated). Approximate current equity as `homeValue` (AVM) minus this."
12846
+ }
12847
+ ]
12848
+ },
12849
+ "employer": {
12850
+ "allOf": [
12851
+ {
12852
+ "$ref": "#/components/schemas/TextFilterValue"
12853
+ },
12854
+ {
12855
+ "description": "Employer/company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
12856
+ }
12857
+ ]
12858
+ },
12859
+ "equity": {
12860
+ "allOf": [
12861
+ {
12862
+ "$ref": "#/components/schemas/NumericFilterValue"
12863
+ },
12864
+ {
12865
+ "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."
12866
+ }
12867
+ ]
12868
+ },
12869
+ "excludeBroker": {
12870
+ "allOf": [
12871
+ {
12872
+ "$ref": "#/components/schemas/TextFilterValue"
12873
+ },
12874
+ {
12875
+ "description": "Exclude loans brokered by this broker-shop NMLS id (digits only) — the inverse of `broker`."
12876
+ }
12877
+ ]
12878
+ },
12879
+ "excludeCity": {
12880
+ "allOf": [
12881
+ {
12882
+ "$ref": "#/components/schemas/TextFilterValue"
12883
+ },
12884
+ {
12885
+ "description": "Exclude loans in this city — the inverse of `city`."
12886
+ }
12887
+ ]
12888
+ },
12889
+ "excludeLender": {
12890
+ "allOf": [
12891
+ {
12892
+ "$ref": "#/components/schemas/TextFilterValue"
12893
+ },
12894
+ {
12895
+ "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."
12896
+ }
12897
+ ]
12898
+ },
12899
+ "excludeLoanCompany": {
12900
+ "allOf": [
12901
+ {
12902
+ "$ref": "#/components/schemas/TextFilterValue"
12903
+ },
12904
+ {
12905
+ "description": "Exclude loans funded by this company NMLS id (digits only) — the inverse of `loanCompany`."
12906
+ }
12907
+ ]
12908
+ },
12909
+ "excludeOriginator": {
12910
+ "allOf": [
12911
+ {
12912
+ "$ref": "#/components/schemas/TextFilterValue"
12913
+ },
12914
+ {
12915
+ "description": "Exclude loans with this originator NMLS id (digits only) — the inverse of `originator`. Common for 'everyone but my own shop' lists."
12916
+ }
12917
+ ]
12918
+ },
12919
+ "excludeState": {
12920
+ "allOf": [
12921
+ {
12922
+ "$ref": "#/components/schemas/TextFilterValue"
12923
+ },
12924
+ {
12925
+ "description": "Exclude loans in this state (2-letter code, e.g. \"CA\") — the inverse of `state`. For \"everywhere but this state\" lists."
12926
+ }
12927
+ ]
12928
+ },
12929
+ "excludeZipCode": {
12930
+ "allOf": [
12931
+ {
12932
+ "$ref": "#/components/schemas/TextFilterValue"
12933
+ },
12934
+ {
12935
+ "description": "Exclude loans in this ZIP code — the inverse of `zipCode`."
12936
+ }
12937
+ ]
12938
+ },
12939
+ "fips": {
12940
+ "allOf": [
12941
+ {
12942
+ "$ref": "#/components/schemas/TextFilterValue"
12943
+ },
12944
+ {
12945
+ "description": "Exact 5-digit county FIPS code (no name resolution) — the code-only escape hatch alongside `county`."
12946
+ }
12947
+ ]
12948
+ },
12949
+ "geoPoint": {
12950
+ "$ref": "#/components/schemas/GeoFilterValue"
12951
+ },
12952
+ "homeValue": {
12953
+ "allOf": [
12954
+ {
12955
+ "$ref": "#/components/schemas/NumericFilterValue"
12956
+ },
12957
+ {
12958
+ "description": "AVM (automated valuation) at the linked property (~26%, MLS-linked). Pair with `currentBalance` to approximate current equity."
12959
+ }
12960
+ ]
12961
+ },
12962
+ "includeUnknownOriginator": {
12963
+ "allOf": [
12964
+ {
12965
+ "$ref": "#/components/schemas/BooleanFilterValue"
12966
+ },
12967
+ {
12968
+ "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)."
12969
+ }
12970
+ ]
12971
+ },
12972
+ "interestRate": {
12973
+ "$ref": "#/components/schemas/NumericFilterValue"
12974
+ },
12975
+ "lender": {
12976
+ "allOf": [
12977
+ {
12978
+ "$ref": "#/components/schemas/TextFilterValue"
12979
+ },
12980
+ {
12981
+ "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`."
12982
+ }
12983
+ ]
12984
+ },
12985
+ "lenderName": {
12986
+ "allOf": [
12987
+ {
12988
+ "$ref": "#/components/schemas/TextFilterValue"
12989
+ },
12990
+ {
12991
+ "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."
12992
+ }
12993
+ ]
12994
+ },
12995
+ "loanCompany": {
12996
+ "allOf": [
12997
+ {
12998
+ "$ref": "#/components/schemas/TextFilterValue"
12999
+ },
13000
+ {
13001
+ "description": "Funding/loan company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
13002
+ }
13003
+ ]
13004
+ },
13005
+ "loanType": {
13006
+ "$ref": "#/components/schemas/LoanTypeFilterValue"
13007
+ },
13008
+ "ltvAtOrigination": {
13009
+ "allOf": [
13010
+ {
13011
+ "$ref": "#/components/schemas/NumericFilterValue"
13012
+ },
13013
+ {
13014
+ "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."
13015
+ }
13016
+ ]
13017
+ },
13018
+ "mode": {
13019
+ "enum": [
13020
+ "and",
13021
+ "or"
13022
+ ],
13023
+ "type": "string"
13024
+ },
13025
+ "mortgageAmount": {
13026
+ "$ref": "#/components/schemas/NumericFilterValue"
13027
+ },
13028
+ "mortgageDate": {
13029
+ "$ref": "#/components/schemas/DateFilterValue"
13030
+ },
13031
+ "originator": {
13032
+ "allOf": [
13033
+ {
13034
+ "$ref": "#/components/schemas/TextFilterValue"
13035
+ },
13036
+ {
13037
+ "description": "Loan originator NMLS id (digits only). To search by name use `originatorName`, or resolve a name to its id via instantSearch."
13038
+ }
13039
+ ]
13040
+ },
13041
+ "originatorName": {
13042
+ "allOf": [
13043
+ {
13044
+ "$ref": "#/components/schemas/TextFilterValue"
13045
+ },
13046
+ {
13047
+ "deprecated": true,
13048
+ "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."
13049
+ }
13050
+ ]
13051
+ },
13052
+ "propertyId": {
13053
+ "allOf": [
13054
+ {
13055
+ "$ref": "#/components/schemas/TextFilterValue"
13056
+ },
13057
+ {
13058
+ "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."
13059
+ }
13060
+ ]
13061
+ },
13062
+ "saleDate": {
13063
+ "$ref": "#/components/schemas/DateFilterValue"
13064
+ },
13065
+ "salePrice": {
13066
+ "$ref": "#/components/schemas/NumericFilterValue"
13067
+ },
13068
+ "state": {
13069
+ "$ref": "#/components/schemas/TextFilterValue"
13070
+ },
13071
+ "transactionType": {
13072
+ "$ref": "#/components/schemas/LoanTransactionTypeFilterValue"
13073
+ },
13074
+ "zip": {
13075
+ "allOf": [
13076
+ {
13077
+ "$ref": "#/components/schemas/TextFilterValue"
13078
+ },
13079
+ {
13080
+ "description": "Alias of `zipCode` — same ZIP filter, accepted for cross-entity key parity."
13081
+ }
13082
+ ]
13083
+ },
13084
+ "zipCode": {
13085
+ "$ref": "#/components/schemas/TextFilterValue"
13086
+ }
13087
+ },
13088
+ "type": "object"
13089
+ },
13090
+ "pagination": {
13091
+ "$ref": "#/components/schemas/Pagination"
13092
+ },
13093
+ "period": {
13094
+ "$ref": "#/components/schemas/DatedPeriod"
13095
+ },
13096
+ "roleScope": {
13097
+ "$ref": "#/components/schemas/CompanyRoleScope"
13098
+ },
13099
+ "sort": {
13100
+ "$ref": "#/components/schemas/BreakdownSort"
13101
+ }
13102
+ },
13103
+ "type": "object"
13104
+ },
12790
13105
  "CompanyChartRequest": {
12791
13106
  "additionalProperties": false,
12792
13107
  "properties": {
@@ -13097,6 +13412,9 @@
13097
13412
  "period": {
13098
13413
  "$ref": "#/components/schemas/Period"
13099
13414
  },
13415
+ "roleScope": {
13416
+ "$ref": "#/components/schemas/CompanyRoleScope"
13417
+ },
13100
13418
  "segment": {
13101
13419
  "allOf": [
13102
13420
  {
@@ -13123,6 +13441,25 @@
13123
13441
  },
13124
13442
  {
13125
13443
  "properties": {
13444
+ "builders": {
13445
+ "description": "Top home builders (up to 10) behind the company's period production — the builder of each sold property, ranked by loan count. Units only (no volume is recorded). Empty when none.",
13446
+ "items": {
13447
+ "properties": {
13448
+ "name": {
13449
+ "type": "string"
13450
+ },
13451
+ "units": {
13452
+ "type": "number"
13453
+ }
13454
+ },
13455
+ "required": [
13456
+ "name",
13457
+ "units"
13458
+ ],
13459
+ "type": "object"
13460
+ },
13461
+ "type": "array"
13462
+ },
13126
13463
  "communityLending": {
13127
13464
  "$ref": "#/components/schemas/EntityCommunityLending"
13128
13465
  },
@@ -13445,6 +13782,14 @@
13445
13782
  "nullable": true,
13446
13783
  "type": "string"
13447
13784
  },
13785
+ "companyUnits": {
13786
+ "description": "Loans the loan officer closed while employed here, recorded inside the window. 0 when none.",
13787
+ "type": "number"
13788
+ },
13789
+ "companyVolume": {
13790
+ "description": "Dollar volume the loan officer closed WHILE EMPLOYED HERE (employer at time of loan = this company), recorded inside the window. 0 when none.",
13791
+ "type": "number"
13792
+ },
13448
13793
  "contact": {
13449
13794
  "$ref": "#/components/schemas/EmploymentContact"
13450
13795
  },
@@ -13484,6 +13829,24 @@
13484
13829
  "nmlsId": {
13485
13830
  "type": "string"
13486
13831
  },
13832
+ "previousEmployer": {
13833
+ "description": "The employer whose record ended most recently on or before this loan officer's start here (the same rule `talent-flow` attributes hires by). Both null when none is on file.",
13834
+ "properties": {
13835
+ "name": {
13836
+ "nullable": true,
13837
+ "type": "string"
13838
+ },
13839
+ "nmlsId": {
13840
+ "nullable": true,
13841
+ "type": "string"
13842
+ }
13843
+ },
13844
+ "required": [
13845
+ "nmlsId",
13846
+ "name"
13847
+ ],
13848
+ "type": "object"
13849
+ },
13487
13850
  "startDate": {
13488
13851
  "description": "For current employees, the start of the earliest OPEN record here (current tenure); otherwise the earliest record relevant to the window.",
13489
13852
  "nullable": true,
@@ -13519,6 +13882,9 @@
13519
13882
  "state",
13520
13883
  "volume",
13521
13884
  "units",
13885
+ "companyVolume",
13886
+ "companyUnits",
13887
+ "previousEmployer",
13522
13888
  "contact"
13523
13889
  ],
13524
13890
  "type": "object"
@@ -14065,9 +14431,22 @@
14065
14431
  }
14066
14432
  ]
14067
14433
  },
14434
+ "isBroker": {
14435
+ "allOf": [
14436
+ {
14437
+ "$ref": "#/components/schemas/BooleanFilterValue"
14438
+ },
14439
+ {
14440
+ "description": "`true`: broker shops — non-bank companies that send more of the period's volume to OTHER lenders than they fund themselves. `false`: everyone else. Computed per period from each company's lender mix. Cannot be combined with `mode: \"or\"`."
14441
+ }
14442
+ ]
14443
+ },
14068
14444
  "loCount": {
14069
14445
  "$ref": "#/components/schemas/NumericFilterValue"
14070
14446
  },
14447
+ "loanType": {
14448
+ "$ref": "#/components/schemas/OriginatorLoanTypeFilterValue"
14449
+ },
14071
14450
  "loansWithCommunityData": {
14072
14451
  "allOf": [
14073
14452
  {
@@ -14136,6 +14515,11 @@
14136
14515
  }
14137
14516
  ]
14138
14517
  },
14518
+ "namePrefix": {
14519
+ "description": "Prefix name search: every word must start a word of the name (\"rock mort\" → Rocket Mortgage). No fuzzy/nickname matching; relevance-ranked unless `sort` is set. Max 100 chars / 6 words (emails, URLs, phones ignored), else 400.",
14520
+ "minLength": 1,
14521
+ "type": "string"
14522
+ },
14139
14523
  "nmlsId": {
14140
14524
  "$ref": "#/components/schemas/TextFilterValue"
14141
14525
  },
@@ -14231,6 +14615,9 @@
14231
14615
  "teamSize": {
14232
14616
  "$ref": "#/components/schemas/NumericFilterValue"
14233
14617
  },
14618
+ "transactionType": {
14619
+ "$ref": "#/components/schemas/OriginatorTransactionTypeFilterValue"
14620
+ },
14234
14621
  "units": {
14235
14622
  "allOf": [
14236
14623
  {
@@ -14331,6 +14718,9 @@
14331
14718
  "period": {
14332
14719
  "$ref": "#/components/schemas/Period"
14333
14720
  },
14721
+ "productMix": {
14722
+ "$ref": "#/components/schemas/CompanyProductMixFilter"
14723
+ },
14334
14724
  "sort": {
14335
14725
  "items": {
14336
14726
  "properties": {
@@ -14349,7 +14739,9 @@
14349
14739
  "loCount",
14350
14740
  "rosterJoined",
14351
14741
  "rosterLeft",
14352
- "producersOnly"
14742
+ "producersOnly",
14743
+ "purchaseShare",
14744
+ "refinanceShare"
14353
14745
  ],
14354
14746
  "type": "string"
14355
14747
  },
@@ -14363,6 +14755,9 @@
14363
14755
  "type": "object"
14364
14756
  },
14365
14757
  "type": "array"
14758
+ },
14759
+ "transactionMix": {
14760
+ "$ref": "#/components/schemas/CompanyTransactionMixFilter"
14366
14761
  }
14367
14762
  },
14368
14763
  "type": "object"
@@ -15301,6 +15696,69 @@
15301
15696
  ],
15302
15697
  "type": "object"
15303
15698
  },
15699
+ "CompanyProductMixFilter": {
15700
+ "description": "Loan-product share bands for the selected period, ANDed: `[{product:\"fha\", minShare:30}]` = FHA is at least 30% of the company's period volume. Whole-book shares across all markets.",
15701
+ "items": {
15702
+ "additionalProperties": false,
15703
+ "properties": {
15704
+ "basis": {
15705
+ "description": "`volume` (default) or `units` (loan count).",
15706
+ "enum": [
15707
+ "volume",
15708
+ "units"
15709
+ ],
15710
+ "type": "string"
15711
+ },
15712
+ "maxShare": {
15713
+ "description": "Upper bound, 0–100 percent. No bucket = 0% (passes).",
15714
+ "maximum": 100,
15715
+ "minimum": 0,
15716
+ "type": "number"
15717
+ },
15718
+ "minShare": {
15719
+ "description": "Lower bound, 0–100 percent of the period book.",
15720
+ "maximum": 100,
15721
+ "minimum": 0,
15722
+ "type": "number"
15723
+ },
15724
+ "product": {
15725
+ "enum": [
15726
+ "conventional",
15727
+ "fha",
15728
+ "va",
15729
+ "he",
15730
+ "heloc",
15731
+ "building",
15732
+ "commercial",
15733
+ "stand_alone_refi",
15734
+ "closed_end",
15735
+ "reverse",
15736
+ "usda",
15737
+ "stand_alone_second",
15738
+ "aggregate",
15739
+ "seller_take_back",
15740
+ "sba_participation_trust_deed",
15741
+ "balloon",
15742
+ "opened_end",
15743
+ "assumption",
15744
+ "negative_amortization",
15745
+ "land_contract",
15746
+ "trade",
15747
+ "modification",
15748
+ "unknown"
15749
+ ],
15750
+ "type": "string"
15751
+ }
15752
+ },
15753
+ "required": [
15754
+ "product"
15755
+ ],
15756
+ "type": "object"
15757
+ },
15758
+ "maxItems": 10,
15759
+ "minItems": 1,
15760
+ "type": "array"
15761
+ },
15304
15762
  "CompanyRegistration": {
15305
15763
  "nullable": true,
15306
15764
  "properties": {
@@ -15421,8 +15879,20 @@
15421
15879
  },
15422
15880
  "type": "object"
15423
15881
  },
15882
+ "CompanyRoleScope": {
15883
+ "description": "Which of a loan's party roles make it this company's loan. `loanCompany` (default): the company named on the loan document — one company per loan. `all`: the company appears in ANY role — loan-document company, the originating LO's employer at time of loan, the LO's organization, broker, or funding lender; a loan matching several roles counts once. `employer`: the company employed the originating LO when the loan closed. `broker`: the company brokered the loan. `lender`: the company funded the loan. `tpo`: third-party origination — the company is the loan company or lender but did NOT employ the originating LO (the `channel` dimension's `tpo` bucket as a population; `employer` is its `inHouse` counterpart). Use `all` for a broker shop's full production — its loans are often recorded under the funding lender's name, so `loanCompany` undercounts it.",
15884
+ "enum": [
15885
+ "loanCompany",
15886
+ "all",
15887
+ "employer",
15888
+ "broker",
15889
+ "lender",
15890
+ "tpo"
15891
+ ],
15892
+ "type": "string"
15893
+ },
15424
15894
  "CompanySegment": {
15425
- "description": "Dimension to group by. Most are the loan's own field (`loanType`, `transactionType`, `state`, …). `lender` groups on the normalized lender (label = display name, `id` = filter key). `propertyType` is the recorder's land-use code of the collateral (`SFR` single-family, `PUD` planned unit development, `CND` condo, `RES` residential-other, `MFD` multi-family dwelling, `2ND` second home, `MFG` manufactured, `TWN` townhouse, `LAN` land, `COM` commercial, …); loans with no code are not grouped (≈20% of recent loans). `conforming` splits on the conforming-loan-limit flag: `conforming` vs `nonConforming` (above the county conforming limit — i.e. jumbo, not Non-QM), raw `true`/`false` on `id`. Time-series only: `titleCompany` groups on the title company named on the deed, with spellings of one company merged per bucket (`label` = most-used spelling across the response, `id` = normalized name — match on `id`) and \"none available\"-style placeholders excluded.",
15895
+ "description": "Dimension to group by. Most are the loan's own field (`loanType`, `transactionType`, `state`, …). `lender` groups on the normalized lender (label = display name, `id` = filter key). `propertyType` is the recorder's land-use code of the collateral (`SFR` single-family, `PUD` planned unit development, `CND` condo, `RES` residential-other, `MFD` multi-family dwelling, `2ND` second home, `MFG` manufactured, `TWN` townhouse, `LAN` land, `COM` commercial, …); loans with no code are not grouped (≈20% of recent loans). `conforming` splits on the conforming-loan-limit flag: `conforming` vs `nonConforming` (above the county conforming limit — i.e. jumbo, not Non-QM), raw `true`/`false` on `id`. Time-series only: `titleCompany` groups on the title company named on the deed, with spellings of one company merged per bucket (`label` = most-used spelling across the response, `id` = normalized name — match on `id`) and \"none available\"-style placeholders excluded. `channel` (companies only) splits the company's loans into `inHouse` — the company employed the originating loan officer — and `tpo` — the company is the loan company or funding lender but did NOT employ the LO (third-party origination). The two never overlap; under `roleScope: \"all\"` they need not sum to the total (broker-only and LO-organization-only matches are in neither). Both buckets are always returned.",
15426
15896
  "enum": [
15427
15897
  "transactionType",
15428
15898
  "loanType",
@@ -15433,12 +15903,15 @@
15433
15903
  "lender",
15434
15904
  "propertyType",
15435
15905
  "conforming",
15906
+ "broker",
15907
+ "originator",
15908
+ "channel",
15436
15909
  "titleCompany"
15437
15910
  ],
15438
15911
  "type": "string"
15439
15912
  },
15440
15913
  "CompanySlice": {
15441
- "description": "Dimension to group by. Most are the loan's own field (`loanType`, `transactionType`, `state`, …). `lender` groups on the normalized lender (label = display name, `id` = filter key). `propertyType` is the recorder's land-use code of the collateral (`SFR` single-family, `PUD` planned unit development, `CND` condo, `RES` residential-other, `MFD` multi-family dwelling, `2ND` second home, `MFG` manufactured, `TWN` townhouse, `LAN` land, `COM` commercial, …); loans with no code are not grouped (≈20% of recent loans). `conforming` splits on the conforming-loan-limit flag: `conforming` vs `nonConforming` (above the county conforming limit — i.e. jumbo, not Non-QM), raw `true`/`false` on `id`.",
15914
+ "description": "Dimension to group by. Most are the loan's own field (`loanType`, `transactionType`, `state`, …). `lender` groups on the normalized lender (label = display name, `id` = filter key). `propertyType` is the recorder's land-use code of the collateral (`SFR` single-family, `PUD` planned unit development, `CND` condo, `RES` residential-other, `MFD` multi-family dwelling, `2ND` second home, `MFG` manufactured, `TWN` townhouse, `LAN` land, `COM` commercial, …); loans with no code are not grouped (≈20% of recent loans). `conforming` splits on the conforming-loan-limit flag: `conforming` vs `nonConforming` (above the county conforming limit — i.e. jumbo, not Non-QM), raw `true`/`false` on `id`. `channel` (companies only) splits the company's loans into `inHouse` — the company employed the originating loan officer — and `tpo` — the company is the loan company or funding lender but did NOT employ the LO (third-party origination). The two never overlap; under `roleScope: \"all\"` they need not sum to the total (broker-only and LO-organization-only matches are in neither). Both buckets are always returned.",
15442
15915
  "enum": [
15443
15916
  "transactionType",
15444
15917
  "loanType",
@@ -15448,7 +15921,10 @@
15448
15921
  "zip",
15449
15922
  "lender",
15450
15923
  "propertyType",
15451
- "conforming"
15924
+ "conforming",
15925
+ "broker",
15926
+ "originator",
15927
+ "channel"
15452
15928
  ],
15453
15929
  "type": "string"
15454
15930
  },
@@ -16172,6 +16648,16 @@
16172
16648
  "nullable": true,
16173
16649
  "type": "string"
16174
16650
  },
16651
+ "purchaseShare": {
16652
+ "description": "Purchase loans as a 0–100 percent of the company's period loan COUNT — the value `sort: [{field: \"purchaseShare\"}]` orders by. `null` when it made no purchase loans in the period (sorts as 0).",
16653
+ "nullable": true,
16654
+ "type": "number"
16655
+ },
16656
+ "refinanceShare": {
16657
+ "description": "Refinance loans as a 0–100 percent of the company's period loan COUNT — the value `sort: [{field: \"refinanceShare\"}]` orders by. `null` when none (sorts as 0).",
16658
+ "nullable": true,
16659
+ "type": "number"
16660
+ },
16175
16661
  "rosterJoined": {
16176
16662
  "description": "Loan officers who joined the company during the selected period — individuals whose sponsorship with the company began inside the window. IMPORTANT — this counts LICENSING EVENTS, not confirmed employer moves. A loan officer holds a separate license record for every state they are sponsored in, and this counts each individual whose sponsorship began or ended inside the window, so a single added or lapsed state license registers as an arrival or a departure even when the person's employment did not change. Measured on large lenders: 13-24% of a 12-month `rosterLeft` are still sponsored by the same employer today, and 33-50% of a 12-month `rosterJoined` were already sponsored by it before the window began. Treat both as directional indicators of movement, not as headcounts. `rosterJoined` and `rosterLeft` are measured from the same source on the same window basis, so unlike the retired `loLoss` — which had no arrivals figure computed the same way — the two can legitimately be combined into a churn rate. Both also grow with the window, so a longer period reports more than a shorter one and the periods are comparable in that direction.",
16177
16663
  "nullable": true,
@@ -16526,6 +17012,9 @@
16526
17012
  },
16527
17013
  "period": {
16528
17014
  "$ref": "#/components/schemas/Period"
17015
+ },
17016
+ "roleScope": {
17017
+ "$ref": "#/components/schemas/CompanyRoleScope"
16529
17018
  }
16530
17019
  },
16531
17020
  "type": "object"
@@ -16551,11 +17040,21 @@
16551
17040
  "unattributed": {
16552
17041
  "description": "Hires with no earlier employer on file that ended by their start date — typically new to the industry.",
16553
17042
  "type": "number"
17043
+ },
17044
+ "units": {
17045
+ "description": "Loans behind `volume`.",
17046
+ "type": "number"
17047
+ },
17048
+ "volume": {
17049
+ "description": "Every mover on this side's production AT THIS company (employer at time of loan = this company) recorded inside the window — volume gained (arrivals) / lost (departures). Includes unattributed movers.",
17050
+ "type": "number"
16554
17051
  }
16555
17052
  },
16556
17053
  "required": [
16557
17054
  "total",
16558
17055
  "unattributed",
17056
+ "volume",
17057
+ "units",
16559
17058
  "companies",
16560
17059
  "companiesTruncated"
16561
17060
  ],
@@ -16580,11 +17079,21 @@
16580
17079
  "unattributed": {
16581
17080
  "description": "Exits with no later employer on file — not re-employed yet, or left the industry.",
16582
17081
  "type": "number"
17082
+ },
17083
+ "units": {
17084
+ "description": "Loans behind `volume`.",
17085
+ "type": "number"
17086
+ },
17087
+ "volume": {
17088
+ "description": "Every mover on this side's production AT THIS company (employer at time of loan = this company) recorded inside the window — volume gained (arrivals) / lost (departures). Includes unattributed movers.",
17089
+ "type": "number"
16583
17090
  }
16584
17091
  },
16585
17092
  "required": [
16586
17093
  "total",
16587
17094
  "unattributed",
17095
+ "volume",
17096
+ "units",
16588
17097
  "companies",
16589
17098
  "companiesTruncated"
16590
17099
  ],
@@ -16919,12 +17428,60 @@
16919
17428
  "period": {
16920
17429
  "$ref": "#/components/schemas/Period"
16921
17430
  },
17431
+ "roleScope": {
17432
+ "$ref": "#/components/schemas/CompanyRoleScope"
17433
+ },
16922
17434
  "segment": {
16923
17435
  "$ref": "#/components/schemas/CompanySegment"
16924
17436
  }
16925
17437
  },
16926
17438
  "type": "object"
16927
17439
  },
17440
+ "CompanyTransactionMixFilter": {
17441
+ "description": "Transaction-type share bands for the selected period, ANDed: `[{transactionType:\"purchase\", minShare:60}]` = purchases are at least 60% of the company's period volume.",
17442
+ "items": {
17443
+ "additionalProperties": false,
17444
+ "properties": {
17445
+ "basis": {
17446
+ "description": "`volume` (default) or `units` (loan count).",
17447
+ "enum": [
17448
+ "volume",
17449
+ "units"
17450
+ ],
17451
+ "type": "string"
17452
+ },
17453
+ "maxShare": {
17454
+ "description": "Upper bound, 0–100 percent. No bucket = 0% (passes).",
17455
+ "maximum": 100,
17456
+ "minimum": 0,
17457
+ "type": "number"
17458
+ },
17459
+ "minShare": {
17460
+ "description": "Lower bound, 0–100 percent of the period book.",
17461
+ "maximum": 100,
17462
+ "minimum": 0,
17463
+ "type": "number"
17464
+ },
17465
+ "transactionType": {
17466
+ "enum": [
17467
+ "purchase",
17468
+ "refinance",
17469
+ "construction",
17470
+ "equity",
17471
+ "UNKNOWN"
17472
+ ],
17473
+ "type": "string"
17474
+ }
17475
+ },
17476
+ "required": [
17477
+ "transactionType"
17478
+ ],
17479
+ "type": "object"
17480
+ },
17481
+ "maxItems": 10,
17482
+ "minItems": 1,
17483
+ "type": "array"
17484
+ },
16928
17485
  "CompanyTypeFilterValue": {
16929
17486
  "anyOf": [
16930
17487
  {
@@ -31911,6 +32468,11 @@
31911
32468
  }
31912
32469
  ]
31913
32470
  },
32471
+ "namePrefix": {
32472
+ "description": "Prefix name search: every word must start a word of the name (\"jen ro\" → Jennifer Rodriguez). No fuzzy/nickname matching; relevance-ranked unless `sort` is set. Max 100 chars / 6 words (emails, URLs, phones ignored), else 400.",
32473
+ "minLength": 1,
32474
+ "type": "string"
32475
+ },
31914
32476
  "nmlsId": {
31915
32477
  "$ref": "#/components/schemas/TextFilterValue"
31916
32478
  },
@@ -39089,12 +39651,22 @@
39089
39651
  "count": {
39090
39652
  "description": "Loan officers attributed.",
39091
39653
  "type": "number"
39654
+ },
39655
+ "units": {
39656
+ "description": "Loans behind `volume`.",
39657
+ "type": "number"
39658
+ },
39659
+ "volume": {
39660
+ "description": "Those loan officers' production AT THIS company (employer at time of loan = this company) recorded inside the window.",
39661
+ "type": "number"
39092
39662
  }
39093
39663
  },
39094
39664
  "required": [
39095
39665
  "companyNmlsId",
39096
39666
  "companyName",
39097
- "count"
39667
+ "count",
39668
+ "volume",
39669
+ "units"
39098
39670
  ],
39099
39671
  "type": "object"
39100
39672
  },
@@ -39557,7 +40129,7 @@
39557
40129
  "info": {
39558
40130
  "description": "ModelMatch API — mortgage and real-estate market data.\n\n## Bulk delivery limits\n\nThe `POST /{entity}/bulk-delivery` endpoints export a full result set to\nS3 as NDJSON, JSON, CSV, or Parquet.\n\n- **Up to 5,000 rows per delivery: no entitlement required.** Available to\n every authenticated caller.\n- **Above 5,000 rows: requires the entity's `bulk-delivery.{entity}`\n entitlement** (e.g. `bulk-delivery.loans`). The grant's scope sets your\n row ceiling and may also restrict which rows and fields you receive.\n\nA delivery that would exceed the limit available to you is rejected with\n`403 entitlement_missing`, reporting the matched row count and the ceiling\nthat applied. To stay under the limit, pass `limit` — the job then delivers\n(and bills for) only the first `limit` rows of a broader query.\n\n**Need a higher limit?** Email support@modelmatch.com to request the\nentitlement. Limits are raised per organization and per entity.\n\nBulk delivery is billed at 1 credit per delivered row whether or not\nan entitlement is held.\n\nInstead of a download, a delivery can be sent to a push target configured\non your workspace: pass `destination: { type: \"push-target\", targetId }`.\nThe same limits and billing apply.",
39559
40131
  "title": "ModelMatch API",
39560
- "version": "3.74.0"
40132
+ "version": "3.75.0"
39561
40133
  },
39562
40134
  "openapi": "3.1.0",
39563
40135
  "paths": {
@@ -47018,7 +47590,7 @@
47018
47590
  "content": {
47019
47591
  "application/json": {
47020
47592
  "schema": {
47021
- "$ref": "#/components/schemas/BreakdownRequest"
47593
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47022
47594
  }
47023
47595
  }
47024
47596
  }
@@ -47110,7 +47682,7 @@
47110
47682
  "content": {
47111
47683
  "application/json": {
47112
47684
  "schema": {
47113
- "$ref": "#/components/schemas/BreakdownRequest"
47685
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47114
47686
  }
47115
47687
  }
47116
47688
  }
@@ -47202,7 +47774,7 @@
47202
47774
  "content": {
47203
47775
  "application/json": {
47204
47776
  "schema": {
47205
- "$ref": "#/components/schemas/BreakdownRequest"
47777
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47206
47778
  }
47207
47779
  }
47208
47780
  }
@@ -47294,7 +47866,7 @@
47294
47866
  "content": {
47295
47867
  "application/json": {
47296
47868
  "schema": {
47297
- "$ref": "#/components/schemas/BreakdownRequest"
47869
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47298
47870
  }
47299
47871
  }
47300
47872
  }
@@ -47386,7 +47958,7 @@
47386
47958
  "content": {
47387
47959
  "application/json": {
47388
47960
  "schema": {
47389
- "$ref": "#/components/schemas/BreakdownRequest"
47961
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47390
47962
  }
47391
47963
  }
47392
47964
  }
@@ -47478,7 +48050,7 @@
47478
48050
  "content": {
47479
48051
  "application/json": {
47480
48052
  "schema": {
47481
- "$ref": "#/components/schemas/BreakdownRequest"
48053
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47482
48054
  }
47483
48055
  }
47484
48056
  }
@@ -47570,7 +48142,7 @@
47570
48142
  "content": {
47571
48143
  "application/json": {
47572
48144
  "schema": {
47573
- "$ref": "#/components/schemas/BreakdownRequest"
48145
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47574
48146
  }
47575
48147
  }
47576
48148
  }
@@ -47662,7 +48234,7 @@
47662
48234
  "content": {
47663
48235
  "application/json": {
47664
48236
  "schema": {
47665
- "$ref": "#/components/schemas/BreakdownRequest"
48237
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47666
48238
  }
47667
48239
  }
47668
48240
  }
@@ -47755,7 +48327,7 @@
47755
48327
  "content": {
47756
48328
  "application/json": {
47757
48329
  "schema": {
47758
- "$ref": "#/components/schemas/BreakdownRequest"
48330
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47759
48331
  }
47760
48332
  }
47761
48333
  }
@@ -47847,7 +48419,7 @@
47847
48419
  "content": {
47848
48420
  "application/json": {
47849
48421
  "schema": {
47850
- "$ref": "#/components/schemas/BreakdownRequest"
48422
+ "$ref": "#/components/schemas/CompanyBreakdownRequest"
47851
48423
  }
47852
48424
  }
47853
48425
  }
@@ -48300,30 +48872,32 @@
48300
48872
  }
48301
48873
  },
48302
48874
  {
48303
- "description": "Sort key (default `name`). `volume`/`units` rank by the loan officer's production in `period` across all employers.",
48875
+ "description": "Sort key (default `name`). `volume`/`units` rank by the loan officer's production in `period` across all employers; `companyVolume`/`companyUnits` by their production AT this company inside the window.",
48304
48876
  "in": "query",
48305
48877
  "name": "sort",
48306
48878
  "required": false,
48307
48879
  "schema": {
48308
- "description": "Sort key (default `name`). `volume`/`units` rank by the loan officer's production in `period` across all employers.",
48880
+ "description": "Sort key (default `name`). `volume`/`units` rank by the loan officer's production in `period` across all employers; `companyVolume`/`companyUnits` by their production AT this company inside the window.",
48309
48881
  "enum": [
48310
48882
  "name",
48311
48883
  "nmlsId",
48312
48884
  "startDate",
48313
48885
  "exitDate",
48314
48886
  "volume",
48315
- "units"
48887
+ "units",
48888
+ "companyVolume",
48889
+ "companyUnits"
48316
48890
  ],
48317
48891
  "type": "string"
48318
48892
  }
48319
48893
  },
48320
48894
  {
48321
- "description": "Default `asc` for text/date keys, `desc` for volume/units.",
48895
+ "description": "Default `asc` for text/date keys, `desc` for the production keys.",
48322
48896
  "in": "query",
48323
48897
  "name": "order",
48324
48898
  "required": false,
48325
48899
  "schema": {
48326
- "description": "Default `asc` for text/date keys, `desc` for volume/units.",
48900
+ "description": "Default `asc` for text/date keys, `desc` for the production keys.",
48327
48901
  "enum": [
48328
48902
  "asc",
48329
48903
  "desc"