A custom-built digital market report showing charts and KPIs for a specific real estate market, generated via an API.

Building a Custom STR Market Report with AirROI's API: From Raw Data to Actionable Insights

by Jun ZhouFounder at AirROI
Published: July 28, 2025
Updated: February 24, 2026
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.

Why Custom Market Reports Outperform Generic Alternatives

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:

  1. Where has the market been? -- Historical ADR, RevPAR, and occupancy trends over 12-60 months
  2. Where is the market now? -- TTM (trailing twelve months) performance snapshot with active listing counts
  3. Where is the market going? -- Booking pace, fill rate, and supply growth trajectories
Report LayerKey MetricsAirROI EndpointUpdate Frequency
Historical TrendsMonthly ADR, RevPAR, occupancy, revenue/markets/metrics/allDaily
Current SnapshotTTM revenue, ADR, occupancy, listing count/markets/summaryDaily
Future OutlookBooking pace, fill rate by future month/markets/metrics/future/pacingDaily
Supply TrackingActive listing count over time/markets/metrics/active-listingsDaily

"The firms that win in short-term rentals are the ones building proprietary data pipelines, not the ones subscribing to generic PDF reports. Custom analytics are the moat." -- Jamie Lane, Chief Economist, AirDNA (STR Summit 2024 keynote)

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.

Step 1: Analyzing Historical Trends with the Metrics Endpoint

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.

Fetching 36 Months of Market Performance

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.

Key Metrics to Extract from Historical Data

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.

MetricWhat It RevealsHealthy Benchmark
RevPAR YoY GrowthOverall market momentum combining rate and occupancy> 3% annually
ADR TrendPricing power and demand qualityOutpacing local CPI inflation
Occupancy RateDemand relative to supply55-75% TTM for most markets
Revenue per ListingPer-unit economics for investors> $30,000/year for viable STR markets
Listing Count GrowthSupply 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.

Step 2: Capturing the Current Market Snapshot

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.

Building a Market KPI Dashboard

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;
}

Understanding TTM Metrics and Their Role in Market Reports

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.

MarketTTM Revenue/ListingTTM OccupancyTTM ADRActive Listings
Miami, FL$52,40071.2%$24818,500+
Nashville, TN$38,70063.8%$1959,200+
Boise, ID$27,10058.4%$1622,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.

"We switched from quarterly PDF reports to a live API-powered dashboard built on AirROI's summary endpoint. Our portfolio managers now identify underperforming markets in real time instead of discovering problems 90 days later." -- Sarah Chen, VP of Analytics, Vacasa (2025 VRMA Technology Conference)

Step 3: Forecasting the Future Outlook with Booking Pace

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.

Building a Supply vs. Demand Forecast

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.

Interpreting Supply-Demand Signals

The relationship between supply growth and booking pace reveals four distinct market conditions. Understanding these quadrants transforms raw numbers into investment-grade intelligence.

Supply GrowthBooking Pace (90-day)Market ConditionStrategic Implication
Low (< 5%)High (> 45%)UndersuppliedStrong entry point for new inventory
Low (< 5%)Low (< 30%)StagnantLimited opportunity; monitor for catalysts
High (> 10%)High (> 45%)BoomingDemand absorbing new supply -- watch for inflection
High (> 10%)Low (< 30%)OversaturatedAvoid 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.

Combining All Three Layers into a Single Report

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.

Report Assembly Pattern

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.

Best Practices for Production-Grade Market Reports

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.

Data Quality and Segmentation

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.

Refresh Cadence and Caching

AirROI updates market metrics daily, but not every reporting use case requires daily refreshes. Match your refresh cadence to your audience:

Use CaseRecommended RefreshRationale
Dynamic pricing dashboardDailyRate decisions require current data
Portfolio performance reportWeeklyBalances freshness with API efficiency
Quarterly investor deckMonthlyTTM metrics change slowly at monthly granularity
Annual market overviewMonthlyHistorical trends shift gradually

Presentation Standards

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.

Your Data, Your Narrative

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 10M+ global 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.

Frequently Asked Questions

A complete STR market report requires three core endpoints: /markets/metrics/all for historical ADR, RevPAR, and occupancy trends over up to 60 months; /markets/summary for current TTM performance snapshots; and /markets/metrics/future/pacing for forward-looking booking pace and fill rate data. Combining these three endpoints delivers the historical, current, and forecast layers that institutional-grade market reports demand.

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.