
Custom STR market reports built on live API data outperform static vendor reports by delivering the exact metrics, segments, and timeframes your investment thesis demands. According to the National Association of Realtors, 97% of homebuyers used the internet during their property search in 2024, and professional investors increasingly rely on programmatic data pipelines rather than manual research. AirROI's API gives you direct access to ADR (average daily rate), RevPAR (revenue per available room-night), occupancy rates, booking pace, and supply growth for every market -- the same dataset powering billions of dollars in STR investment decisions.
This guide walks you through combining multiple /markets/metrics/* endpoints to produce a comprehensive market analysis covering historical trends, current performance, and forward-looking demand signals. Whether you are building internal tools for a property management company or client-facing reports for a consultancy, the three-step framework below delivers institutional-quality output. For a one-off analysis rather than a pipeline, you can also build this market report by asking Claude through AirROI's MCP server, which calls the same market endpoints with the same API key.
Generic market reports deliver one-size-fits-all snapshots that ignore the nuances separating profitable markets from marginal ones. A custom STR market report built on API data solves this problem by letting you define the exact geography, property type, and date range that matter to your investment strategy.
According to a 2024 Deloitte commercial real estate outlook, data-driven real estate firms achieve 20% higher risk-adjusted returns than peers relying on traditional analysis. The short-term rental sector amplifies this advantage because STR performance fluctuates with seasonality, local events, and regulation changes that static reports fail to capture.
A well-structured market report answers three questions:
| Report Layer | Key Metrics | AirROI Endpoint | Update Frequency |
|---|---|---|---|
| Historical Trends | Monthly ADR, RevPAR, occupancy, revenue | /markets/metrics/all | Daily |
| Current Snapshot | TTM revenue, ADR, occupancy, listing count | /markets/summary | Daily |
| Future Outlook | Booking pace, fill rate by future month | /markets/metrics/future/pacing | Daily |
| Supply Tracking | Active listing count over time | /markets/metrics/active-listings | Daily |
This is the framework that powers the reporting tools at property management companies overseeing thousands of units. The sections below walk through each layer with working code examples you can deploy immediately.
Historical trend analysis is the foundation of every credible STR market report. The /markets/metrics/all endpoint returns monthly granularity across ADR, RevPAR, occupancy rate, revenue, and listing counts -- up to 60 months of data in a single request. According to STR, Inc., markets with consistent YoY (year-over-year) RevPAR growth above 5% attract disproportionate institutional capital, making trend identification a prerequisite for competitive investment analysis.
By requesting 24-36 months of historical data, you capture at least two complete seasonal cycles -- enough to distinguish structural trends from one-time anomalies. The code below retrieves this data and is ready for analysis with pandas, matplotlib, or any visualization library.
import requests
def get_historical_trends(api_key, market):
response = requests.post(
"https://api.airroi.com/markets/metrics/all",
headers={"X-API-KEY": api_key, "Content-Type": "application/json"},
json={"market": market, "num_months": 36}
)
data = response.json()
return data.get('results', [])
# Example Usage
market_to_analyze = {"country": "US", "region": "Florida", "locality": "Miami"}
historical_data = get_historical_trends("your-api-key", market_to_analyze)
# Now you can use a library like pandas or matplotlib to visualize the data
# For example, create a line chart of monthly revenue over the last 3 years
# or calculate YoY occupancy growth.
Not all metrics carry equal weight. The table below shows the five indicators that experienced STR analysts prioritize when evaluating market trajectory, along with what each signal reveals.
| Metric | What It Reveals | Healthy Benchmark |
|---|---|---|
| RevPAR YoY Growth | Overall market momentum combining rate and occupancy | > 3% annually |
| ADR Trend | Pricing power and demand quality | Outpacing local CPI inflation |
| Occupancy Rate | Demand relative to supply | 55-75% TTM for most markets |
| Revenue per Listing | Per-unit economics for investors | > $30,000/year for viable STR markets |
| Listing Count Growth | Supply pressure on existing hosts | < 10% YoY to avoid saturation |
According to the U.S. Bureau of Labor Statistics, the shelter component of CPI rose 4.6% in 2025. Markets where STR ADR growth outpaces this figure demonstrate genuine pricing power rather than mere inflation passthrough. This kind of granular analysis is only possible with raw API data -- prepackaged reports rarely surface this comparison.
For a deeper dive into building automated investment scoring on top of historical data, see our guide to building a real estate investment analysis tool.
The current market snapshot delivers the "state of the union" for any STR market. The /markets/summary endpoint returns TTM performance metrics in a single, efficient call -- perfect for populating executive dashboards and KPI cards that stakeholders expect.
According to McKinsey & Company's 2024 real estate technology report, firms that surface real-time KPIs in dashboards reduce decision latency by 40% compared to those relying on periodic report distribution. The summary endpoint enables exactly this workflow.
The code below fetches the current market summary and extracts the four metrics that matter most: TTM revenue, occupancy rate, ADR, and active listing count. These form the top-level KPI cards in any professional market report.
// Fetch the current market summary
async function getMarketSummary(apiKey, market) {
const response = await fetch("https://api.airroi.com/markets/summary", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": apiKey,
},
body: JSON.stringify({ market }),
});
const summary = await response.json();
// Display the KPIs in your UI
console.log(`Current TTM Revenue: $${summary.revenue.toLocaleString()}`);
console.log(
`Current TTM Occupancy: ${(summary.occupancy * 100).toFixed(1)}%`,
);
console.log(`Current TTM ADR: $${summary.average_daily_rate.toFixed(2)}`);
console.log(`Active Listings: ${summary.active_listings_count}`);
return summary;
}
TTM (trailing twelve months) metrics smooth out seasonal volatility and provide the most balanced view of market performance. A market showing $45,000 TTM revenue per listing and 68% TTM occupancy rate delivers a fundamentally different investment profile than one at $25,000 and 52%.
The table below illustrates how TTM metrics from the summary endpoint compare across three representative U.S. markets, demonstrating the variance that custom reports must capture.
| Market | TTM Revenue/Listing | TTM Occupancy | TTM ADR | Active Listings |
|---|---|---|---|---|
| Miami, FL | $52,400 | 71.2% | $248 | 18,500+ |
| Nashville, TN | $38,700 | 63.8% | $195 | 9,200+ |
| Boise, ID | $27,100 | 58.4% | $162 | 2,800+ |
These figures, pulled directly from AirROI's API, reveal that Miami generates nearly double the per-listing revenue of Boise -- a gap invisible in generic "top markets" reports that only rank by total revenue. To learn how to filter and segment this data further, explore our advanced filtering and sorting guide.
Forward-looking analysis separates useful market reports from backward-looking data dumps. The /markets/metrics/future/pacing endpoint delivers booking pace (the percentage of available nights already reserved for future dates), which is the single most reliable leading indicator of STR demand. Combined with the /markets/metrics/active-listings endpoint for supply tracking, you can build a supply-versus-demand forecast that identifies emerging opportunities and risks before they appear in historical data.
According to the U.S. Travel Association, domestic leisure travel spending reached $1.2 trillion in 2024, with short-term rentals capturing an estimated 25-30% of accommodation spend. Markets where booking pace runs above 45% at the 90-day horizon consistently sustain or increase ADR, while those below 30% face rate compression.
The code below combines pacing and active listing data to calculate both supply growth and forward demand. This is the same data foundation that powers our dynamic pricing engine.
# Get both future pacing and historical listing counts
def get_future_outlook(api_key, market):
pacing_res = requests.post(
"https://api.airroi.com/markets/metrics/future/pacing",
headers={"X-API-KEY": api_key, "Content-Type": "application/json"},
json={"market": market}
)
listings_res = requests.post(
"https://api.airroi.com/markets/metrics/active-listings",
headers={"X-API-KEY": api_key, "Content-Type": "application/json"},
json={"market": market, "num_months": 12}
)
pacing_data = pacing_res.json()
listings_data = listings_res.json()
# Simple analysis: Compare supply growth to demand
# (A more advanced analysis would use the full time-series data)
last_month_listings = listings_data['results'][-1]['count']
year_ago_listings = listings_data['results'][0]['count']
supply_growth = (last_month_listings - year_ago_listings) / year_ago_listings
# Check demand for 90 days out
pacing_90_days_out = next((p for p in pacing_data.get('results', []) if p['date'] == '2026-10-29'), None)
print(f"12-Month Supply Growth: {(supply_growth * 100):.1f}%")
if pacing_90_days_out:
print(f"Booked Occupancy 90 Days Out: {(pacing_90_days_out['fill_rate'] * 100):.1f}%")
# You can now build logic to flag markets where supply growth is outpacing demand.
The relationship between supply growth and booking pace reveals four distinct market conditions. Understanding these quadrants transforms raw numbers into investment-grade intelligence.
| Supply Growth | Booking Pace (90-day) | Market Condition | Strategic Implication |
|---|---|---|---|
| Low (< 5%) | High (> 45%) | Undersupplied | Strong entry point for new inventory |
| Low (< 5%) | Low (< 30%) | Stagnant | Limited opportunity; monitor for catalysts |
| High (> 10%) | High (> 45%) | Booming | Demand absorbing new supply -- watch for inflection |
| High (> 10%) | Low (< 30%) | Oversaturated | Avoid new entries; expect ADR compression |
This quadrant framework, populated with live API data, enables the kind of forward-looking market intelligence that differentiates professional STR consultants from casual investors. For more on how to incorporate geographic precision into these forecasts, see our guide on geospatial STR analysis.
The real power emerges when you combine historical trends, the current snapshot, and forward-looking pacing into one unified analysis. Each layer validates and contextualizes the others: historical data reveals whether current performance is above or below the long-term trend, while booking pace signals whether that trajectory will continue.
The pattern below demonstrates how to call all three endpoint groups and structure the output into a single dictionary ready for templating into a PDF, HTML report, or dashboard component.
import requests
from datetime import datetime
def build_complete_market_report(api_key, market):
"""
Assemble a complete STR market report combining
historical, current, and forward-looking data.
"""
# Layer 1: Historical trends (36 months)
historical = requests.post(
"https://api.airroi.com/markets/metrics/all",
headers={"X-API-KEY": api_key, "Content-Type": "application/json"},
json={"market": market, "num_months": 36}
).json().get('results', [])
# Layer 2: Current TTM snapshot
summary = requests.post(
"https://api.airroi.com/markets/summary",
headers={"X-API-KEY": api_key, "Content-Type": "application/json"},
json={"market": market}
).json()
# Layer 3: Forward-looking pacing
pacing = requests.post(
"https://api.airroi.com/markets/metrics/future/pacing",
headers={"X-API-KEY": api_key, "Content-Type": "application/json"},
json={"market": market}
).json().get('results', [])
# Layer 3b: Supply tracking
listings = requests.post(
"https://api.airroi.com/markets/metrics/active-listings",
headers={"X-API-KEY": api_key, "Content-Type": "application/json"},
json={"market": market, "num_months": 12}
).json().get('results', [])
# Calculate derived metrics
yoy_revpar_growth = None
if len(historical) >= 13:
current_month = historical[-1]
year_ago_month = historical[-13]
if year_ago_month.get('revpar', 0) > 0:
yoy_revpar_growth = (
(current_month['revpar'] - year_ago_month['revpar'])
/ year_ago_month['revpar']
)
supply_growth = None
if len(listings) >= 2:
supply_growth = (
(listings[-1]['count'] - listings[0]['count'])
/ listings[0]['count']
)
return {
"generated_at": datetime.now().isoformat(),
"market": market,
"historical_trends": historical,
"current_snapshot": {
"ttm_revenue": summary.get('revenue'),
"ttm_occupancy": summary.get('occupancy'),
"ttm_adr": summary.get('average_daily_rate'),
"active_listings": summary.get('active_listings_count'),
},
"forward_outlook": {
"pacing_data": pacing,
"supply_growth_12m": supply_growth,
"yoy_revpar_growth": yoy_revpar_growth,
},
}
# Generate a report for Miami
report = build_complete_market_report(
"your-api-key",
{"country": "US", "region": "Florida", "locality": "Miami"}
)
This pattern scales cleanly. You can wrap it in a loop to generate comparative reports across multiple markets, feed the output into a revenue calculator integration, or serialize it to JSON for front-end rendering.
Building a one-off report is straightforward. Building a production system that generates reliable, accurate reports at scale requires attention to data quality, caching, and presentation standards.
Always filter by property type and bedroom count when analyzing a market. A market-wide ADR of $200 means little when 1-bedroom condos average $140 and 4-bedroom homes average $380. AirROI's endpoints accept filter parameters for room_type and bedrooms, enabling the segment-level precision that institutional investors demand.
AirROI updates market metrics daily, but not every reporting use case requires daily refreshes. Match your refresh cadence to your audience:
| Use Case | Recommended Refresh | Rationale |
|---|---|---|
| Dynamic pricing dashboard | Daily | Rate decisions require current data |
| Portfolio performance report | Weekly | Balances freshness with API efficiency |
| Quarterly investor deck | Monthly | TTM metrics change slowly at monthly granularity |
| Annual market overview | Monthly | Historical trends shift gradually |
Professional market reports follow consistent formatting conventions. Include the report generation date, data source attribution, and the specific market definition (geography, property type, date range) on every report. This transparency builds trust with stakeholders and satisfies due diligence requirements for institutional capital.
For teams building client-facing report products, our getting started guide covers authentication, rate limiting, and error handling patterns essential for production deployments. The data accuracy methodology page details how AirROI validates its underlying dataset.
The three-endpoint framework presented here -- historical trends, current snapshot, and forward-looking pacing -- delivers the complete analytical foundation for any STR market report. You control the geography, the property segments, the timeframes, and the narrative. According to AirROI's analysis of 20M+ listings, markets with the highest investment returns are consistently identified by analysts who combine all three data layers rather than relying on any single metric.
The difference between a generic market overview and a proprietary insight engine is the data pipeline underneath it. With AirROI's API, that pipeline takes minutes to build and runs indefinitely.
Calculate YoY RevPAR growth by requesting 24 months of data from the /markets/metrics/all endpoint and comparing the same calendar month across consecutive years. For example, divide January 2026 RevPAR by January 2025 RevPAR and subtract 1 to get the percentage change. AirROI returns monthly RevPAR, ADR, and occupancy rate in a single response, eliminating the need for manual calculations.
Yes. AirROI's market endpoints accept filter parameters for room_type (entire home, private room, shared room) and bedroom count. Filtering by property segment is essential for accurate analysis because a 1-bedroom condo and a 5-bedroom villa operate in fundamentally different markets with different ADR, occupancy, and guest demographics.
Booking pace (also called fill rate) measures the percentage of available nights already booked for a future date range. It is the single best leading indicator of market demand. Markets with booking pace above 45% at 90 days out historically maintain or increase ADR, while markets below 30% often experience rate compression as hosts compete for fewer guests.
AirROI updates its market metrics daily, so weekly refreshes strike the optimal balance between data freshness and API efficiency for most reporting use cases. For dynamic pricing applications or real-time dashboards, daily refreshes are recommended. Monthly refreshes are sufficient for quarterly investor reports or annual market overviews.