REST API reference
Mashvisor API
14 endpoints for Mashvisor. Each one is a POST with a JSON body, called with your API key.
- Base URL
- https://cotlet.dev/api/v1/mashvisor
- Connects with
- Your own Mashvisor investor account
- Integration page
- Mashvisor
| Endpoint | Access | Description |
|---|---|---|
| find_properties | read | Property Finder: for-sale properties ranked by cash on cash return for your budget. |
| list_filter_presets | read | Your saved Map Property Finder filter presets, with name and filters. |
| run_filter_preset | read | Apply a saved preset to a city or neighborhood and return the matching listings with their metrics. |
| get_property_analysis | read | Property Analytics page: price, rental income, cash flow, cap rate and cash on cash return per strategy, Mashmeter and expenses. |
| get_property_comps | read | Comparable listings near a property, with occupancy, nightly rate, rent or sale price. |
| search_markets | read | Market Finder: neighborhoods and cities ranked by rental performance, with your filters. |
| list_saved_homes | read | Properties in your Saved Homes, with type, sale price and your rating. |
| list_property_alerts | read | Your Property Alerts with location, filters and email frequency. |
| export_neighborhood_data | read | Excel export of a neighborhood from Map Property Finder. Uses one of your plan's monthly exports. |
| download_property_report | read | PDF analytics report of a property, optionally with your company name and logo. Uses one download. |
| analyze_unlisted_property | write | Look up an off-market address, add it to Saved Homes and return its rental analysis. |
| save_home | write | Add a property to your Saved Homes. |
| remove_saved_home | write | Remove a property from your Saved Homes. |
| create_property_alert | write | New Property Alert: Mashvisor emails you new listings that match, only when there are any. |
Find properties
readPOST https://cotlet.dev/api/v1/mashvisor/find_properties
Searches for-sale properties in one or more cities, as in Property Finder, ranked by cash on cash return for the rental strategy you pick. Radius works only with one city. Each item has the property_id that the analysis, comps and Saved Homes tools take.
Parameters
| Name | Type | Description |
|---|---|---|
| cities required | string[] | One or more cities, e.g. "Tampa, FL". |
| miles | integer | Radius around the city. Only with one city. |
| budget_min | integer | Minimum listing price in USD. |
| budget_max | integer | Maximum listing price in USD. |
| rental_strategy | enum | airbnb or traditional. |
| bedrooms | integer | Minimum bedrooms, 1 to 5. |
| bathrooms | integer | Minimum bathrooms, 1 to 5. |
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/find_properties \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"cities":["Tampa, FL"]}' result = client.call("mashvisor", "find_properties", {"cities":["Tampa, FL"]}) const result = await cotlet.call('mashvisor', 'find_properties', {"cities":["Tampa, FL"]}); cotlet call mashvisor find_properties --data '{"cities":["Tampa, FL"]}' Example response
{
"properties": [
{
"property_id": "p_88120",
"address": "1823 Schyler Ln, Tampa, FL",
"price": 365000,
"bedrooms": 3,
"bathrooms": 2,
"cash_on_cash": 13.1,
"cap_rate": 9.4
},
{
"property_id": "p_88144",
"address": "57 Palm Ct, Tampa, FL",
"price": 342000,
"bedrooms": 3,
"bathrooms": 2,
"cash_on_cash": 11.7,
"cap_rate": 8.5
}
]
} List filter presets
readPOST https://cotlet.dev/api/v1/mashvisor/list_filter_presets
Returns the filter presets you saved with Save Filters in Map Property Finder, each with its name and filters. Pass preset_id to run_filter_preset or export_neighborhood_data. Presets are created, renamed and deleted in Mashvisor, not through Cotlet.
Parameters
No parameters.
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/list_filter_presets \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("mashvisor", "list_filter_presets") const result = await cotlet.call('mashvisor', 'list_filter_presets'); cotlet call mashvisor list_filter_presets Example response
{
"presets": [
{
"preset_id": "fp_2041",
"name": "Tampa STR under 400k",
"filters": {
"price_max": 400000,
"bedrooms_min": 3,
"property_type": "single_family"
}
},
{
"preset_id": "fp_2057",
"name": "Cleveland cash flow",
"filters": {
"price_max": 200000,
"bedrooms_min": 2
}
}
]
} Run filter preset
readPOST https://cotlet.dev/api/v1/mashvisor/run_filter_preset
Applies one saved preset to a city or neighborhood and returns the matching listings with their metrics, like selecting the preset in Map Property Finder. The tab picks the same three views as the app: investment, airbnb_comps or rental_comps. Results come back in the order the app shows them.
Parameters
| Name | Type | Description |
|---|---|---|
| preset_id required | string | Preset ID from list_filter_presets. |
| location required | string | City or neighborhood, e.g. "Ybor City, Tampa, FL". |
| tab | enum | investment, airbnb_comps or rental_comps. Default: investment. |
| limit | integer | 1 to 100. Default: 25. |
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/run_filter_preset \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"preset_id":"fp_2041","location":"Ybor City, Tampa, FL","tab":"investment","limit":25}' result = client.call("mashvisor", "run_filter_preset", {"preset_id":"fp_2041","location":"Ybor City, Tampa, FL","tab":"investment","limit":25}) const result = await cotlet.call('mashvisor', 'run_filter_preset', {"preset_id":"fp_2041","location":"Ybor City, Tampa, FL","tab":"investment","limit":25}); cotlet call mashvisor run_filter_preset --data '{"preset_id":"fp_2041","location":"Ybor City, Tampa, FL","tab":"investment","limit":25}' Example response
{
"preset": "Tampa STR under 400k",
"location": "Ybor City, Tampa, FL",
"tab": "investment",
"listings": [
{
"property_id": "p_88120",
"address": "1823 Schyler Ln, Tampa, FL",
"price": 365000,
"cash_on_cash": 13.1,
"cap_rate": 9.4
},
{
"property_id": "p_88151",
"address": "910 E 8th Ave, Tampa, FL",
"price": 389000,
"cash_on_cash": 10.8,
"cap_rate": 8.1
},
{
"property_id": "p_88163",
"address": "2204 N 15th St, Tampa, FL",
"price": 329000,
"cash_on_cash": 10.2,
"cap_rate": 7.9
}
]
} POST https://cotlet.dev/api/v1/mashvisor/get_property_analysis
Returns the numbers of the Property Analytics page for one property: price, rental income, expenses, cash flow, cap rate and cash on cash return, for the Airbnb and the traditional rental strategy. Set strategy to get one of them. Figures are estimates from Mashvisor, as in the app.
Parameters
| Name | Type | Description |
|---|---|---|
| property_id required | string | Property ID from find_properties, run_filter_preset or list_saved_homes. |
| strategy | enum | airbnb, traditional or both. Default: both. |
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/get_property_analysis \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"property_id":"p_88120","strategy":"both"}' result = client.call("mashvisor", "get_property_analysis", {"property_id":"p_88120","strategy":"both"}) const result = await cotlet.call('mashvisor', 'get_property_analysis', {"property_id":"p_88120","strategy":"both"}); cotlet call mashvisor get_property_analysis --data '{"property_id":"p_88120","strategy":"both"}' Example response
{
"property_id": "p_88120",
"address": "1823 Schyler Ln, Tampa, FL",
"price": 365000,
"cash_invested": 91250,
"airbnb": {
"monthly_revenue": 4000,
"monthly_operating_expenses": 1150,
"monthly_mortgage": 1850,
"monthly_cash_flow": 1000,
"cap_rate": 9.4,
"cash_on_cash": 13.1
},
"traditional": {
"monthly_revenue": 2600,
"monthly_operating_expenses": 650,
"monthly_mortgage": 1850,
"monthly_cash_flow": 100,
"cap_rate": 6.4,
"cash_on_cash": 1.3
}
} Get property comps
readPOST https://cotlet.dev/api/v1/mashvisor/get_property_comps
Returns comparable listings near one property. short_term gives Airbnb comps with occupancy and nightly rate, long_term gives rentals with monthly rent, and sales gives sold or listed prices. Nearest comps come first.
Parameters
| Name | Type | Description |
|---|---|---|
| property_id required | string | Property ID from find_properties, run_filter_preset or list_saved_homes. |
| type required | enum | short_term, long_term or sales. |
| limit | integer | 1 to 50. Default: 20. |
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/get_property_comps \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"property_id":"property_8c41d2","type":"short_term"}' result = client.call("mashvisor", "get_property_comps", {"property_id":"property_8c41d2","type":"short_term"}) const result = await cotlet.call('mashvisor', 'get_property_comps', {"property_id":"property_8c41d2","type":"short_term"}); cotlet call mashvisor get_property_comps --data '{"property_id":"property_8c41d2","type":"short_term"}' Example response
{
"property_id": "p_90417",
"type": "short_term",
"comps": [
{
"address": "420 Oak Street, Austin, TX",
"bedrooms": 3,
"nightly_rate": 245,
"occupancy": 68,
"distance_miles": 0.2
},
{
"address": "17 Elm Ave, Austin, TX",
"bedrooms": 3,
"nightly_rate": 229,
"occupancy": 63,
"distance_miles": 0.4
}
]
} Search markets
readPOST https://cotlet.dev/api/v1/mashvisor/search_markets
Returns neighborhoods and cities from Market Finder, ranked by rental performance, with your filters applied. Filter by state, Mashmeter grade, minimum monthly revenue, minimum occupancy and property types. Without a state it searches nationwide.
Parameters
| Name | Type | Description |
|---|---|---|
| state | string | Two-letter state code. Default: nationwide. |
| mashmeter | string[] | Grades to include: A, B, C, D. |
| min_monthly_revenue | integer | Minimum monthly rental revenue in USD. |
| min_occupancy | integer | Minimum occupancy rate in percent. |
| property_types | string[] | Property types to include. |
| limit | integer | 1 to 50. Default: 20. |
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/search_markets \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("mashvisor", "search_markets") const result = await cotlet.call('mashvisor', 'search_markets'); cotlet call mashvisor search_markets Example response
{
"markets": [
{
"market": "Gatlinburg, TN",
"mashmeter": "A",
"occupancy": 72,
"monthly_revenue": 5400
},
{
"market": "Destin, FL",
"mashmeter": "A",
"occupancy": 69,
"monthly_revenue": 5100
},
{
"market": "Pigeon Forge, TN",
"mashmeter": "A",
"occupancy": 67,
"monthly_revenue": 4700
}
]
} List Saved Homes
readPOST https://cotlet.dev/api/v1/mashvisor/list_saved_homes
Returns the properties in your Saved Homes with type, sale price and your rating. Properties added by analyze_unlisted_property or save_home are included. Use property_id with get_property_analysis, get_property_comps or remove_saved_home.
Parameters
| Name | Type | Description |
|---|---|---|
| limit | integer | 1 to 100. Default: 50. |
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/list_saved_homes \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("mashvisor", "list_saved_homes") const result = await cotlet.call('mashvisor', 'list_saved_homes'); cotlet call mashvisor list_saved_homes Example response
{
"homes": [
{
"property_id": "p_88120",
"address": "1823 Schyler Ln, Tampa, FL",
"type": "single_family",
"sale_price": 365000,
"rating": 4
},
{
"property_id": "p_90417",
"address": "412 Oak Street, Austin, TX",
"type": "single_family",
"sale_price": 385000,
"rating": null
}
]
} List Property Alerts
readPOST https://cotlet.dev/api/v1/mashvisor/list_property_alerts
Returns your Property Alerts with their location, filters and email frequency. Use it before create_property_alert so your agent does not add a duplicate.
Parameters
No parameters.
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/list_property_alerts \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("mashvisor", "list_property_alerts") const result = await cotlet.call('mashvisor', 'list_property_alerts'); cotlet call mashvisor list_property_alerts Example response
{
"alerts": [
{
"alert_id": "pa_58102",
"name": "Tampa condos",
"location": "Tampa, FL",
"property_type": "condo",
"price_max": 300000,
"frequency": "weekly"
}
]
} POST https://cotlet.dev/api/v1/mashvisor/export_neighborhood_data
Creates the Excel export that the Export button gives in Map Property Finder, for one neighborhood and one tab. Without preset_id it exports all data; with a preset it exports only the matching listings. City-level export is not supported. Each call uses one of your plan's monthly exports, so it reads from Mashvisor but is not free of limits.
Parameters
| Name | Type | Description |
|---|---|---|
| neighborhood required | string | Neighborhood name with city. City-level export is not supported. |
| tab required | enum | investment, airbnb_comps or rental_comps. |
| preset_id | string | Export only listings matching this preset. Default: all data. |
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/export_neighborhood_data \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"neighborhood":"neighborhood","tab":"investment"}' result = client.call("mashvisor", "export_neighborhood_data", {"neighborhood":"neighborhood","tab":"investment"}) const result = await cotlet.call('mashvisor', 'export_neighborhood_data', {"neighborhood":"neighborhood","tab":"investment"}); cotlet call mashvisor export_neighborhood_data --data '{"neighborhood":"neighborhood","tab":"investment"}' Example response
{
"neighborhood": "Ybor City, Tampa, FL",
"tab": "airbnb_comps",
"scope": "filtered",
"file_name": "ybor-city-airbnb-comps.xlsx",
"download_url": "https://files.cotlet.example/exports/ybor-city-airbnb-comps.xlsx",
"rows": 38
} POST https://cotlet.dev/api/v1/mashvisor/download_property_report
Creates the PDF analytics report from the download icon on a property page. With branded set to true it adds the company name and logo saved in your account. Mashvisor limits downloads by plan, and each call uses one.
Parameters
| Name | Type | Description |
|---|---|---|
| property_id required | string | Property ID from find_properties, run_filter_preset or list_saved_homes. |
| branded | boolean | Add the company branding saved in your account. Default: false. |
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/download_property_report \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"property_id":"property_8c41d2"}' result = client.call("mashvisor", "download_property_report", {"property_id":"property_8c41d2"}) const result = await cotlet.call('mashvisor', 'download_property_report', {"property_id":"property_8c41d2"}); cotlet call mashvisor download_property_report --data '{"property_id":"property_8c41d2"}' Example response
{
"property_id": "p_88120",
"branded": false,
"file_name": "schyler-ln-tampa-report.pdf",
"download_url": "https://files.cotlet.example/reports/schyler-ln-tampa-report.pdf"
} POST https://cotlet.dev/api/v1/mashvisor/analyze_unlisted_property
Runs the "look up not listed property" flow for an address and returns the rental analysis. It adds the property to your Saved Homes. This reaches no one and is undone with remove_saved_home, so it runs without asking first.
Parameters
| Name | Type | Description |
|---|---|---|
| address required | string | Full US street address. |
| price required | integer | Price in USD. |
| property_type required | enum | single_family, condo, townhouse, apartment or multi_family. |
| bedrooms required | integer | Number of bedrooms. |
| bathrooms required | integer | Number of bathrooms. |
| sqft required | integer | Square footage. |
| unit | string | Unit number for apartments, condos and townhomes. |
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/analyze_unlisted_property \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"address":"412 Oak Street, Austin, TX","price":385000,"property_type":"single_family","bedrooms":3,"bathrooms":2,"sqft":1650}' result = client.call("mashvisor", "analyze_unlisted_property", {"address":"412 Oak Street, Austin, TX","price":385000,"property_type":"single_family","bedrooms":3,"bathrooms":2,"sqft":1650}) const result = await cotlet.call('mashvisor', 'analyze_unlisted_property', {"address":"412 Oak Street, Austin, TX","price":385000,"property_type":"single_family","bedrooms":3,"bathrooms":2,"sqft":1650}); cotlet call mashvisor analyze_unlisted_property --data '{"address":"412 Oak Street, Austin, TX","price":385000,"property_type":"single_family","bedrooms":3,"bathrooms":2,"sqft":1650}' Example response
{
"property_id": "p_90417",
"address": "412 Oak Street, Austin, TX",
"saved_to_saved_homes": true,
"price": 385000,
"cash_invested": 96250,
"airbnb": {
"monthly_revenue": 4200,
"monthly_operating_expenses": 1200,
"monthly_mortgage": 1950,
"monthly_cash_flow": 1050,
"cap_rate": 9.4,
"cash_on_cash": 13.1
},
"traditional": {
"monthly_revenue": 2700,
"monthly_operating_expenses": 650,
"monthly_mortgage": 1950,
"monthly_cash_flow": 100,
"cap_rate": 6.4,
"cash_on_cash": 1.2
}
} Save home
writePOST https://cotlet.dev/api/v1/mashvisor/save_home
Adds one property to your Saved Homes. This reaches no one and is undone with remove_saved_home, so it runs without asking first.
Parameters
| Name | Type | Description |
|---|---|---|
| property_id required | string | Property ID from find_properties, run_filter_preset or list_saved_homes. |
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/save_home \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"property_id":"property_8c41d2"}' result = client.call("mashvisor", "save_home", {"property_id":"property_8c41d2"}) const result = await cotlet.call('mashvisor', 'save_home', {"property_id":"property_8c41d2"}); cotlet call mashvisor save_home --data '{"property_id":"property_8c41d2"}' Example response
{
"property_id": "p_88144",
"saved": true
} Remove saved home
writePOST https://cotlet.dev/api/v1/mashvisor/remove_saved_home
Removes one property from your Saved Homes. This reaches no one and the property can be added again with save_home, so it runs without asking first.
Parameters
| Name | Type | Description |
|---|---|---|
| property_id required | string | Property ID from find_properties, run_filter_preset or list_saved_homes. |
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/remove_saved_home \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"property_id":"property_8c41d2"}' result = client.call("mashvisor", "remove_saved_home", {"property_id":"property_8c41d2"}) const result = await cotlet.call('mashvisor', 'remove_saved_home', {"property_id":"property_8c41d2"}); cotlet call mashvisor remove_saved_home --data '{"property_id":"property_8c41d2"}' Example response
{
"property_id": "p_88144",
"saved": false
} POST https://cotlet.dev/api/v1/mashvisor/create_property_alert
Creates a Property Alert in your account. Mashvisor then emails you new matching listings at the frequency you set, and only when there are any. Price runs from 5,000 to 5,000,000 USD. There is no tool to delete an alert, so you remove one in Mashvisor. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| name required | string | Alert name. |
| location required | string | Address, neighborhood, city or zip code. |
| property_type | enum | all, single_family, condo, townhouse or multi_family. Default: all. |
| price_min | integer | Minimum price in USD, from 5,000. |
| price_max | integer | Maximum price in USD, up to 5,000,000. |
| bedrooms | integer | Minimum bedrooms, 1 to 5. |
| financing | enum | cash or mortgage. Default: cash. |
| min_cap_rate | integer | Minimum cap rate in percent. |
| min_cash_on_cash | integer | Minimum cash on cash return in percent. |
| frequency | enum | daily, weekly or monthly. Default: weekly. |
Request
curl -X POST https://cotlet.dev/api/v1/mashvisor/create_property_alert \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Cleveland SFH under 200k","location":"Cleveland, OH","property_type":"single_family","price_max":200000,"financing":"cash","min_cap_rate":8,"frequency":"weekly"}' result = client.call("mashvisor", "create_property_alert", {"name":"Cleveland SFH under 200k","location":"Cleveland, OH","property_type":"single_family","price_max":200000,"financing":"cash","min_cap_rate":8,"frequency":"weekly"}) const result = await cotlet.call('mashvisor', 'create_property_alert', {"name":"Cleveland SFH under 200k","location":"Cleveland, OH","property_type":"single_family","price_max":200000,"financing":"cash","min_cap_rate":8,"frequency":"weekly"}); cotlet call mashvisor create_property_alert --data '{"name":"Cleveland SFH under 200k","location":"Cleveland, OH","property_type":"single_family","price_max":200000,"financing":"cash","min_cap_rate":8,"frequency":"weekly"}' Example response
{
"alert_id": "pa_58213",
"name": "Cleveland SFH under 200k",
"location": "Cleveland, OH",
"frequency": "weekly",
"email_to": "yourname@example.com",
"status": "active"
}