@model-match/api 3.25.0 → 3.27.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-CN5K4sO6.d.mts → index-DKSn-0DO.d.mts} +267 -9
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +1 -1
- package/dist/slim/index.d.mts +14 -4
- package/dist/slim/index.mjs +30 -4
- package/dist/{src-BHuxdqI3.mjs → src-C2QtRet2.mjs} +28 -2
- package/openapi.json +1354 -357
- package/package.json +2 -2
package/openapi.json
CHANGED
|
@@ -4114,6 +4114,47 @@
|
|
|
4114
4114
|
],
|
|
4115
4115
|
"description": "Production county, keyed by 5-digit county FIPS code (e.g. `06037` = Los Angeles, CA; `04013` = Maricopa, AZ). Matches agents who closed transactions in this county — NOT their office or listed address, which carry no county data at all. A county NAME is REJECTED with a 400 naming the expected format; resolve the name to its FIPS code first (via instantSearch), or use `city`/`state`, which do accept names. Location dimensions AND with each other, so `county` + `state` returns only agents matching both; what sets `county` apart from `city`/`state`/`zip` is its source — those are satisfied by an office address OR a production market, `county` by production alone."
|
|
4116
4116
|
},
|
|
4117
|
+
"AgentCrmListFilter": {
|
|
4118
|
+
"additionalProperties": false,
|
|
4119
|
+
"description": "Scope the result to the caller's CRM. Resolved against the caller's ACTIVE WORKSPACE at query time — list membership is read server-side, so the request never carries member ids. Only real-estate-agent members count; loan officers and manual (unlinked) records on the same list are ignored. `mode: \"in\"` with no matching members returns an empty page (not an unfiltered one). Errors: 400 `crm_list_requires_workspace` when the caller has no active workspace (API-key / OAuth callers must select an organization), 403 / 404 when a named list is not visible to the caller or does not exist, and 400 `crm_list_too_large` when the selected lists hold more than 50,000 agents in total — narrow the selection rather than get a silently partial answer.",
|
|
4120
|
+
"properties": {
|
|
4121
|
+
"lists": {
|
|
4122
|
+
"anyOf": [
|
|
4123
|
+
{
|
|
4124
|
+
"description": "Every People list in the caller's workspace that the caller can see (own, org-wide, or shared with them).",
|
|
4125
|
+
"enum": [
|
|
4126
|
+
"any"
|
|
4127
|
+
],
|
|
4128
|
+
"type": "string"
|
|
4129
|
+
},
|
|
4130
|
+
{
|
|
4131
|
+
"description": "Specific CRM list ids (1–50).",
|
|
4132
|
+
"items": {
|
|
4133
|
+
"minLength": 1,
|
|
4134
|
+
"type": "string"
|
|
4135
|
+
},
|
|
4136
|
+
"maxItems": 50,
|
|
4137
|
+
"minItems": 1,
|
|
4138
|
+
"type": "array"
|
|
4139
|
+
}
|
|
4140
|
+
],
|
|
4141
|
+
"description": "Which lists: `\"any\"` for every People list the caller can see, or an array of list ids. Membership is the UNION across the selected lists."
|
|
4142
|
+
},
|
|
4143
|
+
"mode": {
|
|
4144
|
+
"description": "`in` — only agents who are a member of the selected list(s). `notIn` — exclude every agent who is a member of the selected list(s); everyone else passes, including agents on none of your lists.",
|
|
4145
|
+
"enum": [
|
|
4146
|
+
"in",
|
|
4147
|
+
"notIn"
|
|
4148
|
+
],
|
|
4149
|
+
"type": "string"
|
|
4150
|
+
}
|
|
4151
|
+
},
|
|
4152
|
+
"required": [
|
|
4153
|
+
"mode",
|
|
4154
|
+
"lists"
|
|
4155
|
+
],
|
|
4156
|
+
"type": "object"
|
|
4157
|
+
},
|
|
4117
4158
|
"AgentDetail": {
|
|
4118
4159
|
"allOf": [
|
|
4119
4160
|
{
|
|
@@ -4323,12 +4364,25 @@
|
|
|
4323
4364
|
"advancedFilters": {
|
|
4324
4365
|
"$ref": "#/components/schemas/FilterNode"
|
|
4325
4366
|
},
|
|
4367
|
+
"crmList": {
|
|
4368
|
+
"$ref": "#/components/schemas/AgentCrmListFilter"
|
|
4369
|
+
},
|
|
4326
4370
|
"filters": {
|
|
4327
4371
|
"$ref": "#/components/schemas/FilterNode"
|
|
4328
4372
|
},
|
|
4329
4373
|
"flatFilters": {
|
|
4330
4374
|
"additionalProperties": false,
|
|
4331
4375
|
"properties": {
|
|
4376
|
+
"activeListings": {
|
|
4377
|
+
"allOf": [
|
|
4378
|
+
{
|
|
4379
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
4380
|
+
},
|
|
4381
|
+
{
|
|
4382
|
+
"description": "Current active listings (not period-scoped). `{gte: 1}` = has listings."
|
|
4383
|
+
}
|
|
4384
|
+
]
|
|
4385
|
+
},
|
|
4332
4386
|
"avgMortgagedLoanAmount": {
|
|
4333
4387
|
"allOf": [
|
|
4334
4388
|
{
|
|
@@ -4361,6 +4415,16 @@
|
|
|
4361
4415
|
"county": {
|
|
4362
4416
|
"$ref": "#/components/schemas/AgentCountyFilterValue"
|
|
4363
4417
|
},
|
|
4418
|
+
"currentOffice": {
|
|
4419
|
+
"allOf": [
|
|
4420
|
+
{
|
|
4421
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
4422
|
+
},
|
|
4423
|
+
{
|
|
4424
|
+
"description": "Brokerage/office name(s), OR'd: each a case-insensitive whole-word phrase (`\"compass\"` matches \"Compass RE\", not \"Encompass\"); end with `*` for a prefix (`\"washington fine*\"`); names with punctuation (`\"@properties\"`) match as a substring. `{match}` is a fuzzy single-name match. Matches only the agent's CURRENT office; `office` takes the same values and matches ANY office on record."
|
|
4425
|
+
}
|
|
4426
|
+
]
|
|
4427
|
+
},
|
|
4364
4428
|
"dualUnits": {
|
|
4365
4429
|
"$ref": "#/components/schemas/NumericFilterValue"
|
|
4366
4430
|
},
|
|
@@ -4370,6 +4434,26 @@
|
|
|
4370
4434
|
"email": {
|
|
4371
4435
|
"$ref": "#/components/schemas/TextFilterValue"
|
|
4372
4436
|
},
|
|
4437
|
+
"excludeCurrentOffice": {
|
|
4438
|
+
"allOf": [
|
|
4439
|
+
{
|
|
4440
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
4441
|
+
},
|
|
4442
|
+
{
|
|
4443
|
+
"description": "Drop agents whose CURRENT office matches these names."
|
|
4444
|
+
}
|
|
4445
|
+
]
|
|
4446
|
+
},
|
|
4447
|
+
"excludeOffice": {
|
|
4448
|
+
"allOf": [
|
|
4449
|
+
{
|
|
4450
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
4451
|
+
},
|
|
4452
|
+
{
|
|
4453
|
+
"description": "Drop agents with ANY office matching these names (same grammar as `office`)."
|
|
4454
|
+
}
|
|
4455
|
+
]
|
|
4456
|
+
},
|
|
4373
4457
|
"firstName": {
|
|
4374
4458
|
"allOf": [
|
|
4375
4459
|
{
|
|
@@ -4384,6 +4468,26 @@
|
|
|
4384
4468
|
"geoPoint": {
|
|
4385
4469
|
"$ref": "#/components/schemas/GeoFilterValue"
|
|
4386
4470
|
},
|
|
4471
|
+
"hasEmail": {
|
|
4472
|
+
"allOf": [
|
|
4473
|
+
{
|
|
4474
|
+
"$ref": "#/components/schemas/BooleanFilterValue"
|
|
4475
|
+
},
|
|
4476
|
+
{
|
|
4477
|
+
"description": "Whether the row's `email` is populated."
|
|
4478
|
+
}
|
|
4479
|
+
]
|
|
4480
|
+
},
|
|
4481
|
+
"hasPhone": {
|
|
4482
|
+
"allOf": [
|
|
4483
|
+
{
|
|
4484
|
+
"$ref": "#/components/schemas/BooleanFilterValue"
|
|
4485
|
+
},
|
|
4486
|
+
{
|
|
4487
|
+
"description": "Whether the row's `phone` is populated."
|
|
4488
|
+
}
|
|
4489
|
+
]
|
|
4490
|
+
},
|
|
4387
4491
|
"id": {
|
|
4388
4492
|
"allOf": [
|
|
4389
4493
|
{
|
|
@@ -4405,9 +4509,29 @@
|
|
|
4405
4509
|
}
|
|
4406
4510
|
]
|
|
4407
4511
|
},
|
|
4512
|
+
"lastTransactionDate": {
|
|
4513
|
+
"allOf": [
|
|
4514
|
+
{
|
|
4515
|
+
"$ref": "#/components/schemas/DateFilterValue"
|
|
4516
|
+
},
|
|
4517
|
+
{
|
|
4518
|
+
"description": "Date of the agent's newest deal inside the selected period — \"recently active\". `{gte: \"2026-07-01\"}`. Only producing agents carry it."
|
|
4519
|
+
}
|
|
4520
|
+
]
|
|
4521
|
+
},
|
|
4408
4522
|
"licenseNumber": {
|
|
4409
4523
|
"$ref": "#/components/schemas/AgentLicenseFilterValue"
|
|
4410
4524
|
},
|
|
4525
|
+
"licensedSinceDate": {
|
|
4526
|
+
"allOf": [
|
|
4527
|
+
{
|
|
4528
|
+
"$ref": "#/components/schemas/DateFilterValue"
|
|
4529
|
+
},
|
|
4530
|
+
{
|
|
4531
|
+
"description": "Original issue date of a real-estate license on the record (any license) — \"new agents\": `{gte: \"2025-10-01\"}`. Lifetime, not period-scoped; on ~26% of agents."
|
|
4532
|
+
}
|
|
4533
|
+
]
|
|
4534
|
+
},
|
|
4411
4535
|
"mode": {
|
|
4412
4536
|
"enum": [
|
|
4413
4537
|
"and",
|
|
@@ -4685,12 +4809,24 @@
|
|
|
4685
4809
|
"lenderMatchMode": {
|
|
4686
4810
|
"$ref": "#/components/schemas/LenderMatchMode"
|
|
4687
4811
|
},
|
|
4812
|
+
"locationSource": {
|
|
4813
|
+
"$ref": "#/components/schemas/AgentLocationSource"
|
|
4814
|
+
},
|
|
4815
|
+
"losOnMyTeam": {
|
|
4816
|
+
"$ref": "#/components/schemas/AgentLosOnMyTeamFilter"
|
|
4817
|
+
},
|
|
4688
4818
|
"pagination": {
|
|
4689
4819
|
"$ref": "#/components/schemas/Pagination"
|
|
4690
4820
|
},
|
|
4691
4821
|
"period": {
|
|
4692
4822
|
"$ref": "#/components/schemas/Period"
|
|
4693
4823
|
},
|
|
4824
|
+
"productMix": {
|
|
4825
|
+
"$ref": "#/components/schemas/AgentProductMixFilter"
|
|
4826
|
+
},
|
|
4827
|
+
"sideDominance": {
|
|
4828
|
+
"$ref": "#/components/schemas/AgentSideDominance"
|
|
4829
|
+
},
|
|
4694
4830
|
"sort": {
|
|
4695
4831
|
"items": {
|
|
4696
4832
|
"properties": {
|
|
@@ -5425,6 +5561,39 @@
|
|
|
5425
5561
|
},
|
|
5426
5562
|
"type": "object"
|
|
5427
5563
|
},
|
|
5564
|
+
"AgentLocationSource": {
|
|
5565
|
+
"description": "Which location signal `city`/`state`/`zip`/`county` match. `any` (default) = an office OR a market they transacted in; `office` = their CURRENT office only (a `county` filter is a 400 — offices carry no county); `production` = transaction markets only.",
|
|
5566
|
+
"enum": [
|
|
5567
|
+
"any",
|
|
5568
|
+
"office",
|
|
5569
|
+
"production"
|
|
5570
|
+
],
|
|
5571
|
+
"type": "string"
|
|
5572
|
+
},
|
|
5573
|
+
"AgentLosOnMyTeamFilter": {
|
|
5574
|
+
"additionalProperties": false,
|
|
5575
|
+
"description": "Relationship with loan officers at the CALLER's company, resolved server-side from the caller's profile NMLS id and that LO's current employer; the caller's own deals never count. 400 `los_on_my_team_requires_company` when the caller has no NMLS id on their profile or it resolves to no company.",
|
|
5576
|
+
"properties": {
|
|
5577
|
+
"minUnits": {
|
|
5578
|
+
"description": "Buyer-side deals with ONE colleague that count as a relationship (default 1). Under `doesNotWorkWith`, agents below it still pass.",
|
|
5579
|
+
"maximum": 100,
|
|
5580
|
+
"minimum": 1,
|
|
5581
|
+
"type": "integer"
|
|
5582
|
+
},
|
|
5583
|
+
"relationship": {
|
|
5584
|
+
"description": "`worksWith` — the agent's buyers were financed by loan officers at the caller's company; `doesNotWorkWith` — no such relationship (prospects).",
|
|
5585
|
+
"enum": [
|
|
5586
|
+
"worksWith",
|
|
5587
|
+
"doesNotWorkWith"
|
|
5588
|
+
],
|
|
5589
|
+
"type": "string"
|
|
5590
|
+
}
|
|
5591
|
+
},
|
|
5592
|
+
"required": [
|
|
5593
|
+
"relationship"
|
|
5594
|
+
],
|
|
5595
|
+
"type": "object"
|
|
5596
|
+
},
|
|
5428
5597
|
"AgentMarket": {
|
|
5429
5598
|
"properties": {
|
|
5430
5599
|
"avgSalePrice": {
|
|
@@ -5825,6 +5994,352 @@
|
|
|
5825
5994
|
],
|
|
5826
5995
|
"type": "object"
|
|
5827
5996
|
},
|
|
5997
|
+
"AgentMortgagedTimeSeriesRequest": {
|
|
5998
|
+
"additionalProperties": false,
|
|
5999
|
+
"properties": {
|
|
6000
|
+
"advancedFilters": {
|
|
6001
|
+
"$ref": "#/components/schemas/FilterNode"
|
|
6002
|
+
},
|
|
6003
|
+
"filters": {
|
|
6004
|
+
"$ref": "#/components/schemas/FilterNode"
|
|
6005
|
+
},
|
|
6006
|
+
"flatFilters": {
|
|
6007
|
+
"additionalProperties": false,
|
|
6008
|
+
"properties": {
|
|
6009
|
+
"borrowerStatus": {
|
|
6010
|
+
"$ref": "#/components/schemas/LoanBorrowerStatusFilterValue"
|
|
6011
|
+
},
|
|
6012
|
+
"broker": {
|
|
6013
|
+
"allOf": [
|
|
6014
|
+
{
|
|
6015
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6016
|
+
},
|
|
6017
|
+
{
|
|
6018
|
+
"description": "Broker shop NMLS id (digits only). A broker is a company — resolve a broker name to its NMLS id via instantSearch (or listCompanies)."
|
|
6019
|
+
}
|
|
6020
|
+
]
|
|
6021
|
+
},
|
|
6022
|
+
"buyerEntityType": {
|
|
6023
|
+
"$ref": "#/components/schemas/BooleanFilterValue"
|
|
6024
|
+
},
|
|
6025
|
+
"city": {
|
|
6026
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6027
|
+
},
|
|
6028
|
+
"conforming": {
|
|
6029
|
+
"$ref": "#/components/schemas/BooleanFilterValue"
|
|
6030
|
+
},
|
|
6031
|
+
"county": {
|
|
6032
|
+
"allOf": [
|
|
6033
|
+
{
|
|
6034
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6035
|
+
},
|
|
6036
|
+
{
|
|
6037
|
+
"description": "County name (e.g. \"Broward\") or 5-digit FIPS code. Names resolve to FIPS server-side; include a `state` filter to disambiguate."
|
|
6038
|
+
}
|
|
6039
|
+
]
|
|
6040
|
+
},
|
|
6041
|
+
"currentBalance": {
|
|
6042
|
+
"allOf": [
|
|
6043
|
+
{
|
|
6044
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6045
|
+
},
|
|
6046
|
+
{
|
|
6047
|
+
"description": "Estimated remaining principal balance (~19% populated). Approximate current equity as `homeValue` (AVM) minus this."
|
|
6048
|
+
}
|
|
6049
|
+
]
|
|
6050
|
+
},
|
|
6051
|
+
"employer": {
|
|
6052
|
+
"allOf": [
|
|
6053
|
+
{
|
|
6054
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6055
|
+
},
|
|
6056
|
+
{
|
|
6057
|
+
"description": "Employer/company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
|
|
6058
|
+
}
|
|
6059
|
+
]
|
|
6060
|
+
},
|
|
6061
|
+
"equity": {
|
|
6062
|
+
"allOf": [
|
|
6063
|
+
{
|
|
6064
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6065
|
+
},
|
|
6066
|
+
{
|
|
6067
|
+
"description": "Point-in-time equity recorded on the loan (sparse, ~10%). NOT a live current-equity figure. For HELOC/cash-out targeting on up-to-date equity, use properties search (listProperties) instead — its equity is far better populated and current."
|
|
6068
|
+
}
|
|
6069
|
+
]
|
|
6070
|
+
},
|
|
6071
|
+
"excludeBroker": {
|
|
6072
|
+
"allOf": [
|
|
6073
|
+
{
|
|
6074
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6075
|
+
},
|
|
6076
|
+
{
|
|
6077
|
+
"description": "Exclude loans brokered by this broker-shop NMLS id (digits only) — the inverse of `broker`."
|
|
6078
|
+
}
|
|
6079
|
+
]
|
|
6080
|
+
},
|
|
6081
|
+
"excludeCity": {
|
|
6082
|
+
"allOf": [
|
|
6083
|
+
{
|
|
6084
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6085
|
+
},
|
|
6086
|
+
{
|
|
6087
|
+
"description": "Exclude loans in this city — the inverse of `city`."
|
|
6088
|
+
}
|
|
6089
|
+
]
|
|
6090
|
+
},
|
|
6091
|
+
"excludeLender": {
|
|
6092
|
+
"allOf": [
|
|
6093
|
+
{
|
|
6094
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6095
|
+
},
|
|
6096
|
+
{
|
|
6097
|
+
"description": "Exclude loans from this lender ID (\"everyone but X\") — the inverse of `lender`, same id contract (resolve via instantSearch/listLenders). Loans with no lender stay in the results."
|
|
6098
|
+
}
|
|
6099
|
+
]
|
|
6100
|
+
},
|
|
6101
|
+
"excludeLoanCompany": {
|
|
6102
|
+
"allOf": [
|
|
6103
|
+
{
|
|
6104
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6105
|
+
},
|
|
6106
|
+
{
|
|
6107
|
+
"description": "Exclude loans funded by this company NMLS id (digits only) — the inverse of `loanCompany`."
|
|
6108
|
+
}
|
|
6109
|
+
]
|
|
6110
|
+
},
|
|
6111
|
+
"excludeOriginator": {
|
|
6112
|
+
"allOf": [
|
|
6113
|
+
{
|
|
6114
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6115
|
+
},
|
|
6116
|
+
{
|
|
6117
|
+
"description": "Exclude loans with this originator NMLS id (digits only) — the inverse of `originator`. Common for 'everyone but my own shop' lists."
|
|
6118
|
+
}
|
|
6119
|
+
]
|
|
6120
|
+
},
|
|
6121
|
+
"excludeState": {
|
|
6122
|
+
"allOf": [
|
|
6123
|
+
{
|
|
6124
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6125
|
+
},
|
|
6126
|
+
{
|
|
6127
|
+
"description": "Exclude loans in this state (2-letter code, e.g. \"CA\") — the inverse of `state`. For \"everywhere but this state\" lists."
|
|
6128
|
+
}
|
|
6129
|
+
]
|
|
6130
|
+
},
|
|
6131
|
+
"excludeZipCode": {
|
|
6132
|
+
"allOf": [
|
|
6133
|
+
{
|
|
6134
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6135
|
+
},
|
|
6136
|
+
{
|
|
6137
|
+
"description": "Exclude loans in this ZIP code — the inverse of `zipCode`."
|
|
6138
|
+
}
|
|
6139
|
+
]
|
|
6140
|
+
},
|
|
6141
|
+
"fips": {
|
|
6142
|
+
"allOf": [
|
|
6143
|
+
{
|
|
6144
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6145
|
+
},
|
|
6146
|
+
{
|
|
6147
|
+
"description": "Exact 5-digit county FIPS code (no name resolution) — the code-only escape hatch alongside `county`."
|
|
6148
|
+
}
|
|
6149
|
+
]
|
|
6150
|
+
},
|
|
6151
|
+
"geoPoint": {
|
|
6152
|
+
"$ref": "#/components/schemas/GeoFilterValue"
|
|
6153
|
+
},
|
|
6154
|
+
"homeValue": {
|
|
6155
|
+
"allOf": [
|
|
6156
|
+
{
|
|
6157
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6158
|
+
},
|
|
6159
|
+
{
|
|
6160
|
+
"description": "AVM (automated valuation) at the linked property (~26%, MLS-linked). Pair with `currentBalance` to approximate current equity."
|
|
6161
|
+
}
|
|
6162
|
+
]
|
|
6163
|
+
},
|
|
6164
|
+
"includeUnknownOriginator": {
|
|
6165
|
+
"allOf": [
|
|
6166
|
+
{
|
|
6167
|
+
"$ref": "#/components/schemas/BooleanFilterValue"
|
|
6168
|
+
},
|
|
6169
|
+
{
|
|
6170
|
+
"description": "Include loans that have no originator NMLS id. Omitted/false (default): such loans are excluded — the vast majority are pre-2016 public records with no linkable originator. true: include them. Note that the default scopes results to loans with a known originator (~2016+ recordings)."
|
|
6171
|
+
}
|
|
6172
|
+
]
|
|
6173
|
+
},
|
|
6174
|
+
"interestRate": {
|
|
6175
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6176
|
+
},
|
|
6177
|
+
"lender": {
|
|
6178
|
+
"allOf": [
|
|
6179
|
+
{
|
|
6180
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6181
|
+
},
|
|
6182
|
+
{
|
|
6183
|
+
"description": "Lender ID — the normalized lender-dictionary key, NOT a fuzzy name match. Resolve a lender via instantSearch (or listLenders) and pass the `id` it returns (e.g. \"mortgage_rocket\" or \"mortgage rocket\"). Underscores and letter case are normalized, so either id surface works. A stored normalized lender name (what the `slice: \"lender\"` chart buckets emit) is also accepted, so a chart bucket key filters directly. A value that is neither returns 400 rather than silently matching nothing — to search by lender NAME, use `lenderName`."
|
|
6184
|
+
}
|
|
6185
|
+
]
|
|
6186
|
+
},
|
|
6187
|
+
"lenderName": {
|
|
6188
|
+
"allOf": [
|
|
6189
|
+
{
|
|
6190
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6191
|
+
},
|
|
6192
|
+
{
|
|
6193
|
+
"description": "Lender name as recorded on the loan document — fuzzy, all-terms match (e.g. \"Fifth Third\"). The name counterpart to the exact-id `lender` filter; use `lender` when you have a resolved id, and this when you only have a name."
|
|
6194
|
+
}
|
|
6195
|
+
]
|
|
6196
|
+
},
|
|
6197
|
+
"loanCompany": {
|
|
6198
|
+
"allOf": [
|
|
6199
|
+
{
|
|
6200
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6201
|
+
},
|
|
6202
|
+
{
|
|
6203
|
+
"description": "Funding/loan company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
|
|
6204
|
+
}
|
|
6205
|
+
]
|
|
6206
|
+
},
|
|
6207
|
+
"loanType": {
|
|
6208
|
+
"$ref": "#/components/schemas/LoanTypeFilterValue"
|
|
6209
|
+
},
|
|
6210
|
+
"ltvAtOrigination": {
|
|
6211
|
+
"allOf": [
|
|
6212
|
+
{
|
|
6213
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6214
|
+
},
|
|
6215
|
+
{
|
|
6216
|
+
"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."
|
|
6217
|
+
}
|
|
6218
|
+
]
|
|
6219
|
+
},
|
|
6220
|
+
"mode": {
|
|
6221
|
+
"enum": [
|
|
6222
|
+
"and",
|
|
6223
|
+
"or"
|
|
6224
|
+
],
|
|
6225
|
+
"type": "string"
|
|
6226
|
+
},
|
|
6227
|
+
"mortgageAmount": {
|
|
6228
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6229
|
+
},
|
|
6230
|
+
"mortgageDate": {
|
|
6231
|
+
"$ref": "#/components/schemas/DateFilterValue"
|
|
6232
|
+
},
|
|
6233
|
+
"originator": {
|
|
6234
|
+
"allOf": [
|
|
6235
|
+
{
|
|
6236
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6237
|
+
},
|
|
6238
|
+
{
|
|
6239
|
+
"description": "Loan originator NMLS id (digits only). To search by name use `originatorName`, or resolve a name to its id via instantSearch."
|
|
6240
|
+
}
|
|
6241
|
+
]
|
|
6242
|
+
},
|
|
6243
|
+
"originatorName": {
|
|
6244
|
+
"allOf": [
|
|
6245
|
+
{
|
|
6246
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6247
|
+
},
|
|
6248
|
+
{
|
|
6249
|
+
"deprecated": true,
|
|
6250
|
+
"description": "DEPRECATED — fuzzy name matching is unreliable (same originator can return wildly different counts by name string). Resolve the loan officer via instantSearch and filter by `originator` (exact NMLS id) instead. Still functional for now."
|
|
6251
|
+
}
|
|
6252
|
+
]
|
|
6253
|
+
},
|
|
6254
|
+
"propertyId": {
|
|
6255
|
+
"allOf": [
|
|
6256
|
+
{
|
|
6257
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6258
|
+
},
|
|
6259
|
+
{
|
|
6260
|
+
"description": "Parcel id — returns every loan recorded against one property. Pass the same string this endpoint returns as `mmPropertyId` on a loan row, or the `mmPropertyId` of a property record.\n\nThis is the parcel's FULL recorded loan history, which is deliberately wider than the loans embedded on a property record: that embed is a snapshot of what is still owed (up to five currently-active loans), so paid-off mortgages are absent from it and present here.\n\nMulti-unit caveat: loans carry a unit-blind parcel id, so for one unit of a multi-unit building this selects every unit in the building, not that unit alone."
|
|
6261
|
+
}
|
|
6262
|
+
]
|
|
6263
|
+
},
|
|
6264
|
+
"saleDate": {
|
|
6265
|
+
"$ref": "#/components/schemas/DateFilterValue"
|
|
6266
|
+
},
|
|
6267
|
+
"salePrice": {
|
|
6268
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6269
|
+
},
|
|
6270
|
+
"state": {
|
|
6271
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6272
|
+
},
|
|
6273
|
+
"transactionType": {
|
|
6274
|
+
"$ref": "#/components/schemas/LoanTransactionTypeFilterValue"
|
|
6275
|
+
},
|
|
6276
|
+
"zip": {
|
|
6277
|
+
"allOf": [
|
|
6278
|
+
{
|
|
6279
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6280
|
+
},
|
|
6281
|
+
{
|
|
6282
|
+
"description": "Alias of `zipCode` — same ZIP filter, accepted for cross-entity key parity."
|
|
6283
|
+
}
|
|
6284
|
+
]
|
|
6285
|
+
},
|
|
6286
|
+
"zipCode": {
|
|
6287
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6288
|
+
}
|
|
6289
|
+
},
|
|
6290
|
+
"type": "object"
|
|
6291
|
+
},
|
|
6292
|
+
"interval": {
|
|
6293
|
+
"$ref": "#/components/schemas/Interval"
|
|
6294
|
+
},
|
|
6295
|
+
"period": {
|
|
6296
|
+
"$ref": "#/components/schemas/DatedPeriod"
|
|
6297
|
+
},
|
|
6298
|
+
"side": {
|
|
6299
|
+
"$ref": "#/components/schemas/AgentSide"
|
|
6300
|
+
}
|
|
6301
|
+
},
|
|
6302
|
+
"type": "object"
|
|
6303
|
+
},
|
|
6304
|
+
"AgentProductMixEntry": {
|
|
6305
|
+
"additionalProperties": false,
|
|
6306
|
+
"properties": {
|
|
6307
|
+
"minShare": {
|
|
6308
|
+
"description": "Minimum financed volume of this product through ONE mortgage company, as a percent of the agent's period sale volume. Omit for 'any deal financed with this product'.",
|
|
6309
|
+
"minimum": 0,
|
|
6310
|
+
"type": "number"
|
|
6311
|
+
},
|
|
6312
|
+
"product": {
|
|
6313
|
+
"description": "Loan product (case-insensitive). `government` = FHA, VA or USDA.",
|
|
6314
|
+
"enum": [
|
|
6315
|
+
"conventional",
|
|
6316
|
+
"fha",
|
|
6317
|
+
"va",
|
|
6318
|
+
"usda",
|
|
6319
|
+
"government",
|
|
6320
|
+
"he",
|
|
6321
|
+
"heloc",
|
|
6322
|
+
"commercial",
|
|
6323
|
+
"building",
|
|
6324
|
+
"reverse"
|
|
6325
|
+
],
|
|
6326
|
+
"type": "string"
|
|
6327
|
+
}
|
|
6328
|
+
},
|
|
6329
|
+
"required": [
|
|
6330
|
+
"product"
|
|
6331
|
+
],
|
|
6332
|
+
"type": "object"
|
|
6333
|
+
},
|
|
6334
|
+
"AgentProductMixFilter": {
|
|
6335
|
+
"description": "Agents whose buyers financed with these loan products in the selected period, ANDed: `[{product: \"fha\"}, {product: \"va\", minShare: 10}]`. Not a whole-book share — the index stores product mix per mortgage company only.",
|
|
6336
|
+
"items": {
|
|
6337
|
+
"$ref": "#/components/schemas/AgentProductMixEntry"
|
|
6338
|
+
},
|
|
6339
|
+
"maxItems": 10,
|
|
6340
|
+
"minItems": 1,
|
|
6341
|
+
"type": "array"
|
|
6342
|
+
},
|
|
5828
6343
|
"AgentPropertiesResponse": {
|
|
5829
6344
|
"properties": {
|
|
5830
6345
|
"cursor": {
|
|
@@ -5933,6 +6448,17 @@
|
|
|
5933
6448
|
"AgentSaleSummary": {
|
|
5934
6449
|
"properties": {
|
|
5935
6450
|
"address": {
|
|
6451
|
+
"description": "Full street line — number, directionals, street name, suffix and unit (`123 w 4th st`), lowercase",
|
|
6452
|
+
"nullable": true,
|
|
6453
|
+
"type": "string"
|
|
6454
|
+
},
|
|
6455
|
+
"builderName": {
|
|
6456
|
+
"description": "Builder, on a new-construction sale",
|
|
6457
|
+
"nullable": true,
|
|
6458
|
+
"type": "string"
|
|
6459
|
+
},
|
|
6460
|
+
"buyerName": {
|
|
6461
|
+
"description": "First buyer named on the sale — from the purchase loan's document when the MLS record names none; `null` on most cash deals",
|
|
5936
6462
|
"nullable": true,
|
|
5937
6463
|
"type": "string"
|
|
5938
6464
|
},
|
|
@@ -5940,6 +6466,16 @@
|
|
|
5940
6466
|
"nullable": true,
|
|
5941
6467
|
"type": "string"
|
|
5942
6468
|
},
|
|
6469
|
+
"coListAgentId": {
|
|
6470
|
+
"description": "Co-listing agent's id (`GET /v1/agents/{id}`), when the sale's agent key resolves to one agent",
|
|
6471
|
+
"nullable": true,
|
|
6472
|
+
"type": "string"
|
|
6473
|
+
},
|
|
6474
|
+
"coListAgentName": {
|
|
6475
|
+
"description": "Co-listing agent, as the MLS recorded the name",
|
|
6476
|
+
"nullable": true,
|
|
6477
|
+
"type": "string"
|
|
6478
|
+
},
|
|
5943
6479
|
"date": {
|
|
5944
6480
|
"nullable": true,
|
|
5945
6481
|
"type": "string"
|
|
@@ -5947,10 +6483,25 @@
|
|
|
5947
6483
|
"id": {
|
|
5948
6484
|
"type": "string"
|
|
5949
6485
|
},
|
|
6486
|
+
"listAgentId": {
|
|
6487
|
+
"description": "Listing agent's id (`GET /v1/agents/{id}`), when the sale's agent key resolves to one agent",
|
|
6488
|
+
"nullable": true,
|
|
6489
|
+
"type": "string"
|
|
6490
|
+
},
|
|
5950
6491
|
"listAgentName": {
|
|
5951
6492
|
"nullable": true,
|
|
5952
6493
|
"type": "string"
|
|
5953
6494
|
},
|
|
6495
|
+
"listDate": {
|
|
6496
|
+
"description": "MLS listing date (`YYYY-MM-DD`); days on market = `date` − `listDate`",
|
|
6497
|
+
"nullable": true,
|
|
6498
|
+
"type": "string"
|
|
6499
|
+
},
|
|
6500
|
+
"listPrice": {
|
|
6501
|
+
"description": "Last MLS list price",
|
|
6502
|
+
"nullable": true,
|
|
6503
|
+
"type": "number"
|
|
6504
|
+
},
|
|
5954
6505
|
"loan": {
|
|
5955
6506
|
"description": "The purchase loan recorded against this sale (matched on the sale id), or `null` when none is recorded — a cash deal, or a loan not yet on file.",
|
|
5956
6507
|
"nullable": true,
|
|
@@ -5959,6 +6510,11 @@
|
|
|
5959
6510
|
"nullable": true,
|
|
5960
6511
|
"type": "number"
|
|
5961
6512
|
},
|
|
6513
|
+
"brokerName": {
|
|
6514
|
+
"description": "Mortgage broker as written on the loan document, when the loan was third-party originated",
|
|
6515
|
+
"nullable": true,
|
|
6516
|
+
"type": "string"
|
|
6517
|
+
},
|
|
5962
6518
|
"brokerNmlsId": {
|
|
5963
6519
|
"description": "Mortgage broker NMLS id when the loan was third-party originated",
|
|
5964
6520
|
"nullable": true,
|
|
@@ -5977,6 +6533,11 @@
|
|
|
5977
6533
|
"description": "Loan id (`GET /v1/loans/{id}`)",
|
|
5978
6534
|
"type": "string"
|
|
5979
6535
|
},
|
|
6536
|
+
"interestRate": {
|
|
6537
|
+
"description": "Note rate in percent (e.g. `6.25`), recorded or modeled; `null` when not on file",
|
|
6538
|
+
"nullable": true,
|
|
6539
|
+
"type": "number"
|
|
6540
|
+
},
|
|
5980
6541
|
"lenderId": {
|
|
5981
6542
|
"description": "Normalized lender key — the value the `lender` filter accepts",
|
|
5982
6543
|
"nullable": true,
|
|
@@ -6026,10 +6587,20 @@
|
|
|
6026
6587
|
],
|
|
6027
6588
|
"type": "object"
|
|
6028
6589
|
},
|
|
6590
|
+
"mmPropertyId": {
|
|
6591
|
+
"description": "The property's id (`GET /v1/properties/{id}`)",
|
|
6592
|
+
"nullable": true,
|
|
6593
|
+
"type": "string"
|
|
6594
|
+
},
|
|
6029
6595
|
"price": {
|
|
6030
6596
|
"nullable": true,
|
|
6031
6597
|
"type": "number"
|
|
6032
6598
|
},
|
|
6599
|
+
"sellerName": {
|
|
6600
|
+
"description": "First seller named on the sale — from the purchase loan's document when the MLS record names none",
|
|
6601
|
+
"nullable": true,
|
|
6602
|
+
"type": "string"
|
|
6603
|
+
},
|
|
6033
6604
|
"side": {
|
|
6034
6605
|
"description": "Which side of this deal the agent was on: `buyer`, `listing`, or `dual` (both). `null` when the sale names the agent under an id this API cannot place on a side.",
|
|
6035
6606
|
"enum": [
|
|
@@ -6041,6 +6612,11 @@
|
|
|
6041
6612
|
"nullable": true,
|
|
6042
6613
|
"type": "string"
|
|
6043
6614
|
},
|
|
6615
|
+
"soldAgentId": {
|
|
6616
|
+
"description": "Buyer's (selling) agent's id (`GET /v1/agents/{id}`), when the sale's agent key resolves to one agent",
|
|
6617
|
+
"nullable": true,
|
|
6618
|
+
"type": "string"
|
|
6619
|
+
},
|
|
6044
6620
|
"soldAgentName": {
|
|
6045
6621
|
"nullable": true,
|
|
6046
6622
|
"type": "string"
|
|
@@ -6064,6 +6640,316 @@
|
|
|
6064
6640
|
],
|
|
6065
6641
|
"type": "object"
|
|
6066
6642
|
},
|
|
6643
|
+
"AgentSalesBreakdownRequest": {
|
|
6644
|
+
"additionalProperties": false,
|
|
6645
|
+
"properties": {
|
|
6646
|
+
"advancedFilters": {
|
|
6647
|
+
"$ref": "#/components/schemas/FilterNode"
|
|
6648
|
+
},
|
|
6649
|
+
"filters": {
|
|
6650
|
+
"$ref": "#/components/schemas/FilterNode"
|
|
6651
|
+
},
|
|
6652
|
+
"flatFilters": {
|
|
6653
|
+
"additionalProperties": false,
|
|
6654
|
+
"properties": {
|
|
6655
|
+
"borrowerStatus": {
|
|
6656
|
+
"$ref": "#/components/schemas/LoanBorrowerStatusFilterValue"
|
|
6657
|
+
},
|
|
6658
|
+
"broker": {
|
|
6659
|
+
"allOf": [
|
|
6660
|
+
{
|
|
6661
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6662
|
+
},
|
|
6663
|
+
{
|
|
6664
|
+
"description": "Broker shop NMLS id (digits only). A broker is a company — resolve a broker name to its NMLS id via instantSearch (or listCompanies)."
|
|
6665
|
+
}
|
|
6666
|
+
]
|
|
6667
|
+
},
|
|
6668
|
+
"buyerEntityType": {
|
|
6669
|
+
"$ref": "#/components/schemas/BooleanFilterValue"
|
|
6670
|
+
},
|
|
6671
|
+
"city": {
|
|
6672
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6673
|
+
},
|
|
6674
|
+
"conforming": {
|
|
6675
|
+
"$ref": "#/components/schemas/BooleanFilterValue"
|
|
6676
|
+
},
|
|
6677
|
+
"county": {
|
|
6678
|
+
"allOf": [
|
|
6679
|
+
{
|
|
6680
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6681
|
+
},
|
|
6682
|
+
{
|
|
6683
|
+
"description": "County name (e.g. \"Broward\") or 5-digit FIPS code. Names resolve to FIPS server-side; include a `state` filter to disambiguate."
|
|
6684
|
+
}
|
|
6685
|
+
]
|
|
6686
|
+
},
|
|
6687
|
+
"currentBalance": {
|
|
6688
|
+
"allOf": [
|
|
6689
|
+
{
|
|
6690
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6691
|
+
},
|
|
6692
|
+
{
|
|
6693
|
+
"description": "Estimated remaining principal balance (~19% populated). Approximate current equity as `homeValue` (AVM) minus this."
|
|
6694
|
+
}
|
|
6695
|
+
]
|
|
6696
|
+
},
|
|
6697
|
+
"employer": {
|
|
6698
|
+
"allOf": [
|
|
6699
|
+
{
|
|
6700
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6701
|
+
},
|
|
6702
|
+
{
|
|
6703
|
+
"description": "Employer/company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
|
|
6704
|
+
}
|
|
6705
|
+
]
|
|
6706
|
+
},
|
|
6707
|
+
"equity": {
|
|
6708
|
+
"allOf": [
|
|
6709
|
+
{
|
|
6710
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6711
|
+
},
|
|
6712
|
+
{
|
|
6713
|
+
"description": "Point-in-time equity recorded on the loan (sparse, ~10%). NOT a live current-equity figure. For HELOC/cash-out targeting on up-to-date equity, use properties search (listProperties) instead — its equity is far better populated and current."
|
|
6714
|
+
}
|
|
6715
|
+
]
|
|
6716
|
+
},
|
|
6717
|
+
"excludeBroker": {
|
|
6718
|
+
"allOf": [
|
|
6719
|
+
{
|
|
6720
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6721
|
+
},
|
|
6722
|
+
{
|
|
6723
|
+
"description": "Exclude loans brokered by this broker-shop NMLS id (digits only) — the inverse of `broker`."
|
|
6724
|
+
}
|
|
6725
|
+
]
|
|
6726
|
+
},
|
|
6727
|
+
"excludeCity": {
|
|
6728
|
+
"allOf": [
|
|
6729
|
+
{
|
|
6730
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6731
|
+
},
|
|
6732
|
+
{
|
|
6733
|
+
"description": "Exclude loans in this city — the inverse of `city`."
|
|
6734
|
+
}
|
|
6735
|
+
]
|
|
6736
|
+
},
|
|
6737
|
+
"excludeLender": {
|
|
6738
|
+
"allOf": [
|
|
6739
|
+
{
|
|
6740
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6741
|
+
},
|
|
6742
|
+
{
|
|
6743
|
+
"description": "Exclude loans from this lender ID (\"everyone but X\") — the inverse of `lender`, same id contract (resolve via instantSearch/listLenders). Loans with no lender stay in the results."
|
|
6744
|
+
}
|
|
6745
|
+
]
|
|
6746
|
+
},
|
|
6747
|
+
"excludeLoanCompany": {
|
|
6748
|
+
"allOf": [
|
|
6749
|
+
{
|
|
6750
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6751
|
+
},
|
|
6752
|
+
{
|
|
6753
|
+
"description": "Exclude loans funded by this company NMLS id (digits only) — the inverse of `loanCompany`."
|
|
6754
|
+
}
|
|
6755
|
+
]
|
|
6756
|
+
},
|
|
6757
|
+
"excludeOriginator": {
|
|
6758
|
+
"allOf": [
|
|
6759
|
+
{
|
|
6760
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6761
|
+
},
|
|
6762
|
+
{
|
|
6763
|
+
"description": "Exclude loans with this originator NMLS id (digits only) — the inverse of `originator`. Common for 'everyone but my own shop' lists."
|
|
6764
|
+
}
|
|
6765
|
+
]
|
|
6766
|
+
},
|
|
6767
|
+
"excludeState": {
|
|
6768
|
+
"allOf": [
|
|
6769
|
+
{
|
|
6770
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6771
|
+
},
|
|
6772
|
+
{
|
|
6773
|
+
"description": "Exclude loans in this state (2-letter code, e.g. \"CA\") — the inverse of `state`. For \"everywhere but this state\" lists."
|
|
6774
|
+
}
|
|
6775
|
+
]
|
|
6776
|
+
},
|
|
6777
|
+
"excludeZipCode": {
|
|
6778
|
+
"allOf": [
|
|
6779
|
+
{
|
|
6780
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6781
|
+
},
|
|
6782
|
+
{
|
|
6783
|
+
"description": "Exclude loans in this ZIP code — the inverse of `zipCode`."
|
|
6784
|
+
}
|
|
6785
|
+
]
|
|
6786
|
+
},
|
|
6787
|
+
"fips": {
|
|
6788
|
+
"allOf": [
|
|
6789
|
+
{
|
|
6790
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6791
|
+
},
|
|
6792
|
+
{
|
|
6793
|
+
"description": "Exact 5-digit county FIPS code (no name resolution) — the code-only escape hatch alongside `county`."
|
|
6794
|
+
}
|
|
6795
|
+
]
|
|
6796
|
+
},
|
|
6797
|
+
"geoPoint": {
|
|
6798
|
+
"$ref": "#/components/schemas/GeoFilterValue"
|
|
6799
|
+
},
|
|
6800
|
+
"homeValue": {
|
|
6801
|
+
"allOf": [
|
|
6802
|
+
{
|
|
6803
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6804
|
+
},
|
|
6805
|
+
{
|
|
6806
|
+
"description": "AVM (automated valuation) at the linked property (~26%, MLS-linked). Pair with `currentBalance` to approximate current equity."
|
|
6807
|
+
}
|
|
6808
|
+
]
|
|
6809
|
+
},
|
|
6810
|
+
"includeUnknownOriginator": {
|
|
6811
|
+
"allOf": [
|
|
6812
|
+
{
|
|
6813
|
+
"$ref": "#/components/schemas/BooleanFilterValue"
|
|
6814
|
+
},
|
|
6815
|
+
{
|
|
6816
|
+
"description": "Include loans that have no originator NMLS id. Omitted/false (default): such loans are excluded — the vast majority are pre-2016 public records with no linkable originator. true: include them. Note that the default scopes results to loans with a known originator (~2016+ recordings)."
|
|
6817
|
+
}
|
|
6818
|
+
]
|
|
6819
|
+
},
|
|
6820
|
+
"interestRate": {
|
|
6821
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6822
|
+
},
|
|
6823
|
+
"lender": {
|
|
6824
|
+
"allOf": [
|
|
6825
|
+
{
|
|
6826
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6827
|
+
},
|
|
6828
|
+
{
|
|
6829
|
+
"description": "Lender ID — the normalized lender-dictionary key, NOT a fuzzy name match. Resolve a lender via instantSearch (or listLenders) and pass the `id` it returns (e.g. \"mortgage_rocket\" or \"mortgage rocket\"). Underscores and letter case are normalized, so either id surface works. A stored normalized lender name (what the `slice: \"lender\"` chart buckets emit) is also accepted, so a chart bucket key filters directly. A value that is neither returns 400 rather than silently matching nothing — to search by lender NAME, use `lenderName`."
|
|
6830
|
+
}
|
|
6831
|
+
]
|
|
6832
|
+
},
|
|
6833
|
+
"lenderName": {
|
|
6834
|
+
"allOf": [
|
|
6835
|
+
{
|
|
6836
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6837
|
+
},
|
|
6838
|
+
{
|
|
6839
|
+
"description": "Lender name as recorded on the loan document — fuzzy, all-terms match (e.g. \"Fifth Third\"). The name counterpart to the exact-id `lender` filter; use `lender` when you have a resolved id, and this when you only have a name."
|
|
6840
|
+
}
|
|
6841
|
+
]
|
|
6842
|
+
},
|
|
6843
|
+
"loanCompany": {
|
|
6844
|
+
"allOf": [
|
|
6845
|
+
{
|
|
6846
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6847
|
+
},
|
|
6848
|
+
{
|
|
6849
|
+
"description": "Funding/loan company NMLS id (digits only). Resolve a company name to its NMLS id via instantSearch."
|
|
6850
|
+
}
|
|
6851
|
+
]
|
|
6852
|
+
},
|
|
6853
|
+
"loanType": {
|
|
6854
|
+
"$ref": "#/components/schemas/LoanTypeFilterValue"
|
|
6855
|
+
},
|
|
6856
|
+
"ltvAtOrigination": {
|
|
6857
|
+
"allOf": [
|
|
6858
|
+
{
|
|
6859
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6860
|
+
},
|
|
6861
|
+
{
|
|
6862
|
+
"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."
|
|
6863
|
+
}
|
|
6864
|
+
]
|
|
6865
|
+
},
|
|
6866
|
+
"mode": {
|
|
6867
|
+
"enum": [
|
|
6868
|
+
"and",
|
|
6869
|
+
"or"
|
|
6870
|
+
],
|
|
6871
|
+
"type": "string"
|
|
6872
|
+
},
|
|
6873
|
+
"mortgageAmount": {
|
|
6874
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6875
|
+
},
|
|
6876
|
+
"mortgageDate": {
|
|
6877
|
+
"$ref": "#/components/schemas/DateFilterValue"
|
|
6878
|
+
},
|
|
6879
|
+
"originator": {
|
|
6880
|
+
"allOf": [
|
|
6881
|
+
{
|
|
6882
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6883
|
+
},
|
|
6884
|
+
{
|
|
6885
|
+
"description": "Loan originator NMLS id (digits only). To search by name use `originatorName`, or resolve a name to its id via instantSearch."
|
|
6886
|
+
}
|
|
6887
|
+
]
|
|
6888
|
+
},
|
|
6889
|
+
"originatorName": {
|
|
6890
|
+
"allOf": [
|
|
6891
|
+
{
|
|
6892
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6893
|
+
},
|
|
6894
|
+
{
|
|
6895
|
+
"deprecated": true,
|
|
6896
|
+
"description": "DEPRECATED — fuzzy name matching is unreliable (same originator can return wildly different counts by name string). Resolve the loan officer via instantSearch and filter by `originator` (exact NMLS id) instead. Still functional for now."
|
|
6897
|
+
}
|
|
6898
|
+
]
|
|
6899
|
+
},
|
|
6900
|
+
"propertyId": {
|
|
6901
|
+
"allOf": [
|
|
6902
|
+
{
|
|
6903
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6904
|
+
},
|
|
6905
|
+
{
|
|
6906
|
+
"description": "Parcel id — returns every loan recorded against one property. Pass the same string this endpoint returns as `mmPropertyId` on a loan row, or the `mmPropertyId` of a property record.\n\nThis is the parcel's FULL recorded loan history, which is deliberately wider than the loans embedded on a property record: that embed is a snapshot of what is still owed (up to five currently-active loans), so paid-off mortgages are absent from it and present here.\n\nMulti-unit caveat: loans carry a unit-blind parcel id, so for one unit of a multi-unit building this selects every unit in the building, not that unit alone."
|
|
6907
|
+
}
|
|
6908
|
+
]
|
|
6909
|
+
},
|
|
6910
|
+
"saleDate": {
|
|
6911
|
+
"$ref": "#/components/schemas/DateFilterValue"
|
|
6912
|
+
},
|
|
6913
|
+
"salePrice": {
|
|
6914
|
+
"$ref": "#/components/schemas/NumericFilterValue"
|
|
6915
|
+
},
|
|
6916
|
+
"state": {
|
|
6917
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6918
|
+
},
|
|
6919
|
+
"transactionType": {
|
|
6920
|
+
"$ref": "#/components/schemas/LoanTransactionTypeFilterValue"
|
|
6921
|
+
},
|
|
6922
|
+
"zip": {
|
|
6923
|
+
"allOf": [
|
|
6924
|
+
{
|
|
6925
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6926
|
+
},
|
|
6927
|
+
{
|
|
6928
|
+
"description": "Alias of `zipCode` — same ZIP filter, accepted for cross-entity key parity."
|
|
6929
|
+
}
|
|
6930
|
+
]
|
|
6931
|
+
},
|
|
6932
|
+
"zipCode": {
|
|
6933
|
+
"$ref": "#/components/schemas/TextFilterValue"
|
|
6934
|
+
}
|
|
6935
|
+
},
|
|
6936
|
+
"type": "object"
|
|
6937
|
+
},
|
|
6938
|
+
"pagination": {
|
|
6939
|
+
"$ref": "#/components/schemas/Pagination"
|
|
6940
|
+
},
|
|
6941
|
+
"period": {
|
|
6942
|
+
"$ref": "#/components/schemas/DatedPeriod"
|
|
6943
|
+
},
|
|
6944
|
+
"side": {
|
|
6945
|
+
"$ref": "#/components/schemas/AgentSide"
|
|
6946
|
+
},
|
|
6947
|
+
"sort": {
|
|
6948
|
+
"$ref": "#/components/schemas/BreakdownSort"
|
|
6949
|
+
}
|
|
6950
|
+
},
|
|
6951
|
+
"type": "object"
|
|
6952
|
+
},
|
|
6067
6953
|
"AgentSalesResponse": {
|
|
6068
6954
|
"properties": {
|
|
6069
6955
|
"cursor": {
|
|
@@ -6108,6 +6994,19 @@
|
|
|
6108
6994
|
],
|
|
6109
6995
|
"type": "string"
|
|
6110
6996
|
},
|
|
6997
|
+
"AgentSideDominance": {
|
|
6998
|
+
"description": "Which side the agent mostly represents in the selected period, OR'd: `buyer` = more buyer-side than seller-side deals, `seller` = the reverse (a tie is neither), `dual` = at least one dual-agency deal.",
|
|
6999
|
+
"items": {
|
|
7000
|
+
"enum": [
|
|
7001
|
+
"buyer",
|
|
7002
|
+
"seller",
|
|
7003
|
+
"dual"
|
|
7004
|
+
],
|
|
7005
|
+
"type": "string"
|
|
7006
|
+
},
|
|
7007
|
+
"minItems": 1,
|
|
7008
|
+
"type": "array"
|
|
7009
|
+
},
|
|
6111
7010
|
"AgentSummary": {
|
|
6112
7011
|
"properties": {
|
|
6113
7012
|
"avgSoldPrice": {
|
|
@@ -31968,7 +32867,7 @@
|
|
|
31968
32867
|
"type": "object"
|
|
31969
32868
|
},
|
|
31970
32869
|
"OriginatorAgentSide": {
|
|
31971
|
-
"description": "Which agent on the LO's loans to rank. `buyer` (default): the buyer's (selling) agent — the agent who brought the borrower. `listing`: the seller's listing
|
|
32870
|
+
"description": "Which agent on the LO's loans to rank. `buyer` (default): the buyer's (selling) agent — the agent who brought the borrower. `listing`: the seller's listing and co-listing agents.",
|
|
31972
32871
|
"enum": [
|
|
31973
32872
|
"buyer",
|
|
31974
32873
|
"listing"
|
|
@@ -41562,7 +42461,7 @@
|
|
|
41562
42461
|
"info": {
|
|
41563
42462
|
"description": "ModelMatch API — mortgage and real-estate market data.\n\n## Bulk delivery limits\n\nThe `POST /{entity}/bulk-delivery` endpoints export a full result set to\nS3 as NDJSON, JSON, CSV, or Parquet.\n\n- **Up to 5,000 rows per delivery: no entitlement required.** Available to\n every authenticated caller.\n- **Above 5,000 rows: requires the entity's `bulk-delivery.{entity}`\n entitlement** (e.g. `bulk-delivery.loans`). The grant's scope sets your\n row ceiling and may also restrict which rows and fields you receive.\n\nA delivery that would exceed the limit available to you is rejected with\n`403 entitlement_missing`, reporting the matched row count and the ceiling\nthat applied. To stay under the limit, pass `limit` — the job then delivers\n(and bills for) only the first `limit` rows of a broader query.\n\n**Need a higher limit?** Email support@modelmatch.com to request the\nentitlement. Limits are raised per organization and per entity.\n\nBulk delivery is billed at 1 credit per delivered row whether or not\nan entitlement is held.\n\nInstead of a download, a delivery can be sent to a push target configured\non your workspace: pass `destination: { type: \"push-target\", targetId }`.\nThe same limits and billing apply.",
|
|
41564
42463
|
"title": "ModelMatch API",
|
|
41565
|
-
"version": "3.
|
|
42464
|
+
"version": "3.79.0"
|
|
41566
42465
|
},
|
|
41567
42466
|
"openapi": "3.1.0",
|
|
41568
42467
|
"paths": {
|
|
@@ -41837,7 +42736,7 @@
|
|
|
41837
42736
|
},
|
|
41838
42737
|
"/v1/agents": {
|
|
41839
42738
|
"post": {
|
|
41840
|
-
"description": "Search and list individual real-estate agents with filters — one row per agent. Filter by name, location (state, city, zip), brokerage/office, and production metrics (sales volume, transaction units, price range), with sorting and cursor pagination. LOCATION SEMANTICS: the state/city/zip filters match ANY of an agent's location signals — their listed city/state, their office address(es), AND the markets where they actually closed transactions (production) — combined with OR. So an agent matches a searched location if their office OR their production is there. A search for city \"Long Beach\" can therefore return agents whose office or displayed primary market is in a different city/state, because they transacted in Long Beach. The `state`/`city` returned on each row reflect the agent's primary market and may differ from the searched location. (Use the `office` filter to match by brokerage/office name, and the per-agent city/county/state breakdown endpoints to rank an agent's volume within a specific market.) RANKING BY DEAL SIDE: combine a location filter with `sort` on `buyerVolume`/`buyerUnits` (or `sellerVolume`/`sellerUnits`, `dualVolume`/`dualUnits`) to rank agents by how active they are representing buyers vs. sellers in that market — e.g. sort `buyerVolume` descending for the most active buyer-side agents in a state or city. This is the per-agent record search: use it to find specific real-estate agents or build a filtered agent list. (For a single agent by ID use the agent detail endpoint.) If you only need how many agents match and not the records themselves, send the same request body to `countAgents`.",
|
|
42739
|
+
"description": "Search and list individual real-estate agents with filters — one row per agent. Filter by name, location (state, city, zip), brokerage/office, and production metrics (sales volume, transaction units, price range), with sorting and cursor pagination. LOCATION SEMANTICS: the state/city/zip filters match ANY of an agent's location signals — their listed city/state, their office address(es), AND the markets where they actually closed transactions (production) — combined with OR. So an agent matches a searched location if their office OR their production is there (set `locationSource` to `office` or `production` to use one signal). A search for city \"Long Beach\" can therefore return agents whose office or displayed primary market is in a different city/state, because they transacted in Long Beach. The `state`/`city` returned on each row reflect the agent's primary market and may differ from the searched location. (Use the `office` filter to match by brokerage/office name — one or several names, each a case-insensitive whole-word phrase, `name*` for a prefix; `currentOffice` restricts to the agent's current office — and the per-agent city/county/state breakdown endpoints to rank an agent's volume within a specific market.) RANKING BY DEAL SIDE: combine a location filter with `sort` on `buyerVolume`/`buyerUnits` (or `sellerVolume`/`sellerUnits`, `dualVolume`/`dualUnits`) to rank agents by how active they are representing buyers vs. sellers in that market — e.g. sort `buyerVolume` descending for the most active buyer-side agents in a state or city. This is the per-agent record search: use it to find specific real-estate agents or build a filtered agent list. (For a single agent by ID use the agent detail endpoint.) If you only need how many agents match and not the records themselves, send the same request body to `countAgents`.",
|
|
41841
42740
|
"operationId": "listAgents",
|
|
41842
42741
|
"requestBody": {
|
|
41843
42742
|
"content": {
|
|
@@ -42158,169 +43057,395 @@
|
|
|
42158
43057
|
}
|
|
42159
43058
|
},
|
|
42160
43059
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
42161
|
-
}
|
|
42162
|
-
},
|
|
42163
|
-
"summary": "Agent volume/units over time with buyer/seller/dual split",
|
|
42164
|
-
"tags": [
|
|
42165
|
-
"Agents"
|
|
42166
|
-
]
|
|
42167
|
-
}
|
|
42168
|
-
},
|
|
42169
|
-
"/v1/agents/bulk-delivery": {
|
|
42170
|
-
"post": {
|
|
42171
|
-
"description": "Queues an ECS task that dumps every matching agents document to S3 in the requested format. Returns 202 with a jobId; poll `GET /v1/agents/bulk-delivery/{jobId}` for status + the signed download URL.\n\n**Row limit.** Deliveries of up to 5,000 rows need no entitlement. Above that, the org's `bulk-delivery.agents` entitlement is required and its scope (row ceiling, row filters, allowed fields) governs the delivery; without it the request is rejected with 403 `entitlement_missing`. Pass `limit` at or below the ceiling to deliver a capped subset of a broader query. Email support@modelmatch.com to request a limit increase.\n\nDelivery is billed at 1 credit per row regardless of entitlement (deliveries submitted from the ModelMatch web app are not billed).\n\n**Push-target destination.** Pass `destination: { type: \"push-target\", targetId }` to have the finished rows sent to a configured push target instead of downloaded. The target is checked before anything is queued; a refusal returns the push target's status and `code` (`TARGET_NOT_FOUND` 404, `FORBIDDEN` 403, `PLAN_REQUIRED` 402, `TARGET_DISABLED` 409, `ENTITY_MISMATCH` 400). Limits and billing are the same as a file delivery.",
|
|
42172
|
-
"operationId": "submitAgentsBulkDelivery",
|
|
42173
|
-
"requestBody": {
|
|
42174
|
-
"content": {
|
|
42175
|
-
"application/json": {
|
|
42176
|
-
"schema": {
|
|
42177
|
-
"allOf": [
|
|
42178
|
-
{
|
|
42179
|
-
"$ref": "#/components/schemas/AgentListRequest"
|
|
42180
|
-
},
|
|
42181
|
-
{
|
|
42182
|
-
"additionalProperties": false,
|
|
42183
|
-
"properties": {
|
|
42184
|
-
"columns": {
|
|
42185
|
-
"description": "A FORMATTED file: its columns, in order, with header labels and number formats — for `format` `csv` or `xlsx` only, and not combined with `fields` or a push-target `destination` (400 `columns_format_unsupported` / `columns_with_fields` / `columns_with_destination`). Every field a column reads is gated by the entitlement exactly as if it were listed in `fields`: a withheld field drops out of a column's fallback list, and a column with nothing left is omitted. An unknown field is a 400 `unknown_column_field`. No `id` column is added. A formatted `csv` starts with a UTF-8 byte-order mark and uses CRLF line endings, so Excel opens it with accented names intact. Columns may read any DTO field and any opt-in column `fields` documents, including the computed `governmentPct`, `branchCount` and `managerName` / `managerNmlsId`.",
|
|
42186
|
-
"items": {
|
|
42187
|
-
"$ref": "#/components/schemas/BulkDeliveryColumn"
|
|
42188
|
-
},
|
|
42189
|
-
"maxItems": 200,
|
|
42190
|
-
"minItems": 1,
|
|
42191
|
-
"type": "array"
|
|
42192
|
-
},
|
|
42193
|
-
"destination": {
|
|
42194
|
-
"$ref": "#/components/schemas/BulkDeliveryDestination"
|
|
42195
|
-
},
|
|
42196
|
-
"fields": {
|
|
42197
|
-
"description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). Agents also offer `email2` / `phone2` (the best-ranked email / phone distinct from `email` / `phone`, admitted by the `email` / `phone` entitlement field), `officePhone` (admitted by `phone`), `activeListings` (current active listings; null when unknown), and the profile-link columns `facebook`, `instagram`, `linkedin`, `twitter`, `youtube`, `tiktok`, `zillow`, `otherLinks` (a `; `-joined list of profile URLs on no known platform) — all admitted by the `links` entitlement field. In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
|
|
42198
|
-
"items": {
|
|
42199
|
-
"minLength": 1,
|
|
42200
|
-
"type": "string"
|
|
42201
|
-
},
|
|
42202
|
-
"type": "array"
|
|
42203
|
-
},
|
|
42204
|
-
"format": {
|
|
42205
|
-
"$ref": "#/components/schemas/BulkDeliveryFormat"
|
|
42206
|
-
},
|
|
42207
|
-
"limit": {
|
|
42208
|
-
"description": "Optional hard cap on the number of rows delivered — and therefore billed (1 credit / row). The job delivers the first `limit` rows in sort order (default newest-first) and bills only for those. If the query matches fewer than `limit`, all matches are delivered. Distinct from the page-size `size` field, which is ignored on this endpoint. The row ceiling still applies — 5,000 without the entity's bulk-delivery entitlement, or the entitlement's `maxRows` with it. A `limit` above the ceiling is rejected, but a `limit` at or below it lets you export a capped top-N even when the full match exceeds the ceiling — which is the intended way to run a broad query under the 5,000-row allowance.",
|
|
42209
|
-
"example": 5000,
|
|
42210
|
-
"exclusiveMinimum": true,
|
|
42211
|
-
"minimum": 0,
|
|
42212
|
-
"type": "integer"
|
|
42213
|
-
}
|
|
42214
|
-
},
|
|
42215
|
-
"type": "object"
|
|
42216
|
-
}
|
|
42217
|
-
]
|
|
42218
|
-
}
|
|
42219
|
-
}
|
|
42220
|
-
}
|
|
42221
|
-
},
|
|
42222
|
-
"responses": {
|
|
42223
|
-
"202": {
|
|
42224
|
-
"content": {
|
|
42225
|
-
"application/json": {
|
|
42226
|
-
"schema": {
|
|
42227
|
-
"$ref": "#/components/schemas/BulkDeliverySubmitResponse"
|
|
42228
|
-
}
|
|
42229
|
-
}
|
|
42230
|
-
},
|
|
42231
|
-
"description": "Job queued; ECS task launched"
|
|
42232
|
-
},
|
|
42233
|
-
"400": {
|
|
42234
|
-
"content": {
|
|
42235
|
-
"application/json": {
|
|
42236
|
-
"schema": {
|
|
42237
|
-
"anyOf": [
|
|
42238
|
-
{
|
|
42239
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
42240
|
-
},
|
|
42241
|
-
{
|
|
42242
|
-
"$ref": "#/components/schemas/BulkDeliveryPreflightExceeded"
|
|
42243
|
-
},
|
|
42244
|
-
{
|
|
42245
|
-
"$ref": "#/components/schemas/BulkDeliveryPushTargetError"
|
|
42246
|
-
},
|
|
42247
|
-
{
|
|
42248
|
-
"$ref": "#/components/schemas/BulkDeliveryColumnsError"
|
|
42249
|
-
}
|
|
42250
|
-
]
|
|
42251
|
-
}
|
|
42252
|
-
}
|
|
42253
|
-
},
|
|
42254
|
-
"description": "Validation failure (incl. `format_required`: a file delivery needs `format`; a refused `columns` request), delivery would exceed the entitlement's maxRows, OR the push target does not accept this entity (`ENTITY_MISMATCH`)"
|
|
43060
|
+
}
|
|
43061
|
+
},
|
|
43062
|
+
"summary": "Agent volume/units over time with buyer/seller/dual split",
|
|
43063
|
+
"tags": [
|
|
43064
|
+
"Agents"
|
|
43065
|
+
]
|
|
43066
|
+
}
|
|
43067
|
+
},
|
|
43068
|
+
"/v1/agents/bulk-delivery": {
|
|
43069
|
+
"post": {
|
|
43070
|
+
"description": "Queues an ECS task that dumps every matching agents document to S3 in the requested format. Returns 202 with a jobId; poll `GET /v1/agents/bulk-delivery/{jobId}` for status + the signed download URL.\n\n**Row limit.** Deliveries of up to 5,000 rows need no entitlement. Above that, the org's `bulk-delivery.agents` entitlement is required and its scope (row ceiling, row filters, allowed fields) governs the delivery; without it the request is rejected with 403 `entitlement_missing`. Pass `limit` at or below the ceiling to deliver a capped subset of a broader query. Email support@modelmatch.com to request a limit increase.\n\nDelivery is billed at 1 credit per row regardless of entitlement (deliveries submitted from the ModelMatch web app are not billed).\n\n**Push-target destination.** Pass `destination: { type: \"push-target\", targetId }` to have the finished rows sent to a configured push target instead of downloaded. The target is checked before anything is queued; a refusal returns the push target's status and `code` (`TARGET_NOT_FOUND` 404, `FORBIDDEN` 403, `PLAN_REQUIRED` 402, `TARGET_DISABLED` 409, `ENTITY_MISMATCH` 400). Limits and billing are the same as a file delivery.",
|
|
43071
|
+
"operationId": "submitAgentsBulkDelivery",
|
|
43072
|
+
"requestBody": {
|
|
43073
|
+
"content": {
|
|
43074
|
+
"application/json": {
|
|
43075
|
+
"schema": {
|
|
43076
|
+
"allOf": [
|
|
43077
|
+
{
|
|
43078
|
+
"$ref": "#/components/schemas/AgentListRequest"
|
|
43079
|
+
},
|
|
43080
|
+
{
|
|
43081
|
+
"additionalProperties": false,
|
|
43082
|
+
"properties": {
|
|
43083
|
+
"columns": {
|
|
43084
|
+
"description": "A FORMATTED file: its columns, in order, with header labels and number formats — for `format` `csv` or `xlsx` only, and not combined with `fields` or a push-target `destination` (400 `columns_format_unsupported` / `columns_with_fields` / `columns_with_destination`). Every field a column reads is gated by the entitlement exactly as if it were listed in `fields`: a withheld field drops out of a column's fallback list, and a column with nothing left is omitted. An unknown field is a 400 `unknown_column_field`. No `id` column is added. A formatted `csv` starts with a UTF-8 byte-order mark and uses CRLF line endings, so Excel opens it with accented names intact. Columns may read any DTO field and any opt-in column `fields` documents, including the computed `governmentPct`, `branchCount` and `managerName` / `managerNmlsId`.",
|
|
43085
|
+
"items": {
|
|
43086
|
+
"$ref": "#/components/schemas/BulkDeliveryColumn"
|
|
43087
|
+
},
|
|
43088
|
+
"maxItems": 200,
|
|
43089
|
+
"minItems": 1,
|
|
43090
|
+
"type": "array"
|
|
43091
|
+
},
|
|
43092
|
+
"destination": {
|
|
43093
|
+
"$ref": "#/components/schemas/BulkDeliveryDestination"
|
|
43094
|
+
},
|
|
43095
|
+
"fields": {
|
|
43096
|
+
"description": "Optional output column projection, named by the response DTO fields (the same camelCase fields the list endpoint returns, e.g. `city`, `interestRate`). Intersected with the entitlement scope's allowedFields and the entity's full column set. If empty after intersection, falls back to all columns. It also SELECTS the opt-in columns, which are not part of the list DTO and are never delivered unless named here: `communityLending` (properties, originators, companies, branches) — the Community Lending neighborhood profile, identical to the block on the entity's detail endpoint; `parties` (properties) — the mortgage parties attributed to the parcel, by attribution scope; `marketCount` / `countyCount` / `stateCount` / `zipCount` / `lenderCount` (originators) — the market-breadth rollups you can already filter on; and the computed `governmentPct` (originators: FHA + VA percent of loans, 0–100), `branchCount` (companies: NMLS branch count) and `managerName` / `managerNmlsId` (branches: the first branch manager). Agents also offer `email2` / `phone2` (the best-ranked email / phone distinct from `email` / `phone`, admitted by the `email` / `phone` entitlement field), `officePhone` (admitted by `phone`), `activeListings` (current active listings; null when unknown), and the profile-link columns `facebook`, `instagram`, `linkedin`, `twitter`, `youtube`, `tiktok`, `zillow`, `otherLinks` (a `; `-joined list of profile URLs on no known platform) — all admitted by the `links` entitlement field. In `csv` and `parquet` the two block columns are JSON-encoded cells; in `json` and `ndjson` they are nested objects. Windowed production (originators, agents, companies, branches): name `<field>_<n>mo` for n in 3, 6, 12, 14, 18, 24 to get a production field for that trailing window regardless of `period` — e.g. `volume_3mo`, `units_6mo`, `purchaseVolume_24mo`. Available for originators `volume`, `units`, `avgLoanAmount`, `purchaseVolume`, `purchaseUnits`, `refinanceVolume`, `refinanceUnits`, `conventionalPct`, `fhaPct`, `vaPct`; agents `volume`, `units`, `avgSoldPrice`, `buyerVolume`, `buyerUnits`, `sellerVolume`, `sellerUnits`, `totalOriginatorsWorkedWith`, `totalCompaniesWorkedWith`, `totalLendersWorkedWith`; companies `volume`, `units`, `avgLoanAmount`, `loCount`; branches `volume`, `units`, `avgLoanAmount`, `purchasePct`, `refinancePct`, `loCount`. Numbers (null when the window has no data); an entitlement that allows a field allows every window of it.",
|
|
43097
|
+
"items": {
|
|
43098
|
+
"minLength": 1,
|
|
43099
|
+
"type": "string"
|
|
43100
|
+
},
|
|
43101
|
+
"type": "array"
|
|
43102
|
+
},
|
|
43103
|
+
"format": {
|
|
43104
|
+
"$ref": "#/components/schemas/BulkDeliveryFormat"
|
|
43105
|
+
},
|
|
43106
|
+
"limit": {
|
|
43107
|
+
"description": "Optional hard cap on the number of rows delivered — and therefore billed (1 credit / row). The job delivers the first `limit` rows in sort order (default newest-first) and bills only for those. If the query matches fewer than `limit`, all matches are delivered. Distinct from the page-size `size` field, which is ignored on this endpoint. The row ceiling still applies — 5,000 without the entity's bulk-delivery entitlement, or the entitlement's `maxRows` with it. A `limit` above the ceiling is rejected, but a `limit` at or below it lets you export a capped top-N even when the full match exceeds the ceiling — which is the intended way to run a broad query under the 5,000-row allowance.",
|
|
43108
|
+
"example": 5000,
|
|
43109
|
+
"exclusiveMinimum": true,
|
|
43110
|
+
"minimum": 0,
|
|
43111
|
+
"type": "integer"
|
|
43112
|
+
}
|
|
43113
|
+
},
|
|
43114
|
+
"type": "object"
|
|
43115
|
+
}
|
|
43116
|
+
]
|
|
43117
|
+
}
|
|
43118
|
+
}
|
|
43119
|
+
}
|
|
43120
|
+
},
|
|
43121
|
+
"responses": {
|
|
43122
|
+
"202": {
|
|
43123
|
+
"content": {
|
|
43124
|
+
"application/json": {
|
|
43125
|
+
"schema": {
|
|
43126
|
+
"$ref": "#/components/schemas/BulkDeliverySubmitResponse"
|
|
43127
|
+
}
|
|
43128
|
+
}
|
|
43129
|
+
},
|
|
43130
|
+
"description": "Job queued; ECS task launched"
|
|
43131
|
+
},
|
|
43132
|
+
"400": {
|
|
43133
|
+
"content": {
|
|
43134
|
+
"application/json": {
|
|
43135
|
+
"schema": {
|
|
43136
|
+
"anyOf": [
|
|
43137
|
+
{
|
|
43138
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43139
|
+
},
|
|
43140
|
+
{
|
|
43141
|
+
"$ref": "#/components/schemas/BulkDeliveryPreflightExceeded"
|
|
43142
|
+
},
|
|
43143
|
+
{
|
|
43144
|
+
"$ref": "#/components/schemas/BulkDeliveryPushTargetError"
|
|
43145
|
+
},
|
|
43146
|
+
{
|
|
43147
|
+
"$ref": "#/components/schemas/BulkDeliveryColumnsError"
|
|
43148
|
+
}
|
|
43149
|
+
]
|
|
43150
|
+
}
|
|
43151
|
+
}
|
|
43152
|
+
},
|
|
43153
|
+
"description": "Validation failure (incl. `format_required`: a file delivery needs `format`; a refused `columns` request), delivery would exceed the entitlement's maxRows, OR the push target does not accept this entity (`ENTITY_MISMATCH`)"
|
|
43154
|
+
},
|
|
43155
|
+
"401": {
|
|
43156
|
+
"content": {
|
|
43157
|
+
"application/json": {
|
|
43158
|
+
"schema": {
|
|
43159
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43160
|
+
}
|
|
43161
|
+
}
|
|
43162
|
+
},
|
|
43163
|
+
"description": "Authentication required"
|
|
43164
|
+
},
|
|
43165
|
+
"402": {
|
|
43166
|
+
"content": {
|
|
43167
|
+
"application/json": {
|
|
43168
|
+
"schema": {
|
|
43169
|
+
"anyOf": [
|
|
43170
|
+
{
|
|
43171
|
+
"$ref": "#/components/schemas/BulkDeliveryInsufficientCredits"
|
|
43172
|
+
},
|
|
43173
|
+
{
|
|
43174
|
+
"$ref": "#/components/schemas/BulkDeliveryPushTargetError"
|
|
43175
|
+
}
|
|
43176
|
+
]
|
|
43177
|
+
}
|
|
43178
|
+
}
|
|
43179
|
+
},
|
|
43180
|
+
"description": "Insufficient credits (balance < estimatedTotal, at 1 credit per row), OR the plan does not include push targets (`PLAN_REQUIRED`)"
|
|
43181
|
+
},
|
|
43182
|
+
"403": {
|
|
43183
|
+
"content": {
|
|
43184
|
+
"application/json": {
|
|
43185
|
+
"schema": {
|
|
43186
|
+
"anyOf": [
|
|
43187
|
+
{
|
|
43188
|
+
"$ref": "#/components/schemas/BulkDeliveryForbidden"
|
|
43189
|
+
},
|
|
43190
|
+
{
|
|
43191
|
+
"$ref": "#/components/schemas/BulkDeliveryPushTargetError"
|
|
43192
|
+
},
|
|
43193
|
+
{
|
|
43194
|
+
"$ref": "#/components/schemas/BulkDeliveryInsufficientScope"
|
|
43195
|
+
}
|
|
43196
|
+
]
|
|
43197
|
+
}
|
|
43198
|
+
}
|
|
43199
|
+
},
|
|
43200
|
+
"description": "Delivery exceeds the 5,000-row limit available without the `bulk-delivery.agents` entitlement (lower `limit`, narrow the filters, or contact support for a limit increase), OR you may not use the push target (`FORBIDDEN`), OR a scoped token named a push-target destination without `push-targets:send` (`insufficient_scope`)."
|
|
43201
|
+
},
|
|
43202
|
+
"404": {
|
|
43203
|
+
"content": {
|
|
43204
|
+
"application/json": {
|
|
43205
|
+
"schema": {
|
|
43206
|
+
"$ref": "#/components/schemas/BulkDeliveryPushTargetError"
|
|
43207
|
+
}
|
|
43208
|
+
}
|
|
43209
|
+
},
|
|
43210
|
+
"description": "Push target not found (`TARGET_NOT_FOUND`)"
|
|
43211
|
+
},
|
|
43212
|
+
"409": {
|
|
43213
|
+
"content": {
|
|
43214
|
+
"application/json": {
|
|
43215
|
+
"schema": {
|
|
43216
|
+
"$ref": "#/components/schemas/BulkDeliveryPushTargetError"
|
|
43217
|
+
}
|
|
43218
|
+
}
|
|
43219
|
+
},
|
|
43220
|
+
"description": "Push target is disabled (`TARGET_DISABLED`)"
|
|
43221
|
+
},
|
|
43222
|
+
"502": {
|
|
43223
|
+
"content": {
|
|
43224
|
+
"application/json": {
|
|
43225
|
+
"schema": {
|
|
43226
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43227
|
+
}
|
|
43228
|
+
}
|
|
43229
|
+
},
|
|
43230
|
+
"description": "Preflight / S3 / DDB / ECS launch failure, or the push-target check could not reach the auth server"
|
|
43231
|
+
}
|
|
43232
|
+
},
|
|
43233
|
+
"summary": "Submit a bulk-delivery job for agents",
|
|
43234
|
+
"tags": [
|
|
43235
|
+
"Agents"
|
|
43236
|
+
]
|
|
43237
|
+
}
|
|
43238
|
+
},
|
|
43239
|
+
"/v1/agents/bulk-delivery/{jobId}": {
|
|
43240
|
+
"delete": {
|
|
43241
|
+
"description": "Cancels a queued or running agents delivery job.\n\nThe job is marked `cancelled` immediately; the container running it notices on its next page boundary and stops. Because a delivery is billed once, at the end, **a cancelled job is never charged** — no credits are debited and there is nothing to refund. No partial file is written.\n\nIdempotent-ish: cancelling a job that has already finished (or was already cancelled) returns 409 and changes nothing. Poll `GET /v1/agents/bulk-delivery/{jobId}` for the settled state.",
|
|
43242
|
+
"operationId": "cancelAgentsBulkDeliveryJob",
|
|
43243
|
+
"parameters": [
|
|
43244
|
+
{
|
|
43245
|
+
"description": "Job ID returned by `POST /v1/agents/bulk-delivery`",
|
|
43246
|
+
"in": "path",
|
|
43247
|
+
"name": "jobId",
|
|
43248
|
+
"required": true,
|
|
43249
|
+
"schema": {
|
|
43250
|
+
"description": "Job ID returned by `POST /v1/agents/bulk-delivery`",
|
|
43251
|
+
"type": "string"
|
|
43252
|
+
}
|
|
43253
|
+
}
|
|
43254
|
+
],
|
|
43255
|
+
"responses": {
|
|
43256
|
+
"200": {
|
|
43257
|
+
"content": {
|
|
43258
|
+
"application/json": {
|
|
43259
|
+
"schema": {
|
|
43260
|
+
"$ref": "#/components/schemas/BulkDeliveryStatusResponse"
|
|
43261
|
+
}
|
|
43262
|
+
}
|
|
43263
|
+
},
|
|
43264
|
+
"description": "Job cancelled; body is its settled status"
|
|
43265
|
+
},
|
|
43266
|
+
"401": {
|
|
43267
|
+
"content": {
|
|
43268
|
+
"application/json": {
|
|
43269
|
+
"schema": {
|
|
43270
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43271
|
+
}
|
|
43272
|
+
}
|
|
43273
|
+
},
|
|
43274
|
+
"description": "Authentication required"
|
|
43275
|
+
},
|
|
43276
|
+
"403": {
|
|
43277
|
+
"content": {
|
|
43278
|
+
"application/json": {
|
|
43279
|
+
"schema": {
|
|
43280
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43281
|
+
}
|
|
43282
|
+
}
|
|
43283
|
+
},
|
|
43284
|
+
"description": "Caller does not own this job"
|
|
43285
|
+
},
|
|
43286
|
+
"404": {
|
|
43287
|
+
"content": {
|
|
43288
|
+
"application/json": {
|
|
43289
|
+
"schema": {
|
|
43290
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43291
|
+
}
|
|
43292
|
+
}
|
|
43293
|
+
},
|
|
43294
|
+
"description": "Job not found (or expired past 30d TTL)"
|
|
43295
|
+
},
|
|
43296
|
+
"409": {
|
|
43297
|
+
"content": {
|
|
43298
|
+
"application/json": {
|
|
43299
|
+
"schema": {
|
|
43300
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43301
|
+
}
|
|
43302
|
+
}
|
|
43303
|
+
},
|
|
43304
|
+
"description": "Job already finished — nothing to cancel"
|
|
43305
|
+
}
|
|
43306
|
+
},
|
|
43307
|
+
"summary": "Cancel a bulk-delivery job for agents",
|
|
43308
|
+
"tags": [
|
|
43309
|
+
"Agents"
|
|
43310
|
+
]
|
|
43311
|
+
},
|
|
43312
|
+
"get": {
|
|
43313
|
+
"operationId": "getAgentsBulkDeliveryJob",
|
|
43314
|
+
"parameters": [
|
|
43315
|
+
{
|
|
43316
|
+
"description": "Job ID returned by `POST /v1/agents/bulk-delivery`",
|
|
43317
|
+
"in": "path",
|
|
43318
|
+
"name": "jobId",
|
|
43319
|
+
"required": true,
|
|
43320
|
+
"schema": {
|
|
43321
|
+
"description": "Job ID returned by `POST /v1/agents/bulk-delivery`",
|
|
43322
|
+
"type": "string"
|
|
43323
|
+
}
|
|
43324
|
+
}
|
|
43325
|
+
],
|
|
43326
|
+
"responses": {
|
|
43327
|
+
"200": {
|
|
43328
|
+
"content": {
|
|
43329
|
+
"application/json": {
|
|
43330
|
+
"schema": {
|
|
43331
|
+
"$ref": "#/components/schemas/BulkDeliveryStatusResponse"
|
|
43332
|
+
}
|
|
43333
|
+
}
|
|
43334
|
+
},
|
|
43335
|
+
"description": "Job status (resultsUrl re-signed if completed)"
|
|
43336
|
+
},
|
|
43337
|
+
"401": {
|
|
43338
|
+
"content": {
|
|
43339
|
+
"application/json": {
|
|
43340
|
+
"schema": {
|
|
43341
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43342
|
+
}
|
|
43343
|
+
}
|
|
43344
|
+
},
|
|
43345
|
+
"description": "Authentication required"
|
|
43346
|
+
},
|
|
43347
|
+
"403": {
|
|
43348
|
+
"content": {
|
|
43349
|
+
"application/json": {
|
|
43350
|
+
"schema": {
|
|
43351
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43352
|
+
}
|
|
43353
|
+
}
|
|
43354
|
+
},
|
|
43355
|
+
"description": "Caller does not own this job"
|
|
43356
|
+
},
|
|
43357
|
+
"404": {
|
|
43358
|
+
"content": {
|
|
43359
|
+
"application/json": {
|
|
43360
|
+
"schema": {
|
|
43361
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43362
|
+
}
|
|
43363
|
+
}
|
|
43364
|
+
},
|
|
43365
|
+
"description": "Job not found (or expired past 30d TTL)"
|
|
43366
|
+
}
|
|
43367
|
+
},
|
|
43368
|
+
"summary": "Get bulk-delivery job status for agents",
|
|
43369
|
+
"tags": [
|
|
43370
|
+
"Agents"
|
|
43371
|
+
]
|
|
43372
|
+
}
|
|
43373
|
+
},
|
|
43374
|
+
"/v1/agents/count": {
|
|
43375
|
+
"post": {
|
|
43376
|
+
"description": "Return the exact number of agents matching the given filters. Accepts the same request body as `listAgents` (pagination and sort are ignored). Use this when you only need a total; to get the matching agents themselves, send the same request body to `listAgents`.",
|
|
43377
|
+
"operationId": "countAgents",
|
|
43378
|
+
"requestBody": {
|
|
43379
|
+
"content": {
|
|
43380
|
+
"application/json": {
|
|
43381
|
+
"schema": {
|
|
43382
|
+
"$ref": "#/components/schemas/AgentListRequest"
|
|
43383
|
+
}
|
|
43384
|
+
}
|
|
43385
|
+
}
|
|
43386
|
+
},
|
|
43387
|
+
"responses": {
|
|
43388
|
+
"200": {
|
|
43389
|
+
"content": {
|
|
43390
|
+
"application/json": {
|
|
43391
|
+
"schema": {
|
|
43392
|
+
"$ref": "#/components/schemas/CountResponse"
|
|
43393
|
+
}
|
|
43394
|
+
}
|
|
43395
|
+
},
|
|
43396
|
+
"description": "Exact count of matching agents"
|
|
43397
|
+
},
|
|
43398
|
+
"400": {
|
|
43399
|
+
"content": {
|
|
43400
|
+
"application/json": {
|
|
43401
|
+
"schema": {
|
|
43402
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43403
|
+
}
|
|
43404
|
+
}
|
|
43405
|
+
},
|
|
43406
|
+
"description": "Validation error"
|
|
43407
|
+
},
|
|
43408
|
+
"401": {
|
|
43409
|
+
"content": {
|
|
43410
|
+
"application/json": {
|
|
43411
|
+
"schema": {
|
|
43412
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43413
|
+
}
|
|
43414
|
+
}
|
|
43415
|
+
},
|
|
43416
|
+
"description": "Unauthorized"
|
|
43417
|
+
},
|
|
43418
|
+
"403": {
|
|
43419
|
+
"content": {
|
|
43420
|
+
"application/json": {
|
|
43421
|
+
"schema": {
|
|
43422
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43423
|
+
}
|
|
43424
|
+
}
|
|
43425
|
+
},
|
|
43426
|
+
"description": "Forbidden (authenticated, but missing required context — e.g. no active organization)"
|
|
43427
|
+
},
|
|
43428
|
+
"404": {
|
|
43429
|
+
"content": {
|
|
43430
|
+
"application/json": {
|
|
43431
|
+
"schema": {
|
|
43432
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
43433
|
+
}
|
|
43434
|
+
}
|
|
43435
|
+
},
|
|
43436
|
+
"description": "Not found"
|
|
43437
|
+
},
|
|
43438
|
+
"413": {
|
|
43439
|
+
"content": {
|
|
43440
|
+
"application/json": {
|
|
43441
|
+
"schema": {
|
|
43442
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
43443
|
+
}
|
|
43444
|
+
}
|
|
43445
|
+
},
|
|
43446
|
+
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
42255
43447
|
},
|
|
42256
|
-
"
|
|
42257
|
-
"content": {
|
|
42258
|
-
"application/json": {
|
|
42259
|
-
"schema": {
|
|
42260
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
42261
|
-
}
|
|
42262
|
-
}
|
|
42263
|
-
},
|
|
42264
|
-
"description": "Authentication required"
|
|
42265
|
-
},
|
|
42266
|
-
"402": {
|
|
42267
|
-
"content": {
|
|
42268
|
-
"application/json": {
|
|
42269
|
-
"schema": {
|
|
42270
|
-
"anyOf": [
|
|
42271
|
-
{
|
|
42272
|
-
"$ref": "#/components/schemas/BulkDeliveryInsufficientCredits"
|
|
42273
|
-
},
|
|
42274
|
-
{
|
|
42275
|
-
"$ref": "#/components/schemas/BulkDeliveryPushTargetError"
|
|
42276
|
-
}
|
|
42277
|
-
]
|
|
42278
|
-
}
|
|
42279
|
-
}
|
|
42280
|
-
},
|
|
42281
|
-
"description": "Insufficient credits (balance < estimatedTotal, at 1 credit per row), OR the plan does not include push targets (`PLAN_REQUIRED`)"
|
|
42282
|
-
},
|
|
42283
|
-
"403": {
|
|
42284
|
-
"content": {
|
|
42285
|
-
"application/json": {
|
|
42286
|
-
"schema": {
|
|
42287
|
-
"anyOf": [
|
|
42288
|
-
{
|
|
42289
|
-
"$ref": "#/components/schemas/BulkDeliveryForbidden"
|
|
42290
|
-
},
|
|
42291
|
-
{
|
|
42292
|
-
"$ref": "#/components/schemas/BulkDeliveryPushTargetError"
|
|
42293
|
-
},
|
|
42294
|
-
{
|
|
42295
|
-
"$ref": "#/components/schemas/BulkDeliveryInsufficientScope"
|
|
42296
|
-
}
|
|
42297
|
-
]
|
|
42298
|
-
}
|
|
42299
|
-
}
|
|
42300
|
-
},
|
|
42301
|
-
"description": "Delivery exceeds the 5,000-row limit available without the `bulk-delivery.agents` entitlement (lower `limit`, narrow the filters, or contact support for a limit increase), OR you may not use the push target (`FORBIDDEN`), OR a scoped token named a push-target destination without `push-targets:send` (`insufficient_scope`)."
|
|
42302
|
-
},
|
|
42303
|
-
"404": {
|
|
42304
|
-
"content": {
|
|
42305
|
-
"application/json": {
|
|
42306
|
-
"schema": {
|
|
42307
|
-
"$ref": "#/components/schemas/BulkDeliveryPushTargetError"
|
|
42308
|
-
}
|
|
42309
|
-
}
|
|
42310
|
-
},
|
|
42311
|
-
"description": "Push target not found (`TARGET_NOT_FOUND`)"
|
|
42312
|
-
},
|
|
42313
|
-
"409": {
|
|
42314
|
-
"content": {
|
|
42315
|
-
"application/json": {
|
|
42316
|
-
"schema": {
|
|
42317
|
-
"$ref": "#/components/schemas/BulkDeliveryPushTargetError"
|
|
42318
|
-
}
|
|
42319
|
-
}
|
|
42320
|
-
},
|
|
42321
|
-
"description": "Push target is disabled (`TARGET_DISABLED`)"
|
|
42322
|
-
},
|
|
42323
|
-
"502": {
|
|
43448
|
+
"503": {
|
|
42324
43449
|
"content": {
|
|
42325
43450
|
"application/json": {
|
|
42326
43451
|
"schema": {
|
|
@@ -42328,29 +43453,45 @@
|
|
|
42328
43453
|
}
|
|
42329
43454
|
}
|
|
42330
43455
|
},
|
|
42331
|
-
"description": "
|
|
43456
|
+
"description": "Location dictionary temporarily unavailable. Only returned for a NEGATED location filter (`neq`, or `not`), which cannot be honoured without resolving the excluded value — answering anyway would return the records you asked to exclude. Positive location filters are unaffected. Retry shortly; the filter value itself was not rejected."
|
|
42332
43457
|
}
|
|
42333
43458
|
},
|
|
42334
|
-
"summary": "
|
|
43459
|
+
"summary": "Count agents matching filters",
|
|
42335
43460
|
"tags": [
|
|
42336
43461
|
"Agents"
|
|
42337
|
-
]
|
|
43462
|
+
],
|
|
43463
|
+
"x-mm-records-via": "listAgents"
|
|
42338
43464
|
}
|
|
42339
43465
|
},
|
|
42340
|
-
"/v1/agents/
|
|
42341
|
-
"
|
|
42342
|
-
"
|
|
42343
|
-
"operationId": "cancelAgentsBulkDeliveryJob",
|
|
43466
|
+
"/v1/agents/{id}": {
|
|
43467
|
+
"get": {
|
|
43468
|
+
"operationId": "getAgent",
|
|
42344
43469
|
"parameters": [
|
|
42345
43470
|
{
|
|
42346
|
-
"description": "
|
|
43471
|
+
"description": "Agent document ID",
|
|
42347
43472
|
"in": "path",
|
|
42348
|
-
"name": "
|
|
43473
|
+
"name": "id",
|
|
42349
43474
|
"required": true,
|
|
42350
43475
|
"schema": {
|
|
42351
|
-
"description": "
|
|
43476
|
+
"description": "Agent document ID",
|
|
42352
43477
|
"type": "string"
|
|
42353
43478
|
}
|
|
43479
|
+
},
|
|
43480
|
+
{
|
|
43481
|
+
"description": "Period for volume/units (default: last12Months)",
|
|
43482
|
+
"in": "query",
|
|
43483
|
+
"name": "period",
|
|
43484
|
+
"required": false,
|
|
43485
|
+
"schema": {
|
|
43486
|
+
"allOf": [
|
|
43487
|
+
{
|
|
43488
|
+
"$ref": "#/components/schemas/Period"
|
|
43489
|
+
},
|
|
43490
|
+
{
|
|
43491
|
+
"description": "Period for volume/units (default: last12Months)"
|
|
43492
|
+
}
|
|
43493
|
+
]
|
|
43494
|
+
}
|
|
42354
43495
|
}
|
|
42355
43496
|
],
|
|
42356
43497
|
"responses": {
|
|
@@ -42358,31 +43499,11 @@
|
|
|
42358
43499
|
"content": {
|
|
42359
43500
|
"application/json": {
|
|
42360
43501
|
"schema": {
|
|
42361
|
-
"$ref": "#/components/schemas/
|
|
42362
|
-
}
|
|
42363
|
-
}
|
|
42364
|
-
},
|
|
42365
|
-
"description": "Job cancelled; body is its settled status"
|
|
42366
|
-
},
|
|
42367
|
-
"401": {
|
|
42368
|
-
"content": {
|
|
42369
|
-
"application/json": {
|
|
42370
|
-
"schema": {
|
|
42371
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
42372
|
-
}
|
|
42373
|
-
}
|
|
42374
|
-
},
|
|
42375
|
-
"description": "Authentication required"
|
|
42376
|
-
},
|
|
42377
|
-
"403": {
|
|
42378
|
-
"content": {
|
|
42379
|
-
"application/json": {
|
|
42380
|
-
"schema": {
|
|
42381
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
43502
|
+
"$ref": "#/components/schemas/AgentDetailResponse"
|
|
42382
43503
|
}
|
|
42383
43504
|
}
|
|
42384
43505
|
},
|
|
42385
|
-
"description": "
|
|
43506
|
+
"description": "Agent detail"
|
|
42386
43507
|
},
|
|
42387
43508
|
"404": {
|
|
42388
43509
|
"content": {
|
|
@@ -42392,95 +43513,46 @@
|
|
|
42392
43513
|
}
|
|
42393
43514
|
}
|
|
42394
43515
|
},
|
|
42395
|
-
"description": "
|
|
43516
|
+
"description": "Agent not found"
|
|
42396
43517
|
},
|
|
42397
|
-
"
|
|
43518
|
+
"413": {
|
|
42398
43519
|
"content": {
|
|
42399
43520
|
"application/json": {
|
|
42400
43521
|
"schema": {
|
|
42401
|
-
"$ref": "#/components/schemas/
|
|
43522
|
+
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
42402
43523
|
}
|
|
42403
43524
|
}
|
|
42404
43525
|
},
|
|
42405
|
-
"description": "
|
|
43526
|
+
"description": "Response payload too large"
|
|
42406
43527
|
}
|
|
42407
43528
|
},
|
|
42408
|
-
"summary": "
|
|
43529
|
+
"summary": "Get agent by ID",
|
|
42409
43530
|
"tags": [
|
|
42410
43531
|
"Agents"
|
|
42411
43532
|
]
|
|
42412
|
-
}
|
|
42413
|
-
|
|
42414
|
-
|
|
43533
|
+
}
|
|
43534
|
+
},
|
|
43535
|
+
"/v1/agents/{id}/analytics/loan-mix": {
|
|
43536
|
+
"post": {
|
|
43537
|
+
"description": "Scoped to the agent's FINANCED deals: recorded loans on which the agent is the buyer's agent or the listing / co-listing agent, matched through the agent's MLS ids. Cash deals carry no loan and are not counted. The date window is the loan's recording date. Returns, for each side at once (`any`, `buyer`, `listing` — duals on `buyer`): the financed deal count and loan volume, how many were brokered (third-party origination), and the loan-type mix. For the prior period, call again with that period.",
|
|
43538
|
+
"operationId": "agentLoanMix",
|
|
42415
43539
|
"parameters": [
|
|
42416
43540
|
{
|
|
42417
|
-
"description": "
|
|
43541
|
+
"description": "Agent document ID",
|
|
42418
43542
|
"in": "path",
|
|
42419
|
-
"name": "
|
|
43543
|
+
"name": "id",
|
|
42420
43544
|
"required": true,
|
|
42421
43545
|
"schema": {
|
|
42422
|
-
"description": "
|
|
43546
|
+
"description": "Agent document ID",
|
|
42423
43547
|
"type": "string"
|
|
42424
43548
|
}
|
|
42425
43549
|
}
|
|
42426
43550
|
],
|
|
42427
|
-
"responses": {
|
|
42428
|
-
"200": {
|
|
42429
|
-
"content": {
|
|
42430
|
-
"application/json": {
|
|
42431
|
-
"schema": {
|
|
42432
|
-
"$ref": "#/components/schemas/BulkDeliveryStatusResponse"
|
|
42433
|
-
}
|
|
42434
|
-
}
|
|
42435
|
-
},
|
|
42436
|
-
"description": "Job status (resultsUrl re-signed if completed)"
|
|
42437
|
-
},
|
|
42438
|
-
"401": {
|
|
42439
|
-
"content": {
|
|
42440
|
-
"application/json": {
|
|
42441
|
-
"schema": {
|
|
42442
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
42443
|
-
}
|
|
42444
|
-
}
|
|
42445
|
-
},
|
|
42446
|
-
"description": "Authentication required"
|
|
42447
|
-
},
|
|
42448
|
-
"403": {
|
|
42449
|
-
"content": {
|
|
42450
|
-
"application/json": {
|
|
42451
|
-
"schema": {
|
|
42452
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
42453
|
-
}
|
|
42454
|
-
}
|
|
42455
|
-
},
|
|
42456
|
-
"description": "Caller does not own this job"
|
|
42457
|
-
},
|
|
42458
|
-
"404": {
|
|
42459
|
-
"content": {
|
|
42460
|
-
"application/json": {
|
|
42461
|
-
"schema": {
|
|
42462
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
42463
|
-
}
|
|
42464
|
-
}
|
|
42465
|
-
},
|
|
42466
|
-
"description": "Job not found (or expired past 30d TTL)"
|
|
42467
|
-
}
|
|
42468
|
-
},
|
|
42469
|
-
"summary": "Get bulk-delivery job status for agents",
|
|
42470
|
-
"tags": [
|
|
42471
|
-
"Agents"
|
|
42472
|
-
]
|
|
42473
|
-
}
|
|
42474
|
-
},
|
|
42475
|
-
"/v1/agents/count": {
|
|
42476
|
-
"post": {
|
|
42477
|
-
"description": "Return the exact number of agents matching the given filters. Accepts the same request body as `listAgents` (pagination and sort are ignored). Use this when you only need a total; to get the matching agents themselves, send the same request body to `listAgents`.",
|
|
42478
|
-
"operationId": "countAgents",
|
|
42479
43551
|
"requestBody": {
|
|
42480
43552
|
"content": {
|
|
42481
43553
|
"application/json": {
|
|
42482
43554
|
"schema": {
|
|
42483
|
-
"$ref": "#/components/schemas/
|
|
43555
|
+
"$ref": "#/components/schemas/AgentLoanMixRequest"
|
|
42484
43556
|
}
|
|
42485
43557
|
}
|
|
42486
43558
|
}
|
|
@@ -42490,11 +43562,11 @@
|
|
|
42490
43562
|
"content": {
|
|
42491
43563
|
"application/json": {
|
|
42492
43564
|
"schema": {
|
|
42493
|
-
"$ref": "#/components/schemas/
|
|
43565
|
+
"$ref": "#/components/schemas/AgentLoanMixResponse"
|
|
42494
43566
|
}
|
|
42495
43567
|
}
|
|
42496
43568
|
},
|
|
42497
|
-
"description": "
|
|
43569
|
+
"description": "Per-side financing profile"
|
|
42498
43570
|
},
|
|
42499
43571
|
"400": {
|
|
42500
43572
|
"content": {
|
|
@@ -42545,98 +43617,18 @@
|
|
|
42545
43617
|
}
|
|
42546
43618
|
},
|
|
42547
43619
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
42548
|
-
},
|
|
42549
|
-
"503": {
|
|
42550
|
-
"content": {
|
|
42551
|
-
"application/json": {
|
|
42552
|
-
"schema": {
|
|
42553
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
42554
|
-
}
|
|
42555
|
-
}
|
|
42556
|
-
},
|
|
42557
|
-
"description": "Location dictionary temporarily unavailable. Only returned for a NEGATED location filter (`neq`, or `not`), which cannot be honoured without resolving the excluded value — answering anyway would return the records you asked to exclude. Positive location filters are unaffected. Retry shortly; the filter value itself was not rejected."
|
|
42558
|
-
}
|
|
42559
|
-
},
|
|
42560
|
-
"summary": "Count agents matching filters",
|
|
42561
|
-
"tags": [
|
|
42562
|
-
"Agents"
|
|
42563
|
-
],
|
|
42564
|
-
"x-mm-records-via": "listAgents"
|
|
42565
|
-
}
|
|
42566
|
-
},
|
|
42567
|
-
"/v1/agents/{id}": {
|
|
42568
|
-
"get": {
|
|
42569
|
-
"operationId": "getAgent",
|
|
42570
|
-
"parameters": [
|
|
42571
|
-
{
|
|
42572
|
-
"description": "Agent document ID",
|
|
42573
|
-
"in": "path",
|
|
42574
|
-
"name": "id",
|
|
42575
|
-
"required": true,
|
|
42576
|
-
"schema": {
|
|
42577
|
-
"description": "Agent document ID",
|
|
42578
|
-
"type": "string"
|
|
42579
|
-
}
|
|
42580
|
-
},
|
|
42581
|
-
{
|
|
42582
|
-
"description": "Period for volume/units (default: last12Months)",
|
|
42583
|
-
"in": "query",
|
|
42584
|
-
"name": "period",
|
|
42585
|
-
"required": false,
|
|
42586
|
-
"schema": {
|
|
42587
|
-
"allOf": [
|
|
42588
|
-
{
|
|
42589
|
-
"$ref": "#/components/schemas/Period"
|
|
42590
|
-
},
|
|
42591
|
-
{
|
|
42592
|
-
"description": "Period for volume/units (default: last12Months)"
|
|
42593
|
-
}
|
|
42594
|
-
]
|
|
42595
|
-
}
|
|
42596
|
-
}
|
|
42597
|
-
],
|
|
42598
|
-
"responses": {
|
|
42599
|
-
"200": {
|
|
42600
|
-
"content": {
|
|
42601
|
-
"application/json": {
|
|
42602
|
-
"schema": {
|
|
42603
|
-
"$ref": "#/components/schemas/AgentDetailResponse"
|
|
42604
|
-
}
|
|
42605
|
-
}
|
|
42606
|
-
},
|
|
42607
|
-
"description": "Agent detail"
|
|
42608
|
-
},
|
|
42609
|
-
"404": {
|
|
42610
|
-
"content": {
|
|
42611
|
-
"application/json": {
|
|
42612
|
-
"schema": {
|
|
42613
|
-
"$ref": "#/components/schemas/ErrorResponse"
|
|
42614
|
-
}
|
|
42615
|
-
}
|
|
42616
|
-
},
|
|
42617
|
-
"description": "Agent not found"
|
|
42618
|
-
},
|
|
42619
|
-
"413": {
|
|
42620
|
-
"content": {
|
|
42621
|
-
"application/json": {
|
|
42622
|
-
"schema": {
|
|
42623
|
-
"$ref": "#/components/schemas/PayloadTooLarge"
|
|
42624
|
-
}
|
|
42625
|
-
}
|
|
42626
|
-
},
|
|
42627
|
-
"description": "Response payload too large"
|
|
42628
43620
|
}
|
|
42629
43621
|
},
|
|
42630
|
-
"summary": "
|
|
43622
|
+
"summary": "Financing profile of the agent's deals, per side",
|
|
42631
43623
|
"tags": [
|
|
42632
43624
|
"Agents"
|
|
42633
43625
|
]
|
|
42634
43626
|
}
|
|
42635
43627
|
},
|
|
42636
|
-
"/v1/agents/{id}/analytics/
|
|
43628
|
+
"/v1/agents/{id}/analytics/mortgaged-time-series": {
|
|
42637
43629
|
"post": {
|
|
42638
|
-
"description": "Scoped to the agent's FINANCED deals: recorded loans on which the agent is the buyer's agent or the listing / co-listing agent, matched through the agent's MLS ids. Cash deals carry no loan and are not counted. The date window is the loan's recording date.
|
|
42639
|
-
"operationId": "
|
|
43630
|
+
"description": "Scoped to the agent's FINANCED deals: recorded loans on which the agent is the buyer's agent or the listing / co-listing agent, matched through the agent's MLS ids. Cash deals carry no loan and are not counted. The date window is the loan's recording date. One bucket per `interval` (default monthly): `units` = financed deals recorded in the bucket, `volume` = their total loan amount (out-of-range fill amounts excluded and counted in `excluded`). `previous` is the same series for the prior window. `side` defaults to `any`; `buyer` + `listing` = `any` per bucket. Pair with `agentAnalyticsTimeSeries` (closed sales by sale date) for a mortgaged-vs-total chart — the two use different date axes (loan recording vs sale close), so a deal can land a month apart.",
|
|
43631
|
+
"operationId": "agentMortgagedTimeSeries",
|
|
42640
43632
|
"parameters": [
|
|
42641
43633
|
{
|
|
42642
43634
|
"description": "Agent document ID",
|
|
@@ -42653,7 +43645,7 @@
|
|
|
42653
43645
|
"content": {
|
|
42654
43646
|
"application/json": {
|
|
42655
43647
|
"schema": {
|
|
42656
|
-
"$ref": "#/components/schemas/
|
|
43648
|
+
"$ref": "#/components/schemas/AgentMortgagedTimeSeriesRequest"
|
|
42657
43649
|
}
|
|
42658
43650
|
}
|
|
42659
43651
|
}
|
|
@@ -42663,11 +43655,11 @@
|
|
|
42663
43655
|
"content": {
|
|
42664
43656
|
"application/json": {
|
|
42665
43657
|
"schema": {
|
|
42666
|
-
"$ref": "#/components/schemas/
|
|
43658
|
+
"$ref": "#/components/schemas/SimpleTimeSeriesResponse"
|
|
42667
43659
|
}
|
|
42668
43660
|
}
|
|
42669
43661
|
},
|
|
42670
|
-
"description": "
|
|
43662
|
+
"description": "Financed deals and loan volume per bucket"
|
|
42671
43663
|
},
|
|
42672
43664
|
"400": {
|
|
42673
43665
|
"content": {
|
|
@@ -42720,7 +43712,7 @@
|
|
|
42720
43712
|
"description": "Response payload too large — detail endpoint capped to fit Lambda response limits"
|
|
42721
43713
|
}
|
|
42722
43714
|
},
|
|
42723
|
-
"summary": "
|
|
43715
|
+
"summary": "The agent's financed deals and loan volume, over time",
|
|
42724
43716
|
"tags": [
|
|
42725
43717
|
"Agents"
|
|
42726
43718
|
]
|
|
@@ -42821,6 +43813,7 @@
|
|
|
42821
43813
|
},
|
|
42822
43814
|
"/v1/agents/{id}/breakdowns/cities": {
|
|
42823
43815
|
"post": {
|
|
43816
|
+
"description": "Ranks the agent's CLOSED sales (MLS status sold, a real sale price — rentals and lease listings excluded, duplicate MLS records of one sale counted once) by this dimension. The same population `POST /v1/agents/{id}/sales` returns with `flatFilters.mlsStatus: \"SLD\"` and the agent analytics routes count. `side` narrows to the deals the agent was on that side of (`buyer` includes deals on both sides; `buyer` + `listing` = `any`).",
|
|
42824
43817
|
"operationId": "agentCities",
|
|
42825
43818
|
"parameters": [
|
|
42826
43819
|
{
|
|
@@ -42838,7 +43831,7 @@
|
|
|
42838
43831
|
"content": {
|
|
42839
43832
|
"application/json": {
|
|
42840
43833
|
"schema": {
|
|
42841
|
-
"$ref": "#/components/schemas/
|
|
43834
|
+
"$ref": "#/components/schemas/AgentSalesBreakdownRequest"
|
|
42842
43835
|
}
|
|
42843
43836
|
}
|
|
42844
43837
|
}
|
|
@@ -43005,6 +43998,7 @@
|
|
|
43005
43998
|
},
|
|
43006
43999
|
"/v1/agents/{id}/breakdowns/counties": {
|
|
43007
44000
|
"post": {
|
|
44001
|
+
"description": "Ranks the agent's CLOSED sales (MLS status sold, a real sale price — rentals and lease listings excluded, duplicate MLS records of one sale counted once) by this dimension. The same population `POST /v1/agents/{id}/sales` returns with `flatFilters.mlsStatus: \"SLD\"` and the agent analytics routes count. `side` narrows to the deals the agent was on that side of (`buyer` includes deals on both sides; `buyer` + `listing` = `any`).",
|
|
43008
44002
|
"operationId": "agentCounties",
|
|
43009
44003
|
"parameters": [
|
|
43010
44004
|
{
|
|
@@ -43022,7 +44016,7 @@
|
|
|
43022
44016
|
"content": {
|
|
43023
44017
|
"application/json": {
|
|
43024
44018
|
"schema": {
|
|
43025
|
-
"$ref": "#/components/schemas/
|
|
44019
|
+
"$ref": "#/components/schemas/AgentSalesBreakdownRequest"
|
|
43026
44020
|
}
|
|
43027
44021
|
}
|
|
43028
44022
|
}
|
|
@@ -43189,6 +44183,7 @@
|
|
|
43189
44183
|
},
|
|
43190
44184
|
"/v1/agents/{id}/breakdowns/offices": {
|
|
43191
44185
|
"post": {
|
|
44186
|
+
"description": "Ranks the agent's CLOSED sales (MLS status sold, a real sale price — rentals and lease listings excluded, duplicate MLS records of one sale counted once) by this dimension. The same population `POST /v1/agents/{id}/sales` returns with `flatFilters.mlsStatus: \"SLD\"` and the agent analytics routes count. `side` narrows to the deals the agent was on that side of (`buyer` includes deals on both sides; `buyer` + `listing` = `any`).",
|
|
43192
44187
|
"operationId": "agentOffices",
|
|
43193
44188
|
"parameters": [
|
|
43194
44189
|
{
|
|
@@ -43206,7 +44201,7 @@
|
|
|
43206
44201
|
"content": {
|
|
43207
44202
|
"application/json": {
|
|
43208
44203
|
"schema": {
|
|
43209
|
-
"$ref": "#/components/schemas/
|
|
44204
|
+
"$ref": "#/components/schemas/AgentSalesBreakdownRequest"
|
|
43210
44205
|
}
|
|
43211
44206
|
}
|
|
43212
44207
|
}
|
|
@@ -43373,6 +44368,7 @@
|
|
|
43373
44368
|
},
|
|
43374
44369
|
"/v1/agents/{id}/breakdowns/states": {
|
|
43375
44370
|
"post": {
|
|
44371
|
+
"description": "Ranks the agent's CLOSED sales (MLS status sold, a real sale price — rentals and lease listings excluded, duplicate MLS records of one sale counted once) by this dimension. The same population `POST /v1/agents/{id}/sales` returns with `flatFilters.mlsStatus: \"SLD\"` and the agent analytics routes count. `side` narrows to the deals the agent was on that side of (`buyer` includes deals on both sides; `buyer` + `listing` = `any`).",
|
|
43376
44372
|
"operationId": "agentStates",
|
|
43377
44373
|
"parameters": [
|
|
43378
44374
|
{
|
|
@@ -43390,7 +44386,7 @@
|
|
|
43390
44386
|
"content": {
|
|
43391
44387
|
"application/json": {
|
|
43392
44388
|
"schema": {
|
|
43393
|
-
"$ref": "#/components/schemas/
|
|
44389
|
+
"$ref": "#/components/schemas/AgentSalesBreakdownRequest"
|
|
43394
44390
|
}
|
|
43395
44391
|
}
|
|
43396
44392
|
}
|
|
@@ -43651,6 +44647,7 @@
|
|
|
43651
44647
|
},
|
|
43652
44648
|
"/v1/agents/{id}/breakdowns/zip-codes": {
|
|
43653
44649
|
"post": {
|
|
44650
|
+
"description": "Ranks the agent's CLOSED sales (MLS status sold, a real sale price — rentals and lease listings excluded, duplicate MLS records of one sale counted once) by this dimension. The same population `POST /v1/agents/{id}/sales` returns with `flatFilters.mlsStatus: \"SLD\"` and the agent analytics routes count. `side` narrows to the deals the agent was on that side of (`buyer` includes deals on both sides; `buyer` + `listing` = `any`).",
|
|
43654
44651
|
"operationId": "agentZipCodes",
|
|
43655
44652
|
"parameters": [
|
|
43656
44653
|
{
|
|
@@ -43668,7 +44665,7 @@
|
|
|
43668
44665
|
"content": {
|
|
43669
44666
|
"application/json": {
|
|
43670
44667
|
"schema": {
|
|
43671
|
-
"$ref": "#/components/schemas/
|
|
44668
|
+
"$ref": "#/components/schemas/AgentSalesBreakdownRequest"
|
|
43672
44669
|
}
|
|
43673
44670
|
}
|
|
43674
44671
|
}
|
|
@@ -68808,7 +69805,7 @@
|
|
|
68808
69805
|
},
|
|
68809
69806
|
"/v1/originators/{nmlsId}/breakdowns/agents": {
|
|
68810
69807
|
"post": {
|
|
68811
|
-
"description": "Ranks the real-estate agents on this LO's loans, by volume — the buyer's agent by default, the listing
|
|
69808
|
+
"description": "Ranks the real-estate agents on this LO's loans, by volume — the buyer's agent by default, the listing and co-listing agents with `side: \"listing\"`. Each loan is credited to the agent its MLS agent keys resolve to (a key naming several different people credits only the confirmed one), so `units` counts distinct loans per agent. `id` is that agent's id (pass it to `GET /v1/agents/{id}`); absent when the loan's key matches no agent profile, in which case `label` is the name the MLS recorded. Names that are an MLS placeholder for \"no agent recorded\" (`non member`, `non listed agent`, and ~140 board-specific spellings) are excluded — they are not people. Percentages are shares of the LO's whole loan population, so they do not sum to 100 across the page.",
|
|
68812
69809
|
"operationId": "originatorAgents",
|
|
68813
69810
|
"parameters": [
|
|
68814
69811
|
{
|