Skip to main content

How to Monitor Listing Performance (KPIs)

Learn how to retrieve KPI data for your Wheelhouse listings — rolling-window metrics, monthly history, and quarterly history.

Written by Ryo

Wheelhouse provides four KPI endpoints per listing — a rolling-window snapshot, monthly historical stats, quarterly historical stats, and yearly historical stats. All four require listing_id in the path and channel as a query parameter.


Rolling-window KPIs

Returns performance metrics across multiple time windows simultaneously — both forward-looking (next 7, 14, 30, 60, 90, 180, 365 days) and backward-looking (past 7, 14, 21, 30, 60, 90, 100, 180, 365 days). Each metric is an object keyed by period strings like 0_7 (next 7 days), 30_0 (past 30 days), etc.

curl "https://api.usewheelhouse.com/ss_api/v1/listings/12345678/kpis?channel=airbnb" \
  -H "X-Integration-Api-Key: your_api_key_here"

Response shape:

{
  "currency": "USD",
  "model_date": "2026-07-04",
  "last_booked_days": {
    "0_7": 3,
    "0_30": 3,
    "7_0": 3,
    "30_0": 3,
    "365_0": 3
  },
  "occupancy": {
    "0_7": 0,
    "0_30": 0,
    "7_0": 0,
    "30_0": 0,
    "365_0": 0
  },
  "adr": { "0_7": 0, "0_30": 0, ... },
  "revenue": { "0_7": 0, "0_30": 0, ... },
  "bookings": { "0_7": 0, "0_30": 0, ... },
  "revpar": { "0_7": 0, "0_30": 0, ... },
  "nights_available": { "0_7": 0, "0_30": 0, ... },
  "nights_blocked": { "0_7": 0, "0_30": 0, ... }
}

⚠️ Breaking change (2026-08-13): last_booked_at — a single timestamp of the most recent booking — no longer exists. It's replaced by last_booked_days, a full rolling-window metric (same period-keyed shape as adr): the number of days since the most recent booking whose stay dates overlap that period, per period. Read last_booked_days["7_0"] instead of diffing a timestamp yourself.

Available metrics include: occupancy, occupancy_adjusted, adr, adr_fees, asking_rate, asking_rate_fees, revenue, revenue_fees, revenue_fees_taxes, revpar, revpar_fees, revpar_adjusted_occupancy, bookings, lead_time, length_of_stay, nights_available, nights_blocked, nights_bookable, nights_booked, nights_calendar, nights_percent_open, last_booked_days, revenue_available, revenue_blocked, pickup, pickup_bookings, comp_set_occupancy, comp_set_revenue, comp_set_count.

All monetary values are in the listing's currency.


Rank your whole portfolio by one KPI

New as of 2026-08-13. Instead of pulling every listing's full KPI object and sorting client-side, GET /listings/kpis ranks every listing you can access by a single metric + window in one call.

curl "https://api.usewheelhouse.com/ss_api/v1/listings/kpis?metric=revenue&window=30_0&sort=desc" \
  -H "X-Integration-Api-Key: your_api_key_here"

Response — one row per listing, already sorted:

[
  { "listing_id": 84521, "partner_listing_id": "12345678", "value": 4210.55, "currency": "USD", "updated_at": "2026-08-12T04:00:00Z" },
  { "listing_id": 84522, "partner_listing_id": "12345679", "value": 3980.10, "currency": "USD", "updated_at": "2026-08-12T04:00:00Z" }
]

metric and window are required — most metrics support both 0_N (forward) and N_0 (trailing) windows; a few are one-direction only (see the full endpoint reference for the exact split). Pass currency to convert monetary metrics before ranking if your portfolio spans currencies — without it, rows are ranked on unconverted numbers. A listing with no value for the window sorts last with value: null; listings with no stats at all are omitted entirely. include_managed_listings defaults to true (includes listings you manage for another account, not just ones you own).


Monthly historical stats

Returns monthly performance stats ordered oldest to newest. Up to 15 months of history.

curl "https://api.usewheelhouse.com/ss_api/v1/listings/12345678/kpis/monthly?channel=airbnb" \
  -H "X-Integration-Api-Key: your_api_key_here"

Response:

{
  "currency": "USD",
  "data": [
    { ... }
  ]
}


Quarterly historical stats

Returns quarterly performance stats ordered oldest to newest. Up to 5 recent quarters of history.

curl "https://api.usewheelhouse.com/ss_api/v1/listings/12345678/kpis/quarterly?channel=airbnb" \
  -H "X-Integration-Api-Key: your_api_key_here"

Response follows the same shape: {"currency": "USD", "data": [...]}.


Yearly historical stats

Returns yearly performance stats ordered oldest to newest. Up to 5 years of history.

curl "https://api.usewheelhouse.com/ss_api/v1/listings/12345678/kpis/yearly?channel=airbnb" \
  -H "X-Integration-Api-Key: your_api_key_here"

Response follows the same shape: {"currency": "USD", "data": [...]}.


Monitor your full portfolio

Loop through all active listings to pull rolling-window KPIs for each:

import requestsAPI_KEY = "your_api_key_here"
BASE_URL = "https://api.usewheelhouse.com/ss_api/v1"
headers = {"X-Integration-Api-Key": API_KEY}listings = requests.get(
    f"{BASE_URL}/listings",
    headers=headers,
    params={"exclude_inactive": "true"}
).json()for listing in listings:
    kpis = requests.get(
        f"{BASE_URL}/listings/{listing['id']}/kpis",
        headers=headers,
        params={"channel": listing["channel"]}
    ).json()
    occ_30 = kpis.get("occupancy", {}).get("0_30")
    rev_30 = kpis.get("revenue", {}).get("0_30")
    print(f"{listing['id']}: next-30d occupancy={occ_30}, revenue={rev_30}")


Next steps
How to organize and filter listings (tags, segments, dynamic sets)

Did this answer your question?