@model-match/api 3.15.0 → 3.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index-BCrq4x8K.d.mts → index-CEo1apoH.d.mts} +896 -28
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/slim/index.d.mts +54 -2
- package/dist/slim/index.mjs +218 -2
- package/dist/{src-DA2DVf_U.mjs → src-_-RWzjQf.mjs} +219 -1
- package/openapi.json +2314 -334
- package/package.json +2 -2
package/openapi.json
CHANGED
|
@@ -1144,13 +1144,13 @@
|
|
|
1144
1144
|
"AgentCountyFilterValue": {
|
|
1145
1145
|
"anyOf": [
|
|
1146
1146
|
{
|
|
1147
|
-
"pattern": "^\\d{5}
|
|
1147
|
+
"pattern": "^\\d{5}$",
|
|
1148
1148
|
"type": "string"
|
|
1149
1149
|
},
|
|
1150
1150
|
{
|
|
1151
1151
|
"description": "Match any of several counties",
|
|
1152
1152
|
"items": {
|
|
1153
|
-
"pattern": "^\\d{5}
|
|
1153
|
+
"pattern": "^\\d{5}$",
|
|
1154
1154
|
"type": "string"
|
|
1155
1155
|
},
|
|
1156
1156
|
"type": "array"
|
|
@@ -1969,13 +1969,13 @@
|
|
|
1969
1969
|
"from": {
|
|
1970
1970
|
"description": "Inclusive lower bound on the transaction date.",
|
|
1971
1971
|
"example": "2024-01-01",
|
|
1972
|
-
"pattern": "^\\d{4}(-\\d{2}(-\\d{2})?)
|
|
1972
|
+
"pattern": "^\\d{4}(-\\d{2}(-\\d{2})?)?$",
|
|
1973
1973
|
"type": "string"
|
|
1974
1974
|
},
|
|
1975
1975
|
"to": {
|
|
1976
1976
|
"description": "Inclusive upper bound on the transaction date.",
|
|
1977
1977
|
"example": "2025-12-31",
|
|
1978
|
-
"pattern": "^\\d{4}(-\\d{2}(-\\d{2})?)
|
|
1978
|
+
"pattern": "^\\d{4}(-\\d{2}(-\\d{2})?)?$",
|
|
1979
1979
|
"type": "string"
|
|
1980
1980
|
}
|
|
1981
1981
|
},
|
|
@@ -3102,7 +3102,7 @@
|
|
|
3102
3102
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
3103
3103
|
},
|
|
3104
3104
|
{
|
|
3105
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
3105
|
+
"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."
|
|
3106
3106
|
}
|
|
3107
3107
|
]
|
|
3108
3108
|
},
|
|
@@ -3189,6 +3189,16 @@
|
|
|
3189
3189
|
"period": {
|
|
3190
3190
|
"$ref": "#/components/schemas/Period"
|
|
3191
3191
|
},
|
|
3192
|
+
"segment": {
|
|
3193
|
+
"allOf": [
|
|
3194
|
+
{
|
|
3195
|
+
"$ref": "#/components/schemas/BranchSlice"
|
|
3196
|
+
},
|
|
3197
|
+
{
|
|
3198
|
+
"description": "Optional second dimension. Each bucket of `slice` then carries `segments`: the same `measure` broken down by this dimension (e.g. `slice: \"loanType\", segment: \"lender\"` is loan type × lender in one call), top 25 per bucket ranked by `measure`, with the remainder counted in `segmentsOmittedCount`. Omit it and the response is the one-dimensional chart, unchanged. Must differ from `slice`, and cannot be combined with `size` / `after` paging (400)."
|
|
3199
|
+
}
|
|
3200
|
+
]
|
|
3201
|
+
},
|
|
3192
3202
|
"slice": {
|
|
3193
3203
|
"$ref": "#/components/schemas/BranchSlice"
|
|
3194
3204
|
}
|
|
@@ -4144,7 +4154,24 @@
|
|
|
4144
4154
|
],
|
|
4145
4155
|
"type": "string"
|
|
4146
4156
|
},
|
|
4157
|
+
"BranchSegment": {
|
|
4158
|
+
"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.",
|
|
4159
|
+
"enum": [
|
|
4160
|
+
"transactionType",
|
|
4161
|
+
"loanType",
|
|
4162
|
+
"city",
|
|
4163
|
+
"county",
|
|
4164
|
+
"state",
|
|
4165
|
+
"zip",
|
|
4166
|
+
"lender",
|
|
4167
|
+
"propertyType",
|
|
4168
|
+
"conforming",
|
|
4169
|
+
"titleCompany"
|
|
4170
|
+
],
|
|
4171
|
+
"type": "string"
|
|
4172
|
+
},
|
|
4147
4173
|
"BranchSlice": {
|
|
4174
|
+
"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`.",
|
|
4148
4175
|
"enum": [
|
|
4149
4176
|
"transactionType",
|
|
4150
4177
|
"loanType",
|
|
@@ -4152,7 +4179,9 @@
|
|
|
4152
4179
|
"county",
|
|
4153
4180
|
"state",
|
|
4154
4181
|
"zip",
|
|
4155
|
-
"lender"
|
|
4182
|
+
"lender",
|
|
4183
|
+
"propertyType",
|
|
4184
|
+
"conforming"
|
|
4156
4185
|
],
|
|
4157
4186
|
"type": "string"
|
|
4158
4187
|
},
|
|
@@ -4518,7 +4547,7 @@
|
|
|
4518
4547
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
4519
4548
|
},
|
|
4520
4549
|
{
|
|
4521
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
4550
|
+
"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."
|
|
4522
4551
|
}
|
|
4523
4552
|
]
|
|
4524
4553
|
},
|
|
@@ -4827,7 +4856,7 @@
|
|
|
4827
4856
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
4828
4857
|
},
|
|
4829
4858
|
{
|
|
4830
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
4859
|
+
"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."
|
|
4831
4860
|
}
|
|
4832
4861
|
]
|
|
4833
4862
|
},
|
|
@@ -4918,7 +4947,7 @@
|
|
|
4918
4947
|
"$ref": "#/components/schemas/Period"
|
|
4919
4948
|
},
|
|
4920
4949
|
"segment": {
|
|
4921
|
-
"$ref": "#/components/schemas/
|
|
4950
|
+
"$ref": "#/components/schemas/BranchSegment"
|
|
4922
4951
|
}
|
|
4923
4952
|
},
|
|
4924
4953
|
"required": [
|
|
@@ -5189,7 +5218,7 @@
|
|
|
5189
5218
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
5190
5219
|
},
|
|
5191
5220
|
{
|
|
5192
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
5221
|
+
"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."
|
|
5193
5222
|
}
|
|
5194
5223
|
]
|
|
5195
5224
|
},
|
|
@@ -5589,18 +5618,23 @@
|
|
|
5589
5618
|
"type": "number"
|
|
5590
5619
|
},
|
|
5591
5620
|
"id": {
|
|
5592
|
-
"description": "Machine value behind `label` when the bucket key is
|
|
5621
|
+
"description": "Machine value behind `label` when the bucket key is not itself the label. `lender`: `label` is the dictionary display name and `id` the normalized lender key — pass `id`, not `label`, back as a `lender` filter value. `conforming`: `label` is `conforming` / `nonConforming` and `id` the raw `true` / `false` flag. `titleCompany` (time-series segment): `label` is the most-used spelling and `id` the normalized name every spelling was merged under — match segments across buckets on `id`. Absent on slices whose `label` is already the machine value.",
|
|
5593
5622
|
"type": "string"
|
|
5594
5623
|
},
|
|
5595
5624
|
"label": {
|
|
5596
5625
|
"type": "string"
|
|
5597
5626
|
},
|
|
5598
5627
|
"segments": {
|
|
5628
|
+
"description": "Present only when the request named a `segment`: this bucket broken down by that second dimension, ranked by the same `measure` and capped at 25 per bucket (the rest is counted in `segmentsOmittedCount`). Documents with no value for the segment are not grouped and appear nowhere here, so segment `count`s sum to at most the bucket's `count`.",
|
|
5599
5629
|
"items": {
|
|
5600
5630
|
"$ref": "#/components/schemas/ChartSegment"
|
|
5601
5631
|
},
|
|
5602
5632
|
"type": "array"
|
|
5603
5633
|
},
|
|
5634
|
+
"segmentsOmittedCount": {
|
|
5635
|
+
"description": "Present only with `segments`: documents in this bucket whose segment value fell past the 25-per-bucket cap. A document COUNT, never a dollar figure. `0` means `segments` is the complete breakdown of every document that carries a segment value.",
|
|
5636
|
+
"type": "number"
|
|
5637
|
+
},
|
|
5604
5638
|
"unattributed": {
|
|
5605
5639
|
"description": "Present and `true` on at most one bucket, which is NOT a real category: it collects the documents this breakdown could not attribute to any value of the slice, and its `label` (`\"(unknown)\"`) is prose, not an identifier. Filter on THIS field, never on the label — a consumer plotting a map or joining the label to a real code must drop this row. It is always the LAST element of `data`, appended after ranking rather than placed by value, so it is the one bucket that does not obey the ordering `measure` describes. It exists so the bars account for the same population the summary reports: a document whose slice field holds no indexed term is absent from a terms breakdown entirely rather than forming a small bucket, so without it a chart silently omits part of its own corpus. That reconciliation is exact for `units`; on an average it is not, because buckets under the five-document floor are dropped and a slice with more than 200 distinct values still truncates — neither loss is collected in this row (the truncated tail is reported response-wide as `omittedCount`; the floor is reported nowhere). Absent when there is nothing unattributed, never `false` and never a zero-valued row.",
|
|
5606
5640
|
"enum": [
|
|
@@ -5653,6 +5687,7 @@
|
|
|
5653
5687
|
"type": "number"
|
|
5654
5688
|
},
|
|
5655
5689
|
"segment": {
|
|
5690
|
+
"description": "The second dimension echoed from the request, or `null` for a one-dimensional chart (then no bucket carries `segments`).",
|
|
5656
5691
|
"nullable": true,
|
|
5657
5692
|
"type": "string"
|
|
5658
5693
|
},
|
|
@@ -5678,16 +5713,26 @@
|
|
|
5678
5713
|
},
|
|
5679
5714
|
"ChartSegment": {
|
|
5680
5715
|
"properties": {
|
|
5716
|
+
"count": {
|
|
5717
|
+
"description": "Documents in this segment of the parent bucket — the denominator behind `value`, whatever the measure.",
|
|
5718
|
+
"type": "number"
|
|
5719
|
+
},
|
|
5720
|
+
"id": {
|
|
5721
|
+
"description": "Machine value behind `label` when the bucket key is not itself the label. `lender`: `label` is the dictionary display name and `id` the normalized lender key — pass `id`, not `label`, back as a `lender` filter value. `conforming`: `label` is `conforming` / `nonConforming` and `id` the raw `true` / `false` flag. `titleCompany` (time-series segment): `label` is the most-used spelling and `id` the normalized name every spelling was merged under — match segments across buckets on `id`. Absent on slices whose `label` is already the machine value.",
|
|
5722
|
+
"type": "string"
|
|
5723
|
+
},
|
|
5681
5724
|
"label": {
|
|
5682
5725
|
"type": "string"
|
|
5683
5726
|
},
|
|
5684
5727
|
"value": {
|
|
5728
|
+
"description": "The requested `measure` over the documents in BOTH this segment and its parent bucket.",
|
|
5685
5729
|
"type": "number"
|
|
5686
5730
|
}
|
|
5687
5731
|
},
|
|
5688
5732
|
"required": [
|
|
5689
5733
|
"label",
|
|
5690
|
-
"value"
|
|
5734
|
+
"value",
|
|
5735
|
+
"count"
|
|
5691
5736
|
],
|
|
5692
5737
|
"type": "object"
|
|
5693
5738
|
},
|
|
@@ -6040,7 +6085,7 @@
|
|
|
6040
6085
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6041
6086
|
},
|
|
6042
6087
|
{
|
|
6043
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
6088
|
+
"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."
|
|
6044
6089
|
}
|
|
6045
6090
|
]
|
|
6046
6091
|
},
|
|
@@ -6423,7 +6468,7 @@
|
|
|
6423
6468
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6424
6469
|
},
|
|
6425
6470
|
{
|
|
6426
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
6471
|
+
"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."
|
|
6427
6472
|
}
|
|
6428
6473
|
]
|
|
6429
6474
|
},
|
|
@@ -6514,6 +6559,16 @@
|
|
|
6514
6559
|
"period": {
|
|
6515
6560
|
"$ref": "#/components/schemas/Period"
|
|
6516
6561
|
},
|
|
6562
|
+
"segment": {
|
|
6563
|
+
"allOf": [
|
|
6564
|
+
{
|
|
6565
|
+
"$ref": "#/components/schemas/CompanySlice"
|
|
6566
|
+
},
|
|
6567
|
+
{
|
|
6568
|
+
"description": "Optional second dimension. Each bucket of `slice` then carries `segments`: the same `measure` broken down by this dimension (e.g. `slice: \"loanType\", segment: \"lender\"` is loan type × lender in one call), top 25 per bucket ranked by `measure`, with the remainder counted in `segmentsOmittedCount`. Omit it and the response is the one-dimensional chart, unchanged. Must differ from `slice`, and cannot be combined with `size` / `after` paging (400)."
|
|
6569
|
+
}
|
|
6570
|
+
]
|
|
6571
|
+
},
|
|
6517
6572
|
"slice": {
|
|
6518
6573
|
"$ref": "#/components/schemas/CompanySlice"
|
|
6519
6574
|
}
|
|
@@ -8424,7 +8479,7 @@
|
|
|
8424
8479
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
8425
8480
|
},
|
|
8426
8481
|
{
|
|
8427
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
8482
|
+
"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."
|
|
8428
8483
|
}
|
|
8429
8484
|
]
|
|
8430
8485
|
},
|
|
@@ -8828,7 +8883,24 @@
|
|
|
8828
8883
|
},
|
|
8829
8884
|
"type": "object"
|
|
8830
8885
|
},
|
|
8886
|
+
"CompanySegment": {
|
|
8887
|
+
"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.",
|
|
8888
|
+
"enum": [
|
|
8889
|
+
"transactionType",
|
|
8890
|
+
"loanType",
|
|
8891
|
+
"city",
|
|
8892
|
+
"county",
|
|
8893
|
+
"state",
|
|
8894
|
+
"zip",
|
|
8895
|
+
"lender",
|
|
8896
|
+
"propertyType",
|
|
8897
|
+
"conforming",
|
|
8898
|
+
"titleCompany"
|
|
8899
|
+
],
|
|
8900
|
+
"type": "string"
|
|
8901
|
+
},
|
|
8831
8902
|
"CompanySlice": {
|
|
8903
|
+
"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`.",
|
|
8832
8904
|
"enum": [
|
|
8833
8905
|
"transactionType",
|
|
8834
8906
|
"loanType",
|
|
@@ -8836,7 +8908,9 @@
|
|
|
8836
8908
|
"county",
|
|
8837
8909
|
"state",
|
|
8838
8910
|
"zip",
|
|
8839
|
-
"lender"
|
|
8911
|
+
"lender",
|
|
8912
|
+
"propertyType",
|
|
8913
|
+
"conforming"
|
|
8840
8914
|
],
|
|
8841
8915
|
"type": "string"
|
|
8842
8916
|
},
|
|
@@ -9130,7 +9204,7 @@
|
|
|
9130
9204
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
9131
9205
|
},
|
|
9132
9206
|
{
|
|
9133
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
9207
|
+
"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."
|
|
9134
9208
|
}
|
|
9135
9209
|
]
|
|
9136
9210
|
},
|
|
@@ -9827,7 +9901,7 @@
|
|
|
9827
9901
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
9828
9902
|
},
|
|
9829
9903
|
{
|
|
9830
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
9904
|
+
"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."
|
|
9831
9905
|
}
|
|
9832
9906
|
]
|
|
9833
9907
|
},
|
|
@@ -10213,7 +10287,7 @@
|
|
|
10213
10287
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
10214
10288
|
},
|
|
10215
10289
|
{
|
|
10216
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
10290
|
+
"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."
|
|
10217
10291
|
}
|
|
10218
10292
|
]
|
|
10219
10293
|
},
|
|
@@ -10308,7 +10382,7 @@
|
|
|
10308
10382
|
"$ref": "#/components/schemas/Period"
|
|
10309
10383
|
},
|
|
10310
10384
|
"segment": {
|
|
10311
|
-
"$ref": "#/components/schemas/
|
|
10385
|
+
"$ref": "#/components/schemas/CompanySegment"
|
|
10312
10386
|
}
|
|
10313
10387
|
},
|
|
10314
10388
|
"type": "object"
|
|
@@ -10392,6 +10466,98 @@
|
|
|
10392
10466
|
],
|
|
10393
10467
|
"type": "object"
|
|
10394
10468
|
},
|
|
10469
|
+
"CreateSavedFilterRequest": {
|
|
10470
|
+
"additionalProperties": false,
|
|
10471
|
+
"properties": {
|
|
10472
|
+
"fidelity": {
|
|
10473
|
+
"description": "How much of the UI state `query` captures: `exact`; `partial` (see `unmapped`); `ui_only` — no runnable query. Defaults from whether `query` is present.",
|
|
10474
|
+
"enum": [
|
|
10475
|
+
"exact",
|
|
10476
|
+
"partial",
|
|
10477
|
+
"ui_only"
|
|
10478
|
+
],
|
|
10479
|
+
"type": "string"
|
|
10480
|
+
},
|
|
10481
|
+
"icon": {
|
|
10482
|
+
"$ref": "#/components/schemas/SavedFilterIcon"
|
|
10483
|
+
},
|
|
10484
|
+
"kind": {
|
|
10485
|
+
"description": "`filter` (default) — a saved search; `view` — a saved CRM table layout (columns / order) kept in `uiState`. Views never carry a `query` and have their own 25-per-target quota. Fixed at create.",
|
|
10486
|
+
"enum": [
|
|
10487
|
+
"filter",
|
|
10488
|
+
"view"
|
|
10489
|
+
],
|
|
10490
|
+
"type": "string"
|
|
10491
|
+
},
|
|
10492
|
+
"name": {
|
|
10493
|
+
"maxLength": 100,
|
|
10494
|
+
"minLength": 1,
|
|
10495
|
+
"type": "string"
|
|
10496
|
+
},
|
|
10497
|
+
"query": {
|
|
10498
|
+
"additionalProperties": {
|
|
10499
|
+
"nullable": true
|
|
10500
|
+
},
|
|
10501
|
+
"description": "The target list operation's request body WITHOUT `pagination` (e.g. `{ flatFilters, filters, sort, period }` for listOriginators). Validated against that operation's schema; unknown filter fields are rejected. Null/omitted for a UI-only filter.",
|
|
10502
|
+
"nullable": true,
|
|
10503
|
+
"type": "object"
|
|
10504
|
+
},
|
|
10505
|
+
"target": {
|
|
10506
|
+
"description": "Which list the filter runs against. Market targets run against that entity's list operation (see `operationId`, e.g. listOriginators); `crm_people` / `crm_companies` are UI-only (filtered client-side).",
|
|
10507
|
+
"enum": [
|
|
10508
|
+
"originators",
|
|
10509
|
+
"agents",
|
|
10510
|
+
"companies",
|
|
10511
|
+
"branches",
|
|
10512
|
+
"offices",
|
|
10513
|
+
"loans",
|
|
10514
|
+
"properties",
|
|
10515
|
+
"sales",
|
|
10516
|
+
"crm_people",
|
|
10517
|
+
"crm_companies"
|
|
10518
|
+
],
|
|
10519
|
+
"type": "string"
|
|
10520
|
+
},
|
|
10521
|
+
"uiState": {
|
|
10522
|
+
"additionalProperties": {
|
|
10523
|
+
"nullable": true
|
|
10524
|
+
},
|
|
10525
|
+
"description": "Opaque client UI state used to restore a filter panel (≤16KB). Not interpreted by the API.",
|
|
10526
|
+
"nullable": true,
|
|
10527
|
+
"type": "object"
|
|
10528
|
+
},
|
|
10529
|
+
"uiStateVersion": {
|
|
10530
|
+
"minimum": 1,
|
|
10531
|
+
"type": "integer"
|
|
10532
|
+
},
|
|
10533
|
+
"unmapped": {
|
|
10534
|
+
"description": "UI filter keys the client could not express in `query` (set with `fidelity: partial`).",
|
|
10535
|
+
"items": {
|
|
10536
|
+
"maxLength": 200,
|
|
10537
|
+
"minLength": 1,
|
|
10538
|
+
"type": "string"
|
|
10539
|
+
},
|
|
10540
|
+
"maxItems": 100,
|
|
10541
|
+
"type": "array"
|
|
10542
|
+
}
|
|
10543
|
+
},
|
|
10544
|
+
"required": [
|
|
10545
|
+
"name",
|
|
10546
|
+
"target"
|
|
10547
|
+
],
|
|
10548
|
+
"type": "object"
|
|
10549
|
+
},
|
|
10550
|
+
"CreateSavedFilterResult": {
|
|
10551
|
+
"properties": {
|
|
10552
|
+
"data": {
|
|
10553
|
+
"$ref": "#/components/schemas/SavedFilter"
|
|
10554
|
+
}
|
|
10555
|
+
},
|
|
10556
|
+
"required": [
|
|
10557
|
+
"data"
|
|
10558
|
+
],
|
|
10559
|
+
"type": "object"
|
|
10560
|
+
},
|
|
10395
10561
|
"CrmActiveCall": {
|
|
10396
10562
|
"nullable": true,
|
|
10397
10563
|
"properties": {
|
|
@@ -10480,6 +10646,10 @@
|
|
|
10480
10646
|
},
|
|
10481
10647
|
"type": "array"
|
|
10482
10648
|
},
|
|
10649
|
+
"occurredAt": {
|
|
10650
|
+
"nullable": true,
|
|
10651
|
+
"type": "number"
|
|
10652
|
+
},
|
|
10483
10653
|
"parentId": {
|
|
10484
10654
|
"nullable": true,
|
|
10485
10655
|
"type": "string"
|
|
@@ -10509,7 +10679,8 @@
|
|
|
10509
10679
|
"actorEmail",
|
|
10510
10680
|
"actorImage",
|
|
10511
10681
|
"createdAt",
|
|
10512
|
-
"editedAt"
|
|
10682
|
+
"editedAt",
|
|
10683
|
+
"occurredAt"
|
|
10513
10684
|
],
|
|
10514
10685
|
"type": "object"
|
|
10515
10686
|
},
|
|
@@ -11646,6 +11817,25 @@
|
|
|
11646
11817
|
],
|
|
11647
11818
|
"type": "object"
|
|
11648
11819
|
},
|
|
11820
|
+
"CrmEditLoggedActivityResult": {
|
|
11821
|
+
"properties": {
|
|
11822
|
+
"data": {
|
|
11823
|
+
"properties": {
|
|
11824
|
+
"updated": {
|
|
11825
|
+
"type": "boolean"
|
|
11826
|
+
}
|
|
11827
|
+
},
|
|
11828
|
+
"required": [
|
|
11829
|
+
"updated"
|
|
11830
|
+
],
|
|
11831
|
+
"type": "object"
|
|
11832
|
+
}
|
|
11833
|
+
},
|
|
11834
|
+
"required": [
|
|
11835
|
+
"data"
|
|
11836
|
+
],
|
|
11837
|
+
"type": "object"
|
|
11838
|
+
},
|
|
11649
11839
|
"CrmEditNoteResult": {
|
|
11650
11840
|
"properties": {
|
|
11651
11841
|
"data": {
|
|
@@ -12940,6 +13130,34 @@
|
|
|
12940
13130
|
],
|
|
12941
13131
|
"type": "object"
|
|
12942
13132
|
},
|
|
13133
|
+
"CrmLogActivityResult": {
|
|
13134
|
+
"properties": {
|
|
13135
|
+
"data": {
|
|
13136
|
+
"properties": {
|
|
13137
|
+
"id": {
|
|
13138
|
+
"type": "string"
|
|
13139
|
+
}
|
|
13140
|
+
},
|
|
13141
|
+
"required": [
|
|
13142
|
+
"id"
|
|
13143
|
+
],
|
|
13144
|
+
"type": "object"
|
|
13145
|
+
}
|
|
13146
|
+
},
|
|
13147
|
+
"required": [
|
|
13148
|
+
"data"
|
|
13149
|
+
],
|
|
13150
|
+
"type": "object"
|
|
13151
|
+
},
|
|
13152
|
+
"CrmLoggedActivityType": {
|
|
13153
|
+
"enum": [
|
|
13154
|
+
"call",
|
|
13155
|
+
"meeting",
|
|
13156
|
+
"email",
|
|
13157
|
+
"task"
|
|
13158
|
+
],
|
|
13159
|
+
"type": "string"
|
|
13160
|
+
},
|
|
12943
13161
|
"CrmMailProvider": {
|
|
12944
13162
|
"enum": [
|
|
12945
13163
|
"google",
|
|
@@ -16117,6 +16335,28 @@
|
|
|
16117
16335
|
],
|
|
16118
16336
|
"type": "string"
|
|
16119
16337
|
},
|
|
16338
|
+
"DeleteSavedFilterResult": {
|
|
16339
|
+
"properties": {
|
|
16340
|
+
"data": {
|
|
16341
|
+
"properties": {
|
|
16342
|
+
"deleted": {
|
|
16343
|
+
"enum": [
|
|
16344
|
+
true
|
|
16345
|
+
],
|
|
16346
|
+
"type": "boolean"
|
|
16347
|
+
}
|
|
16348
|
+
},
|
|
16349
|
+
"required": [
|
|
16350
|
+
"deleted"
|
|
16351
|
+
],
|
|
16352
|
+
"type": "object"
|
|
16353
|
+
}
|
|
16354
|
+
},
|
|
16355
|
+
"required": [
|
|
16356
|
+
"data"
|
|
16357
|
+
],
|
|
16358
|
+
"type": "object"
|
|
16359
|
+
},
|
|
16120
16360
|
"EarlyExitCounterparty": {
|
|
16121
16361
|
"properties": {
|
|
16122
16362
|
"name": {
|
|
@@ -16896,14 +17136,130 @@
|
|
|
16896
17136
|
],
|
|
16897
17137
|
"type": "object"
|
|
16898
17138
|
},
|
|
17139
|
+
"EnrichmentCacheStats": {
|
|
17140
|
+
"properties": {
|
|
17141
|
+
"computedAt": {
|
|
17142
|
+
"description": "ISO 8601 timestamp",
|
|
17143
|
+
"type": "string"
|
|
17144
|
+
},
|
|
17145
|
+
"costUsd": {
|
|
17146
|
+
"description": "`total × unitCostUsd` — upstream spend behind the live table.",
|
|
17147
|
+
"minimum": 0,
|
|
17148
|
+
"type": "number"
|
|
17149
|
+
},
|
|
17150
|
+
"empty": {
|
|
17151
|
+
"description": "Unexpired rows where the provider returned no persons.",
|
|
17152
|
+
"minimum": 0,
|
|
17153
|
+
"type": "integer"
|
|
17154
|
+
},
|
|
17155
|
+
"expired": {
|
|
17156
|
+
"minimum": 0,
|
|
17157
|
+
"type": "integer"
|
|
17158
|
+
},
|
|
17159
|
+
"healthy": {
|
|
17160
|
+
"description": "Unexpired rows with at least one person.",
|
|
17161
|
+
"minimum": 0,
|
|
17162
|
+
"type": "integer"
|
|
17163
|
+
},
|
|
17164
|
+
"memberRows": {
|
|
17165
|
+
"description": "Member entitlement rows across every workspace.",
|
|
17166
|
+
"minimum": 0,
|
|
17167
|
+
"type": "integer"
|
|
17168
|
+
},
|
|
17169
|
+
"partial": {
|
|
17170
|
+
"description": "True when the scan hit its page/time budget; counts are a lower bound.",
|
|
17171
|
+
"type": "boolean"
|
|
17172
|
+
},
|
|
17173
|
+
"savedLookups": {
|
|
17174
|
+
"description": "Member entitlements served from the internal cache rather than a fresh BatchData call (every member beyond the first per property).",
|
|
17175
|
+
"minimum": 0,
|
|
17176
|
+
"type": "integer"
|
|
17177
|
+
},
|
|
17178
|
+
"savingsUsd": {
|
|
17179
|
+
"description": "`savedLookups × unitCostUsd`.",
|
|
17180
|
+
"minimum": 0,
|
|
17181
|
+
"type": "number"
|
|
17182
|
+
},
|
|
17183
|
+
"total": {
|
|
17184
|
+
"description": "Internal property cache rows — one per enriched property.",
|
|
17185
|
+
"minimum": 0,
|
|
17186
|
+
"type": "integer"
|
|
17187
|
+
},
|
|
17188
|
+
"unitCostUsd": {
|
|
17189
|
+
"minimum": 0,
|
|
17190
|
+
"type": "number"
|
|
17191
|
+
}
|
|
17192
|
+
},
|
|
17193
|
+
"required": [
|
|
17194
|
+
"total",
|
|
17195
|
+
"expired",
|
|
17196
|
+
"empty",
|
|
17197
|
+
"healthy",
|
|
17198
|
+
"memberRows",
|
|
17199
|
+
"savedLookups",
|
|
17200
|
+
"costUsd",
|
|
17201
|
+
"savingsUsd",
|
|
17202
|
+
"unitCostUsd",
|
|
17203
|
+
"partial",
|
|
17204
|
+
"computedAt"
|
|
17205
|
+
],
|
|
17206
|
+
"type": "object"
|
|
17207
|
+
},
|
|
17208
|
+
"EnrichmentCharge": {
|
|
17209
|
+
"properties": {
|
|
17210
|
+
"at": {
|
|
17211
|
+
"description": "ISO 8601 time of the debit",
|
|
17212
|
+
"type": "string"
|
|
17213
|
+
},
|
|
17214
|
+
"credits": {
|
|
17215
|
+
"type": "number"
|
|
17216
|
+
},
|
|
17217
|
+
"refresh": {
|
|
17218
|
+
"description": "True when this charge came from a forced re-run",
|
|
17219
|
+
"type": "boolean"
|
|
17220
|
+
}
|
|
17221
|
+
},
|
|
17222
|
+
"required": [
|
|
17223
|
+
"at",
|
|
17224
|
+
"credits",
|
|
17225
|
+
"refresh"
|
|
17226
|
+
],
|
|
17227
|
+
"type": "object"
|
|
17228
|
+
},
|
|
16899
17229
|
"EnrichmentListItem": {
|
|
16900
17230
|
"properties": {
|
|
17231
|
+
"charged": {
|
|
17232
|
+
"description": "Whether the call that produced the current result debited credits. `null` for results stored before charges were recorded.",
|
|
17233
|
+
"nullable": true,
|
|
17234
|
+
"type": "boolean"
|
|
17235
|
+
},
|
|
17236
|
+
"charges": {
|
|
17237
|
+
"description": "Every recorded debit for this property, oldest first. More than one means it was paid for more than once (a `refresh` re-run). `null` when not recorded.",
|
|
17238
|
+
"items": {
|
|
17239
|
+
"$ref": "#/components/schemas/EnrichmentCharge"
|
|
17240
|
+
},
|
|
17241
|
+
"nullable": true,
|
|
17242
|
+
"type": "array"
|
|
17243
|
+
},
|
|
17244
|
+
"creditsCharged": {
|
|
17245
|
+
"description": "Total credits debited for this property across every recorded run, including forced re-runs. `null` when not recorded.",
|
|
17246
|
+
"nullable": true,
|
|
17247
|
+
"type": "number"
|
|
17248
|
+
},
|
|
17249
|
+
"emailCount": {
|
|
17250
|
+
"description": "Email addresses found across every matched person.",
|
|
17251
|
+
"type": "number"
|
|
17252
|
+
},
|
|
16901
17253
|
"enrichedAt": {
|
|
16902
17254
|
"type": "string"
|
|
16903
17255
|
},
|
|
16904
17256
|
"personCount": {
|
|
16905
17257
|
"type": "number"
|
|
16906
17258
|
},
|
|
17259
|
+
"phoneCount": {
|
|
17260
|
+
"description": "Phone numbers found across every matched person. A matched person can have none.",
|
|
17261
|
+
"type": "number"
|
|
17262
|
+
},
|
|
16907
17263
|
"propertyId": {
|
|
16908
17264
|
"type": "string"
|
|
16909
17265
|
},
|
|
@@ -16915,7 +17271,12 @@
|
|
|
16915
17271
|
"propertyId",
|
|
16916
17272
|
"enrichedAt",
|
|
16917
17273
|
"source",
|
|
16918
|
-
"personCount"
|
|
17274
|
+
"personCount",
|
|
17275
|
+
"phoneCount",
|
|
17276
|
+
"emailCount",
|
|
17277
|
+
"charged",
|
|
17278
|
+
"creditsCharged",
|
|
17279
|
+
"charges"
|
|
16919
17280
|
],
|
|
16920
17281
|
"type": "object"
|
|
16921
17282
|
},
|
|
@@ -17742,6 +18103,17 @@
|
|
|
17742
18103
|
],
|
|
17743
18104
|
"type": "object"
|
|
17744
18105
|
},
|
|
18106
|
+
"GetSavedFilterResult": {
|
|
18107
|
+
"properties": {
|
|
18108
|
+
"data": {
|
|
18109
|
+
"$ref": "#/components/schemas/SavedFilter"
|
|
18110
|
+
}
|
|
18111
|
+
},
|
|
18112
|
+
"required": [
|
|
18113
|
+
"data"
|
|
18114
|
+
],
|
|
18115
|
+
"type": "object"
|
|
18116
|
+
},
|
|
17745
18117
|
"HeadcountPoint": {
|
|
17746
18118
|
"properties": {
|
|
17747
18119
|
"active": {
|
|
@@ -18637,7 +19009,7 @@
|
|
|
18637
19009
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
18638
19010
|
},
|
|
18639
19011
|
{
|
|
18640
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
19012
|
+
"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."
|
|
18641
19013
|
}
|
|
18642
19014
|
]
|
|
18643
19015
|
},
|
|
@@ -18719,6 +19091,16 @@
|
|
|
18719
19091
|
"period": {
|
|
18720
19092
|
"$ref": "#/components/schemas/DatedPeriod"
|
|
18721
19093
|
},
|
|
19094
|
+
"segment": {
|
|
19095
|
+
"allOf": [
|
|
19096
|
+
{
|
|
19097
|
+
"$ref": "#/components/schemas/LoanSlice"
|
|
19098
|
+
},
|
|
19099
|
+
{
|
|
19100
|
+
"description": "Optional second dimension. Each bucket of `slice` then carries `segments`: the same `measure` broken down by this dimension (e.g. `slice: \"loanType\", segment: \"lender\"` is loan type × lender in one call), top 25 per bucket ranked by `measure`, with the remainder counted in `segmentsOmittedCount`. Omit it and the response is the one-dimensional chart, unchanged. Must differ from `slice`, and cannot be combined with `size` / `after` paging (400)."
|
|
19101
|
+
}
|
|
19102
|
+
]
|
|
19103
|
+
},
|
|
18722
19104
|
"size": {
|
|
18723
19105
|
"description": "PARTY slices only (`originator`, `broker`, `loanCompany`; 400 on any other slice). Page size for the ranking, 1–1000. Passing `size` (or `after`) turns on paging: the response gains `total` / `totalApproximate` and, when more buckets remain, `nextCursor`, and drops `omittedCount`. Buckets stay ranked by `measure` descending (ties broken by key), and bucket labels stay NMLS ids. Default when only `after` is sent: 200, the fixed chart's bucket count. Paging reaches the top 10,000 ranked buckets.",
|
|
18724
19106
|
"maximum": 1000,
|
|
@@ -19041,7 +19423,7 @@
|
|
|
19041
19423
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
19042
19424
|
},
|
|
19043
19425
|
{
|
|
19044
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
19426
|
+
"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."
|
|
19045
19427
|
}
|
|
19046
19428
|
]
|
|
19047
19429
|
},
|
|
@@ -19202,7 +19584,27 @@
|
|
|
19202
19584
|
],
|
|
19203
19585
|
"type": "object"
|
|
19204
19586
|
},
|
|
19587
|
+
"LoanSegment": {
|
|
19588
|
+
"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.",
|
|
19589
|
+
"enum": [
|
|
19590
|
+
"transactionType",
|
|
19591
|
+
"loanType",
|
|
19592
|
+
"city",
|
|
19593
|
+
"county",
|
|
19594
|
+
"state",
|
|
19595
|
+
"zip",
|
|
19596
|
+
"lender",
|
|
19597
|
+
"propertyType",
|
|
19598
|
+
"conforming",
|
|
19599
|
+
"broker",
|
|
19600
|
+
"loanCompany",
|
|
19601
|
+
"originator",
|
|
19602
|
+
"titleCompany"
|
|
19603
|
+
],
|
|
19604
|
+
"type": "string"
|
|
19605
|
+
},
|
|
19205
19606
|
"LoanSlice": {
|
|
19607
|
+
"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`.",
|
|
19206
19608
|
"enum": [
|
|
19207
19609
|
"transactionType",
|
|
19208
19610
|
"loanType",
|
|
@@ -19211,6 +19613,8 @@
|
|
|
19211
19613
|
"state",
|
|
19212
19614
|
"zip",
|
|
19213
19615
|
"lender",
|
|
19616
|
+
"propertyType",
|
|
19617
|
+
"conforming",
|
|
19214
19618
|
"broker",
|
|
19215
19619
|
"loanCompany",
|
|
19216
19620
|
"originator"
|
|
@@ -19587,7 +19991,7 @@
|
|
|
19587
19991
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
19588
19992
|
},
|
|
19589
19993
|
{
|
|
19590
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
19994
|
+
"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."
|
|
19591
19995
|
}
|
|
19592
19996
|
]
|
|
19593
19997
|
},
|
|
@@ -19888,7 +20292,7 @@
|
|
|
19888
20292
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
19889
20293
|
},
|
|
19890
20294
|
{
|
|
19891
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
20295
|
+
"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."
|
|
19892
20296
|
}
|
|
19893
20297
|
]
|
|
19894
20298
|
},
|
|
@@ -19974,7 +20378,7 @@
|
|
|
19974
20378
|
"$ref": "#/components/schemas/DatedPeriod"
|
|
19975
20379
|
},
|
|
19976
20380
|
"segment": {
|
|
19977
|
-
"$ref": "#/components/schemas/
|
|
20381
|
+
"$ref": "#/components/schemas/LoanSegment"
|
|
19978
20382
|
}
|
|
19979
20383
|
},
|
|
19980
20384
|
"type": "object"
|
|
@@ -23479,7 +23883,7 @@
|
|
|
23479
23883
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
23480
23884
|
},
|
|
23481
23885
|
{
|
|
23482
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
23886
|
+
"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."
|
|
23483
23887
|
}
|
|
23484
23888
|
]
|
|
23485
23889
|
},
|
|
@@ -23570,6 +23974,16 @@
|
|
|
23570
23974
|
"period": {
|
|
23571
23975
|
"$ref": "#/components/schemas/Period"
|
|
23572
23976
|
},
|
|
23977
|
+
"segment": {
|
|
23978
|
+
"allOf": [
|
|
23979
|
+
{
|
|
23980
|
+
"$ref": "#/components/schemas/OriginatorSlice"
|
|
23981
|
+
},
|
|
23982
|
+
{
|
|
23983
|
+
"description": "Optional second dimension. Each bucket of `slice` then carries `segments`: the same `measure` broken down by this dimension (e.g. `slice: \"loanType\", segment: \"lender\"` is loan type × lender in one call), top 25 per bucket ranked by `measure`, with the remainder counted in `segmentsOmittedCount`. Omit it and the response is the one-dimensional chart, unchanged. Must differ from `slice`, and cannot be combined with `size` / `after` paging (400)."
|
|
23984
|
+
}
|
|
23985
|
+
]
|
|
23986
|
+
},
|
|
23573
23987
|
"slice": {
|
|
23574
23988
|
"$ref": "#/components/schemas/OriginatorSlice"
|
|
23575
23989
|
}
|
|
@@ -23986,6 +24400,16 @@
|
|
|
23986
24400
|
"nullable": true,
|
|
23987
24401
|
"type": "number"
|
|
23988
24402
|
},
|
|
24403
|
+
"careerYears": {
|
|
24404
|
+
"description": "Years since the earliest employer start on `records`, to 0.1 — the career length the recruiting signal is judged on. Null when no record carries a start date.",
|
|
24405
|
+
"nullable": true,
|
|
24406
|
+
"type": "number"
|
|
24407
|
+
},
|
|
24408
|
+
"currentTenureYears": {
|
|
24409
|
+
"description": "Years at the current employer (the first employer with an active record), from its earliest record start to today, to 0.1. Null when no employer is active or its start date is unknown. A 365-day year, matching the profile's recruiting signal.",
|
|
24410
|
+
"nullable": true,
|
|
24411
|
+
"type": "number"
|
|
24412
|
+
},
|
|
23989
24413
|
"employerChanges": {
|
|
23990
24414
|
"nullable": true,
|
|
23991
24415
|
"type": "number"
|
|
@@ -23996,6 +24420,37 @@
|
|
|
23996
24420
|
},
|
|
23997
24421
|
"type": "array"
|
|
23998
24422
|
},
|
|
24423
|
+
"recruitingSignal": {
|
|
24424
|
+
"description": "One-line read of this career for recruiting, rule-based over `records` (employers grouped by company NMLS id): no records → `none`; over half the employers missing a start date → `incompleteData`; under 2 career years with one employer → `limitedHistory`; one employer for 2+ years → `singleEmployerCareer`; 5+ years at the current employer with ≤3 employers → `longTermStability`; 3+ employers at ≥0.6 per career year → `highMobility`; under 1 year at the current employer with >1 employer → `recentMove`; 3-4 employers over 5+ years → `multiSponsorships`; otherwise `establishedAtCurrent`. First matching rule wins. `label`/`subtext` are display copy.",
|
|
24425
|
+
"properties": {
|
|
24426
|
+
"code": {
|
|
24427
|
+
"enum": [
|
|
24428
|
+
"singleEmployerCareer",
|
|
24429
|
+
"longTermStability",
|
|
24430
|
+
"establishedAtCurrent",
|
|
24431
|
+
"recentMove",
|
|
24432
|
+
"highMobility",
|
|
24433
|
+
"multiSponsorships",
|
|
24434
|
+
"limitedHistory",
|
|
24435
|
+
"incompleteData",
|
|
24436
|
+
"none"
|
|
24437
|
+
],
|
|
24438
|
+
"type": "string"
|
|
24439
|
+
},
|
|
24440
|
+
"label": {
|
|
24441
|
+
"type": "string"
|
|
24442
|
+
},
|
|
24443
|
+
"subtext": {
|
|
24444
|
+
"type": "string"
|
|
24445
|
+
}
|
|
24446
|
+
},
|
|
24447
|
+
"required": [
|
|
24448
|
+
"code",
|
|
24449
|
+
"label",
|
|
24450
|
+
"subtext"
|
|
24451
|
+
],
|
|
24452
|
+
"type": "object"
|
|
24453
|
+
},
|
|
23999
24454
|
"totalEmployers": {
|
|
24000
24455
|
"type": "number"
|
|
24001
24456
|
},
|
|
@@ -24038,6 +24493,9 @@
|
|
|
24038
24493
|
"nullable": true,
|
|
24039
24494
|
"type": "array"
|
|
24040
24495
|
},
|
|
24496
|
+
"profileInsights": {
|
|
24497
|
+
"$ref": "#/components/schemas/OriginatorProfileInsights"
|
|
24498
|
+
},
|
|
24041
24499
|
"registration": {
|
|
24042
24500
|
"$ref": "#/components/schemas/OriginatorRegistration"
|
|
24043
24501
|
},
|
|
@@ -25550,11 +26008,11 @@
|
|
|
25550
26008
|
"description": "Custom window. A period is a fixed pre-aggregated window and cannot be re-cut, so any bound here switches the response to live transaction data.",
|
|
25551
26009
|
"properties": {
|
|
25552
26010
|
"from": {
|
|
25553
|
-
"pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)
|
|
26011
|
+
"pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
|
|
25554
26012
|
"type": "string"
|
|
25555
26013
|
},
|
|
25556
26014
|
"to": {
|
|
25557
|
-
"pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)
|
|
26015
|
+
"pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
|
|
25558
26016
|
"type": "string"
|
|
25559
26017
|
}
|
|
25560
26018
|
},
|
|
@@ -25831,6 +26289,41 @@
|
|
|
25831
26289
|
],
|
|
25832
26290
|
"type": "object"
|
|
25833
26291
|
},
|
|
26292
|
+
"OriginatorProfileInsights": {
|
|
26293
|
+
"description": "Profile read-outs computed server-side from the LO's production in the requested `period` (default `last12Months`) — the same `volume` / `units` this response reports. Labels and descriptions are display copy; branch on the enum fields.",
|
|
26294
|
+
"properties": {
|
|
26295
|
+
"producerTier": {
|
|
26296
|
+
"description": "From the period's units and volume, first match wins: `topProducer` ≥ 60 units OR ≥ $25M; `strongProducer` ≥ 36 units OR ≥ $12M; `midTier` ≥ 18 units OR ≥ $5M; else `lowVolume`.",
|
|
26297
|
+
"properties": {
|
|
26298
|
+
"description": {
|
|
26299
|
+
"type": "string"
|
|
26300
|
+
},
|
|
26301
|
+
"label": {
|
|
26302
|
+
"type": "string"
|
|
26303
|
+
},
|
|
26304
|
+
"tier": {
|
|
26305
|
+
"enum": [
|
|
26306
|
+
"topProducer",
|
|
26307
|
+
"strongProducer",
|
|
26308
|
+
"midTier",
|
|
26309
|
+
"lowVolume"
|
|
26310
|
+
],
|
|
26311
|
+
"type": "string"
|
|
26312
|
+
}
|
|
26313
|
+
},
|
|
26314
|
+
"required": [
|
|
26315
|
+
"tier",
|
|
26316
|
+
"label",
|
|
26317
|
+
"description"
|
|
26318
|
+
],
|
|
26319
|
+
"type": "object"
|
|
26320
|
+
}
|
|
26321
|
+
},
|
|
26322
|
+
"required": [
|
|
26323
|
+
"producerTier"
|
|
26324
|
+
],
|
|
26325
|
+
"type": "object"
|
|
26326
|
+
},
|
|
25834
26327
|
"OriginatorRegistration": {
|
|
25835
26328
|
"nullable": true,
|
|
25836
26329
|
"properties": {
|
|
@@ -25903,7 +26396,24 @@
|
|
|
25903
26396
|
},
|
|
25904
26397
|
"type": "object"
|
|
25905
26398
|
},
|
|
26399
|
+
"OriginatorSegment": {
|
|
26400
|
+
"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.",
|
|
26401
|
+
"enum": [
|
|
26402
|
+
"transactionType",
|
|
26403
|
+
"loanType",
|
|
26404
|
+
"city",
|
|
26405
|
+
"county",
|
|
26406
|
+
"state",
|
|
26407
|
+
"zip",
|
|
26408
|
+
"lender",
|
|
26409
|
+
"propertyType",
|
|
26410
|
+
"conforming",
|
|
26411
|
+
"titleCompany"
|
|
26412
|
+
],
|
|
26413
|
+
"type": "string"
|
|
26414
|
+
},
|
|
25906
26415
|
"OriginatorSlice": {
|
|
26416
|
+
"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`.",
|
|
25907
26417
|
"enum": [
|
|
25908
26418
|
"transactionType",
|
|
25909
26419
|
"loanType",
|
|
@@ -25911,7 +26421,9 @@
|
|
|
25911
26421
|
"county",
|
|
25912
26422
|
"state",
|
|
25913
26423
|
"zip",
|
|
25914
|
-
"lender"
|
|
26424
|
+
"lender",
|
|
26425
|
+
"propertyType",
|
|
26426
|
+
"conforming"
|
|
25915
26427
|
],
|
|
25916
26428
|
"type": "string"
|
|
25917
26429
|
},
|
|
@@ -26429,7 +26941,7 @@
|
|
|
26429
26941
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
26430
26942
|
},
|
|
26431
26943
|
{
|
|
26432
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
26944
|
+
"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."
|
|
26433
26945
|
}
|
|
26434
26946
|
]
|
|
26435
26947
|
},
|
|
@@ -26739,7 +27251,7 @@
|
|
|
26739
27251
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
26740
27252
|
},
|
|
26741
27253
|
{
|
|
26742
|
-
"description": "Loan-to-value at ORIGINATION (sparse). This is not a current LTV — there is no stored current-LTV field on loans."
|
|
27254
|
+
"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."
|
|
26743
27255
|
}
|
|
26744
27256
|
]
|
|
26745
27257
|
},
|
|
@@ -26834,7 +27346,7 @@
|
|
|
26834
27346
|
"$ref": "#/components/schemas/Period"
|
|
26835
27347
|
},
|
|
26836
27348
|
"segment": {
|
|
26837
|
-
"$ref": "#/components/schemas/
|
|
27349
|
+
"$ref": "#/components/schemas/OriginatorSegment"
|
|
26838
27350
|
}
|
|
26839
27351
|
},
|
|
26840
27352
|
"type": "object"
|
|
@@ -29765,7 +30277,7 @@
|
|
|
29765
30277
|
"properties": {
|
|
29766
30278
|
"asOf": {
|
|
29767
30279
|
"description": "The subscribe day (yyyy-MM-dd). Step 0 replays the backfill window a real subscribe would deliver on this date.",
|
|
29768
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}
|
|
30280
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}",
|
|
29769
30281
|
"type": "string"
|
|
29770
30282
|
},
|
|
29771
30283
|
"backfillDays": {
|
|
@@ -29795,7 +30307,7 @@
|
|
|
29795
30307
|
"steps": {
|
|
29796
30308
|
"description": "Later dates (yyyy-MM-dd) to advance to. Each shows only what is NEW since the previous date — the forward delta the cron would have delivered. Sorted + de-duplicated; capped at 12 dates total.",
|
|
29797
30309
|
"items": {
|
|
29798
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}
|
|
30310
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}",
|
|
29799
30311
|
"type": "string"
|
|
29800
30312
|
},
|
|
29801
30313
|
"type": "array"
|
|
@@ -30601,6 +31113,260 @@
|
|
|
30601
31113
|
],
|
|
30602
31114
|
"type": "object"
|
|
30603
31115
|
},
|
|
31116
|
+
"SavedFilter": {
|
|
31117
|
+
"properties": {
|
|
31118
|
+
"createdAt": {
|
|
31119
|
+
"format": "date-time",
|
|
31120
|
+
"type": "string"
|
|
31121
|
+
},
|
|
31122
|
+
"fidelity": {
|
|
31123
|
+
"description": "How much of the UI state `query` captures: `exact`; `partial` (see `unmapped`); `ui_only` — no runnable query. Defaults from whether `query` is present.",
|
|
31124
|
+
"enum": [
|
|
31125
|
+
"exact",
|
|
31126
|
+
"partial",
|
|
31127
|
+
"ui_only"
|
|
31128
|
+
],
|
|
31129
|
+
"type": "string"
|
|
31130
|
+
},
|
|
31131
|
+
"icon": {
|
|
31132
|
+
"$ref": "#/components/schemas/SavedFilterIcon"
|
|
31133
|
+
},
|
|
31134
|
+
"id": {
|
|
31135
|
+
"type": "string"
|
|
31136
|
+
},
|
|
31137
|
+
"kind": {
|
|
31138
|
+
"description": "`filter` (default) — a saved search; `view` — a saved CRM table layout (columns / order) kept in `uiState`. Views never carry a `query` and have their own 25-per-target quota. Fixed at create.",
|
|
31139
|
+
"enum": [
|
|
31140
|
+
"filter",
|
|
31141
|
+
"view"
|
|
31142
|
+
],
|
|
31143
|
+
"type": "string"
|
|
31144
|
+
},
|
|
31145
|
+
"name": {
|
|
31146
|
+
"type": "string"
|
|
31147
|
+
},
|
|
31148
|
+
"operationId": {
|
|
31149
|
+
"description": "The operation to run `query` against (e.g. `listOriginators`); null for UI-only targets.",
|
|
31150
|
+
"nullable": true,
|
|
31151
|
+
"type": "string"
|
|
31152
|
+
},
|
|
31153
|
+
"query": {
|
|
31154
|
+
"additionalProperties": {
|
|
31155
|
+
"nullable": true
|
|
31156
|
+
},
|
|
31157
|
+
"nullable": true,
|
|
31158
|
+
"type": "object"
|
|
31159
|
+
},
|
|
31160
|
+
"queryVersion": {
|
|
31161
|
+
"type": "integer"
|
|
31162
|
+
},
|
|
31163
|
+
"stale": {
|
|
31164
|
+
"description": "True when the stored `query` no longer validates against the operation (its contract changed). Re-save or adjust before running.",
|
|
31165
|
+
"type": "boolean"
|
|
31166
|
+
},
|
|
31167
|
+
"staleIssues": {
|
|
31168
|
+
"items": {
|
|
31169
|
+
"properties": {
|
|
31170
|
+
"message": {
|
|
31171
|
+
"type": "string"
|
|
31172
|
+
},
|
|
31173
|
+
"path": {
|
|
31174
|
+
"type": "string"
|
|
31175
|
+
}
|
|
31176
|
+
},
|
|
31177
|
+
"required": [
|
|
31178
|
+
"path",
|
|
31179
|
+
"message"
|
|
31180
|
+
],
|
|
31181
|
+
"type": "object"
|
|
31182
|
+
},
|
|
31183
|
+
"type": "array"
|
|
31184
|
+
},
|
|
31185
|
+
"target": {
|
|
31186
|
+
"description": "Which list the filter runs against. Market targets run against that entity's list operation (see `operationId`, e.g. listOriginators); `crm_people` / `crm_companies` are UI-only (filtered client-side).",
|
|
31187
|
+
"enum": [
|
|
31188
|
+
"originators",
|
|
31189
|
+
"agents",
|
|
31190
|
+
"companies",
|
|
31191
|
+
"branches",
|
|
31192
|
+
"offices",
|
|
31193
|
+
"loans",
|
|
31194
|
+
"properties",
|
|
31195
|
+
"sales",
|
|
31196
|
+
"crm_people",
|
|
31197
|
+
"crm_companies"
|
|
31198
|
+
],
|
|
31199
|
+
"type": "string"
|
|
31200
|
+
},
|
|
31201
|
+
"uiState": {
|
|
31202
|
+
"additionalProperties": {
|
|
31203
|
+
"nullable": true
|
|
31204
|
+
},
|
|
31205
|
+
"nullable": true,
|
|
31206
|
+
"type": "object"
|
|
31207
|
+
},
|
|
31208
|
+
"uiStateVersion": {
|
|
31209
|
+
"type": "integer"
|
|
31210
|
+
},
|
|
31211
|
+
"unmapped": {
|
|
31212
|
+
"items": {
|
|
31213
|
+
"type": "string"
|
|
31214
|
+
},
|
|
31215
|
+
"type": "array"
|
|
31216
|
+
},
|
|
31217
|
+
"updatedAt": {
|
|
31218
|
+
"format": "date-time",
|
|
31219
|
+
"type": "string"
|
|
31220
|
+
},
|
|
31221
|
+
"visibility": {
|
|
31222
|
+
"description": "Always `private` in v1.",
|
|
31223
|
+
"enum": [
|
|
31224
|
+
"private",
|
|
31225
|
+
"organization",
|
|
31226
|
+
"shared"
|
|
31227
|
+
],
|
|
31228
|
+
"type": "string"
|
|
31229
|
+
}
|
|
31230
|
+
},
|
|
31231
|
+
"required": [
|
|
31232
|
+
"id",
|
|
31233
|
+
"name",
|
|
31234
|
+
"target",
|
|
31235
|
+
"kind",
|
|
31236
|
+
"icon",
|
|
31237
|
+
"query",
|
|
31238
|
+
"queryVersion",
|
|
31239
|
+
"uiState",
|
|
31240
|
+
"uiStateVersion",
|
|
31241
|
+
"fidelity",
|
|
31242
|
+
"unmapped",
|
|
31243
|
+
"visibility",
|
|
31244
|
+
"operationId",
|
|
31245
|
+
"stale",
|
|
31246
|
+
"staleIssues",
|
|
31247
|
+
"createdAt",
|
|
31248
|
+
"updatedAt"
|
|
31249
|
+
],
|
|
31250
|
+
"type": "object"
|
|
31251
|
+
},
|
|
31252
|
+
"SavedFilterError": {
|
|
31253
|
+
"properties": {
|
|
31254
|
+
"code": {
|
|
31255
|
+
"description": "`QUOTA_EXCEEDED` (409, 25 per target + kind).",
|
|
31256
|
+
"type": "string"
|
|
31257
|
+
},
|
|
31258
|
+
"error": {
|
|
31259
|
+
"type": "string"
|
|
31260
|
+
},
|
|
31261
|
+
"issues": {
|
|
31262
|
+
"items": {
|
|
31263
|
+
"properties": {
|
|
31264
|
+
"message": {
|
|
31265
|
+
"type": "string"
|
|
31266
|
+
},
|
|
31267
|
+
"path": {
|
|
31268
|
+
"type": "string"
|
|
31269
|
+
}
|
|
31270
|
+
},
|
|
31271
|
+
"required": [
|
|
31272
|
+
"path",
|
|
31273
|
+
"message"
|
|
31274
|
+
],
|
|
31275
|
+
"type": "object"
|
|
31276
|
+
},
|
|
31277
|
+
"type": "array"
|
|
31278
|
+
}
|
|
31279
|
+
},
|
|
31280
|
+
"required": [
|
|
31281
|
+
"error"
|
|
31282
|
+
],
|
|
31283
|
+
"type": "object"
|
|
31284
|
+
},
|
|
31285
|
+
"SavedFilterIcon": {
|
|
31286
|
+
"description": "Optional marker: a color dot, a tinted icon, or an emoji.",
|
|
31287
|
+
"oneOf": [
|
|
31288
|
+
{
|
|
31289
|
+
"properties": {
|
|
31290
|
+
"color": {
|
|
31291
|
+
"pattern": "^#[0-9a-fA-F]{6}$",
|
|
31292
|
+
"type": "string"
|
|
31293
|
+
},
|
|
31294
|
+
"type": {
|
|
31295
|
+
"enum": [
|
|
31296
|
+
"color"
|
|
31297
|
+
],
|
|
31298
|
+
"type": "string"
|
|
31299
|
+
}
|
|
31300
|
+
},
|
|
31301
|
+
"required": [
|
|
31302
|
+
"type",
|
|
31303
|
+
"color"
|
|
31304
|
+
],
|
|
31305
|
+
"type": "object"
|
|
31306
|
+
},
|
|
31307
|
+
{
|
|
31308
|
+
"properties": {
|
|
31309
|
+
"color": {
|
|
31310
|
+
"pattern": "^#[0-9a-fA-F]{6}$",
|
|
31311
|
+
"type": "string"
|
|
31312
|
+
},
|
|
31313
|
+
"icon": {
|
|
31314
|
+
"pattern": "^[A-Za-z][A-Za-z0-9]{0,63}$",
|
|
31315
|
+
"type": "string"
|
|
31316
|
+
},
|
|
31317
|
+
"type": {
|
|
31318
|
+
"enum": [
|
|
31319
|
+
"icon"
|
|
31320
|
+
],
|
|
31321
|
+
"type": "string"
|
|
31322
|
+
}
|
|
31323
|
+
},
|
|
31324
|
+
"required": [
|
|
31325
|
+
"type",
|
|
31326
|
+
"icon",
|
|
31327
|
+
"color"
|
|
31328
|
+
],
|
|
31329
|
+
"type": "object"
|
|
31330
|
+
},
|
|
31331
|
+
{
|
|
31332
|
+
"properties": {
|
|
31333
|
+
"emoji": {
|
|
31334
|
+
"maxLength": 16,
|
|
31335
|
+
"minLength": 1,
|
|
31336
|
+
"type": "string"
|
|
31337
|
+
},
|
|
31338
|
+
"type": {
|
|
31339
|
+
"enum": [
|
|
31340
|
+
"emoji"
|
|
31341
|
+
],
|
|
31342
|
+
"type": "string"
|
|
31343
|
+
}
|
|
31344
|
+
},
|
|
31345
|
+
"required": [
|
|
31346
|
+
"type",
|
|
31347
|
+
"emoji"
|
|
31348
|
+
],
|
|
31349
|
+
"type": "object"
|
|
31350
|
+
},
|
|
31351
|
+
{
|
|
31352
|
+
"nullable": true
|
|
31353
|
+
}
|
|
31354
|
+
]
|
|
31355
|
+
},
|
|
31356
|
+
"SavedFilterList": {
|
|
31357
|
+
"properties": {
|
|
31358
|
+
"data": {
|
|
31359
|
+
"items": {
|
|
31360
|
+
"$ref": "#/components/schemas/SavedFilter"
|
|
31361
|
+
},
|
|
31362
|
+
"type": "array"
|
|
31363
|
+
}
|
|
31364
|
+
},
|
|
31365
|
+
"required": [
|
|
31366
|
+
"data"
|
|
31367
|
+
],
|
|
31368
|
+
"type": "object"
|
|
31369
|
+
},
|
|
30604
31370
|
"ScoredBreakdownRequest": {
|
|
30605
31371
|
"properties": {
|
|
30606
31372
|
"period": {
|
|
@@ -30945,7 +31711,7 @@
|
|
|
30945
31711
|
"SimpleTimeSeriesSegment": {
|
|
30946
31712
|
"properties": {
|
|
30947
31713
|
"id": {
|
|
30948
|
-
"description": "Machine value behind `label` when the bucket key is
|
|
31714
|
+
"description": "Machine value behind `label` when the bucket key is not itself the label. `lender`: `label` is the dictionary display name and `id` the normalized lender key — pass `id`, not `label`, back as a `lender` filter value. `conforming`: `label` is `conforming` / `nonConforming` and `id` the raw `true` / `false` flag. `titleCompany` (time-series segment): `label` is the most-used spelling and `id` the normalized name every spelling was merged under — match segments across buckets on `id`. Absent on slices whose `label` is already the machine value.",
|
|
30949
31715
|
"type": "string"
|
|
30950
31716
|
},
|
|
30951
31717
|
"label": {
|
|
@@ -31495,6 +32261,70 @@
|
|
|
31495
32261
|
},
|
|
31496
32262
|
"type": "object"
|
|
31497
32263
|
},
|
|
32264
|
+
"UpdateSavedFilterRequest": {
|
|
32265
|
+
"additionalProperties": false,
|
|
32266
|
+
"properties": {
|
|
32267
|
+
"fidelity": {
|
|
32268
|
+
"description": "How much of the UI state `query` captures: `exact`; `partial` (see `unmapped`); `ui_only` — no runnable query. Defaults from whether `query` is present.",
|
|
32269
|
+
"enum": [
|
|
32270
|
+
"exact",
|
|
32271
|
+
"partial",
|
|
32272
|
+
"ui_only"
|
|
32273
|
+
],
|
|
32274
|
+
"type": "string"
|
|
32275
|
+
},
|
|
32276
|
+
"icon": {
|
|
32277
|
+
"$ref": "#/components/schemas/SavedFilterIcon"
|
|
32278
|
+
},
|
|
32279
|
+
"name": {
|
|
32280
|
+
"maxLength": 100,
|
|
32281
|
+
"minLength": 1,
|
|
32282
|
+
"type": "string"
|
|
32283
|
+
},
|
|
32284
|
+
"query": {
|
|
32285
|
+
"additionalProperties": {
|
|
32286
|
+
"nullable": true
|
|
32287
|
+
},
|
|
32288
|
+
"description": "The target list operation's request body WITHOUT `pagination` (e.g. `{ flatFilters, filters, sort, period }` for listOriginators). Validated against that operation's schema; unknown filter fields are rejected. Null/omitted for a UI-only filter.",
|
|
32289
|
+
"nullable": true,
|
|
32290
|
+
"type": "object"
|
|
32291
|
+
},
|
|
32292
|
+
"uiState": {
|
|
32293
|
+
"additionalProperties": {
|
|
32294
|
+
"nullable": true
|
|
32295
|
+
},
|
|
32296
|
+
"description": "Opaque client UI state used to restore a filter panel (≤16KB). Not interpreted by the API.",
|
|
32297
|
+
"nullable": true,
|
|
32298
|
+
"type": "object"
|
|
32299
|
+
},
|
|
32300
|
+
"uiStateVersion": {
|
|
32301
|
+
"minimum": 1,
|
|
32302
|
+
"type": "integer"
|
|
32303
|
+
},
|
|
32304
|
+
"unmapped": {
|
|
32305
|
+
"description": "UI filter keys the client could not express in `query` (set with `fidelity: partial`).",
|
|
32306
|
+
"items": {
|
|
32307
|
+
"maxLength": 200,
|
|
32308
|
+
"minLength": 1,
|
|
32309
|
+
"type": "string"
|
|
32310
|
+
},
|
|
32311
|
+
"maxItems": 100,
|
|
32312
|
+
"type": "array"
|
|
32313
|
+
}
|
|
32314
|
+
},
|
|
32315
|
+
"type": "object"
|
|
32316
|
+
},
|
|
32317
|
+
"UpdateSavedFilterResult": {
|
|
32318
|
+
"properties": {
|
|
32319
|
+
"data": {
|
|
32320
|
+
"$ref": "#/components/schemas/SavedFilter"
|
|
32321
|
+
}
|
|
32322
|
+
},
|
|
32323
|
+
"required": [
|
|
32324
|
+
"data"
|
|
32325
|
+
],
|
|
32326
|
+
"type": "object"
|
|
32327
|
+
},
|
|
31498
32328
|
"WatchedAgent": {
|
|
31499
32329
|
"properties": {
|
|
31500
32330
|
"addedAt": {
|
|
@@ -31746,7 +32576,7 @@
|
|
|
31746
32576
|
"info": {
|
|
31747
32577
|
"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 1,000 rows per delivery: no entitlement required.** Available to\n every authenticated caller.\n- **Above 1,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.",
|
|
31748
32578
|
"title": "ModelMatch API",
|
|
31749
|
-
"version": "3.
|
|
32579
|
+
"version": "3.63.0"
|
|
31750
32580
|
},
|
|
31751
32581
|
"openapi": "3.1.0",
|
|
31752
32582
|
"paths": {
|
|
@@ -35064,6 +35894,99 @@
|
|
|
35064
35894
|
]
|
|
35065
35895
|
}
|
|
35066
35896
|
},
|
|
35897
|
+
"/originators/{nmlsId}/breakdowns/title-companies": {
|
|
35898
|
+
"post": {
|
|
35899
|
+
"description": "Ranks the title companies on this entity's loans (recorded deeds, `recording_date` window — the same population and period axis as every other loans breakdown). Spellings of one company are MERGED: `label` is its most-used spelling, `id` the normalized name every spelling was grouped under (legal-form and filler words such as `inc`, `llc`, `co`, `company`, `title`, `escrow` removed; `natl` → `national`). Placeholder entries meaning \"no title company recorded\" (`none available` and its misspellings, `unknown`, `n/a`, …) and names shorter than 3 characters are excluded rather than ranked. `attorney` and `accommodation` are kept: they say who closed. `pctUnits` / `pctVolume` are shares of the entity's WHOLE loan population in the window, including loans with no title company, so they do not sum to 100 across the page. Pages of up to 100 via `pagination`.",
|
|
35900
|
+
"operationId": "originatorTitleCompanies",
|
|
35901
|
+
"parameters": [
|
|
35902
|
+
{
|
|
35903
|
+
"description": "Originator NMLS ID",
|
|
35904
|
+
"in": "path",
|
|
35905
|
+
"name": "nmlsId",
|
|
35906
|
+
"required": true,
|
|
35907
|
+
"schema": {
|
|
35908
|
+
"description": "Originator NMLS ID",
|
|
35909
|
+
"type": "string"
|
|
35910
|
+
}
|
|
35911
|
+
}
|
|
35912
|
+
],
|
|
35913
|
+
"requestBody": {
|
|
35914
|
+
"content": {
|
|
35915
|
+
"application/json": {
|
|
35916
|
+
"schema": {
|
|
35917
|
+
"$ref": "#/components/schemas/BreakdownRequest"
|
|
35918
|
+
}
|
|
35919
|
+
}
|
|
35920
|
+
}
|
|
35921
|
+
},
|
|
35922
|
+
"responses": {
|
|
35923
|
+
"200": {
|
|
35924
|
+
"content": {
|
|
35925
|
+
"application/json": {
|
|
35926
|
+
"schema": {
|
|
35927
|
+
"$ref": "#/components/schemas/BreakdownResponse"
|
|
35928
|
+
}
|
|
35929
|
+
}
|
|
35930
|
+
},
|
|
35931
|
+
"description": "Breakdown of the entity's loans by title company"
|
|
35932
|
+
},
|
|
35933
|
+
"400": {
|
|
35934
|
+
"content": {
|
|
35935
|
+
"application/json": {
|
|
35936
|
+
"schema": {
|
|
35937
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
35938
|
+
}
|
|
35939
|
+
}
|
|
35940
|
+
},
|
|
35941
|
+
"description": "Validation error"
|
|
35942
|
+
},
|
|
35943
|
+
"401": {
|
|
35944
|
+
"content": {
|
|
35945
|
+
"application/json": {
|
|
35946
|
+
"schema": {
|
|
35947
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
35948
|
+
}
|
|
35949
|
+
}
|
|
35950
|
+
},
|
|
35951
|
+
"description": "Unauthorized"
|
|
35952
|
+
},
|
|
35953
|
+
"403": {
|
|
35954
|
+
"content": {
|
|
35955
|
+
"application/json": {
|
|
35956
|
+
"schema": {
|
|
35957
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
35958
|
+
}
|
|
35959
|
+
}
|
|
35960
|
+
},
|
|
35961
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
35962
|
+
},
|
|
35963
|
+
"404": {
|
|
35964
|
+
"content": {
|
|
35965
|
+
"application/json": {
|
|
35966
|
+
"schema": {
|
|
35967
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
35968
|
+
}
|
|
35969
|
+
}
|
|
35970
|
+
},
|
|
35971
|
+
"description": "Not found"
|
|
35972
|
+
},
|
|
35973
|
+
"413": {
|
|
35974
|
+
"content": {
|
|
35975
|
+
"application/json": {
|
|
35976
|
+
"schema": {
|
|
35977
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
35978
|
+
}
|
|
35979
|
+
}
|
|
35980
|
+
},
|
|
35981
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
35982
|
+
}
|
|
35983
|
+
},
|
|
35984
|
+
"summary": "Title companies on this LO's loans (spellings merged)",
|
|
35985
|
+
"tags": [
|
|
35986
|
+
"Originators"
|
|
35987
|
+
]
|
|
35988
|
+
}
|
|
35989
|
+
},
|
|
35067
35990
|
"/originators/{nmlsId}/breakdowns/zip-codes": {
|
|
35068
35991
|
"post": {
|
|
35069
35992
|
"operationId": "originatorZipCodes",
|
|
@@ -35447,7 +36370,7 @@
|
|
|
35447
36370
|
"schema": {
|
|
35448
36371
|
"description": "Individual NMLS id.",
|
|
35449
36372
|
"example": "3352",
|
|
35450
|
-
"pattern": "^\\d
|
|
36373
|
+
"pattern": "^\\d+$",
|
|
35451
36374
|
"type": "string"
|
|
35452
36375
|
}
|
|
35453
36376
|
}
|
|
@@ -35585,7 +36508,7 @@
|
|
|
35585
36508
|
"schema": {
|
|
35586
36509
|
"description": "ECS task id returned by the launch route.",
|
|
35587
36510
|
"example": "0123456789abcdef0123456789abcdef",
|
|
35588
|
-
"pattern": "^[a-f0-9]{32}
|
|
36511
|
+
"pattern": "^[a-f0-9]{32}$",
|
|
35589
36512
|
"type": "string"
|
|
35590
36513
|
}
|
|
35591
36514
|
}
|
|
@@ -40197,10 +41120,10 @@
|
|
|
40197
41120
|
]
|
|
40198
41121
|
}
|
|
40199
41122
|
},
|
|
40200
|
-
"/v1/branches/{nmlsId}/
|
|
41123
|
+
"/v1/branches/{nmlsId}/breakdowns/title-companies": {
|
|
40201
41124
|
"post": {
|
|
40202
|
-
"description": "
|
|
40203
|
-
"operationId": "
|
|
41125
|
+
"description": "Ranks the title companies on this entity's loans (recorded deeds, `recording_date` window — the same population and period axis as every other loans breakdown). Spellings of one company are MERGED: `label` is its most-used spelling, `id` the normalized name every spelling was grouped under (legal-form and filler words such as `inc`, `llc`, `co`, `company`, `title`, `escrow` removed; `natl` → `national`). Placeholder entries meaning \"no title company recorded\" (`none available` and its misspellings, `unknown`, `n/a`, …) and names shorter than 3 characters are excluded rather than ranked. `attorney` and `accommodation` are kept: they say who closed. `pctUnits` / `pctVolume` are shares of the entity's WHOLE loan population in the window, including loans with no title company, so they do not sum to 100 across the page. Pages of up to 100 via `pagination`.",
|
|
41126
|
+
"operationId": "branchTitleCompanies",
|
|
40204
41127
|
"parameters": [
|
|
40205
41128
|
{
|
|
40206
41129
|
"description": "Branch NMLS ID",
|
|
@@ -40217,7 +41140,7 @@
|
|
|
40217
41140
|
"content": {
|
|
40218
41141
|
"application/json": {
|
|
40219
41142
|
"schema": {
|
|
40220
|
-
"$ref": "#/components/schemas/
|
|
41143
|
+
"$ref": "#/components/schemas/BreakdownRequest"
|
|
40221
41144
|
}
|
|
40222
41145
|
}
|
|
40223
41146
|
}
|
|
@@ -40227,11 +41150,11 @@
|
|
|
40227
41150
|
"content": {
|
|
40228
41151
|
"application/json": {
|
|
40229
41152
|
"schema": {
|
|
40230
|
-
"$ref": "#/components/schemas/
|
|
41153
|
+
"$ref": "#/components/schemas/BreakdownResponse"
|
|
40231
41154
|
}
|
|
40232
41155
|
}
|
|
40233
41156
|
},
|
|
40234
|
-
"description": "
|
|
41157
|
+
"description": "Breakdown of the entity's loans by title company"
|
|
40235
41158
|
},
|
|
40236
41159
|
"400": {
|
|
40237
41160
|
"content": {
|
|
@@ -40284,16 +41207,16 @@
|
|
|
40284
41207
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
40285
41208
|
}
|
|
40286
41209
|
},
|
|
40287
|
-
"summary": "
|
|
41210
|
+
"summary": "Title companies on this branch's loans (spellings merged)",
|
|
40288
41211
|
"tags": [
|
|
40289
41212
|
"Branches"
|
|
40290
41213
|
]
|
|
40291
41214
|
}
|
|
40292
41215
|
},
|
|
40293
|
-
"/v1/branches/{nmlsId}/
|
|
41216
|
+
"/v1/branches/{nmlsId}/loans": {
|
|
40294
41217
|
"post": {
|
|
40295
|
-
"description": "
|
|
40296
|
-
"operationId": "
|
|
41218
|
+
"description": "Returns the individual loans attributed to this branch office — the branch's own book, not its parent company's. Accepts the same filters, sorts and pagination as the main loan search. Attribution comes from public record, so this is the branch's recorded footprint and can be smaller than the production totals on `GET /v1/branches/{nmlsId}`.",
|
|
41219
|
+
"operationId": "branchLoans",
|
|
40297
41220
|
"parameters": [
|
|
40298
41221
|
{
|
|
40299
41222
|
"description": "Branch NMLS ID",
|
|
@@ -40310,7 +41233,7 @@
|
|
|
40310
41233
|
"content": {
|
|
40311
41234
|
"application/json": {
|
|
40312
41235
|
"schema": {
|
|
40313
|
-
"$ref": "#/components/schemas/
|
|
41236
|
+
"$ref": "#/components/schemas/LoanListRequest"
|
|
40314
41237
|
}
|
|
40315
41238
|
}
|
|
40316
41239
|
}
|
|
@@ -40320,11 +41243,11 @@
|
|
|
40320
41243
|
"content": {
|
|
40321
41244
|
"application/json": {
|
|
40322
41245
|
"schema": {
|
|
40323
|
-
"$ref": "#/components/schemas/
|
|
41246
|
+
"$ref": "#/components/schemas/LoanListResponse"
|
|
40324
41247
|
}
|
|
40325
41248
|
}
|
|
40326
41249
|
},
|
|
40327
|
-
"description": "Paginated
|
|
41250
|
+
"description": "Paginated list of loans written by this branch"
|
|
40328
41251
|
},
|
|
40329
41252
|
"400": {
|
|
40330
41253
|
"content": {
|
|
@@ -40364,7 +41287,7 @@
|
|
|
40364
41287
|
}
|
|
40365
41288
|
}
|
|
40366
41289
|
},
|
|
40367
|
-
"description": "
|
|
41290
|
+
"description": "Not found"
|
|
40368
41291
|
},
|
|
40369
41292
|
"413": {
|
|
40370
41293
|
"content": {
|
|
@@ -40377,101 +41300,33 @@
|
|
|
40377
41300
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
40378
41301
|
}
|
|
40379
41302
|
},
|
|
40380
|
-
"summary": "
|
|
41303
|
+
"summary": "Loans written by this branch",
|
|
40381
41304
|
"tags": [
|
|
40382
41305
|
"Branches"
|
|
40383
41306
|
]
|
|
40384
41307
|
}
|
|
40385
41308
|
},
|
|
40386
|
-
"/v1/
|
|
41309
|
+
"/v1/branches/{nmlsId}/roster": {
|
|
40387
41310
|
"post": {
|
|
40388
|
-
"description": "
|
|
40389
|
-
"operationId": "
|
|
40390
|
-
"
|
|
40391
|
-
|
|
40392
|
-
"
|
|
40393
|
-
|
|
40394
|
-
|
|
40395
|
-
|
|
41311
|
+
"description": "The loan officers currently registered to this branch location who hold an active sponsorship or registration — one row per person, with current employer, tenure, years in the industry, manager flags and collected contact info. This is the LICENSING roster; for the loan officers whose loans public record attributes to the branch, use `branchOriginators`.",
|
|
41312
|
+
"operationId": "branchRoster",
|
|
41313
|
+
"parameters": [
|
|
41314
|
+
{
|
|
41315
|
+
"description": "Branch NMLS ID",
|
|
41316
|
+
"in": "path",
|
|
41317
|
+
"name": "nmlsId",
|
|
41318
|
+
"required": true,
|
|
41319
|
+
"schema": {
|
|
41320
|
+
"description": "Branch NMLS ID",
|
|
41321
|
+
"type": "string"
|
|
40396
41322
|
}
|
|
40397
41323
|
}
|
|
40398
|
-
|
|
40399
|
-
"responses": {
|
|
40400
|
-
"200": {
|
|
40401
|
-
"content": {
|
|
40402
|
-
"application/json": {
|
|
40403
|
-
"schema": {
|
|
40404
|
-
"$ref": "#/components/schemas/CompanyListResponse"
|
|
40405
|
-
}
|
|
40406
|
-
}
|
|
40407
|
-
},
|
|
40408
|
-
"description": "Paginated list of companies"
|
|
40409
|
-
},
|
|
40410
|
-
"400": {
|
|
40411
|
-
"content": {
|
|
40412
|
-
"application/json": {
|
|
40413
|
-
"schema": {
|
|
40414
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
40415
|
-
}
|
|
40416
|
-
}
|
|
40417
|
-
},
|
|
40418
|
-
"description": "Validation error. Includes unresolvable location filters: a `city`/`county`/`state`/`zip` value that does not match a recognized location returns 400 rather than an empty result set. Resolve the name with `instantSearch` (use an id from its `results.locations[]`) or `suggestLocations` (use the `id` of a `source: \"dictionary\"` result), then pass that id back as the filter value."
|
|
40419
|
-
},
|
|
40420
|
-
"401": {
|
|
40421
|
-
"content": {
|
|
40422
|
-
"application/json": {
|
|
40423
|
-
"schema": {
|
|
40424
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
40425
|
-
}
|
|
40426
|
-
}
|
|
40427
|
-
},
|
|
40428
|
-
"description": "Unauthorized"
|
|
40429
|
-
},
|
|
40430
|
-
"403": {
|
|
40431
|
-
"content": {
|
|
40432
|
-
"application/json": {
|
|
40433
|
-
"schema": {
|
|
40434
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
40435
|
-
}
|
|
40436
|
-
}
|
|
40437
|
-
},
|
|
40438
|
-
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
40439
|
-
},
|
|
40440
|
-
"404": {
|
|
40441
|
-
"content": {
|
|
40442
|
-
"application/json": {
|
|
40443
|
-
"schema": {
|
|
40444
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
40445
|
-
}
|
|
40446
|
-
}
|
|
40447
|
-
},
|
|
40448
|
-
"description": "Not found"
|
|
40449
|
-
},
|
|
40450
|
-
"413": {
|
|
40451
|
-
"content": {
|
|
40452
|
-
"application/json": {
|
|
40453
|
-
"schema": {
|
|
40454
|
-
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
40455
|
-
}
|
|
40456
|
-
}
|
|
40457
|
-
},
|
|
40458
|
-
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
40459
|
-
}
|
|
40460
|
-
},
|
|
40461
|
-
"summary": "Search companies with filters",
|
|
40462
|
-
"tags": [
|
|
40463
|
-
"Companies"
|
|
40464
|
-
]
|
|
40465
|
-
}
|
|
40466
|
-
},
|
|
40467
|
-
"/v1/companies/analytics/chart": {
|
|
40468
|
-
"post": {
|
|
40469
|
-
"operationId": "companyAnalyticsChart",
|
|
41324
|
+
],
|
|
40470
41325
|
"requestBody": {
|
|
40471
41326
|
"content": {
|
|
40472
41327
|
"application/json": {
|
|
40473
41328
|
"schema": {
|
|
40474
|
-
"$ref": "#/components/schemas/
|
|
41329
|
+
"$ref": "#/components/schemas/BranchRosterRequest"
|
|
40475
41330
|
}
|
|
40476
41331
|
}
|
|
40477
41332
|
}
|
|
@@ -40481,11 +41336,172 @@
|
|
|
40481
41336
|
"content": {
|
|
40482
41337
|
"application/json": {
|
|
40483
41338
|
"schema": {
|
|
40484
|
-
"$ref": "#/components/schemas/
|
|
41339
|
+
"$ref": "#/components/schemas/BranchRosterResponse"
|
|
40485
41340
|
}
|
|
40486
41341
|
}
|
|
40487
41342
|
},
|
|
40488
|
-
"description": "
|
|
41343
|
+
"description": "Paginated roster"
|
|
41344
|
+
},
|
|
41345
|
+
"400": {
|
|
41346
|
+
"content": {
|
|
41347
|
+
"application/json": {
|
|
41348
|
+
"schema": {
|
|
41349
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
41350
|
+
}
|
|
41351
|
+
}
|
|
41352
|
+
},
|
|
41353
|
+
"description": "Validation error"
|
|
41354
|
+
},
|
|
41355
|
+
"401": {
|
|
41356
|
+
"content": {
|
|
41357
|
+
"application/json": {
|
|
41358
|
+
"schema": {
|
|
41359
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
41360
|
+
}
|
|
41361
|
+
}
|
|
41362
|
+
},
|
|
41363
|
+
"description": "Unauthorized"
|
|
41364
|
+
},
|
|
41365
|
+
"403": {
|
|
41366
|
+
"content": {
|
|
41367
|
+
"application/json": {
|
|
41368
|
+
"schema": {
|
|
41369
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
41370
|
+
}
|
|
41371
|
+
}
|
|
41372
|
+
},
|
|
41373
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
41374
|
+
},
|
|
41375
|
+
"404": {
|
|
41376
|
+
"content": {
|
|
41377
|
+
"application/json": {
|
|
41378
|
+
"schema": {
|
|
41379
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
41380
|
+
}
|
|
41381
|
+
}
|
|
41382
|
+
},
|
|
41383
|
+
"description": "Branch not found"
|
|
41384
|
+
},
|
|
41385
|
+
"413": {
|
|
41386
|
+
"content": {
|
|
41387
|
+
"application/json": {
|
|
41388
|
+
"schema": {
|
|
41389
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
41390
|
+
}
|
|
41391
|
+
}
|
|
41392
|
+
},
|
|
41393
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
41394
|
+
}
|
|
41395
|
+
},
|
|
41396
|
+
"summary": "Loan officers on this branch's current roster",
|
|
41397
|
+
"tags": [
|
|
41398
|
+
"Branches"
|
|
41399
|
+
]
|
|
41400
|
+
}
|
|
41401
|
+
},
|
|
41402
|
+
"/v1/companies": {
|
|
41403
|
+
"post": {
|
|
41404
|
+
"description": "Search and list individual mortgage companies with filters — one row per company. Filter by name, NMLS ID, location (state, county, city, zip), and production metrics (loan volume, units, market share) by period and geography, with sorting and cursor pagination. This is the per-company record search: use it to find specific mortgage lenders/companies or build a filtered company list. (For a single company by ID use the company detail endpoint.) If you only need how many companies match and not the records themselves, send the same request body to `countCompanies`.",
|
|
41405
|
+
"operationId": "listCompanies",
|
|
41406
|
+
"requestBody": {
|
|
41407
|
+
"content": {
|
|
41408
|
+
"application/json": {
|
|
41409
|
+
"schema": {
|
|
41410
|
+
"$ref": "#/components/schemas/CompanyListRequest"
|
|
41411
|
+
}
|
|
41412
|
+
}
|
|
41413
|
+
}
|
|
41414
|
+
},
|
|
41415
|
+
"responses": {
|
|
41416
|
+
"200": {
|
|
41417
|
+
"content": {
|
|
41418
|
+
"application/json": {
|
|
41419
|
+
"schema": {
|
|
41420
|
+
"$ref": "#/components/schemas/CompanyListResponse"
|
|
41421
|
+
}
|
|
41422
|
+
}
|
|
41423
|
+
},
|
|
41424
|
+
"description": "Paginated list of companies"
|
|
41425
|
+
},
|
|
41426
|
+
"400": {
|
|
41427
|
+
"content": {
|
|
41428
|
+
"application/json": {
|
|
41429
|
+
"schema": {
|
|
41430
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
41431
|
+
}
|
|
41432
|
+
}
|
|
41433
|
+
},
|
|
41434
|
+
"description": "Validation error. Includes unresolvable location filters: a `city`/`county`/`state`/`zip` value that does not match a recognized location returns 400 rather than an empty result set. Resolve the name with `instantSearch` (use an id from its `results.locations[]`) or `suggestLocations` (use the `id` of a `source: \"dictionary\"` result), then pass that id back as the filter value."
|
|
41435
|
+
},
|
|
41436
|
+
"401": {
|
|
41437
|
+
"content": {
|
|
41438
|
+
"application/json": {
|
|
41439
|
+
"schema": {
|
|
41440
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
41441
|
+
}
|
|
41442
|
+
}
|
|
41443
|
+
},
|
|
41444
|
+
"description": "Unauthorized"
|
|
41445
|
+
},
|
|
41446
|
+
"403": {
|
|
41447
|
+
"content": {
|
|
41448
|
+
"application/json": {
|
|
41449
|
+
"schema": {
|
|
41450
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
41451
|
+
}
|
|
41452
|
+
}
|
|
41453
|
+
},
|
|
41454
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
41455
|
+
},
|
|
41456
|
+
"404": {
|
|
41457
|
+
"content": {
|
|
41458
|
+
"application/json": {
|
|
41459
|
+
"schema": {
|
|
41460
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
41461
|
+
}
|
|
41462
|
+
}
|
|
41463
|
+
},
|
|
41464
|
+
"description": "Not found"
|
|
41465
|
+
},
|
|
41466
|
+
"413": {
|
|
41467
|
+
"content": {
|
|
41468
|
+
"application/json": {
|
|
41469
|
+
"schema": {
|
|
41470
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
41471
|
+
}
|
|
41472
|
+
}
|
|
41473
|
+
},
|
|
41474
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
41475
|
+
}
|
|
41476
|
+
},
|
|
41477
|
+
"summary": "Search companies with filters",
|
|
41478
|
+
"tags": [
|
|
41479
|
+
"Companies"
|
|
41480
|
+
]
|
|
41481
|
+
}
|
|
41482
|
+
},
|
|
41483
|
+
"/v1/companies/analytics/chart": {
|
|
41484
|
+
"post": {
|
|
41485
|
+
"operationId": "companyAnalyticsChart",
|
|
41486
|
+
"requestBody": {
|
|
41487
|
+
"content": {
|
|
41488
|
+
"application/json": {
|
|
41489
|
+
"schema": {
|
|
41490
|
+
"$ref": "#/components/schemas/CompanyChartRequest"
|
|
41491
|
+
}
|
|
41492
|
+
}
|
|
41493
|
+
}
|
|
41494
|
+
},
|
|
41495
|
+
"responses": {
|
|
41496
|
+
"200": {
|
|
41497
|
+
"content": {
|
|
41498
|
+
"application/json": {
|
|
41499
|
+
"schema": {
|
|
41500
|
+
"$ref": "#/components/schemas/ChartResponse"
|
|
41501
|
+
}
|
|
41502
|
+
}
|
|
41503
|
+
},
|
|
41504
|
+
"description": "Chart data. Money measures (`volume`, `avgSalePrice`, `avgListPrice`) are sentinel-guarded. Excludes values outside 0–100,000,000 — the source encodes unknown values as an out-of-range fill, and averaging them raw is wrong by orders of magnitude. The bound is applied before the metric and is not part of the public filter surface, so an equivalent range filter will not reproduce this figure exactly."
|
|
40489
41505
|
},
|
|
40490
41506
|
"400": {
|
|
40491
41507
|
"content": {
|
|
@@ -42130,9 +43146,10 @@
|
|
|
42130
43146
|
]
|
|
42131
43147
|
}
|
|
42132
43148
|
},
|
|
42133
|
-
"/v1/companies/{nmlsId}/breakdowns/
|
|
43149
|
+
"/v1/companies/{nmlsId}/breakdowns/title-companies": {
|
|
42134
43150
|
"post": {
|
|
42135
|
-
"
|
|
43151
|
+
"description": "Ranks the title companies on this entity's loans (recorded deeds, `recording_date` window — the same population and period axis as every other loans breakdown). Spellings of one company are MERGED: `label` is its most-used spelling, `id` the normalized name every spelling was grouped under (legal-form and filler words such as `inc`, `llc`, `co`, `company`, `title`, `escrow` removed; `natl` → `national`). Placeholder entries meaning \"no title company recorded\" (`none available` and its misspellings, `unknown`, `n/a`, …) and names shorter than 3 characters are excluded rather than ranked. `attorney` and `accommodation` are kept: they say who closed. `pctUnits` / `pctVolume` are shares of the entity's WHOLE loan population in the window, including loans with no title company, so they do not sum to 100 across the page. Pages of up to 100 via `pagination`.",
|
|
43152
|
+
"operationId": "companyTitleCompanies",
|
|
42136
43153
|
"parameters": [
|
|
42137
43154
|
{
|
|
42138
43155
|
"description": "Company NMLS ID",
|
|
@@ -42163,7 +43180,7 @@
|
|
|
42163
43180
|
}
|
|
42164
43181
|
}
|
|
42165
43182
|
},
|
|
42166
|
-
"description": "Breakdown of the
|
|
43183
|
+
"description": "Breakdown of the entity's loans by title company"
|
|
42167
43184
|
},
|
|
42168
43185
|
"400": {
|
|
42169
43186
|
"content": {
|
|
@@ -42216,15 +43233,15 @@
|
|
|
42216
43233
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
42217
43234
|
}
|
|
42218
43235
|
},
|
|
42219
|
-
"summary": "
|
|
43236
|
+
"summary": "Title companies on this company's loans (spellings merged)",
|
|
42220
43237
|
"tags": [
|
|
42221
43238
|
"Companies"
|
|
42222
43239
|
]
|
|
42223
43240
|
}
|
|
42224
43241
|
},
|
|
42225
|
-
"/v1/companies/{nmlsId}/
|
|
42226
|
-
"
|
|
42227
|
-
"operationId": "
|
|
43242
|
+
"/v1/companies/{nmlsId}/breakdowns/zip-codes": {
|
|
43243
|
+
"post": {
|
|
43244
|
+
"operationId": "companyZipCodes",
|
|
42228
43245
|
"parameters": [
|
|
42229
43246
|
{
|
|
42230
43247
|
"description": "Company NMLS ID",
|
|
@@ -42235,79 +43252,27 @@
|
|
|
42235
43252
|
"description": "Company NMLS ID",
|
|
42236
43253
|
"type": "string"
|
|
42237
43254
|
}
|
|
42238
|
-
},
|
|
42239
|
-
{
|
|
42240
|
-
"description": "Preset window when `from`/`to` are not given (default `last12Months`). Rolling periods start on the FIRST day of the month N months back and end today; a year is Jan 1 – Dec 31; `allTime` starts 2017-01-01, the earliest reliable registration data. Also selects the production period for volume/units.",
|
|
42241
|
-
"in": "query",
|
|
42242
|
-
"name": "period",
|
|
42243
|
-
"required": false,
|
|
42244
|
-
"schema": {
|
|
42245
|
-
"allOf": [
|
|
42246
|
-
{
|
|
42247
|
-
"$ref": "#/components/schemas/Period"
|
|
42248
|
-
},
|
|
42249
|
-
{
|
|
42250
|
-
"description": "Preset window when `from`/`to` are not given (default `last12Months`). Rolling periods start on the FIRST day of the month N months back and end today; a year is Jan 1 – Dec 31; `allTime` starts 2017-01-01, the earliest reliable registration data. Also selects the production period for volume/units."
|
|
42251
|
-
}
|
|
42252
|
-
]
|
|
42253
|
-
}
|
|
42254
|
-
},
|
|
42255
|
-
{
|
|
42256
|
-
"description": "Window start, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
42257
|
-
"in": "query",
|
|
42258
|
-
"name": "from",
|
|
42259
|
-
"required": false,
|
|
42260
|
-
"schema": {
|
|
42261
|
-
"description": "Window start, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
42262
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}$/u",
|
|
42263
|
-
"type": "string"
|
|
42264
|
-
}
|
|
42265
|
-
},
|
|
42266
|
-
{
|
|
42267
|
-
"description": "Window end, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
42268
|
-
"in": "query",
|
|
42269
|
-
"name": "to",
|
|
42270
|
-
"required": false,
|
|
42271
|
-
"schema": {
|
|
42272
|
-
"description": "Window end, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
42273
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}$/u",
|
|
42274
|
-
"type": "string"
|
|
42275
|
-
}
|
|
42276
|
-
},
|
|
42277
|
-
{
|
|
42278
|
-
"description": "Drill into one hire cohort (`YYYY-MM`): `data` then lists its early departures and recent starts.",
|
|
42279
|
-
"in": "query",
|
|
42280
|
-
"name": "month",
|
|
42281
|
-
"required": false,
|
|
42282
|
-
"schema": {
|
|
42283
|
-
"description": "Drill into one hire cohort (`YYYY-MM`): `data` then lists its early departures and recent starts.",
|
|
42284
|
-
"pattern": "^\\d{4}-\\d{2}$/u",
|
|
42285
|
-
"type": "string"
|
|
42286
|
-
}
|
|
42287
|
-
},
|
|
42288
|
-
{
|
|
42289
|
-
"description": "An exit within this many days of the start is EARLY (default 90). Also the 'recent start' and incomplete-cohort horizon.",
|
|
42290
|
-
"in": "query",
|
|
42291
|
-
"name": "withinDays",
|
|
42292
|
-
"required": false,
|
|
42293
|
-
"schema": {
|
|
42294
|
-
"description": "An exit within this many days of the start is EARLY (default 90). Also the 'recent start' and incomplete-cohort horizon.",
|
|
42295
|
-
"maximum": 730,
|
|
42296
|
-
"minimum": 1,
|
|
42297
|
-
"type": "integer"
|
|
42298
|
-
}
|
|
42299
43255
|
}
|
|
42300
43256
|
],
|
|
43257
|
+
"requestBody": {
|
|
43258
|
+
"content": {
|
|
43259
|
+
"application/json": {
|
|
43260
|
+
"schema": {
|
|
43261
|
+
"$ref": "#/components/schemas/BreakdownRequest"
|
|
43262
|
+
}
|
|
43263
|
+
}
|
|
43264
|
+
}
|
|
43265
|
+
},
|
|
42301
43266
|
"responses": {
|
|
42302
43267
|
"200": {
|
|
42303
43268
|
"content": {
|
|
42304
43269
|
"application/json": {
|
|
42305
43270
|
"schema": {
|
|
42306
|
-
"$ref": "#/components/schemas/
|
|
43271
|
+
"$ref": "#/components/schemas/BreakdownResponse"
|
|
42307
43272
|
}
|
|
42308
43273
|
}
|
|
42309
43274
|
},
|
|
42310
|
-
"description": "
|
|
43275
|
+
"description": "Breakdown of the company's loans by zip-codes"
|
|
42311
43276
|
},
|
|
42312
43277
|
"400": {
|
|
42313
43278
|
"content": {
|
|
@@ -42360,15 +43325,15 @@
|
|
|
42360
43325
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
42361
43326
|
}
|
|
42362
43327
|
},
|
|
42363
|
-
"summary": "
|
|
43328
|
+
"summary": "Zip-code volume breakdown across this company's loans",
|
|
42364
43329
|
"tags": [
|
|
42365
43330
|
"Companies"
|
|
42366
43331
|
]
|
|
42367
43332
|
}
|
|
42368
43333
|
},
|
|
42369
|
-
"/v1/companies/{nmlsId}/
|
|
43334
|
+
"/v1/companies/{nmlsId}/early-exits": {
|
|
42370
43335
|
"get": {
|
|
42371
|
-
"operationId": "
|
|
43336
|
+
"operationId": "companyEarlyExits",
|
|
42372
43337
|
"parameters": [
|
|
42373
43338
|
{
|
|
42374
43339
|
"description": "Company NMLS ID",
|
|
@@ -42403,7 +43368,7 @@
|
|
|
42403
43368
|
"required": false,
|
|
42404
43369
|
"schema": {
|
|
42405
43370
|
"description": "Window start, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
42406
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}
|
|
43371
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
42407
43372
|
"type": "string"
|
|
42408
43373
|
}
|
|
42409
43374
|
},
|
|
@@ -42414,9 +43379,32 @@
|
|
|
42414
43379
|
"required": false,
|
|
42415
43380
|
"schema": {
|
|
42416
43381
|
"description": "Window end, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
42417
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}
|
|
43382
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
43383
|
+
"type": "string"
|
|
43384
|
+
}
|
|
43385
|
+
},
|
|
43386
|
+
{
|
|
43387
|
+
"description": "Drill into one hire cohort (`YYYY-MM`): `data` then lists its early departures and recent starts.",
|
|
43388
|
+
"in": "query",
|
|
43389
|
+
"name": "month",
|
|
43390
|
+
"required": false,
|
|
43391
|
+
"schema": {
|
|
43392
|
+
"description": "Drill into one hire cohort (`YYYY-MM`): `data` then lists its early departures and recent starts.",
|
|
43393
|
+
"pattern": "^\\d{4}-\\d{2}$",
|
|
42418
43394
|
"type": "string"
|
|
42419
43395
|
}
|
|
43396
|
+
},
|
|
43397
|
+
{
|
|
43398
|
+
"description": "An exit within this many days of the start is EARLY (default 90). Also the 'recent start' and incomplete-cohort horizon.",
|
|
43399
|
+
"in": "query",
|
|
43400
|
+
"name": "withinDays",
|
|
43401
|
+
"required": false,
|
|
43402
|
+
"schema": {
|
|
43403
|
+
"description": "An exit within this many days of the start is EARLY (default 90). Also the 'recent start' and incomplete-cohort horizon.",
|
|
43404
|
+
"maximum": 730,
|
|
43405
|
+
"minimum": 1,
|
|
43406
|
+
"type": "integer"
|
|
43407
|
+
}
|
|
42420
43408
|
}
|
|
42421
43409
|
],
|
|
42422
43410
|
"responses": {
|
|
@@ -42424,11 +43412,132 @@
|
|
|
42424
43412
|
"content": {
|
|
42425
43413
|
"application/json": {
|
|
42426
43414
|
"schema": {
|
|
42427
|
-
"$ref": "#/components/schemas/
|
|
43415
|
+
"$ref": "#/components/schemas/CompanyEarlyExitsResponse"
|
|
42428
43416
|
}
|
|
42429
43417
|
}
|
|
42430
43418
|
},
|
|
42431
|
-
"description": "
|
|
43419
|
+
"description": "Early-exit cohorts"
|
|
43420
|
+
},
|
|
43421
|
+
"400": {
|
|
43422
|
+
"content": {
|
|
43423
|
+
"application/json": {
|
|
43424
|
+
"schema": {
|
|
43425
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43426
|
+
}
|
|
43427
|
+
}
|
|
43428
|
+
},
|
|
43429
|
+
"description": "Validation error"
|
|
43430
|
+
},
|
|
43431
|
+
"401": {
|
|
43432
|
+
"content": {
|
|
43433
|
+
"application/json": {
|
|
43434
|
+
"schema": {
|
|
43435
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43436
|
+
}
|
|
43437
|
+
}
|
|
43438
|
+
},
|
|
43439
|
+
"description": "Unauthorized"
|
|
43440
|
+
},
|
|
43441
|
+
"403": {
|
|
43442
|
+
"content": {
|
|
43443
|
+
"application/json": {
|
|
43444
|
+
"schema": {
|
|
43445
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43446
|
+
}
|
|
43447
|
+
}
|
|
43448
|
+
},
|
|
43449
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
43450
|
+
},
|
|
43451
|
+
"404": {
|
|
43452
|
+
"content": {
|
|
43453
|
+
"application/json": {
|
|
43454
|
+
"schema": {
|
|
43455
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43456
|
+
}
|
|
43457
|
+
}
|
|
43458
|
+
},
|
|
43459
|
+
"description": "Not found"
|
|
43460
|
+
},
|
|
43461
|
+
"413": {
|
|
43462
|
+
"content": {
|
|
43463
|
+
"application/json": {
|
|
43464
|
+
"schema": {
|
|
43465
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
43466
|
+
}
|
|
43467
|
+
}
|
|
43468
|
+
},
|
|
43469
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
43470
|
+
}
|
|
43471
|
+
},
|
|
43472
|
+
"summary": "Hire cohorts and how many left within N days",
|
|
43473
|
+
"tags": [
|
|
43474
|
+
"Companies"
|
|
43475
|
+
]
|
|
43476
|
+
}
|
|
43477
|
+
},
|
|
43478
|
+
"/v1/companies/{nmlsId}/employee-stats": {
|
|
43479
|
+
"get": {
|
|
43480
|
+
"operationId": "companyEmployeeStats",
|
|
43481
|
+
"parameters": [
|
|
43482
|
+
{
|
|
43483
|
+
"description": "Company NMLS ID",
|
|
43484
|
+
"in": "path",
|
|
43485
|
+
"name": "nmlsId",
|
|
43486
|
+
"required": true,
|
|
43487
|
+
"schema": {
|
|
43488
|
+
"description": "Company NMLS ID",
|
|
43489
|
+
"type": "string"
|
|
43490
|
+
}
|
|
43491
|
+
},
|
|
43492
|
+
{
|
|
43493
|
+
"description": "Preset window when `from`/`to` are not given (default `last12Months`). Rolling periods start on the FIRST day of the month N months back and end today; a year is Jan 1 – Dec 31; `allTime` starts 2017-01-01, the earliest reliable registration data. Also selects the production period for volume/units.",
|
|
43494
|
+
"in": "query",
|
|
43495
|
+
"name": "period",
|
|
43496
|
+
"required": false,
|
|
43497
|
+
"schema": {
|
|
43498
|
+
"allOf": [
|
|
43499
|
+
{
|
|
43500
|
+
"$ref": "#/components/schemas/Period"
|
|
43501
|
+
},
|
|
43502
|
+
{
|
|
43503
|
+
"description": "Preset window when `from`/`to` are not given (default `last12Months`). Rolling periods start on the FIRST day of the month N months back and end today; a year is Jan 1 – Dec 31; `allTime` starts 2017-01-01, the earliest reliable registration data. Also selects the production period for volume/units."
|
|
43504
|
+
}
|
|
43505
|
+
]
|
|
43506
|
+
}
|
|
43507
|
+
},
|
|
43508
|
+
{
|
|
43509
|
+
"description": "Window start, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
43510
|
+
"in": "query",
|
|
43511
|
+
"name": "from",
|
|
43512
|
+
"required": false,
|
|
43513
|
+
"schema": {
|
|
43514
|
+
"description": "Window start, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
43515
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
43516
|
+
"type": "string"
|
|
43517
|
+
}
|
|
43518
|
+
},
|
|
43519
|
+
{
|
|
43520
|
+
"description": "Window end, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
43521
|
+
"in": "query",
|
|
43522
|
+
"name": "to",
|
|
43523
|
+
"required": false,
|
|
43524
|
+
"schema": {
|
|
43525
|
+
"description": "Window end, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
43526
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
43527
|
+
"type": "string"
|
|
43528
|
+
}
|
|
43529
|
+
}
|
|
43530
|
+
],
|
|
43531
|
+
"responses": {
|
|
43532
|
+
"200": {
|
|
43533
|
+
"content": {
|
|
43534
|
+
"application/json": {
|
|
43535
|
+
"schema": {
|
|
43536
|
+
"$ref": "#/components/schemas/CompanyEmployeeStatsResponse"
|
|
43537
|
+
}
|
|
43538
|
+
}
|
|
43539
|
+
},
|
|
43540
|
+
"description": "Roster and mover statistics"
|
|
42432
43541
|
},
|
|
42433
43542
|
"400": {
|
|
42434
43543
|
"content": {
|
|
@@ -42541,7 +43650,7 @@
|
|
|
42541
43650
|
"required": false,
|
|
42542
43651
|
"schema": {
|
|
42543
43652
|
"description": "Window start, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
42544
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}
|
|
43653
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
42545
43654
|
"type": "string"
|
|
42546
43655
|
}
|
|
42547
43656
|
},
|
|
@@ -42552,7 +43661,7 @@
|
|
|
42552
43661
|
"required": false,
|
|
42553
43662
|
"schema": {
|
|
42554
43663
|
"description": "Window end, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
42555
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}
|
|
43664
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
42556
43665
|
"type": "string"
|
|
42557
43666
|
}
|
|
42558
43667
|
},
|
|
@@ -42563,7 +43672,7 @@
|
|
|
42563
43672
|
"required": false,
|
|
42564
43673
|
"schema": {
|
|
42565
43674
|
"description": "Roster AS OF this date (YYYY-MM-DD): loan officers with a record covering it. Replaces the window; `status` must be `active` or omitted.",
|
|
42566
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}
|
|
43675
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
42567
43676
|
"type": "string"
|
|
42568
43677
|
}
|
|
42569
43678
|
},
|
|
@@ -42739,7 +43848,7 @@
|
|
|
42739
43848
|
"required": false,
|
|
42740
43849
|
"schema": {
|
|
42741
43850
|
"description": "Window start, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
42742
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}
|
|
43851
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
42743
43852
|
"type": "string"
|
|
42744
43853
|
}
|
|
42745
43854
|
},
|
|
@@ -42750,7 +43859,7 @@
|
|
|
42750
43859
|
"required": false,
|
|
42751
43860
|
"schema": {
|
|
42752
43861
|
"description": "Window end, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
42753
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}
|
|
43862
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
42754
43863
|
"type": "string"
|
|
42755
43864
|
}
|
|
42756
43865
|
},
|
|
@@ -43150,7 +44259,7 @@
|
|
|
43150
44259
|
"required": false,
|
|
43151
44260
|
"schema": {
|
|
43152
44261
|
"description": "Window start, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
43153
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}
|
|
44262
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
43154
44263
|
"type": "string"
|
|
43155
44264
|
}
|
|
43156
44265
|
},
|
|
@@ -43161,7 +44270,7 @@
|
|
|
43161
44270
|
"required": false,
|
|
43162
44271
|
"schema": {
|
|
43163
44272
|
"description": "Window end, inclusive (YYYY-MM-DD). Overrides `period`.",
|
|
43164
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}
|
|
44273
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
43165
44274
|
"type": "string"
|
|
43166
44275
|
}
|
|
43167
44276
|
},
|
|
@@ -43651,32 +44760,97 @@
|
|
|
43651
44760
|
]
|
|
43652
44761
|
}
|
|
43653
44762
|
},
|
|
43654
|
-
"/v1/crm/activity/
|
|
43655
|
-
"
|
|
43656
|
-
"operationId": "
|
|
43657
|
-
"
|
|
43658
|
-
{
|
|
43659
|
-
"
|
|
43660
|
-
|
|
43661
|
-
|
|
43662
|
-
|
|
43663
|
-
|
|
43664
|
-
|
|
43665
|
-
|
|
43666
|
-
|
|
44763
|
+
"/v1/crm/activity/log": {
|
|
44764
|
+
"patch": {
|
|
44765
|
+
"operationId": "editCrmLoggedActivity",
|
|
44766
|
+
"requestBody": {
|
|
44767
|
+
"content": {
|
|
44768
|
+
"application/json": {
|
|
44769
|
+
"schema": {
|
|
44770
|
+
"properties": {
|
|
44771
|
+
"activityType": {
|
|
44772
|
+
"$ref": "#/components/schemas/CrmLoggedActivityType"
|
|
44773
|
+
},
|
|
44774
|
+
"body": {
|
|
44775
|
+
"type": "string"
|
|
44776
|
+
},
|
|
44777
|
+
"bodyHtml": {
|
|
44778
|
+
"nullable": true,
|
|
44779
|
+
"type": "string"
|
|
44780
|
+
},
|
|
44781
|
+
"direction": {
|
|
44782
|
+
"description": "call + email only.",
|
|
44783
|
+
"enum": [
|
|
44784
|
+
"inbound",
|
|
44785
|
+
"outbound",
|
|
44786
|
+
null
|
|
44787
|
+
],
|
|
44788
|
+
"nullable": true,
|
|
44789
|
+
"type": "string"
|
|
44790
|
+
},
|
|
44791
|
+
"durationMinutes": {
|
|
44792
|
+
"description": "call + meeting only, in minutes.",
|
|
44793
|
+
"maximum": 1440,
|
|
44794
|
+
"minimum": 0,
|
|
44795
|
+
"nullable": true,
|
|
44796
|
+
"type": "integer"
|
|
44797
|
+
},
|
|
44798
|
+
"grantRecordAccessUserIds": {
|
|
44799
|
+
"items": {
|
|
44800
|
+
"type": "string"
|
|
44801
|
+
},
|
|
44802
|
+
"type": "array"
|
|
44803
|
+
},
|
|
44804
|
+
"id": {
|
|
44805
|
+
"minLength": 1,
|
|
44806
|
+
"type": "string"
|
|
44807
|
+
},
|
|
44808
|
+
"listId": {
|
|
44809
|
+
"nullable": true,
|
|
44810
|
+
"type": "string"
|
|
44811
|
+
},
|
|
44812
|
+
"occurredAt": {
|
|
44813
|
+
"description": "Epoch ms the activity actually happened. Must be ≤ now + 5 minutes.",
|
|
44814
|
+
"exclusiveMinimum": true,
|
|
44815
|
+
"minimum": 0,
|
|
44816
|
+
"type": "integer"
|
|
44817
|
+
},
|
|
44818
|
+
"outcome": {
|
|
44819
|
+
"description": "call: connected | voicemail | no_answer | busy. meeting: held | no_show. Not allowed for email/task.",
|
|
44820
|
+
"nullable": true,
|
|
44821
|
+
"type": "string"
|
|
44822
|
+
},
|
|
44823
|
+
"recordName": {
|
|
44824
|
+
"type": "string"
|
|
44825
|
+
},
|
|
44826
|
+
"title": {
|
|
44827
|
+
"description": "Meeting title / email subject / task title. Not allowed for a call; required for a task.",
|
|
44828
|
+
"maxLength": 200,
|
|
44829
|
+
"nullable": true,
|
|
44830
|
+
"type": "string"
|
|
44831
|
+
}
|
|
44832
|
+
},
|
|
44833
|
+
"required": [
|
|
44834
|
+
"id",
|
|
44835
|
+
"activityType",
|
|
44836
|
+
"occurredAt",
|
|
44837
|
+
"body"
|
|
44838
|
+
],
|
|
44839
|
+
"type": "object"
|
|
44840
|
+
}
|
|
43667
44841
|
}
|
|
43668
44842
|
}
|
|
43669
|
-
|
|
44843
|
+
},
|
|
43670
44844
|
"responses": {
|
|
43671
44845
|
"200": {
|
|
43672
44846
|
"content": {
|
|
43673
44847
|
"application/json": {
|
|
43674
44848
|
"schema": {
|
|
43675
|
-
"$ref": "#/components/schemas/
|
|
44849
|
+
"$ref": "#/components/schemas/CrmEditLoggedActivityResult"
|
|
43676
44850
|
}
|
|
43677
44851
|
}
|
|
43678
44852
|
},
|
|
43679
|
-
"description": "
|
|
44853
|
+
"description": "Whether the logged entry was updated."
|
|
43680
44854
|
},
|
|
43681
44855
|
"400": {
|
|
43682
44856
|
"content": {
|
|
@@ -43716,7 +44890,7 @@
|
|
|
43716
44890
|
}
|
|
43717
44891
|
}
|
|
43718
44892
|
},
|
|
43719
|
-
"description": "
|
|
44893
|
+
"description": "No live logged entry with that id — either it doesn't exist, was deleted, or isn't a logged entry (this route can't edit a plain note)."
|
|
43720
44894
|
},
|
|
43721
44895
|
"413": {
|
|
43722
44896
|
"content": {
|
|
@@ -43729,36 +44903,267 @@
|
|
|
43729
44903
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
43730
44904
|
}
|
|
43731
44905
|
},
|
|
43732
|
-
"summary": "
|
|
44906
|
+
"summary": "Edit a logged activity entry",
|
|
43733
44907
|
"tags": [
|
|
43734
44908
|
"CRM"
|
|
43735
44909
|
]
|
|
43736
|
-
}
|
|
43737
|
-
|
|
43738
|
-
|
|
43739
|
-
|
|
43740
|
-
|
|
43741
|
-
|
|
43742
|
-
|
|
43743
|
-
|
|
43744
|
-
|
|
43745
|
-
|
|
43746
|
-
|
|
43747
|
-
|
|
43748
|
-
|
|
44910
|
+
},
|
|
44911
|
+
"post": {
|
|
44912
|
+
"operationId": "logCrmActivity",
|
|
44913
|
+
"requestBody": {
|
|
44914
|
+
"content": {
|
|
44915
|
+
"application/json": {
|
|
44916
|
+
"schema": {
|
|
44917
|
+
"properties": {
|
|
44918
|
+
"activityType": {
|
|
44919
|
+
"$ref": "#/components/schemas/CrmLoggedActivityType"
|
|
44920
|
+
},
|
|
44921
|
+
"body": {
|
|
44922
|
+
"type": "string"
|
|
44923
|
+
},
|
|
44924
|
+
"bodyHtml": {
|
|
44925
|
+
"nullable": true,
|
|
44926
|
+
"type": "string"
|
|
44927
|
+
},
|
|
44928
|
+
"direction": {
|
|
44929
|
+
"description": "call + email only.",
|
|
44930
|
+
"enum": [
|
|
44931
|
+
"inbound",
|
|
44932
|
+
"outbound",
|
|
44933
|
+
null
|
|
44934
|
+
],
|
|
44935
|
+
"nullable": true,
|
|
44936
|
+
"type": "string"
|
|
44937
|
+
},
|
|
44938
|
+
"durationMinutes": {
|
|
44939
|
+
"description": "call + meeting only, in minutes.",
|
|
44940
|
+
"maximum": 1440,
|
|
44941
|
+
"minimum": 0,
|
|
44942
|
+
"nullable": true,
|
|
44943
|
+
"type": "integer"
|
|
44944
|
+
},
|
|
44945
|
+
"entityId": {
|
|
44946
|
+
"minLength": 1,
|
|
44947
|
+
"type": "string"
|
|
44948
|
+
},
|
|
44949
|
+
"grantRecordAccessUserIds": {
|
|
44950
|
+
"items": {
|
|
44951
|
+
"type": "string"
|
|
44952
|
+
},
|
|
44953
|
+
"type": "array"
|
|
44954
|
+
},
|
|
44955
|
+
"listId": {
|
|
44956
|
+
"nullable": true,
|
|
44957
|
+
"type": "string"
|
|
44958
|
+
},
|
|
44959
|
+
"occurredAt": {
|
|
44960
|
+
"description": "Epoch ms the activity actually happened. Must be ≤ now + 5 minutes.",
|
|
44961
|
+
"exclusiveMinimum": true,
|
|
44962
|
+
"minimum": 0,
|
|
44963
|
+
"type": "integer"
|
|
44964
|
+
},
|
|
44965
|
+
"outcome": {
|
|
44966
|
+
"description": "call: connected | voicemail | no_answer | busy. meeting: held | no_show. Not allowed for email/task.",
|
|
44967
|
+
"nullable": true,
|
|
44968
|
+
"type": "string"
|
|
44969
|
+
},
|
|
44970
|
+
"recordName": {
|
|
44971
|
+
"type": "string"
|
|
44972
|
+
},
|
|
44973
|
+
"title": {
|
|
44974
|
+
"description": "Meeting title / email subject / task title. Not allowed for a call; required for a task.",
|
|
44975
|
+
"maxLength": 200,
|
|
44976
|
+
"nullable": true,
|
|
44977
|
+
"type": "string"
|
|
44978
|
+
}
|
|
44979
|
+
},
|
|
44980
|
+
"required": [
|
|
44981
|
+
"entityId",
|
|
44982
|
+
"activityType",
|
|
44983
|
+
"occurredAt",
|
|
44984
|
+
"body"
|
|
44985
|
+
],
|
|
44986
|
+
"type": "object"
|
|
44987
|
+
}
|
|
43749
44988
|
}
|
|
43750
44989
|
}
|
|
43751
|
-
|
|
44990
|
+
},
|
|
43752
44991
|
"responses": {
|
|
43753
44992
|
"200": {
|
|
43754
44993
|
"content": {
|
|
43755
44994
|
"application/json": {
|
|
43756
44995
|
"schema": {
|
|
43757
|
-
"$ref": "#/components/schemas/
|
|
44996
|
+
"$ref": "#/components/schemas/CrmLogActivityResult"
|
|
43758
44997
|
}
|
|
43759
44998
|
}
|
|
43760
44999
|
},
|
|
43761
|
-
"description": "
|
|
45000
|
+
"description": "The new logged entry's id."
|
|
45001
|
+
},
|
|
45002
|
+
"400": {
|
|
45003
|
+
"content": {
|
|
45004
|
+
"application/json": {
|
|
45005
|
+
"schema": {
|
|
45006
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
45007
|
+
}
|
|
45008
|
+
}
|
|
45009
|
+
},
|
|
45010
|
+
"description": "Validation error"
|
|
45011
|
+
},
|
|
45012
|
+
"401": {
|
|
45013
|
+
"content": {
|
|
45014
|
+
"application/json": {
|
|
45015
|
+
"schema": {
|
|
45016
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
45017
|
+
}
|
|
45018
|
+
}
|
|
45019
|
+
},
|
|
45020
|
+
"description": "Unauthorized"
|
|
45021
|
+
},
|
|
45022
|
+
"403": {
|
|
45023
|
+
"content": {
|
|
45024
|
+
"application/json": {
|
|
45025
|
+
"schema": {
|
|
45026
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
45027
|
+
}
|
|
45028
|
+
}
|
|
45029
|
+
},
|
|
45030
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
45031
|
+
},
|
|
45032
|
+
"404": {
|
|
45033
|
+
"content": {
|
|
45034
|
+
"application/json": {
|
|
45035
|
+
"schema": {
|
|
45036
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
45037
|
+
}
|
|
45038
|
+
}
|
|
45039
|
+
},
|
|
45040
|
+
"description": "Not found"
|
|
45041
|
+
},
|
|
45042
|
+
"413": {
|
|
45043
|
+
"content": {
|
|
45044
|
+
"application/json": {
|
|
45045
|
+
"schema": {
|
|
45046
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
45047
|
+
}
|
|
45048
|
+
}
|
|
45049
|
+
},
|
|
45050
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
45051
|
+
}
|
|
45052
|
+
},
|
|
45053
|
+
"summary": "Log a Call/Meeting/Email/Task that happened outside Model Match",
|
|
45054
|
+
"tags": [
|
|
45055
|
+
"CRM"
|
|
45056
|
+
]
|
|
45057
|
+
}
|
|
45058
|
+
},
|
|
45059
|
+
"/v1/crm/activity/referenced": {
|
|
45060
|
+
"get": {
|
|
45061
|
+
"operationId": "listCrmReferencedActivity",
|
|
45062
|
+
"parameters": [
|
|
45063
|
+
{
|
|
45064
|
+
"description": "The CRM record whose referenced (trickled-up) activity to read.",
|
|
45065
|
+
"in": "query",
|
|
45066
|
+
"name": "entityId",
|
|
45067
|
+
"required": true,
|
|
45068
|
+
"schema": {
|
|
45069
|
+
"description": "The CRM record whose referenced (trickled-up) activity to read.",
|
|
45070
|
+
"minLength": 1,
|
|
45071
|
+
"type": "string"
|
|
45072
|
+
}
|
|
45073
|
+
}
|
|
45074
|
+
],
|
|
45075
|
+
"responses": {
|
|
45076
|
+
"200": {
|
|
45077
|
+
"content": {
|
|
45078
|
+
"application/json": {
|
|
45079
|
+
"schema": {
|
|
45080
|
+
"$ref": "#/components/schemas/CrmReferencedActivityList"
|
|
45081
|
+
}
|
|
45082
|
+
}
|
|
45083
|
+
},
|
|
45084
|
+
"description": "Notes authored on other records that reference this record, newest first."
|
|
45085
|
+
},
|
|
45086
|
+
"400": {
|
|
45087
|
+
"content": {
|
|
45088
|
+
"application/json": {
|
|
45089
|
+
"schema": {
|
|
45090
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
45091
|
+
}
|
|
45092
|
+
}
|
|
45093
|
+
},
|
|
45094
|
+
"description": "Validation error"
|
|
45095
|
+
},
|
|
45096
|
+
"401": {
|
|
45097
|
+
"content": {
|
|
45098
|
+
"application/json": {
|
|
45099
|
+
"schema": {
|
|
45100
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
45101
|
+
}
|
|
45102
|
+
}
|
|
45103
|
+
},
|
|
45104
|
+
"description": "Unauthorized"
|
|
45105
|
+
},
|
|
45106
|
+
"403": {
|
|
45107
|
+
"content": {
|
|
45108
|
+
"application/json": {
|
|
45109
|
+
"schema": {
|
|
45110
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
45111
|
+
}
|
|
45112
|
+
}
|
|
45113
|
+
},
|
|
45114
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
45115
|
+
},
|
|
45116
|
+
"404": {
|
|
45117
|
+
"content": {
|
|
45118
|
+
"application/json": {
|
|
45119
|
+
"schema": {
|
|
45120
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
45121
|
+
}
|
|
45122
|
+
}
|
|
45123
|
+
},
|
|
45124
|
+
"description": "Not found"
|
|
45125
|
+
},
|
|
45126
|
+
"413": {
|
|
45127
|
+
"content": {
|
|
45128
|
+
"application/json": {
|
|
45129
|
+
"schema": {
|
|
45130
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
45131
|
+
}
|
|
45132
|
+
}
|
|
45133
|
+
},
|
|
45134
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
45135
|
+
}
|
|
45136
|
+
},
|
|
45137
|
+
"summary": "List notes from other records that reference this one (trickled up)",
|
|
45138
|
+
"tags": [
|
|
45139
|
+
"CRM"
|
|
45140
|
+
]
|
|
45141
|
+
}
|
|
45142
|
+
},
|
|
45143
|
+
"/v1/crm/caller-ids": {
|
|
45144
|
+
"delete": {
|
|
45145
|
+
"operationId": "deleteCrmCallerId",
|
|
45146
|
+
"parameters": [
|
|
45147
|
+
{
|
|
45148
|
+
"in": "query",
|
|
45149
|
+
"name": "id",
|
|
45150
|
+
"required": true,
|
|
45151
|
+
"schema": {
|
|
45152
|
+
"minLength": 1,
|
|
45153
|
+
"type": "string"
|
|
45154
|
+
}
|
|
45155
|
+
}
|
|
45156
|
+
],
|
|
45157
|
+
"responses": {
|
|
45158
|
+
"200": {
|
|
45159
|
+
"content": {
|
|
45160
|
+
"application/json": {
|
|
45161
|
+
"schema": {
|
|
45162
|
+
"$ref": "#/components/schemas/CrmDeleteCallerIdResult"
|
|
45163
|
+
}
|
|
45164
|
+
}
|
|
45165
|
+
},
|
|
45166
|
+
"description": "Whether the caller ID was removed."
|
|
43762
45167
|
},
|
|
43763
45168
|
"400": {
|
|
43764
45169
|
"content": {
|
|
@@ -57312,7 +58717,7 @@
|
|
|
57312
58717
|
"schema": {
|
|
57313
58718
|
"description": "Reporting window. `last_N_months` = the N most recent COMPLETED calendar months (the current month is excluded); `year_to_date` = Jan 1 through the end of last month; `YYYY` (or `fy_YYYY`) = that calendar year; `all_time`. Default `last_12_months`.",
|
|
57314
58719
|
"example": "last_12_months",
|
|
57315
|
-
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})
|
|
58720
|
+
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})$",
|
|
57316
58721
|
"type": "string"
|
|
57317
58722
|
}
|
|
57318
58723
|
},
|
|
@@ -57324,7 +58729,7 @@
|
|
|
57324
58729
|
"schema": {
|
|
57325
58730
|
"description": "Two-letter state. Matches the loan officer's CURRENT NMLS location, not where they were when they moved.",
|
|
57326
58731
|
"example": "TX",
|
|
57327
|
-
"pattern": "^[A-Za-z]{2}
|
|
58732
|
+
"pattern": "^[A-Za-z]{2}$",
|
|
57328
58733
|
"type": "string"
|
|
57329
58734
|
}
|
|
57330
58735
|
},
|
|
@@ -57336,7 +58741,7 @@
|
|
|
57336
58741
|
"schema": {
|
|
57337
58742
|
"description": "Comma-separated two-letter states (e.g. a region). ORed; combined with `state` when both are sent.",
|
|
57338
58743
|
"example": "WA,OR,ID",
|
|
57339
|
-
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})
|
|
58744
|
+
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})*$",
|
|
57340
58745
|
"type": "string"
|
|
57341
58746
|
}
|
|
57342
58747
|
},
|
|
@@ -57455,7 +58860,7 @@
|
|
|
57455
58860
|
"schema": {
|
|
57456
58861
|
"description": "Reporting window. `last_N_months` = the N most recent COMPLETED calendar months (the current month is excluded); `year_to_date` = Jan 1 through the end of last month; `YYYY` (or `fy_YYYY`) = that calendar year; `all_time`. Default `last_12_months`.",
|
|
57457
58862
|
"example": "last_12_months",
|
|
57458
|
-
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})
|
|
58863
|
+
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})$",
|
|
57459
58864
|
"type": "string"
|
|
57460
58865
|
}
|
|
57461
58866
|
},
|
|
@@ -57467,7 +58872,7 @@
|
|
|
57467
58872
|
"schema": {
|
|
57468
58873
|
"description": "Two-letter state. Matches the loan officer's CURRENT NMLS location, not where they were when they moved.",
|
|
57469
58874
|
"example": "TX",
|
|
57470
|
-
"pattern": "^[A-Za-z]{2}
|
|
58875
|
+
"pattern": "^[A-Za-z]{2}$",
|
|
57471
58876
|
"type": "string"
|
|
57472
58877
|
}
|
|
57473
58878
|
},
|
|
@@ -57479,7 +58884,7 @@
|
|
|
57479
58884
|
"schema": {
|
|
57480
58885
|
"description": "Comma-separated two-letter states (e.g. a region). ORed; combined with `state` when both are sent.",
|
|
57481
58886
|
"example": "WA,OR,ID",
|
|
57482
|
-
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})
|
|
58887
|
+
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})*$",
|
|
57483
58888
|
"type": "string"
|
|
57484
58889
|
}
|
|
57485
58890
|
},
|
|
@@ -57503,7 +58908,7 @@
|
|
|
57503
58908
|
"schema": {
|
|
57504
58909
|
"description": "Comma-separated company categories (`BANK`, `CU`, `OTHER`) applied to the company whose roster changed — the destination for arrivals, the company left for departures.",
|
|
57505
58910
|
"example": "BANK,CU",
|
|
57506
|
-
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))
|
|
58911
|
+
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))*$",
|
|
57507
58912
|
"type": "string"
|
|
57508
58913
|
}
|
|
57509
58914
|
},
|
|
@@ -57622,7 +59027,7 @@
|
|
|
57622
59027
|
"schema": {
|
|
57623
59028
|
"description": "Reporting window. `last_N_months` = the N most recent COMPLETED calendar months (the current month is excluded); `year_to_date` = Jan 1 through the end of last month; `YYYY` (or `fy_YYYY`) = that calendar year; `all_time`. Default `last_12_months`.",
|
|
57624
59029
|
"example": "last_12_months",
|
|
57625
|
-
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})
|
|
59030
|
+
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})$",
|
|
57626
59031
|
"type": "string"
|
|
57627
59032
|
}
|
|
57628
59033
|
},
|
|
@@ -57634,7 +59039,7 @@
|
|
|
57634
59039
|
"schema": {
|
|
57635
59040
|
"description": "Two-letter state. Matches the loan officer's CURRENT NMLS location, not where they were when they moved.",
|
|
57636
59041
|
"example": "TX",
|
|
57637
|
-
"pattern": "^[A-Za-z]{2}
|
|
59042
|
+
"pattern": "^[A-Za-z]{2}$",
|
|
57638
59043
|
"type": "string"
|
|
57639
59044
|
}
|
|
57640
59045
|
},
|
|
@@ -57646,7 +59051,7 @@
|
|
|
57646
59051
|
"schema": {
|
|
57647
59052
|
"description": "Comma-separated two-letter states (e.g. a region). ORed; combined with `state` when both are sent.",
|
|
57648
59053
|
"example": "WA,OR,ID",
|
|
57649
|
-
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})
|
|
59054
|
+
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})*$",
|
|
57650
59055
|
"type": "string"
|
|
57651
59056
|
}
|
|
57652
59057
|
},
|
|
@@ -57670,7 +59075,7 @@
|
|
|
57670
59075
|
"schema": {
|
|
57671
59076
|
"description": "Comma-separated company categories (`BANK`, `CU`, `OTHER`) applied to the company whose roster changed — the destination for arrivals, the company left for departures.",
|
|
57672
59077
|
"example": "BANK,CU",
|
|
57673
|
-
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))
|
|
59078
|
+
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))*$",
|
|
57674
59079
|
"type": "string"
|
|
57675
59080
|
}
|
|
57676
59081
|
},
|
|
@@ -57792,7 +59197,7 @@
|
|
|
57792
59197
|
"schema": {
|
|
57793
59198
|
"description": "Reporting window. `last_N_months` = the N most recent COMPLETED calendar months (the current month is excluded); `year_to_date` = Jan 1 through the end of last month; `YYYY` (or `fy_YYYY`) = that calendar year; `all_time`. Default `last_12_months`.",
|
|
57794
59199
|
"example": "last_12_months",
|
|
57795
|
-
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})
|
|
59200
|
+
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})$",
|
|
57796
59201
|
"type": "string"
|
|
57797
59202
|
}
|
|
57798
59203
|
},
|
|
@@ -57804,7 +59209,7 @@
|
|
|
57804
59209
|
"schema": {
|
|
57805
59210
|
"description": "Two-letter state. Matches the loan officer's CURRENT NMLS location, not where they were when they moved.",
|
|
57806
59211
|
"example": "TX",
|
|
57807
|
-
"pattern": "^[A-Za-z]{2}
|
|
59212
|
+
"pattern": "^[A-Za-z]{2}$",
|
|
57808
59213
|
"type": "string"
|
|
57809
59214
|
}
|
|
57810
59215
|
},
|
|
@@ -57816,7 +59221,7 @@
|
|
|
57816
59221
|
"schema": {
|
|
57817
59222
|
"description": "Comma-separated two-letter states (e.g. a region). ORed; combined with `state` when both are sent.",
|
|
57818
59223
|
"example": "WA,OR,ID",
|
|
57819
|
-
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})
|
|
59224
|
+
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})*$",
|
|
57820
59225
|
"type": "string"
|
|
57821
59226
|
}
|
|
57822
59227
|
},
|
|
@@ -57840,7 +59245,7 @@
|
|
|
57840
59245
|
"schema": {
|
|
57841
59246
|
"description": "Comma-separated company categories (`BANK`, `CU`, `OTHER`) applied to the company whose roster changed — the destination for arrivals, the company left for departures.",
|
|
57842
59247
|
"example": "BANK,CU",
|
|
57843
|
-
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))
|
|
59248
|
+
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))*$",
|
|
57844
59249
|
"type": "string"
|
|
57845
59250
|
}
|
|
57846
59251
|
},
|
|
@@ -57973,7 +59378,7 @@
|
|
|
57973
59378
|
"schema": {
|
|
57974
59379
|
"description": "Reporting window. `last_N_months` = the N most recent COMPLETED calendar months (the current month is excluded); `year_to_date` = Jan 1 through the end of last month; `YYYY` (or `fy_YYYY`) = that calendar year; `all_time`. Default `last_12_months`.",
|
|
57975
59380
|
"example": "last_12_months",
|
|
57976
|
-
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})
|
|
59381
|
+
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})$",
|
|
57977
59382
|
"type": "string"
|
|
57978
59383
|
}
|
|
57979
59384
|
},
|
|
@@ -57985,7 +59390,7 @@
|
|
|
57985
59390
|
"schema": {
|
|
57986
59391
|
"description": "Two-letter state. Matches the loan officer's CURRENT NMLS location, not where they were when they moved.",
|
|
57987
59392
|
"example": "TX",
|
|
57988
|
-
"pattern": "^[A-Za-z]{2}
|
|
59393
|
+
"pattern": "^[A-Za-z]{2}$",
|
|
57989
59394
|
"type": "string"
|
|
57990
59395
|
}
|
|
57991
59396
|
},
|
|
@@ -57997,7 +59402,7 @@
|
|
|
57997
59402
|
"schema": {
|
|
57998
59403
|
"description": "Comma-separated two-letter states (e.g. a region). ORed; combined with `state` when both are sent.",
|
|
57999
59404
|
"example": "WA,OR,ID",
|
|
58000
|
-
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})
|
|
59405
|
+
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})*$",
|
|
58001
59406
|
"type": "string"
|
|
58002
59407
|
}
|
|
58003
59408
|
},
|
|
@@ -58021,7 +59426,7 @@
|
|
|
58021
59426
|
"schema": {
|
|
58022
59427
|
"description": "Comma-separated company categories (`BANK`, `CU`, `OTHER`) applied to the company whose roster changed — the destination for arrivals, the company left for departures.",
|
|
58023
59428
|
"example": "BANK,CU",
|
|
58024
|
-
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))
|
|
59429
|
+
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))*$",
|
|
58025
59430
|
"type": "string"
|
|
58026
59431
|
}
|
|
58027
59432
|
},
|
|
@@ -58154,7 +59559,7 @@
|
|
|
58154
59559
|
"schema": {
|
|
58155
59560
|
"description": "Reporting window. `last_N_months` = the N most recent COMPLETED calendar months (the current month is excluded); `year_to_date` = Jan 1 through the end of last month; `YYYY` (or `fy_YYYY`) = that calendar year; `all_time`. Default `last_12_months`.",
|
|
58156
59561
|
"example": "last_12_months",
|
|
58157
|
-
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})
|
|
59562
|
+
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})$",
|
|
58158
59563
|
"type": "string"
|
|
58159
59564
|
}
|
|
58160
59565
|
},
|
|
@@ -58166,7 +59571,7 @@
|
|
|
58166
59571
|
"schema": {
|
|
58167
59572
|
"description": "Two-letter state. Matches the loan officer's CURRENT NMLS location, not where they were when they moved.",
|
|
58168
59573
|
"example": "TX",
|
|
58169
|
-
"pattern": "^[A-Za-z]{2}
|
|
59574
|
+
"pattern": "^[A-Za-z]{2}$",
|
|
58170
59575
|
"type": "string"
|
|
58171
59576
|
}
|
|
58172
59577
|
},
|
|
@@ -58178,7 +59583,7 @@
|
|
|
58178
59583
|
"schema": {
|
|
58179
59584
|
"description": "Comma-separated two-letter states (e.g. a region). ORed; combined with `state` when both are sent.",
|
|
58180
59585
|
"example": "WA,OR,ID",
|
|
58181
|
-
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})
|
|
59586
|
+
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})*$",
|
|
58182
59587
|
"type": "string"
|
|
58183
59588
|
}
|
|
58184
59589
|
},
|
|
@@ -58202,7 +59607,7 @@
|
|
|
58202
59607
|
"schema": {
|
|
58203
59608
|
"description": "Comma-separated company categories (`BANK`, `CU`, `OTHER`) applied to the company whose roster changed — the destination for arrivals, the company left for departures.",
|
|
58204
59609
|
"example": "BANK,CU",
|
|
58205
|
-
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))
|
|
59610
|
+
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))*$",
|
|
58206
59611
|
"type": "string"
|
|
58207
59612
|
}
|
|
58208
59613
|
},
|
|
@@ -58382,7 +59787,7 @@
|
|
|
58382
59787
|
"required": false,
|
|
58383
59788
|
"schema": {
|
|
58384
59789
|
"description": "Calendar year to rank (default: last year).",
|
|
58385
|
-
"pattern": "^\\d{4}
|
|
59790
|
+
"pattern": "^\\d{4}$",
|
|
58386
59791
|
"type": "string"
|
|
58387
59792
|
}
|
|
58388
59793
|
},
|
|
@@ -58511,7 +59916,7 @@
|
|
|
58511
59916
|
"schema": {
|
|
58512
59917
|
"description": "Reporting window. `last_N_months` = the N most recent COMPLETED calendar months (the current month is excluded); `year_to_date` = Jan 1 through the end of last month; `YYYY` (or `fy_YYYY`) = that calendar year; `all_time`. Default `last_12_months`.",
|
|
58513
59918
|
"example": "last_12_months",
|
|
58514
|
-
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})
|
|
59919
|
+
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})$",
|
|
58515
59920
|
"type": "string"
|
|
58516
59921
|
}
|
|
58517
59922
|
},
|
|
@@ -58523,7 +59928,7 @@
|
|
|
58523
59928
|
"schema": {
|
|
58524
59929
|
"description": "Two-letter state. Matches the loan officer's CURRENT NMLS location, not where they were when they moved.",
|
|
58525
59930
|
"example": "TX",
|
|
58526
|
-
"pattern": "^[A-Za-z]{2}
|
|
59931
|
+
"pattern": "^[A-Za-z]{2}$",
|
|
58527
59932
|
"type": "string"
|
|
58528
59933
|
}
|
|
58529
59934
|
},
|
|
@@ -58535,7 +59940,7 @@
|
|
|
58535
59940
|
"schema": {
|
|
58536
59941
|
"description": "Comma-separated two-letter states (e.g. a region). ORed; combined with `state` when both are sent.",
|
|
58537
59942
|
"example": "WA,OR,ID",
|
|
58538
|
-
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})
|
|
59943
|
+
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})*$",
|
|
58539
59944
|
"type": "string"
|
|
58540
59945
|
}
|
|
58541
59946
|
},
|
|
@@ -58559,7 +59964,7 @@
|
|
|
58559
59964
|
"schema": {
|
|
58560
59965
|
"description": "Comma-separated company categories (`BANK`, `CU`, `OTHER`) applied to the company whose roster changed — the destination for arrivals, the company left for departures.",
|
|
58561
59966
|
"example": "BANK,CU",
|
|
58562
|
-
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))
|
|
59967
|
+
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))*$",
|
|
58563
59968
|
"type": "string"
|
|
58564
59969
|
}
|
|
58565
59970
|
}
|
|
@@ -58666,7 +60071,7 @@
|
|
|
58666
60071
|
"schema": {
|
|
58667
60072
|
"description": "Reporting window. `last_N_months` = the N most recent COMPLETED calendar months (the current month is excluded); `year_to_date` = Jan 1 through the end of last month; `YYYY` (or `fy_YYYY`) = that calendar year; `all_time`. Default `last_12_months`.",
|
|
58668
60073
|
"example": "last_12_months",
|
|
58669
|
-
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})
|
|
60074
|
+
"pattern": "^(?:last_\\d{1,3}_months|year_to_date|all_time|(?:fy_|fiscal_)?\\d{4})$",
|
|
58670
60075
|
"type": "string"
|
|
58671
60076
|
}
|
|
58672
60077
|
},
|
|
@@ -58678,7 +60083,7 @@
|
|
|
58678
60083
|
"schema": {
|
|
58679
60084
|
"description": "Two-letter state. Matches the loan officer's CURRENT NMLS location, not where they were when they moved.",
|
|
58680
60085
|
"example": "TX",
|
|
58681
|
-
"pattern": "^[A-Za-z]{2}
|
|
60086
|
+
"pattern": "^[A-Za-z]{2}$",
|
|
58682
60087
|
"type": "string"
|
|
58683
60088
|
}
|
|
58684
60089
|
},
|
|
@@ -58690,7 +60095,7 @@
|
|
|
58690
60095
|
"schema": {
|
|
58691
60096
|
"description": "Comma-separated two-letter states (e.g. a region). ORed; combined with `state` when both are sent.",
|
|
58692
60097
|
"example": "WA,OR,ID",
|
|
58693
|
-
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})
|
|
60098
|
+
"pattern": "^[A-Za-z]{2}(?:,[A-Za-z]{2})*$",
|
|
58694
60099
|
"type": "string"
|
|
58695
60100
|
}
|
|
58696
60101
|
},
|
|
@@ -58714,7 +60119,7 @@
|
|
|
58714
60119
|
"schema": {
|
|
58715
60120
|
"description": "Comma-separated company categories (`BANK`, `CU`, `OTHER`) applied to the company whose roster changed — the destination for arrivals, the company left for departures.",
|
|
58716
60121
|
"example": "BANK,CU",
|
|
58717
|
-
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))
|
|
60122
|
+
"pattern": "^(?:BANK|CU|OTHER)(?:,(?:BANK|CU|OTHER))*$",
|
|
58718
60123
|
"type": "string"
|
|
58719
60124
|
}
|
|
58720
60125
|
},
|
|
@@ -59013,7 +60418,7 @@
|
|
|
59013
60418
|
"required": false,
|
|
59014
60419
|
"schema": {
|
|
59015
60420
|
"description": "Usage window start (YYYY-MM-DD, inclusive)",
|
|
59016
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}
|
|
60421
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
59017
60422
|
"type": "string"
|
|
59018
60423
|
}
|
|
59019
60424
|
},
|
|
@@ -59024,7 +60429,7 @@
|
|
|
59024
60429
|
"required": false,
|
|
59025
60430
|
"schema": {
|
|
59026
60431
|
"description": "Usage window end (YYYY-MM-DD, inclusive)",
|
|
59027
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}
|
|
60432
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
59028
60433
|
"type": "string"
|
|
59029
60434
|
}
|
|
59030
60435
|
}
|
|
@@ -61157,9 +62562,10 @@
|
|
|
61157
62562
|
]
|
|
61158
62563
|
}
|
|
61159
62564
|
},
|
|
61160
|
-
"/v1/originators/{nmlsId}/breakdowns/
|
|
62565
|
+
"/v1/originators/{nmlsId}/breakdowns/title-companies": {
|
|
61161
62566
|
"post": {
|
|
61162
|
-
"
|
|
62567
|
+
"description": "Ranks the title companies on this entity's loans (recorded deeds, `recording_date` window — the same population and period axis as every other loans breakdown). Spellings of one company are MERGED: `label` is its most-used spelling, `id` the normalized name every spelling was grouped under (legal-form and filler words such as `inc`, `llc`, `co`, `company`, `title`, `escrow` removed; `natl` → `national`). Placeholder entries meaning \"no title company recorded\" (`none available` and its misspellings, `unknown`, `n/a`, …) and names shorter than 3 characters are excluded rather than ranked. `attorney` and `accommodation` are kept: they say who closed. `pctUnits` / `pctVolume` are shares of the entity's WHOLE loan population in the window, including loans with no title company, so they do not sum to 100 across the page. Pages of up to 100 via `pagination`.",
|
|
62568
|
+
"operationId": "originatorTitleCompanies",
|
|
61163
62569
|
"parameters": [
|
|
61164
62570
|
{
|
|
61165
62571
|
"description": "Originator NMLS ID",
|
|
@@ -61190,7 +62596,7 @@
|
|
|
61190
62596
|
}
|
|
61191
62597
|
}
|
|
61192
62598
|
},
|
|
61193
|
-
"description": "Breakdown of the
|
|
62599
|
+
"description": "Breakdown of the entity's loans by title company"
|
|
61194
62600
|
},
|
|
61195
62601
|
"400": {
|
|
61196
62602
|
"content": {
|
|
@@ -61243,15 +62649,15 @@
|
|
|
61243
62649
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
61244
62650
|
}
|
|
61245
62651
|
},
|
|
61246
|
-
"summary": "
|
|
62652
|
+
"summary": "Title companies on this LO's loans (spellings merged)",
|
|
61247
62653
|
"tags": [
|
|
61248
62654
|
"Originators"
|
|
61249
62655
|
]
|
|
61250
62656
|
}
|
|
61251
62657
|
},
|
|
61252
|
-
"/v1/originators/{nmlsId}/
|
|
62658
|
+
"/v1/originators/{nmlsId}/breakdowns/zip-codes": {
|
|
61253
62659
|
"post": {
|
|
61254
|
-
"operationId": "
|
|
62660
|
+
"operationId": "originatorZipCodes",
|
|
61255
62661
|
"parameters": [
|
|
61256
62662
|
{
|
|
61257
62663
|
"description": "Originator NMLS ID",
|
|
@@ -61268,7 +62674,7 @@
|
|
|
61268
62674
|
"content": {
|
|
61269
62675
|
"application/json": {
|
|
61270
62676
|
"schema": {
|
|
61271
|
-
"$ref": "#/components/schemas/
|
|
62677
|
+
"$ref": "#/components/schemas/BreakdownRequest"
|
|
61272
62678
|
}
|
|
61273
62679
|
}
|
|
61274
62680
|
}
|
|
@@ -61278,11 +62684,11 @@
|
|
|
61278
62684
|
"content": {
|
|
61279
62685
|
"application/json": {
|
|
61280
62686
|
"schema": {
|
|
61281
|
-
"$ref": "#/components/schemas/
|
|
62687
|
+
"$ref": "#/components/schemas/BreakdownResponse"
|
|
61282
62688
|
}
|
|
61283
62689
|
}
|
|
61284
62690
|
},
|
|
61285
|
-
"description": "
|
|
62691
|
+
"description": "Breakdown of the LO's loans by zip-codes"
|
|
61286
62692
|
},
|
|
61287
62693
|
"400": {
|
|
61288
62694
|
"content": {
|
|
@@ -61335,16 +62741,15 @@
|
|
|
61335
62741
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
61336
62742
|
}
|
|
61337
62743
|
},
|
|
61338
|
-
"summary": "
|
|
62744
|
+
"summary": "Zip-code volume breakdown",
|
|
61339
62745
|
"tags": [
|
|
61340
62746
|
"Originators"
|
|
61341
62747
|
]
|
|
61342
62748
|
}
|
|
61343
62749
|
},
|
|
61344
|
-
"/v1/originators/{nmlsId}/
|
|
62750
|
+
"/v1/originators/{nmlsId}/loans": {
|
|
61345
62751
|
"post": {
|
|
61346
|
-
"
|
|
61347
|
-
"operationId": "originatorMarkets",
|
|
62752
|
+
"operationId": "originatorLoans",
|
|
61348
62753
|
"parameters": [
|
|
61349
62754
|
{
|
|
61350
62755
|
"description": "Originator NMLS ID",
|
|
@@ -61361,7 +62766,7 @@
|
|
|
61361
62766
|
"content": {
|
|
61362
62767
|
"application/json": {
|
|
61363
62768
|
"schema": {
|
|
61364
|
-
"$ref": "#/components/schemas/
|
|
62769
|
+
"$ref": "#/components/schemas/LoanListRequest"
|
|
61365
62770
|
}
|
|
61366
62771
|
}
|
|
61367
62772
|
}
|
|
@@ -61371,11 +62776,11 @@
|
|
|
61371
62776
|
"content": {
|
|
61372
62777
|
"application/json": {
|
|
61373
62778
|
"schema": {
|
|
61374
|
-
"$ref": "#/components/schemas/
|
|
62779
|
+
"$ref": "#/components/schemas/LoanListResponse"
|
|
61375
62780
|
}
|
|
61376
62781
|
}
|
|
61377
62782
|
},
|
|
61378
|
-
"description": "
|
|
62783
|
+
"description": "Paginated list of loans originated by this LO"
|
|
61379
62784
|
},
|
|
61380
62785
|
"400": {
|
|
61381
62786
|
"content": {
|
|
@@ -61415,7 +62820,7 @@
|
|
|
61415
62820
|
}
|
|
61416
62821
|
}
|
|
61417
62822
|
},
|
|
61418
|
-
"description": "
|
|
62823
|
+
"description": "Not found"
|
|
61419
62824
|
},
|
|
61420
62825
|
"413": {
|
|
61421
62826
|
"content": {
|
|
@@ -61428,16 +62833,16 @@
|
|
|
61428
62833
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
61429
62834
|
}
|
|
61430
62835
|
},
|
|
61431
|
-
"summary": "
|
|
62836
|
+
"summary": "Loans originated by this LO",
|
|
61432
62837
|
"tags": [
|
|
61433
62838
|
"Originators"
|
|
61434
62839
|
]
|
|
61435
62840
|
}
|
|
61436
62841
|
},
|
|
61437
|
-
"/v1/originators/{nmlsId}/
|
|
62842
|
+
"/v1/originators/{nmlsId}/markets": {
|
|
61438
62843
|
"post": {
|
|
61439
|
-
"description": "
|
|
61440
|
-
"operationId": "
|
|
62844
|
+
"description": "One blended view of a loan officer's lending footprint: the ZIP codes they originated in, city / county / state rollups of the same scope, and the period totals those markets are a share of. AVERAGES ARE VOLUME-WEIGHTED: the summary loan size is Σ volume ÷ Σ units, not an unweighted mean of the per-market averages (on a real footprint the two differ by thousands of dollars). Sending `zipCodes` narrows every grain to those ZIPs; sending a `dateRange` re-cuts the window. Either switches the response from the LO's pre-aggregated footprint to a live aggregation of their loans — `source` and `sourceReasons` say which was used, and bucket `key` forms differ between them (use `name` for display). All shares on this response are 0–100 percentages. A summary can cover less than the whole book: production that could not be attributed to a place is held out and reported in `summary.unresolved` rather than being folded in or silently dropped. The summary also carries a Community Lending mix — what kind of neighborhood this book lands in. These are U.S. Census tract-level aggregates describing whole neighborhoods, never individual, household or applicant attributes. Unscoped it is the LO's own whole-period mix; a ZIP or date scope recomputes it over the markets in scope, and `summary.communityLending.basis` says which you got.",
|
|
62845
|
+
"operationId": "originatorMarkets",
|
|
61441
62846
|
"parameters": [
|
|
61442
62847
|
{
|
|
61443
62848
|
"description": "Originator NMLS ID",
|
|
@@ -61454,7 +62859,7 @@
|
|
|
61454
62859
|
"content": {
|
|
61455
62860
|
"application/json": {
|
|
61456
62861
|
"schema": {
|
|
61457
|
-
"$ref": "#/components/schemas/
|
|
62862
|
+
"$ref": "#/components/schemas/OriginatorMarketsRequest"
|
|
61458
62863
|
}
|
|
61459
62864
|
}
|
|
61460
62865
|
}
|
|
@@ -61464,11 +62869,11 @@
|
|
|
61464
62869
|
"content": {
|
|
61465
62870
|
"application/json": {
|
|
61466
62871
|
"schema": {
|
|
61467
|
-
"$ref": "#/components/schemas/
|
|
62872
|
+
"$ref": "#/components/schemas/OriginatorMarketsResponse"
|
|
61468
62873
|
}
|
|
61469
62874
|
}
|
|
61470
62875
|
},
|
|
61471
|
-
"description": "
|
|
62876
|
+
"description": "The LO's blended market footprint"
|
|
61472
62877
|
},
|
|
61473
62878
|
"400": {
|
|
61474
62879
|
"content": {
|
|
@@ -61508,7 +62913,7 @@
|
|
|
61508
62913
|
}
|
|
61509
62914
|
}
|
|
61510
62915
|
},
|
|
61511
|
-
"description": "
|
|
62916
|
+
"description": "Originator not found"
|
|
61512
62917
|
},
|
|
61513
62918
|
"413": {
|
|
61514
62919
|
"content": {
|
|
@@ -61521,16 +62926,28 @@
|
|
|
61521
62926
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
61522
62927
|
}
|
|
61523
62928
|
},
|
|
61524
|
-
"summary": "
|
|
62929
|
+
"summary": "The markets this LO lends in",
|
|
61525
62930
|
"tags": [
|
|
61526
62931
|
"Originators"
|
|
61527
62932
|
]
|
|
61528
62933
|
}
|
|
61529
62934
|
},
|
|
61530
|
-
"/v1/properties": {
|
|
62935
|
+
"/v1/originators/{nmlsId}/properties": {
|
|
61531
62936
|
"post": {
|
|
61532
|
-
"description": "
|
|
61533
|
-
"operationId": "
|
|
62937
|
+
"description": "Returns the parcels this loan officer is attributed to in public record — the reverse of the `parties` block on `GET /v1/properties/{id}`. Accepts the same filters, sorts and pagination as the main property search, so a caller can ask 'this LO's parcels in Travis County built after 2015' in one request. Attribution is ALL-TIME: a parcel stays in this LO's set after the loan is paid off, because the question is career reach rather than current book. An LO with no attributed parcels returns an empty page, not a 404 — the LO may be real and simply have nothing in the public record yet.",
|
|
62938
|
+
"operationId": "originatorProperties",
|
|
62939
|
+
"parameters": [
|
|
62940
|
+
{
|
|
62941
|
+
"description": "Originator NMLS ID",
|
|
62942
|
+
"in": "path",
|
|
62943
|
+
"name": "nmlsId",
|
|
62944
|
+
"required": true,
|
|
62945
|
+
"schema": {
|
|
62946
|
+
"description": "Originator NMLS ID",
|
|
62947
|
+
"type": "string"
|
|
62948
|
+
}
|
|
62949
|
+
}
|
|
62950
|
+
],
|
|
61534
62951
|
"requestBody": {
|
|
61535
62952
|
"content": {
|
|
61536
62953
|
"application/json": {
|
|
@@ -61549,7 +62966,7 @@
|
|
|
61549
62966
|
}
|
|
61550
62967
|
}
|
|
61551
62968
|
},
|
|
61552
|
-
"description": "Paginated list of
|
|
62969
|
+
"description": "Paginated list of parcels attributed to this LO"
|
|
61553
62970
|
},
|
|
61554
62971
|
"400": {
|
|
61555
62972
|
"content": {
|
|
@@ -61602,20 +63019,21 @@
|
|
|
61602
63019
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
61603
63020
|
}
|
|
61604
63021
|
},
|
|
61605
|
-
"summary": "
|
|
63022
|
+
"summary": "Properties this loan officer has touched",
|
|
61606
63023
|
"tags": [
|
|
61607
|
-
"
|
|
63024
|
+
"Originators"
|
|
61608
63025
|
]
|
|
61609
63026
|
}
|
|
61610
63027
|
},
|
|
61611
|
-
"/v1/properties
|
|
63028
|
+
"/v1/properties": {
|
|
61612
63029
|
"post": {
|
|
61613
|
-
"
|
|
63030
|
+
"description": "Search and list individual properties/parcels with filters — one row per parcel. Filter by location (state, county, city, zip, address), owner name, property characteristics (beds, baths, square footage, year built, property type), value, and ownership or transaction history, with sorting and cursor pagination. This is the discrete per-property record search: use it to find specific properties or build a filtered property list. (For a single property by its ID use the property detail endpoint.) If you only need how many properties match and not the records themselves, send the same request body to `countProperties`.",
|
|
63031
|
+
"operationId": "listProperties",
|
|
61614
63032
|
"requestBody": {
|
|
61615
63033
|
"content": {
|
|
61616
63034
|
"application/json": {
|
|
61617
63035
|
"schema": {
|
|
61618
|
-
"$ref": "#/components/schemas/
|
|
63036
|
+
"$ref": "#/components/schemas/PropertyListRequest"
|
|
61619
63037
|
}
|
|
61620
63038
|
}
|
|
61621
63039
|
}
|
|
@@ -61625,11 +63043,11 @@
|
|
|
61625
63043
|
"content": {
|
|
61626
63044
|
"application/json": {
|
|
61627
63045
|
"schema": {
|
|
61628
|
-
"$ref": "#/components/schemas/
|
|
63046
|
+
"$ref": "#/components/schemas/PropertyListResponse"
|
|
61629
63047
|
}
|
|
61630
63048
|
}
|
|
61631
63049
|
},
|
|
61632
|
-
"description": "
|
|
63050
|
+
"description": "Paginated list of properties"
|
|
61633
63051
|
},
|
|
61634
63052
|
"400": {
|
|
61635
63053
|
"content": {
|
|
@@ -61682,20 +63100,20 @@
|
|
|
61682
63100
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
61683
63101
|
}
|
|
61684
63102
|
},
|
|
61685
|
-
"summary": "
|
|
63103
|
+
"summary": "Search properties with filters",
|
|
61686
63104
|
"tags": [
|
|
61687
63105
|
"Properties"
|
|
61688
63106
|
]
|
|
61689
63107
|
}
|
|
61690
63108
|
},
|
|
61691
|
-
"/v1/properties/analytics/
|
|
63109
|
+
"/v1/properties/analytics/chart": {
|
|
61692
63110
|
"post": {
|
|
61693
|
-
"operationId": "
|
|
63111
|
+
"operationId": "propertiesAnalyticsChart",
|
|
61694
63112
|
"requestBody": {
|
|
61695
63113
|
"content": {
|
|
61696
63114
|
"application/json": {
|
|
61697
63115
|
"schema": {
|
|
61698
|
-
"$ref": "#/components/schemas/
|
|
63116
|
+
"$ref": "#/components/schemas/PropertyChartRequest"
|
|
61699
63117
|
}
|
|
61700
63118
|
}
|
|
61701
63119
|
}
|
|
@@ -61705,11 +63123,91 @@
|
|
|
61705
63123
|
"content": {
|
|
61706
63124
|
"application/json": {
|
|
61707
63125
|
"schema": {
|
|
61708
|
-
"$ref": "#/components/schemas/
|
|
63126
|
+
"$ref": "#/components/schemas/ChartResponse"
|
|
61709
63127
|
}
|
|
61710
63128
|
}
|
|
61711
63129
|
},
|
|
61712
|
-
"description": "
|
|
63130
|
+
"description": "Chart data with measure/slice breakdown"
|
|
63131
|
+
},
|
|
63132
|
+
"400": {
|
|
63133
|
+
"content": {
|
|
63134
|
+
"application/json": {
|
|
63135
|
+
"schema": {
|
|
63136
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
63137
|
+
}
|
|
63138
|
+
}
|
|
63139
|
+
},
|
|
63140
|
+
"description": "Validation error"
|
|
63141
|
+
},
|
|
63142
|
+
"401": {
|
|
63143
|
+
"content": {
|
|
63144
|
+
"application/json": {
|
|
63145
|
+
"schema": {
|
|
63146
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
63147
|
+
}
|
|
63148
|
+
}
|
|
63149
|
+
},
|
|
63150
|
+
"description": "Unauthorized"
|
|
63151
|
+
},
|
|
63152
|
+
"403": {
|
|
63153
|
+
"content": {
|
|
63154
|
+
"application/json": {
|
|
63155
|
+
"schema": {
|
|
63156
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
63157
|
+
}
|
|
63158
|
+
}
|
|
63159
|
+
},
|
|
63160
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
63161
|
+
},
|
|
63162
|
+
"404": {
|
|
63163
|
+
"content": {
|
|
63164
|
+
"application/json": {
|
|
63165
|
+
"schema": {
|
|
63166
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
63167
|
+
}
|
|
63168
|
+
}
|
|
63169
|
+
},
|
|
63170
|
+
"description": "Not found"
|
|
63171
|
+
},
|
|
63172
|
+
"413": {
|
|
63173
|
+
"content": {
|
|
63174
|
+
"application/json": {
|
|
63175
|
+
"schema": {
|
|
63176
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
63177
|
+
}
|
|
63178
|
+
}
|
|
63179
|
+
},
|
|
63180
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
63181
|
+
}
|
|
63182
|
+
},
|
|
63183
|
+
"summary": "Configurable chart data (measure × slice)",
|
|
63184
|
+
"tags": [
|
|
63185
|
+
"Properties"
|
|
63186
|
+
]
|
|
63187
|
+
}
|
|
63188
|
+
},
|
|
63189
|
+
"/v1/properties/analytics/summary": {
|
|
63190
|
+
"post": {
|
|
63191
|
+
"operationId": "propertiesAnalyticsSummary",
|
|
63192
|
+
"requestBody": {
|
|
63193
|
+
"content": {
|
|
63194
|
+
"application/json": {
|
|
63195
|
+
"schema": {
|
|
63196
|
+
"$ref": "#/components/schemas/PropertySummaryRequest"
|
|
63197
|
+
}
|
|
63198
|
+
}
|
|
63199
|
+
}
|
|
63200
|
+
},
|
|
63201
|
+
"responses": {
|
|
63202
|
+
"200": {
|
|
63203
|
+
"content": {
|
|
63204
|
+
"application/json": {
|
|
63205
|
+
"schema": {
|
|
63206
|
+
"$ref": "#/components/schemas/PropertyAnalyticsResponse"
|
|
63207
|
+
}
|
|
63208
|
+
}
|
|
63209
|
+
},
|
|
63210
|
+
"description": "Property count and average AVM value"
|
|
61713
63211
|
},
|
|
61714
63212
|
"400": {
|
|
61715
63213
|
"content": {
|
|
@@ -62466,6 +63964,17 @@
|
|
|
62466
63964
|
"description": "Pagination cursor from a previous response",
|
|
62467
63965
|
"type": "string"
|
|
62468
63966
|
}
|
|
63967
|
+
},
|
|
63968
|
+
{
|
|
63969
|
+
"description": "Return only this property's enrichment (zero or one item). The id is the one in the credit ledger's `enrich:<propertyId>` reason.",
|
|
63970
|
+
"in": "query",
|
|
63971
|
+
"name": "propertyId",
|
|
63972
|
+
"required": false,
|
|
63973
|
+
"schema": {
|
|
63974
|
+
"description": "Return only this property's enrichment (zero or one item). The id is the one in the credit ledger's `enrich:<propertyId>` reason.",
|
|
63975
|
+
"minLength": 1,
|
|
63976
|
+
"type": "string"
|
|
63977
|
+
}
|
|
62469
63978
|
}
|
|
62470
63979
|
],
|
|
62471
63980
|
"responses": {
|
|
@@ -63584,6 +65093,473 @@
|
|
|
63584
65093
|
]
|
|
63585
65094
|
}
|
|
63586
65095
|
},
|
|
65096
|
+
"/v1/saved-filters": {
|
|
65097
|
+
"get": {
|
|
65098
|
+
"description": "The caller's saved filters (and saved CRM views) in the active organization, oldest first, optionally narrowed by target and kind.",
|
|
65099
|
+
"operationId": "listSavedFilters",
|
|
65100
|
+
"parameters": [
|
|
65101
|
+
{
|
|
65102
|
+
"description": "Which list the filter runs against. Market targets run against that entity's list operation (see `operationId`, e.g. listOriginators); `crm_people` / `crm_companies` are UI-only (filtered client-side).",
|
|
65103
|
+
"in": "query",
|
|
65104
|
+
"name": "target",
|
|
65105
|
+
"required": false,
|
|
65106
|
+
"schema": {
|
|
65107
|
+
"description": "Which list the filter runs against. Market targets run against that entity's list operation (see `operationId`, e.g. listOriginators); `crm_people` / `crm_companies` are UI-only (filtered client-side).",
|
|
65108
|
+
"enum": [
|
|
65109
|
+
"originators",
|
|
65110
|
+
"agents",
|
|
65111
|
+
"companies",
|
|
65112
|
+
"branches",
|
|
65113
|
+
"offices",
|
|
65114
|
+
"loans",
|
|
65115
|
+
"properties",
|
|
65116
|
+
"sales",
|
|
65117
|
+
"crm_people",
|
|
65118
|
+
"crm_companies"
|
|
65119
|
+
],
|
|
65120
|
+
"type": "string"
|
|
65121
|
+
}
|
|
65122
|
+
},
|
|
65123
|
+
{
|
|
65124
|
+
"description": "`filter` (default) — a saved search; `view` — a saved CRM table layout (columns / order) kept in `uiState`. Views never carry a `query` and have their own 25-per-target quota. Fixed at create.",
|
|
65125
|
+
"in": "query",
|
|
65126
|
+
"name": "kind",
|
|
65127
|
+
"required": false,
|
|
65128
|
+
"schema": {
|
|
65129
|
+
"description": "`filter` (default) — a saved search; `view` — a saved CRM table layout (columns / order) kept in `uiState`. Views never carry a `query` and have their own 25-per-target quota. Fixed at create.",
|
|
65130
|
+
"enum": [
|
|
65131
|
+
"filter",
|
|
65132
|
+
"view"
|
|
65133
|
+
],
|
|
65134
|
+
"type": "string"
|
|
65135
|
+
}
|
|
65136
|
+
}
|
|
65137
|
+
],
|
|
65138
|
+
"responses": {
|
|
65139
|
+
"200": {
|
|
65140
|
+
"content": {
|
|
65141
|
+
"application/json": {
|
|
65142
|
+
"schema": {
|
|
65143
|
+
"$ref": "#/components/schemas/SavedFilterList"
|
|
65144
|
+
}
|
|
65145
|
+
}
|
|
65146
|
+
},
|
|
65147
|
+
"description": "Saved filters."
|
|
65148
|
+
},
|
|
65149
|
+
"400": {
|
|
65150
|
+
"content": {
|
|
65151
|
+
"application/json": {
|
|
65152
|
+
"schema": {
|
|
65153
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65154
|
+
}
|
|
65155
|
+
}
|
|
65156
|
+
},
|
|
65157
|
+
"description": "Validation error"
|
|
65158
|
+
},
|
|
65159
|
+
"401": {
|
|
65160
|
+
"content": {
|
|
65161
|
+
"application/json": {
|
|
65162
|
+
"schema": {
|
|
65163
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65164
|
+
}
|
|
65165
|
+
}
|
|
65166
|
+
},
|
|
65167
|
+
"description": "Unauthorized"
|
|
65168
|
+
},
|
|
65169
|
+
"403": {
|
|
65170
|
+
"content": {
|
|
65171
|
+
"application/json": {
|
|
65172
|
+
"schema": {
|
|
65173
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65174
|
+
}
|
|
65175
|
+
}
|
|
65176
|
+
},
|
|
65177
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
65178
|
+
},
|
|
65179
|
+
"404": {
|
|
65180
|
+
"content": {
|
|
65181
|
+
"application/json": {
|
|
65182
|
+
"schema": {
|
|
65183
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65184
|
+
}
|
|
65185
|
+
}
|
|
65186
|
+
},
|
|
65187
|
+
"description": "Not found"
|
|
65188
|
+
},
|
|
65189
|
+
"413": {
|
|
65190
|
+
"content": {
|
|
65191
|
+
"application/json": {
|
|
65192
|
+
"schema": {
|
|
65193
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
65194
|
+
}
|
|
65195
|
+
}
|
|
65196
|
+
},
|
|
65197
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
65198
|
+
}
|
|
65199
|
+
},
|
|
65200
|
+
"summary": "List your saved filters",
|
|
65201
|
+
"tags": [
|
|
65202
|
+
"Saved Filters"
|
|
65203
|
+
]
|
|
65204
|
+
},
|
|
65205
|
+
"post": {
|
|
65206
|
+
"description": "Save a named filter for a list target. For a market target, `query` is the target operation's request body without `pagination` (e.g. the body you would send to listOriginators) and is validated against it. Limit: 25 per target.",
|
|
65207
|
+
"operationId": "createSavedFilter",
|
|
65208
|
+
"requestBody": {
|
|
65209
|
+
"content": {
|
|
65210
|
+
"application/json": {
|
|
65211
|
+
"schema": {
|
|
65212
|
+
"$ref": "#/components/schemas/CreateSavedFilterRequest"
|
|
65213
|
+
}
|
|
65214
|
+
}
|
|
65215
|
+
}
|
|
65216
|
+
},
|
|
65217
|
+
"responses": {
|
|
65218
|
+
"201": {
|
|
65219
|
+
"content": {
|
|
65220
|
+
"application/json": {
|
|
65221
|
+
"schema": {
|
|
65222
|
+
"$ref": "#/components/schemas/CreateSavedFilterResult"
|
|
65223
|
+
}
|
|
65224
|
+
}
|
|
65225
|
+
},
|
|
65226
|
+
"description": "The saved filter."
|
|
65227
|
+
},
|
|
65228
|
+
"400": {
|
|
65229
|
+
"content": {
|
|
65230
|
+
"application/json": {
|
|
65231
|
+
"schema": {
|
|
65232
|
+
"$ref": "#/components/schemas/SavedFilterError"
|
|
65233
|
+
}
|
|
65234
|
+
}
|
|
65235
|
+
},
|
|
65236
|
+
"description": "Validation error — including a `query` that is not a valid request for the target's operation (`issues` lists each problem)."
|
|
65237
|
+
},
|
|
65238
|
+
"401": {
|
|
65239
|
+
"content": {
|
|
65240
|
+
"application/json": {
|
|
65241
|
+
"schema": {
|
|
65242
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65243
|
+
}
|
|
65244
|
+
}
|
|
65245
|
+
},
|
|
65246
|
+
"description": "Unauthorized"
|
|
65247
|
+
},
|
|
65248
|
+
"403": {
|
|
65249
|
+
"content": {
|
|
65250
|
+
"application/json": {
|
|
65251
|
+
"schema": {
|
|
65252
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65253
|
+
}
|
|
65254
|
+
}
|
|
65255
|
+
},
|
|
65256
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
65257
|
+
},
|
|
65258
|
+
"404": {
|
|
65259
|
+
"content": {
|
|
65260
|
+
"application/json": {
|
|
65261
|
+
"schema": {
|
|
65262
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65263
|
+
}
|
|
65264
|
+
}
|
|
65265
|
+
},
|
|
65266
|
+
"description": "Not found"
|
|
65267
|
+
},
|
|
65268
|
+
"409": {
|
|
65269
|
+
"content": {
|
|
65270
|
+
"application/json": {
|
|
65271
|
+
"schema": {
|
|
65272
|
+
"$ref": "#/components/schemas/SavedFilterError"
|
|
65273
|
+
}
|
|
65274
|
+
}
|
|
65275
|
+
},
|
|
65276
|
+
"description": "`QUOTA_EXCEEDED` — 25 saved filters for this target already; update or delete one."
|
|
65277
|
+
},
|
|
65278
|
+
"413": {
|
|
65279
|
+
"content": {
|
|
65280
|
+
"application/json": {
|
|
65281
|
+
"schema": {
|
|
65282
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
65283
|
+
}
|
|
65284
|
+
}
|
|
65285
|
+
},
|
|
65286
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
65287
|
+
}
|
|
65288
|
+
},
|
|
65289
|
+
"summary": "Save a filter",
|
|
65290
|
+
"tags": [
|
|
65291
|
+
"Saved Filters"
|
|
65292
|
+
]
|
|
65293
|
+
}
|
|
65294
|
+
},
|
|
65295
|
+
"/v1/saved-filters/{id}": {
|
|
65296
|
+
"delete": {
|
|
65297
|
+
"operationId": "deleteSavedFilter",
|
|
65298
|
+
"parameters": [
|
|
65299
|
+
{
|
|
65300
|
+
"description": "Saved-filter id (nanoid).",
|
|
65301
|
+
"in": "path",
|
|
65302
|
+
"name": "id",
|
|
65303
|
+
"required": true,
|
|
65304
|
+
"schema": {
|
|
65305
|
+
"description": "Saved-filter id (nanoid).",
|
|
65306
|
+
"example": "V1StGXR8_Z5jdHi6B-myT",
|
|
65307
|
+
"maxLength": 32,
|
|
65308
|
+
"minLength": 1,
|
|
65309
|
+
"pattern": "^[\\w-]+$",
|
|
65310
|
+
"type": "string"
|
|
65311
|
+
}
|
|
65312
|
+
}
|
|
65313
|
+
],
|
|
65314
|
+
"responses": {
|
|
65315
|
+
"200": {
|
|
65316
|
+
"content": {
|
|
65317
|
+
"application/json": {
|
|
65318
|
+
"schema": {
|
|
65319
|
+
"$ref": "#/components/schemas/DeleteSavedFilterResult"
|
|
65320
|
+
}
|
|
65321
|
+
}
|
|
65322
|
+
},
|
|
65323
|
+
"description": "Deleted."
|
|
65324
|
+
},
|
|
65325
|
+
"400": {
|
|
65326
|
+
"content": {
|
|
65327
|
+
"application/json": {
|
|
65328
|
+
"schema": {
|
|
65329
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65330
|
+
}
|
|
65331
|
+
}
|
|
65332
|
+
},
|
|
65333
|
+
"description": "Validation error"
|
|
65334
|
+
},
|
|
65335
|
+
"401": {
|
|
65336
|
+
"content": {
|
|
65337
|
+
"application/json": {
|
|
65338
|
+
"schema": {
|
|
65339
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65340
|
+
}
|
|
65341
|
+
}
|
|
65342
|
+
},
|
|
65343
|
+
"description": "Unauthorized"
|
|
65344
|
+
},
|
|
65345
|
+
"403": {
|
|
65346
|
+
"content": {
|
|
65347
|
+
"application/json": {
|
|
65348
|
+
"schema": {
|
|
65349
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65350
|
+
}
|
|
65351
|
+
}
|
|
65352
|
+
},
|
|
65353
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
65354
|
+
},
|
|
65355
|
+
"404": {
|
|
65356
|
+
"content": {
|
|
65357
|
+
"application/json": {
|
|
65358
|
+
"schema": {
|
|
65359
|
+
"$ref": "#/components/schemas/SavedFilterError"
|
|
65360
|
+
}
|
|
65361
|
+
}
|
|
65362
|
+
},
|
|
65363
|
+
"description": "No saved filter with that id belongs to the caller."
|
|
65364
|
+
},
|
|
65365
|
+
"413": {
|
|
65366
|
+
"content": {
|
|
65367
|
+
"application/json": {
|
|
65368
|
+
"schema": {
|
|
65369
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
65370
|
+
}
|
|
65371
|
+
}
|
|
65372
|
+
},
|
|
65373
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
65374
|
+
}
|
|
65375
|
+
},
|
|
65376
|
+
"summary": "Delete a saved filter",
|
|
65377
|
+
"tags": [
|
|
65378
|
+
"Saved Filters"
|
|
65379
|
+
]
|
|
65380
|
+
},
|
|
65381
|
+
"get": {
|
|
65382
|
+
"description": "Returns the saved `query` and the `operationId` to run it with. Check `fidelity` (`partial` → `unmapped` lists what the query omits; `ui_only` → nothing to run) and `stale` (the query no longer validates) before running.",
|
|
65383
|
+
"operationId": "getSavedFilter",
|
|
65384
|
+
"parameters": [
|
|
65385
|
+
{
|
|
65386
|
+
"description": "Saved-filter id (nanoid).",
|
|
65387
|
+
"in": "path",
|
|
65388
|
+
"name": "id",
|
|
65389
|
+
"required": true,
|
|
65390
|
+
"schema": {
|
|
65391
|
+
"description": "Saved-filter id (nanoid).",
|
|
65392
|
+
"example": "V1StGXR8_Z5jdHi6B-myT",
|
|
65393
|
+
"maxLength": 32,
|
|
65394
|
+
"minLength": 1,
|
|
65395
|
+
"pattern": "^[\\w-]+$",
|
|
65396
|
+
"type": "string"
|
|
65397
|
+
}
|
|
65398
|
+
}
|
|
65399
|
+
],
|
|
65400
|
+
"responses": {
|
|
65401
|
+
"200": {
|
|
65402
|
+
"content": {
|
|
65403
|
+
"application/json": {
|
|
65404
|
+
"schema": {
|
|
65405
|
+
"$ref": "#/components/schemas/GetSavedFilterResult"
|
|
65406
|
+
}
|
|
65407
|
+
}
|
|
65408
|
+
},
|
|
65409
|
+
"description": "The saved filter."
|
|
65410
|
+
},
|
|
65411
|
+
"400": {
|
|
65412
|
+
"content": {
|
|
65413
|
+
"application/json": {
|
|
65414
|
+
"schema": {
|
|
65415
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65416
|
+
}
|
|
65417
|
+
}
|
|
65418
|
+
},
|
|
65419
|
+
"description": "Validation error"
|
|
65420
|
+
},
|
|
65421
|
+
"401": {
|
|
65422
|
+
"content": {
|
|
65423
|
+
"application/json": {
|
|
65424
|
+
"schema": {
|
|
65425
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65426
|
+
}
|
|
65427
|
+
}
|
|
65428
|
+
},
|
|
65429
|
+
"description": "Unauthorized"
|
|
65430
|
+
},
|
|
65431
|
+
"403": {
|
|
65432
|
+
"content": {
|
|
65433
|
+
"application/json": {
|
|
65434
|
+
"schema": {
|
|
65435
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65436
|
+
}
|
|
65437
|
+
}
|
|
65438
|
+
},
|
|
65439
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
65440
|
+
},
|
|
65441
|
+
"404": {
|
|
65442
|
+
"content": {
|
|
65443
|
+
"application/json": {
|
|
65444
|
+
"schema": {
|
|
65445
|
+
"$ref": "#/components/schemas/SavedFilterError"
|
|
65446
|
+
}
|
|
65447
|
+
}
|
|
65448
|
+
},
|
|
65449
|
+
"description": "No saved filter with that id belongs to the caller."
|
|
65450
|
+
},
|
|
65451
|
+
"413": {
|
|
65452
|
+
"content": {
|
|
65453
|
+
"application/json": {
|
|
65454
|
+
"schema": {
|
|
65455
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
65456
|
+
}
|
|
65457
|
+
}
|
|
65458
|
+
},
|
|
65459
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
65460
|
+
}
|
|
65461
|
+
},
|
|
65462
|
+
"summary": "Get a saved filter (with the operation to run it)",
|
|
65463
|
+
"tags": [
|
|
65464
|
+
"Saved Filters"
|
|
65465
|
+
]
|
|
65466
|
+
},
|
|
65467
|
+
"patch": {
|
|
65468
|
+
"description": "Rename, re-icon, or replace the query / UI state. The target is fixed. A new `query` is validated like on create.",
|
|
65469
|
+
"operationId": "updateSavedFilter",
|
|
65470
|
+
"parameters": [
|
|
65471
|
+
{
|
|
65472
|
+
"description": "Saved-filter id (nanoid).",
|
|
65473
|
+
"in": "path",
|
|
65474
|
+
"name": "id",
|
|
65475
|
+
"required": true,
|
|
65476
|
+
"schema": {
|
|
65477
|
+
"description": "Saved-filter id (nanoid).",
|
|
65478
|
+
"example": "V1StGXR8_Z5jdHi6B-myT",
|
|
65479
|
+
"maxLength": 32,
|
|
65480
|
+
"minLength": 1,
|
|
65481
|
+
"pattern": "^[\\w-]+$",
|
|
65482
|
+
"type": "string"
|
|
65483
|
+
}
|
|
65484
|
+
}
|
|
65485
|
+
],
|
|
65486
|
+
"requestBody": {
|
|
65487
|
+
"content": {
|
|
65488
|
+
"application/json": {
|
|
65489
|
+
"schema": {
|
|
65490
|
+
"$ref": "#/components/schemas/UpdateSavedFilterRequest"
|
|
65491
|
+
}
|
|
65492
|
+
}
|
|
65493
|
+
}
|
|
65494
|
+
},
|
|
65495
|
+
"responses": {
|
|
65496
|
+
"200": {
|
|
65497
|
+
"content": {
|
|
65498
|
+
"application/json": {
|
|
65499
|
+
"schema": {
|
|
65500
|
+
"$ref": "#/components/schemas/UpdateSavedFilterResult"
|
|
65501
|
+
}
|
|
65502
|
+
}
|
|
65503
|
+
},
|
|
65504
|
+
"description": "The updated filter."
|
|
65505
|
+
},
|
|
65506
|
+
"400": {
|
|
65507
|
+
"content": {
|
|
65508
|
+
"application/json": {
|
|
65509
|
+
"schema": {
|
|
65510
|
+
"$ref": "#/components/schemas/SavedFilterError"
|
|
65511
|
+
}
|
|
65512
|
+
}
|
|
65513
|
+
},
|
|
65514
|
+
"description": "Validation error — including a `query` that is not a valid request for the target's operation (`issues` lists each problem)."
|
|
65515
|
+
},
|
|
65516
|
+
"401": {
|
|
65517
|
+
"content": {
|
|
65518
|
+
"application/json": {
|
|
65519
|
+
"schema": {
|
|
65520
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65521
|
+
}
|
|
65522
|
+
}
|
|
65523
|
+
},
|
|
65524
|
+
"description": "Unauthorized"
|
|
65525
|
+
},
|
|
65526
|
+
"403": {
|
|
65527
|
+
"content": {
|
|
65528
|
+
"application/json": {
|
|
65529
|
+
"schema": {
|
|
65530
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
65531
|
+
}
|
|
65532
|
+
}
|
|
65533
|
+
},
|
|
65534
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
65535
|
+
},
|
|
65536
|
+
"404": {
|
|
65537
|
+
"content": {
|
|
65538
|
+
"application/json": {
|
|
65539
|
+
"schema": {
|
|
65540
|
+
"$ref": "#/components/schemas/SavedFilterError"
|
|
65541
|
+
}
|
|
65542
|
+
}
|
|
65543
|
+
},
|
|
65544
|
+
"description": "No saved filter with that id belongs to the caller."
|
|
65545
|
+
},
|
|
65546
|
+
"413": {
|
|
65547
|
+
"content": {
|
|
65548
|
+
"application/json": {
|
|
65549
|
+
"schema": {
|
|
65550
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
65551
|
+
}
|
|
65552
|
+
}
|
|
65553
|
+
},
|
|
65554
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
65555
|
+
}
|
|
65556
|
+
},
|
|
65557
|
+
"summary": "Update a saved filter",
|
|
65558
|
+
"tags": [
|
|
65559
|
+
"Saved Filters"
|
|
65560
|
+
]
|
|
65561
|
+
}
|
|
65562
|
+
},
|
|
63587
65563
|
"/v1/search-token": {
|
|
63588
65564
|
"get": {
|
|
63589
65565
|
"description": "Returns a short-lived scoped search token plus the host to query, so a trusted client can search the entity indexes directly with per-query controls (e.g. attributesToSearchOn for name-only matching).",
|
|
@@ -63744,6 +65720,10 @@
|
|
|
63744
65720
|
"description": "Real-estate sales transactions",
|
|
63745
65721
|
"name": "Sales"
|
|
63746
65722
|
},
|
|
65723
|
+
{
|
|
65724
|
+
"description": "Your saved list filters — store a query once, re-run it against its list operation",
|
|
65725
|
+
"name": "Saved Filters"
|
|
65726
|
+
},
|
|
63747
65727
|
{
|
|
63748
65728
|
"description": "Instant multi-entity search",
|
|
63749
65729
|
"name": "Search"
|