Airbnb API & Short-Term Rental Data API | AirROI (2.3.0)

Download OpenAPI specification:

✨️ Feed this spec to your AI coding agent — Claude, Codex, OpenCode, etc.

Unlock the full potential of the short-term rental market with the AirROI API, the industry's leading data and analytics solution for Airbnb and vacation rentals. Our powerful API provides unparalleled access to comprehensive property-level data, advanced revenue forecasting, and in-depth competitive intelligence, giving you a decisive edge in the STR ecosystem.

Whether you are a property manager, investor, or data analyst, the AirROI API delivers the actionable insights you need to identify high-yield investments, optimize rental performance, and master market dynamics. Experience the next level of STR data analytics and unlock superior returns with AirROI.

Onboarding: www.airroi.com/api/developer

Pricing: www.airroi.com/api/pricing

Support: www.airroi.com/contact

Terms of Service: www.airroi.com/tos

Last Updated: September 23rd, 2026

Authentication

This API is secured using an API key. To get your key, please visit www.airroi.com/api/developer/activate.

Include your assigned API key in the request headers as follows:

  • Header Name: X-API-KEY
  • Value: your-airroi-api-key

Example:

curl -X GET \
  -H "X-API-KEY: your-airroi-api-key" \
  https://api.airroi.com/listings?listing_id=1234567890

Filtering

Our API provides powerful filtering capabilities to help you refine your search results and retrieve the exact data you need.

You can filter your results by providing a filter object in the request body. The filter object is a simple object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them. For example, "amenities": {"all": ["wifi", "kitchen"], "any": ["pool", "hot_tub"], "none": ["smoking_allowed"]} means:

  • the listing has wifi and kitchen
  • the listing has pool or hot_tub
  • the listing does not have smoking_allowed

Filter Operators

Operator Description Example
eq Equal to "bedrooms": {"eq": 2}
lt Less than "price": {"lt": 100}
lte Less than or equal to "price": {"lte": 100}
gt Greater than "rating": {"gt": 4.5}
gte Greater than or equal to "rating": {"gte": 4.5}
range Between two values (inclusive) "bedrooms": {"range": [2, 4]}
any Contains any of the values in the list "amenities": {"any": ["pool", "wifi"]}
all Contains all of the values in the list "amenities": {"all": ["pool", "wifi"]}
none Contains none of the values in the list "amenities": {"none": ["pets_allowed"]}

Powerful Filter Sort Example

Here's a comprehensive example showcasing multiple filters and sorts:

{
  "filter": {
    "room_type": {"eq": "entire_home"},
    "bedrooms": {"range": [2, 5]},
    "baths": {"gte": 2},
    "guests": {"range": [4, 10]},
    "amenities": {"all": ["wifi", "kitchen", "air_conditioning"], "any": ["pool", "hot_tub", "beach_access", "waterfront"], "none": ["pets_allowed", "smoking_allowed"]},
    "superhost": {"eq": true},
    "instant_book": {"eq": true},
    "min_nights": {"lte": 3},
    "rating_overall": {"gte": 4.8},
    "num_reviews": {"gte": 50},
    "ttm_revenue": {"range": [75000, 250000]},
    "ttm_occupancy": {"gte": 0.7},
    "ttm_avg_rate": {"range": [200, 800]},
    "l90d_occupancy": {"gt": 0.65},
    "cleaning_fee": {"lte": 200}
  },
  "sort": {
    "ttm_revenue": "desc",
    "rating_overall": "desc",
    "ttm_occupancy": "desc",
    "ttm_avg_rate": "asc",
    "num_reviews": "desc"
  },
  "pagination": {
    "page_size": 10,
    "offset": 0
  },
  "currency": "native"
}

This query finds high-performing entire homes that are family-friendly, have luxury amenities, excellent ratings, and strong financial performance, sorted by multiple criteria.

Location Filtering

Our location filtering is powerful and flexible, allowing you to search at various geographic levels. If you are unsure about the exact spelling of a location, you can use the /markets/search or /markets/lookup endpoints to find the correct location names.

Understanding Market Administrative Levels

  • Country: The country where the property is located. (e.g., "US", "France")
  • Region: The primary administrative division, such as a state or province. (e.g., "California", "Ile-de-France")
  • Locality: The city, town, or other municipality. (e.g., "Los Angeles", "Paris")
  • District: A neighborhood, borough, or other sub-city area. (e.g., "18th Arrondissement", "10001")

By Market

When searching for listings, you can specify a market object to narrow your search to a specific geographic area. The country, region, locality, and district fields are all optional, allowing for searches at different levels of granularity.

Global Search To search for listings globally, set the market object to null.

{
  "market": null,
  "sort": {
    "ttm_revenue": "desc"
  }
}

Country-Level Search To find high-performing entire home listings with excellent ratings in the United States:

{
  "market": {
    "country": "United States"
  },
  "filter": {
    "room_type": {"eq": "entire_home"},
    "ttm_revenue": {"gte": 75000},
    "ttm_occupancy": {"gt": 0.65},
    "rating_overall": {"gte": 4.8},
    "num_reviews": {"gte": 25}
  },
  "sort": {
    "ttm_revenue": "desc",
    "rating_overall": "desc",
    "ttm_occupancy": "desc"
  },
  "pagination": {
    "page_size": 10,
    "offset": 0
  }
}

Region-Level Search To find premium vacation rentals in California with specific amenities and performance metrics:

{
  "market": {
    "country": "United States",
    "region": "California"
  },
  "filter": {
    "bedrooms": {"range": [3, 6]},
    "baths": {"gte": 2.5},
    "guests": {"gte": 6},
    "amenities": {"all": ["pool", "hot_tub", "wifi", "kitchen"]},
    "ttm_avg_rate": {"range": [350, 1000]},
    "ttm_revenue": {"gt": 100000},
    "superhost": {"eq": true},
    "instant_book": {"eq": true}
  },
  "sort": {
    "ttm_revenue": "desc",
    "ttm_avg_rate": "desc",
    "num_reviews": "desc"
  },
  "currency": "usd"
}

Locality-Level Search To find high-performing short-term rentals in Miami Beach with beach proximity and luxury features:

{
  "market": {
    "country": "United States",
    "region": "Florida",
    "locality": "Miami Beach"
  },
  "filter": {
    "bedrooms": {"gte": 2},
    "baths": {"gte": 2},
    "amenities": {"all": ["beach_access", "patio_or_balcony", "pool", "free_parking_on_premises"]},
    "ttm_occupancy": {"gte": 0.70},
    "ttm_revenue": {"gte": 80000},
    "rating_overall": {"gte": 4.7},
    "instant_book": {"eq": true}
  },
  "sort": {
    "ttm_revenue": "desc",
    "ttm_occupancy": "desc"
  },
  "currency": "usd"
}

District-Level Search To find exceptional short-term rentals in the 18th Arrondissement of Paris with specific criteria:

{
  "market": {
    "country": "France",
    "region": "Ile-de-France",
    "locality": "Paris",
    "district": "18th Arrondissement"
  },
  "filter": {
    "superhost": {"eq": true},
    "rating_overall": {"gte": 4.9},
    "rating_cleanliness": {"gte": 4.95},
    "num_reviews": {"range": [50, 500]},
    "bedrooms": {"range": [1, 3]},
    "min_nights": {"lte": 3},
    "l90d_occupancy": {"gte": 0.75},
    "amenities": {"any": ["elevator", "air_conditioning"], "none": ["pets_allowed", "smoking_allowed"]}
  },
  "sort": {
    "rating_overall": "desc",
    "num_reviews": "desc",
    "l90d_revenue": "desc",
    "ttm_avg_rate": "asc"
  },
  "pagination": {
    "page_size": 10
  }
}

For Market Data

When querying for market data, the country, region, and locality fields are required. The district field is optional. Market analytics request bodies support filter, currency, and num_months. They do not support sort or pagination.

Locality-Level Market Search To analyze performance metrics for premium family-friendly listings in Paris:

{
  "market": {
    "country": "France",
    "region": "Ile-de-France",
    "locality": "Paris"
  },
  "filter": {
    "bedrooms": {"range": [2, 4]},
    "baths": {"gte": 1.5},
    "guests": {"range": [4, 8]},
    "amenities": {"all": ["kitchen", "washer", "wifi"], "any": ["crib", "high_chair", "childrens_books_and_toys"]},
    "ttm_revenue": {"gte": 50000},
    "rating_overall": {"gte": 4.7}
  },
  "num_months": 60,
  "currency": "usd"
}

District-Level Market Search To analyze luxury apartment performance in Manhattan's 10001 zip code:

{
  "market": {
    "country": "United States",
    "region": "New York",
    "locality": "New York",
    "district": "10001"
  },
  "filter": {
    "room_type": {"eq": "entire_home"},
    "bedrooms": {"gte": 2},
    "amenities": {"all": ["air_conditioning", "elevator", "wifi"], "any": ["pool", "gym", "sauna", "hot_tub"]},
    "ttm_avg_rate": {"gte": 400},
    "l90d_occupancy": {"range": [0.6, 0.95]},
    "cleaning_fee": {"lte": 300},
    "min_nights": {"range": [2, 7]}
  },
  "num_months": 24
}

Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq (Accepts 2-letter country code or full name)
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range

Allowed Values

room_type

  • entire_home
  • private_room
  • shared_room

amenities

  • air_conditioning
  • arcade_games
  • baby_bath
  • baby_monitor
  • baby_safety_gates
  • babysitter_recommendations
  • backyard
  • baking_sheet
  • bar
  • barbecue_utensils
  • bathtub
  • batting_cage
  • bbq_grill
  • beach_access
  • beach_essentials
  • bed_linens
  • bidet
  • bikes
  • blender
  • board_games
  • boat_slip
  • body_soap
  • books_and_reading_material
  • bowling_alley
  • bread_maker
  • breakfast
  • building_staff
  • cable_tv
  • carbon_monoxide_alarm
  • ceiling_fan
  • changing_table
  • childrens_bikes
  • childrens_books_and_toys
  • childrens_dinnerware
  • childrens_playroom
  • cleaning_before_checkout
  • cleaning_products
  • climbing_wall
  • clothing_storage
  • coffee
  • coffee_maker
  • conditioner
  • cooking_basics
  • crib
  • dedicated_workspace
  • dining_table
  • dishes_and_silverware
  • dishwasher
  • doorman
  • dryer
  • drying_rack_for_clothing
  • elevator
  • essentials
  • ethernet_connection
  • ev_charger
  • exercise_equipment
  • exterior_security_cameras_on_property
  • extra_pillows_and_blankets
  • fire_extinguisher
  • fire_pit
  • fireplace_guards
  • first_aid_kit
  • free_parking_on_premises
  • free_street_parking
  • freezer
  • game_console
  • garden_view
  • gated_property
  • gym
  • hair_dryer
  • hammock
  • hangers
  • heating
  • high_chair
  • hockey_rink
  • host_greets_you
  • hot_tub
  • hot_water
  • hot_water_kettle
  • indoor_fireplace
  • iron
  • kayak
  • keypad
  • kitchen
  • lake_access
  • laser_tag
  • laundromat_nearby
  • life_size_games
  • lock_on_bedroom_door
  • lockbox
  • long_term_stays_allowed
  • luggage_dropoff_allowed
  • microwave
  • mini_fridge
  • mini_golf
  • mosquito_net
  • movie_theater
  • noise_decibel_monitors_on_property
  • ocean_view
  • outdoor_dining_area
  • outdoor_furniture
  • outdoor_kitchen
  • outdoor_playground
  • outdoor_shower
  • outlet_covers
  • oven
  • pack_n_play_travel_crib
  • paid_parking_off_premises
  • paid_parking_on_premises
  • patio_or_balcony
  • pets_allowed
  • piano
  • ping_pong_table
  • pocket_wifi
  • pool
  • pool_table
  • pool_view
  • portable_fans
  • private_entrance
  • private_living_room
  • record_player
  • refrigerator
  • resort_access
  • rice_maker
  • river_view
  • room_darkening_shades
  • safe
  • sauna
  • security_system
  • self_check_in
  • shampoo
  • shower_gel
  • single_level_home
  • skate_ramp
  • ski_in_ski_out
  • smart_lock
  • smoke_alarm
  • smoking_allowed
  • sound_system
  • stove
  • sun_loungers
  • table_corner_guards
  • theme_room
  • toaster
  • trash_compactor
  • tv
  • washer
  • waterfront
  • wifi
  • window_guards
  • wine_glasses

Sorting

Sorting is supported on the /listings/search/* endpoints. Provide a sort object in the request body to order listing results. The sort object is a map of field names to sort directions (asc or desc). Order is preserved, with the first field having highest priority.

Example:

{
  "sort": {
    "ttm_revenue": "desc",
    "rating_overall": "desc",
    "num_reviews": "desc"
  }
}

Sortable Fields

Location

Field Type
latitude Numeric
longitude Numeric

Property Details

Field Type
baths Numeric
bedrooms Numeric
beds Numeric
guests Numeric
listing_id Numeric
listing_type String
min_nights Numeric
photos_count Numeric
room_type String
guest_favorite Boolean

Host

Field Type
host_id Numeric
host_name String
professional_management Boolean
superhost Boolean

Booking & Pricing

Field Type
cleaning_fee Numeric
extra_guest_fee Numeric
instant_book Boolean
short_stay_cleaning_fee Numeric

Ratings

Field Type
num_reviews Numeric
rating_accuracy Numeric
rating_checkin Numeric
rating_cleanliness Numeric
rating_communication Numeric
rating_location Numeric
rating_overall Numeric
rating_value Numeric

Performance Metrics (Last 90 Days)

Field Type
l90d_adjusted_occupancy Numeric
l90d_adjusted_revpar Numeric
l90d_avg_rate Numeric
l90d_avg_min_nights Numeric
l90d_avg_length_of_stay Numeric
l90d_available_days Numeric
l90d_days_booked Numeric
l90d_occupancy Numeric
l90d_revenue Numeric
l90d_revpar Numeric

Performance Metrics (Trailing Twelve Months)

Field Type
ttm_adjusted_occupancy Numeric
ttm_adjusted_revpar Numeric
ttm_avg_rate Numeric
ttm_avg_min_nights Numeric
ttm_avg_length_of_stay Numeric
ttm_available_days Numeric
ttm_days_booked Numeric
ttm_occupancy Numeric
ttm_revenue Numeric
ttm_revpar Numeric

Pagination

Pagination is controlled by the pagination object in the request body.

  • /listings/search/* defaults to page_size: 10 and offset: 0
  • /markets/summary and /markets/metrics/* do not use pagination; use num_months to control the time window for aggregated market analytics

Example:

{
  "pagination": {
    "page_size": 10,
    "offset": 20
  }
}

Listings

Access comprehensive Airbnb listings and vacation rental search capabilities through our property data API. Search and analyze short-term rental listing data across multiple markets to find investment opportunities and track competitor properties.

Retrieve Single Listing

Access our Airbnb property details API to retrieve comprehensive vacation rental listing data and STR property analytics for individual listing performance analysis. Get complete short-term rental property information using the listing's unique identifier.

Returns extensive property information including:

  • Property characteristics (bedrooms, bathrooms, amenities)
  • Host details and superhost status
  • Location data with coordinates
  • Pricing structure and fees
  • Guest reviews and ratings
  • Performance metrics (TTM and L90D) for vacation rental listing data
  • Availability and booking patterns for STR property analytics
query Parameters
listing_id
required
integer <int64>
Example: listing_id=43036533

Airbnb listing ID to fetch detailed information about a specific property.

currency
string
Default: "native"
Enum: "usd" "native"
Example: currency=usd

Currency for financial data conversion. Default: native currency. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

Responses

Request samples

curl -X GET "https://api.airroi.com/listings?listing_id=43036533&currency=native" \
  -H "x-api-key: your-airroi-api-key"

Response samples

Content type
application/json
{
  • "listing_info": {},
  • "host_info": {
    },
  • "location_info": {
    },
  • "property_details": {
    },
  • "booking_settings": {
    },
  • "pricing_info": {
    },
  • "ratings": {
    },
  • "performance_metrics": {
    }
}

Batch Retrieve Multiple Listings

Access our bulk Airbnb data API to fetch multiple vacation rental listings in a single request. This batch endpoint accepts up to 25 listing IDs and returns comprehensive property data for STR portfolio analysis, competitive intelligence, and market research. Perfect for property managers, real estate investors, and market analysts who need detailed listing information for multiple properties simultaneously.

Returns comprehensive listing details including property characteristics, host information, amenities, pricing data, guest reviews, and performance metrics (TTM and L90D). The API optimizes bulk data retrieval by processing up to 25 listings per request, ensuring efficient data access for vacation rental analytics. The response includes both successfully retrieved listings and error information for any listings that could not be found.

Request Body schema: application/json
required
required
Array of integers or strings [ 1 .. 25 ] items

List of Airbnb listing IDs to retrieve. Maximum 25 per request.

currency
string
Default: "native"
Enum: "usd" "native"

Optional currency for financial data conversion. If omitted, returns each listing's native currency. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

Responses

Request samples

Content type
application/json
{
  • "listing_ids": [
    ],
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "results": [
    ],
  • "errors": [
    ]
}

Get Comparable Listings

Find Airbnb comparable properties using our STR competitive analysis and vacation rental comps API. Our property benchmarking tool identifies similar short-term rental properties for accurate short-term rental market comparison based on location and property characteristics.

Specify location using either latitude/longitude coordinates or a physical address string (but not both).

query Parameters
latitude
number <double> [ -90 .. 90 ]
Example: latitude=34.052235

Property latitude for comparison. Required if address is not provided.

longitude
number <double> [ -180 .. 180 ]
Example: longitude=-118.243683

Property longitude for comparison. Required if address is not provided.

address
string
Example: address=123 Main St, Miami, FL

Physical address for comparison (e.g. "123 Main St, Miami, FL"). Use as an alternative to latitude/longitude. Cannot be combined with coordinates.

radius
number <double> [ 1 .. 10 ]
Default: 3
Example: radius=5

Search radius in miles for comparable listings. Default: 3 miles. Increase the radius in low-density areas (e.g. rural locations or large homes with few similar properties nearby) to find more comparables.

room_type
string
Enum: "entire_home" "private_room" "shared_room"
Example: room_type=entire_home

Restrict comparable listings to a single room type. By default all room types are searched. For whole-property comparisons, entire_home is recommended — it excludes private/shared rooms that can otherwise appear as weak comparables in low-density areas.

bedrooms
required
integer [ 0 .. 20 ]
Example: bedrooms=2

Number of bedrooms in subject property

baths
required
number <double> [ 0 .. 20 ]
Example: baths=2

Number of bathrooms in subject property (supports half baths as decimals)

guests
required
integer [ 1 .. 30 ]
Example: guests=4

Guest capacity of subject property

currency
string
Default: "native"
Enum: "usd" "native"
Example: currency=native

Currency for financial data in comparable listings. Default: each listing's native currency. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

Responses

Request samples

curl -X GET "https://api.airroi.com/listings/comparables?latitude=34.052235&longitude=-118.243683&bedrooms=2&baths=2.0&guests=4&currency=native" \
  -H "x-api-key: your-airroi-api-key"

Response samples

Content type
application/json
{
  • "listings": [
    ]
}

Search Listings by Market

Search Airbnb listings and vacation rental properties within any market worldwide using our comprehensive STR market search API. This endpoint enables location-based property discovery for short-term rental market analysis, competitive research, and investment opportunities. Filter listings by property type, amenities, pricing, and performance metrics to identify the best vacation rental opportunities in your target market.

Perfect for property managers, real estate investors, and market researchers analyzing Airbnb competition, market saturation, and revenue potential. Returns detailed listing data with performance metrics, enabling data-driven investment decisions in the short-term rental industry.

Request Body schema: application/json
required
object

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
object

A map of field names to sort directions. Order is preserved, with the first field having highest priority.

Example:

{
  "ttm_revenue": "desc",
  "rating_overall": "desc",
  "cleaning_fee": "asc"
}
View Sortable Fields

Location

Field Type
latitude Numeric
longitude Numeric

Property Details

Field Type
baths Numeric
bedrooms Numeric
beds Numeric
guests Numeric
listing_id Numeric
listing_type String
min_nights Numeric
photos_count Numeric
room_type String
guest_favorite Boolean

Host

Field Type
host_id Numeric
host_name String
professional_management Boolean
superhost Boolean

Booking & Pricing

Field Type
cleaning_fee Numeric
extra_guest_fee Numeric
instant_book Boolean
short_stay_cleaning_fee Numeric

Ratings

Field Type
num_reviews Numeric
rating_accuracy Numeric
rating_checkin Numeric
rating_cleanliness Numeric
rating_communication Numeric
rating_location Numeric
rating_overall Numeric
rating_value Numeric

Performance Metrics (Last 90 Days)

Field Type
l90d_adjusted_occupancy Numeric
l90d_adjusted_revpar Numeric
l90d_avg_rate Numeric
l90d_avg_min_nights Numeric
l90d_avg_length_of_stay Numeric
l90d_available_days Numeric
l90d_days_booked Numeric
l90d_occupancy Numeric
l90d_revenue Numeric
l90d_revpar Numeric

Performance Metrics (Trailing Twelve Months)

Field Type
ttm_adjusted_occupancy Numeric
ttm_adjusted_revpar Numeric
ttm_avg_rate Numeric
ttm_avg_min_nights Numeric
ttm_avg_length_of_stay Numeric
ttm_available_days Numeric
ttm_days_booked Numeric
ttm_occupancy Numeric
ttm_revenue Numeric
ttm_revpar Numeric
object

Pagination parameters for listing search requests.

currency
string
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

object (Market)

Internal representation of a geographic market used for encoding/decoding market identifiers.

Responses

Request samples

Content type
application/json
Example
{
  • "market": {
    },
  • "filter": {
    },
  • "sort": {
    },
  • "pagination": {
    },
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "pagination": {
    },
  • "results": [
    ]
}

Search Listings by Radius

Discover Airbnb listings and vacation rentals within a specific radius using our geospatial STR property search API. This proximity-based search endpoint finds all short-term rental properties within your defined distance from any location, perfect for competitive analysis, market research, and identifying investment opportunities near points of interest.

Ideal for analyzing vacation rental density around attractions, business districts, or specific addresses. Returns comprehensive listing data including property details, performance metrics, and location coordinates, enabling location-based market analysis and strategic property investment decisions.

Request Body schema: application/json
required
object

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
object

A map of field names to sort directions. Order is preserved, with the first field having highest priority.

Example:

{
  "ttm_revenue": "desc",
  "rating_overall": "desc",
  "cleaning_fee": "asc"
}
View Sortable Fields

Location

Field Type
latitude Numeric
longitude Numeric

Property Details

Field Type
baths Numeric
bedrooms Numeric
beds Numeric
guests Numeric
listing_id Numeric
listing_type String
min_nights Numeric
photos_count Numeric
room_type String
guest_favorite Boolean

Host

Field Type
host_id Numeric
host_name String
professional_management Boolean
superhost Boolean

Booking & Pricing

Field Type
cleaning_fee Numeric
extra_guest_fee Numeric
instant_book Boolean
short_stay_cleaning_fee Numeric

Ratings

Field Type
num_reviews Numeric
rating_accuracy Numeric
rating_checkin Numeric
rating_cleanliness Numeric
rating_communication Numeric
rating_location Numeric
rating_overall Numeric
rating_value Numeric

Performance Metrics (Last 90 Days)

Field Type
l90d_adjusted_occupancy Numeric
l90d_adjusted_revpar Numeric
l90d_avg_rate Numeric
l90d_avg_min_nights Numeric
l90d_avg_length_of_stay Numeric
l90d_available_days Numeric
l90d_days_booked Numeric
l90d_occupancy Numeric
l90d_revenue Numeric
l90d_revpar Numeric

Performance Metrics (Trailing Twelve Months)

Field Type
ttm_adjusted_occupancy Numeric
ttm_adjusted_revpar Numeric
ttm_avg_rate Numeric
ttm_avg_min_nights Numeric
ttm_avg_length_of_stay Numeric
ttm_available_days Numeric
ttm_days_booked Numeric
ttm_occupancy Numeric
ttm_revenue Numeric
ttm_revpar Numeric
object

Pagination parameters for listing search requests.

currency
string
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

latitude
required
number <double> [ -90 .. 90 ]
longitude
required
number <double> [ -180 .. 180 ]
radius_miles
number <double> [ 1 .. 100 ]
Default: 3

Responses

Request samples

Content type
application/json
Example
{
  • "latitude": 40.758,
  • "longitude": -73.9855,
  • "radius_miles": 2,
  • "filter": {
    },
  • "sort": {
    },
  • "pagination": {
    },
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "pagination": {
    },
  • "results": [
    ]
}

Search Listings by Polygon

Search Airbnb listings within custom geographic boundaries using our polygon-based vacation rental search API. This advanced geospatial endpoint enables precise market analysis by finding all short-term rental properties within your defined area - perfect for neighborhood analysis, district comparisons, or custom market boundaries that don't align with standard administrative regions.

Essential for sophisticated market research, zoning analysis, and targeted investment strategies. Define complex search areas using multiple coordinate points to analyze vacation rental distribution, market saturation, and revenue potential in specific neighborhoods or custom-defined regions. Returns detailed listing data with performance metrics for all properties within your polygon.

Request Body schema: application/json
required
object

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
object

A map of field names to sort directions. Order is preserved, with the first field having highest priority.

Example:

{
  "ttm_revenue": "desc",
  "rating_overall": "desc",
  "cleaning_fee": "asc"
}
View Sortable Fields

Location

Field Type
latitude Numeric
longitude Numeric

Property Details

Field Type
baths Numeric
bedrooms Numeric
beds Numeric
guests Numeric
listing_id Numeric
listing_type String
min_nights Numeric
photos_count Numeric
room_type String
guest_favorite Boolean

Host

Field Type
host_id Numeric
host_name String
professional_management Boolean
superhost Boolean

Booking & Pricing

Field Type
cleaning_fee Numeric
extra_guest_fee Numeric
instant_book Boolean
short_stay_cleaning_fee Numeric

Ratings

Field Type
num_reviews Numeric
rating_accuracy Numeric
rating_checkin Numeric
rating_cleanliness Numeric
rating_communication Numeric
rating_location Numeric
rating_overall Numeric
rating_value Numeric

Performance Metrics (Last 90 Days)

Field Type
l90d_adjusted_occupancy Numeric
l90d_adjusted_revpar Numeric
l90d_avg_rate Numeric
l90d_avg_min_nights Numeric
l90d_avg_length_of_stay Numeric
l90d_available_days Numeric
l90d_days_booked Numeric
l90d_occupancy Numeric
l90d_revenue Numeric
l90d_revpar Numeric

Performance Metrics (Trailing Twelve Months)

Field Type
ttm_adjusted_occupancy Numeric
ttm_adjusted_revpar Numeric
ttm_avg_rate Numeric
ttm_avg_min_nights Numeric
ttm_avg_length_of_stay Numeric
ttm_available_days Numeric
ttm_days_booked Numeric
ttm_occupancy Numeric
ttm_revenue Numeric
ttm_revpar Numeric
object

Pagination parameters for listing search requests.

currency
string
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

required
Array of objects (PolygonCoordinate) [ 3 .. 1000 ] items

Responses

Request samples

Content type
application/json
Example
{
  • "polygon": [
    ],
  • "filter": {
    },
  • "sort": {
    },
  • "pagination": {
    },
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "pagination": {
    },
  • "results": [
    ]
}

Get Listing Metrics

Access comprehensive historical performance data and time-series analytics for any Airbnb listing with our vacation rental metrics API. This endpoint delivers up to 60 months of detailed performance history including occupancy rates, average daily rates (ADR), revenue, and booking patterns. Essential for understanding seasonal trends, year-over-year growth, and long-term property performance in the short-term rental market.

Track key performance indicators over time to identify booking trends, optimize pricing strategies, and forecast future performance. Perfect for property managers monitoring portfolio performance, investors evaluating acquisition targets, and analysts studying vacation rental market dynamics. Returns monthly aggregated data with revenue metrics, occupancy trends, and pricing evolution.

query Parameters
listing_id
required
integer <int64>

The ID of the listing to retrieve metrics for.

currency
string
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

num_months
integer [ 1 .. 60 ]
Default: 12

The number of months of data to return.

Responses

Request samples

curl -X GET "https://api.airroi.com/listings/metrics/all?listing_id=43036533&currency=native&num_months=12" \
  -H "x-api-key: your-airroi-api-key"

Response samples

Content type
application/json
{
  • "results": [
    ]
}

Get Listing Future Rates Deprecated

Deprecated. Use Get Live Calendar instead. It returns the same nightly data (in a results array instead of rates) plus the listing's cleaning fees, which this endpoint doesn't return: cleaning_fee, and short_stay_cleaning_fee for stays of 1–2 nights.

Returns a listing's nightly rates, availability and minimum stays for the next 12 months.

  • rate is the nightly rate, excluding the cleaning fee.
  • available: false covers both booked and host-blocked nights.
query Parameters
listing_id
required
integer <int64>

The ID of the listing to retrieve future rates for.

currency
string
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

Responses

Request samples

curl -X GET "https://api.airroi.com/listings/future/rates?listing_id=43036533&currency=native" \
  -H "x-api-key: your-airroi-api-key"

Response samples

Content type
application/json
{
  • "currency": "USD",
  • "rates": [
    ]
}

Get Live Calendar

Returns a listing's nightly rates, availability and minimum stays for the next 12 months.

  • rate is the nightly rate, excluding the cleaning fee.
  • cleaning_fee is the cleaning fee set by the host.
  • short_stay_cleaning_fee is the cleaning fee the host set for stays of 1–2 nights. It equals cleaning_fee when the host has one fee.
  • available: false covers both booked and host-blocked nights.
  • currency=native returns the listing's local currency; usd returns US dollars.
query Parameters
listing_id
required
integer <int64> >= 1
Example: listing_id=43036533

Airbnb listing ID.

currency
string
Default: "native"
Enum: "native" "usd"

native returns rates in the local currency of the listing's country (for example EUR in France or JPY in Japan). usd returns US dollars.

Responses

Request samples

curl -X GET "https://api.airroi.com/listings/live/calendar?listing_id=43036533&currency=native" \
  -H "x-api-key: your-airroi-api-key"

Response samples

Content type
application/json
{
  • "currency": "EUR",
  • "cleaning_fee": 60,
  • "short_stay_cleaning_fee": 45,
  • "results": [
    ]
}

Get Live Rates

Returns a listing's nightly rates for the next 12 months.

  • rate is the nightly rate, excluding the cleaning fee.
  • currency=native returns the listing's local currency; usd returns US dollars.
query Parameters
listing_id
required
integer <int64> >= 1
Example: listing_id=43036533

Airbnb listing ID.

currency
string
Default: "native"
Enum: "native" "usd"

native returns rates in the local currency of the listing's country (for example EUR in France or JPY in Japan). usd returns US dollars.

Responses

Request samples

curl -X GET "https://api.airroi.com/listings/live/rates?listing_id=43036533&currency=usd" \
  -H "x-api-key: your-airroi-api-key"

Response samples

Content type
application/json
{
  • "currency": "EUR",
  • "results": [
    ]
}

Get Live Availability

Returns a listing's nightly availability and stay rules for the next 12 months.

  • available: false covers both booked and host-blocked nights.
  • min_nights and max_nights limit the length of a stay starting on that date.
  • available_for_checkin and available_for_checkout say whether guests can arrive or leave on that date.
  • Stay rules are null when unknown.
query Parameters
listing_id
required
integer <int64> >= 1
Example: listing_id=43036533

Airbnb listing ID.

Responses

Request samples

curl -X GET "https://api.airroi.com/listings/live/availability?listing_id=43036533" \
  -H "x-api-key: your-airroi-api-key"

Response samples

Content type
application/json
{
  • "results": [
    ]
}

Get Live Search Ranking

Returns listing search rankings for an area, up to 270 listing IDs ordered by rank.

Request Body schema: application/json
required
required
object (Bounds)

A latitude/longitude rectangle in WGS84 degrees.

  • south must be less than north, and west less than east.
  • Latitudes must be between -85 and 85.
  • The rectangle can't cross the antimeridian (±180° longitude).
  • The area can be at most 10,000 km², and neither side can be longer than 200 km.

Responses

Request samples

Content type
application/json
{
  • "bounds": {
    }
}

Response samples

Content type
application/json
{
  • "count": 3,
  • "results": [
    ]
}

Scan Live Listings

Returns the Airbnb listing IDs inside a polygon, up to 100 per page, in no particular order.

Pagination

Send the first request without a cursor, then repeat it with pagination.cursor set to the previous next_cursor until next_cursor is null. A page can be short or empty before the scan ends.

  • Keep the same polygon and API key on every page.
  • To retry a failed page, resend the same cursor.
  • Cursors expire 24 hours after the first request.

Notes

  • IDs are unique within a scan, not across separate scans.
  • Listings are matched by their approximate location on Airbnb's map.
  • A scan returns at most 100,000 IDs. If the area is too large or dense, you get a 422; split it into smaller areas.
header Parameters
x-api-key
required
string

Your API key. Every page of a scan must use the same key as the first request.

Request Body schema: application/json
required
required
Array of objects (ScanPolygon) [ 3 .. 1000 ] items

The area to scan, as an ordered list of {latitude, longitude} points.

  • Use 3 to 1,000 points. The shape is closed for you, so repeating the first point is optional.
  • Edges can't cross each other, and holes aren't supported.
  • Latitudes must be between -85 and 85.
  • The polygon's bounding rectangle can be at most 10,000 km², with no side longer than 200 km.
object

Responses

Request samples

Content type
application/json
Example
{
  • "polygon": [
    ],
  • "pagination": {
    }
}

Response samples

Content type
application/json
Example
{
  • "results": [
    ],
  • "pagination": {
    }
}

Markets

Analyze STR market analysis data including rental market data, occupancy rates, and ADR trends. Get insights into short-term rental market trends, historical performance metrics, and future market outlook to make informed investment decisions.

Find Market by Name

Search for Airbnb market data and vacation rental market information using our comprehensive STR market identifier lookup. Find short-term rental location data by searching with city names, neighborhoods, states, or countries to discover holiday rental market opportunities. The endpoint supports partial matching, making it ideal for building autocomplete and typeahead functionality in location search interfaces.

Returns matching markets with their unique base64-encoded market IDs, active listing counts, and local currency information. Use the returned market ID for accessing historical performance data and future projections through our vacation rental market lookup system.

query Parameters
query
required
string non-empty
Example: query=Paris

Location search query for typeahead functionality. Start typing any location - from districts to entire countries. Examples:

  • Countries: "Mex" → Mexico, "Jap" → Japan, "Port" → Portugal
  • Regions: "Calif" → California, "Tusc" → Tuscany, "Bav" → Bavaria
  • Localities: "Tok" → Tokyo, "Aus" → Austin, "Bar" → Barcelona
  • Districts: "Willi" → Williamsburg, "Soho", "Mission District"
  • Tourist areas: "French Riv" → French Riviera, "Costa" → Costa Rica/Costa del Sol

Responses

Request samples

curl -X GET "https://api.airroi.com/markets/search?query=Paris" \
  -H "x-api-key: your-airroi-api-key"

Response samples

Content type
application/json
{
  • "entries": [
    ]
}

Find Market by Coordinates

Convert coordinates to market ID using our latitude longitude market lookup system. This STR geographic resolver finds the nearest short-term rental listing to the provided coordinates and returns the associated market ID for vacation rental location analysis.

Our Airbnb market geocoding tool is perfect for converting property locations into market identifiers for further analysis. Returns a base64-encoded market ID that can be used with other market endpoints as a vacation rental location finder.

query Parameters
lat
required
number <double> [ -90 .. 90 ]
Example: lat=48.8566

Latitude coordinate (-90 to 90)

lng
required
number <double> [ -180 .. 180 ]
Example: lng=2.3522

Longitude coordinate (-180 to 180)

Responses

Request samples

curl -X GET "https://api.airroi.com/markets/lookup?lat=48.8566&lng=2.3522" \
  -H "x-api-key: your-airroi-api-key"

Response samples

Content type
application/json
{
  • "full_name": "string",
  • "country": "string",
  • "region": "string",
  • "locality": "string",
  • "district": "string"
}

Get Market Summary

Get a comprehensive vacation rental market overview with key performance indicators for any Airbnb market worldwide. This endpoint provides essential market summary statistics including occupancy rates, average daily rates (ADR), revenue metrics, and minimum stay requirements for short-term rental market analysis. Perfect for quick market assessments, investment decisions, and competitive benchmarking in the vacation rental industry.

Returns aggregated market performance data to help property managers, real estate investors, and market analysts understand market dynamics at a glance.

Request Body schema: application/json
required
required
object (Market)

Internal representation of a geographic market used for encoding/decoding market identifiers.

object (filter)

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
currency
string (currency)
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

num_months
integer [ 0 .. 60 ]
Default: 12

The number of months of historical data to retrieve for time-series queries.

Responses

Request samples

Content type
application/json
Example
{
  • "market": {
    },
  • "num_months": 12,
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "market": {
    },
  • "occupancy": 0.72,
  • "average_daily_rate": 285.5,
  • "rev_par": 205.56,
  • "revenue": 125000,
  • "booking_lead_time": 42.5,
  • "length_of_stay": 3.8,
  • "min_nights": 3.2,
  • "active_listings_count": 2458
}

Get Market All Metrics

Access comprehensive vacation rental market analytics with all available performance metrics for any Airbnb market worldwide. This endpoint delivers a complete market overview including occupancy rates, average daily rates (ADR), RevPAR, revenue trends, booking patterns, minimum stay requirements, and active listing counts. Essential for market research, investment analysis, and competitive benchmarking in the short-term rental industry.

Returns historical market performance data with daily, monthly, and trailing twelve months (TTM) aggregations, enabling deep market analysis and trend identification for vacation rental markets.

Request Body schema: application/json
required
required
object (Market)

Internal representation of a geographic market used for encoding/decoding market identifiers.

object (filter)

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
currency
string (currency)
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

num_months
integer [ 0 .. 60 ]
Default: 12

The number of months of historical data to retrieve for time-series queries.

Responses

Request samples

Content type
application/json
Example
{
  • "market": {
    },
  • "filter": {
    },
  • "num_months": 12,
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "market": {
    },
  • "results": [
    ]
}

Get Market Occupancy

Track vacation rental occupancy rates and booking patterns for any Airbnb market with detailed time-series data. This endpoint delivers historical occupancy percentages showing how often short-term rentals are booked in your target market. Essential for understanding market demand, seasonal trends, and booking dynamics in the vacation rental industry.

Returns daily, monthly, and aggregated occupancy data to help optimize pricing strategies, identify peak seasons, and forecast market performance for short-term rental investments.

Request Body schema: application/json
required
required
object (Market)

Internal representation of a geographic market used for encoding/decoding market identifiers.

object (filter)

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
currency
string (currency)
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

num_months
integer [ 0 .. 60 ]
Default: 12

The number of months of historical data to retrieve for time-series queries.

Responses

Request samples

Content type
application/json
Example
{
  • "market": {
    },
  • "filter": {
    },
  • "num_months": 12,
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "market": {
    },
  • "results": [
    ]
}

Get Market Average Daily Rate

Access Airbnb pricing trends and average daily rate (ADR) analytics for vacation rental markets worldwide. This endpoint provides comprehensive pricing data showing what guests pay per night in your target market. Critical for revenue management, competitive pricing analysis, and understanding market rate dynamics in the short-term rental industry.

Returns historical ADR time-series data with daily, monthly, and seasonal trends to help property managers optimize pricing strategies and maximize rental income.

Request Body schema: application/json
required
required
object (Market)

Internal representation of a geographic market used for encoding/decoding market identifiers.

object (filter)

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
currency
string (currency)
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

num_months
integer [ 0 .. 60 ]
Default: 12

The number of months of historical data to retrieve for time-series queries.

Responses

Request samples

Content type
application/json
Example
{
  • "market": {
    },
  • "filter": {
    },
  • "num_months": 12,
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "market": {
    },
  • "results": [
    ]
}

Get Market RevPAR

Analyze vacation rental revenue per available rental (RevPAR) metrics for comprehensive market performance insights. This endpoint combines occupancy and pricing data to show the average revenue generated per available listing in any Airbnb market. Essential for investment analysis, portfolio optimization, and understanding true market earning potential in the short-term rental sector.

Returns RevPAR time-series data that helps investors and property managers evaluate market profitability, compare investment opportunities, and track revenue performance trends.

Request Body schema: application/json
required
required
object (Market)

Internal representation of a geographic market used for encoding/decoding market identifiers.

object (filter)

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
currency
string (currency)
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

num_months
integer [ 0 .. 60 ]
Default: 12

The number of months of historical data to retrieve for time-series queries.

Responses

Request samples

Content type
application/json
Example
{
  • "market": {
    },
  • "filter": {
    },
  • "num_months": 12,
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "market": {
    },
  • "results": [
    ]
}

Get Market Revenue

Access comprehensive vacation rental revenue analytics showing total market earnings and income trends for any Airbnb market. This endpoint provides aggregated revenue data demonstrating the overall market size and earning potential for short-term rentals. Valuable for market sizing, investment planning, and understanding the economic impact of vacation rentals in specific locations.

Returns historical revenue time-series data with seasonal patterns and growth trends to support market analysis and investment decisions in the short-term rental industry.

Request Body schema: application/json
required
required
object (Market)

Internal representation of a geographic market used for encoding/decoding market identifiers.

object (filter)

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
currency
string (currency)
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

num_months
integer [ 0 .. 60 ]
Default: 12

The number of months of historical data to retrieve for time-series queries.

Responses

Request samples

Content type
application/json
Example
{
  • "market": {
    },
  • "filter": {
    },
  • "num_months": 24,
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "market": {
    },
  • "results": [
    ]
}

Get Market Booking Lead Time

Understand guest booking behavior with detailed booking lead time analytics for vacation rental markets. This endpoint reveals how far in advance guests typically book short-term rentals in your target market. Critical for revenue management, marketing timing, and inventory planning in the Airbnb ecosystem.

Returns booking lead time patterns showing the average days between booking and check-in, helping property managers optimize availability calendars, adjust pricing strategies, and plan marketing campaigns.

Request Body schema: application/json
required
required
object (Market)

Internal representation of a geographic market used for encoding/decoding market identifiers.

object (filter)

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
currency
string (currency)
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

num_months
integer [ 0 .. 60 ]
Default: 12

The number of months of historical data to retrieve for time-series queries.

Responses

Request samples

Content type
application/json
Example
{
  • "market": {
    },
  • "filter": {
    },
  • "num_months": 12,
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "market": {
    },
  • "results": [
    ]
}

Get Market Length of Stay

Analyze guest stay duration patterns and average length of stay metrics for vacation rental markets worldwide. This endpoint provides insights into typical booking durations, helping understand whether markets cater to short weekend trips or extended stays. Essential for property setup, amenity planning, and pricing strategy optimization in the short-term rental industry.

Returns length of stay distribution data showing average nights per booking, enabling property managers to tailor their offerings and minimum stay requirements to match market demand.

Request Body schema: application/json
required
required
object (Market)

Internal representation of a geographic market used for encoding/decoding market identifiers.

object (filter)

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
currency
string (currency)
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

num_months
integer [ 0 .. 60 ]
Default: 12

The number of months of historical data to retrieve for time-series queries.

Responses

Request samples

Content type
application/json
Example
{
  • "market": {
    },
  • "filter": {
    },
  • "num_months": 12,
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "market": {
    },
  • "results": [
    ]
}

Get Market Min Nights

Analyze average minimum stay requirements for vacation rental markets worldwide. This endpoint shows how restrictive a market is by month, helping operators understand whether a market is optimized for short getaways or longer stays. Essential for competitive positioning, stay-rule benchmarking, and aligning listing policies with local demand.

Returns monthly minimum-stay distributions so property managers and investors can compare their stay rules against prevailing market behavior.

Request Body schema: application/json
required
required
object (Market)

Internal representation of a geographic market used for encoding/decoding market identifiers.

object (filter)

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
currency
string (currency)
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

num_months
integer [ 0 .. 60 ]
Default: 12

The number of months of historical data to retrieve for time-series queries.

Responses

Request samples

Content type
application/json
Example
{
  • "market": {
    },
  • "filter": {
    },
  • "num_months": 12,
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "market": {
    },
  • "results": [
    ]
}

Get Market Active Listings Count

Monitor vacation rental market supply and competition levels with active listing counts for any Airbnb market. This endpoint tracks the total number of available short-term rentals, providing crucial supply-side intelligence for market analysis. Essential for understanding market saturation, competitive landscape, and growth opportunities in the vacation rental sector.

Returns current and historical active listing counts to help investors assess market competition, identify emerging markets, and track supply growth trends over time.

Request Body schema: application/json
required
required
object (Market)

Internal representation of a geographic market used for encoding/decoding market identifiers.

object (filter)

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
currency
string (currency)
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

num_months
integer [ 0 .. 60 ]
Default: 12

The number of months of historical data to retrieve for time-series queries.

Responses

Request samples

Content type
application/json
Example
{
  • "market": {
    },
  • "filter": {
    },
  • "num_months": 12,
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "market": {
    },
  • "results": [
    ]
}

Get Market Future Pacing

Forecast vacation rental market performance with forward-looking pacing data and booking trends for Airbnb markets. This endpoint provides visibility into future occupancy and demand patterns based on current bookings on the books. Critical for revenue forecasting, seasonal planning, and proactive market strategy in the short-term rental industry.

Returns future pacing metrics showing booked occupancy rates for upcoming periods, helping property managers and investors anticipate market demand and adjust strategies accordingly.

Request Body schema: application/json
required
required
object (Market)

Internal representation of a geographic market used for encoding/decoding market identifiers.

object (filter)

A filter object where each field maps to its condition(s). Multiple filters are ANDed together.

For most fields, each field condition must contain exactly one operator.

The amenities field is the exception. It may combine all, any, and none in the same object:

  • all: the listing must include every amenity in the list
  • any: the listing must include at least one amenity in the list
  • none: the listing must include none of the amenities in the list

If you provide more than one of these operators, the listing must satisfy all of them.

Available Operators:

  • eq: Exact match
  • gt, gte, lt, lte: Numeric comparisons
  • range: Two-value array [min, max]
  • any: Match any value in list
  • all: Match all values in list
  • none: Match none of the values in list

Example:

{
  "bedrooms": { "gte": 2 },
  "amenities": {
    "all": ["wifi", "kitchen"],
    "any": ["pool", "hot_tub"],
    "none": ["smoking_allowed"]
  },
  "ttm_revenue": { "gt": 50000 },
  "superhost": { "eq": true }
}

This means the listing must have wifi and kitchen, must have pool or hot_tub, and must not have smoking_allowed.

View Filterable Fields

Location

Field Type Operators
latitude Numeric eq, lt, lte, gt, gte, range
longitude Numeric eq, lt, lte, gt, gte, range
country String eq
region String eq
locality String eq
district String eq
exact_location Boolean eq

Property Details

Field Type Operators
amenities List any, all, none (can be combined on the same field)
baths Numeric eq, lt, lte, gt, gte, range
bedrooms Numeric eq, lt, lte, gt, gte, range
beds Numeric eq, lt, lte, gt, gte, range
guests Numeric eq, lt, lte, gt, gte, range
listing_id Numeric eq, lt, lte, gt, gte, range
listing_type String eq
min_nights Numeric eq, lt, lte, gt, gte, range
photos_count Numeric eq, lt, lte, gt, gte, range
room_type String eq
guest_favorite Boolean eq

Host

Field Type Operators
cohost_ids List any, all, none
cohost_names List any, all, none
host_id Numeric eq, lt, lte, gt, gte, range
host_name String eq
professional_management Boolean eq
superhost Boolean eq

Booking & Pricing

Field Type Operators
cleaning_fee Numeric eq, lt, lte, gt, gte, range
extra_guest_fee Numeric eq, lt, lte, gt, gte, range
instant_book Boolean eq
short_stay_cleaning_fee Numeric eq, lt, lte, gt, gte, range
single_fee_structure Boolean eq

Ratings

Field Type Operators
num_reviews Numeric eq, lt, lte, gt, gte, range
rating_accuracy Numeric eq, lt, lte, gt, gte, range
rating_checkin Numeric eq, lt, lte, gt, gte, range
rating_cleanliness Numeric eq, lt, lte, gt, gte, range
rating_communication Numeric eq, lt, lte, gt, gte, range
rating_location Numeric eq, lt, lte, gt, gte, range
rating_overall Numeric eq, lt, lte, gt, gte, range
rating_value Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Last 90 Days)

Field Type Operators
l90d_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
l90d_avg_rate Numeric eq, lt, lte, gt, gte, range
l90d_avg_min_nights Numeric eq, lt, lte, gt, gte, range
l90d_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
l90d_available_days Numeric eq, lt, lte, gt, gte, range
l90d_days_booked Numeric eq, lt, lte, gt, gte, range
l90d_occupancy Numeric eq, lt, lte, gt, gte, range
l90d_revenue Numeric eq, lt, lte, gt, gte, range
l90d_revpar Numeric eq, lt, lte, gt, gte, range

Performance Metrics (Trailing Twelve Months)

Field Type Operators
ttm_adjusted_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_adjusted_revpar Numeric eq, lt, lte, gt, gte, range
ttm_avg_rate Numeric eq, lt, lte, gt, gte, range
ttm_avg_min_nights Numeric eq, lt, lte, gt, gte, range
ttm_avg_length_of_stay Numeric eq, lt, lte, gt, gte, range
ttm_available_days Numeric eq, lt, lte, gt, gte, range
ttm_days_booked Numeric eq, lt, lte, gt, gte, range
ttm_occupancy Numeric eq, lt, lte, gt, gte, range
ttm_revenue Numeric eq, lt, lte, gt, gte, range
ttm_revpar Numeric eq, lt, lte, gt, gte, range
currency
string (currency)
Default: "native"
Enum: "usd" "native"

Currency for financial data conversion. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

num_months
integer [ 0 .. 60 ]
Default: 12

The number of months of historical data to retrieve for time-series queries.

Responses

Request samples

Content type
application/json
Example
{
  • "market": {
    },
  • "filter": {
    },
  • "num_months": 6,
  • "currency": "native"
}

Response samples

Content type
application/json
{
  • "market": {
    },
  • "results": [
    ]
}

Calculator

Calculate accurate Airbnb revenue projections using our rental property valuation and investment analysis tools. Generate property revenue estimates and performance projections based on real market data and competitive insights.

Estimate Listing Revenue Potential

Use our Airbnb revenue calculator and vacation rental income estimator to generate comprehensive STR profit projections for potential short-term rental properties. This powerful short-term rental ROI calculator serves as your complete property investment analysis tool based on location and property characteristics.

Location Input: Specify the property location using either geographic coordinates (lat + lng) or a physical address. These are mutually exclusive — provide one or the other, not both.

Our vacation rental income estimator analyzes comparable properties in the area to provide:

  • Projected annual occupancy rate using STR profit projection models
  • Expected Average Daily Rate (ADR) from our Airbnb revenue calculator
  • Monthly revenue distribution across the year
  • Full percentile breakdown (p25, p50, p75, p90) for revenue, ADR, and occupancy
  • A list of comparable listings used to generate the estimate

The response includes root-level average values for quick access, plus a percentiles object with full statistical breakdown (p25, p50, p75, p90) for detailed analysis. A location object with the resolved latitude and longitude is always included in the response.

query Parameters
lat
number <double> [ -90 .. 90 ]
Example: lat=34.052235

Property latitude for revenue estimation. Required if address is not provided. Mutually exclusive with address.

lng
number <double> [ -180 .. 180 ]
Example: lng=-118.243683

Property longitude for revenue estimation. Required if address is not provided. Mutually exclusive with address.

address
string
Example: address=1234 Ocean Drive, Miami Beach, FL 33139

Physical address of the property for revenue estimation. The address is geocoded to latitude/longitude coordinates using Google Geocoding API. Required if lat and lng are not provided. Mutually exclusive with lat/lng.

radius
number <double> [ 1 .. 10 ]
Default: 3
Example: radius=5

Search radius in miles for comparable listings. Default: 3 miles. Increase the radius in low-density areas (e.g. rural locations or large homes with few similar properties nearby) to find more comparables.

room_type
string
Enum: "entire_home" "private_room" "shared_room"
Example: room_type=entire_home

Restrict comparable listings to a single room type. By default all room types are searched. For whole-property revenue estimates, entire_home is recommended — it excludes private/shared rooms that can otherwise appear as weak comparables in low-density areas.

bedrooms
required
integer [ 0 .. 20 ]
Example: bedrooms=2

Number of bedrooms (use 0 for studios)

baths
required
number <double> [ 0.5 .. 20 ]
Example: baths=2

Number of bathrooms (supports decimals for half baths)

guests
required
integer [ 1 .. 30 ]
Example: guests=4

Maximum guest capacity

currency
string
Default: "native"
Enum: "usd" "native"
Example: currency=usd

Currency for financial data conversion. Default: native currency. Allowed currency values are 'usd' (US Dollars) or 'native' (local currency). For example, 'native' automatically uses EUR in France, JPY in Japan, or BRL in Brazil etc.

Responses

Request samples

curl -X GET "https://api.airroi.com/calculator/estimate?lat=34.052235&lng=-118.243683&bedrooms=2&baths=2.0&guests=4&currency=native" \
  -H "x-api-key: your-airroi-api-key"

Response samples

Content type
application/json
{
  • "location": {
    },
  • "revenue": 50000,
  • "average_daily_rate": 200,
  • "occupancy": 0.68,
  • "percentiles": {
    },
  • "currency": "USD",
  • "monthly_revenue_distributions": [
    ],
  • "comparable_listings": [
    ]
}

Price Recommendation

Estimate a property's base price, then calculate calendar prices with optional rules and limits. You can also supply your own base price. Both endpoints return itemized explanations; neither stores settings nor publishes rates.

How it fits your stack

AirROI recommends prices. Your property management system (PMS) or channel manager is what actually sets them on Airbnb, Booking.com, Vrbo and the other OTAs. A typical integration runs in three steps, once a day or whenever a booking changes the calendar.

Your PMS or channel manager sends calendar state to AirROI, gets price recommendations back, and pushes the rates to the OTAs AirROI API price recommendation Your PMS / channel manager Airbnb Booking.com Vrbo 1 · calendar state 2 · price recommendations 3 · push rates 1 Calendar state your PMS or channel manager sends reservations and availability 2 Price recommendations AirROI returns a suggested price for every night, with the reasons 3 Push rates your PMS or channel manager writes the rates to the OTAs
Your PMS or channel manager sends calendar state to AirROI, gets price recommendations back, and pushes the rates to the OTAs.
  1. Calendar state. Your PMS or channel manager calls POST /price-recommendation/calendar-prices with the property, its base price, the current calendar (reserved, available and blocked nights) and the pricing rules you want applied.
  2. Price recommendations. AirROI returns a recommended price for every night in the horizon, each with an itemized explanation of how it was calculated.
  3. Push rates. Your PMS or channel manager writes those prices to the OTAs through its existing channel connections. AirROI never connects to an OTA on your behalf.

Start with POST /price-recommendation/base-price if you do not have a base price yet; it estimates one from comparable listings in the market.

Recommend a Base Price

Estimate a property's year-round nightly starting price, before date-specific adjustments, fees, and taxes. Nothing is saved or published.

Property details

Provide the property's coordinates, bedroom and bathroom counts, and guest capacity. Optional details—such as amenities, reviews, and cleaning fees—can refine the estimate. Leave out details you do not know.

Understanding the estimate

The response includes a balanced recommendation, conservative and aggressive alternatives, a typical local price range, and an itemized explanation. The range is context, not a price limit or a guarantee.

Use the recommendation and its returned currency with Recommend Calendar Prices to calculate nightly rates for individual dates. Amounts are whole currency units, not cents. Currency defaults to USD, including when an unrecognized code is supplied, so check the returned currency.

Errors

Error bodies from this endpoint are simpler than those of Calendar Prices: a flat code and message object on 400, and an errors list on 422, with no error envelope and no request_id field. The X-Request-ID header is still returned; quote it when contacting support.

For deeper context and examples, see choosing a base price.

Request Body schema: application/json
required
required
object (Property location)

Property coordinates used to find pricing data. Where local data is unavailable, the estimate falls back to broader regional or global data.

required
object (Property details)

Bedrooms, bathrooms, and guest capacity are required. Optional fields refine the estimate when supported by the current model. Omission means unknown.

currency
string or null = 3 characters ^[A-Za-z]{3}$
Default: "USD"

Currency for cleaning_fee and all returned amounts. Accepts either case; omitted, null, or unrecognized codes resolve to USD. Check the response currency before using the recommendation.

Responses

Request samples

Content type
application/json
Example

Coordinates, bedrooms, bathrooms and guest capacity. Enough for a recommendation.

{
  • "location": {
    },
  • "property": {
    },
  • "currency": "USD"
}

Response samples

Content type
application/json

Illustrative result for the required-fields request. The explanation amounts sum to 200; actual prices depend on the property and current model.

{
  • "location": {
    },
  • "currency": "USD",
  • "recommended_base_price": 200,
  • "price_options": {
    },
  • "typical_market_range": {
    },
  • "explanation": [
    ]
}

Recommend Calendar Prices

Calculate nightly prices from a base price, automatically accounting for seasonality, weekdays, holidays/events, and market demand. Optional rules let you tailor the result. Nothing is saved or published; send your settings with each request.

Every example below is a real response for a 200 USD base price in Nashville, Tennessee, calculated on Mon Sep 14, 2026 (America/Chicago). Dates in the snippets are relative to that day; replace them with your own. Each example turns on only the rule it explains, and the price strip shows the night's price without the rule → with the rule.

How a night is priced

Every night goes through the same seven stages, in this order. Each stage adds its lines to that night's explanation, and the lines always add up to price. Here is a real Saturday that is a one-night gap between two reservations, with a last-minute rule, a gap rule, a Saturday uplift, a +10% override and a 260 ceiling all switched on:

1Base priceyour base_price
Base price 200
running total 200
2Model effectsseasonality · weekday · events · demand
Seasonality +10.32%+20.64
Day of week +10.52%+23.22
Holiday/event +0%0
Market demand +0%0
running total 243.86
3Automatic ruleslast-minute · far-future · gap · adjacent · pacing, summed
Last-minute rule −10%−24.38
Gap-night rule −15%−36.58
running total 182.90
4Custom weekdayyour day_of_week percentages
Custom Saturday rule +10%+18.29
running total 201.19
5Percentage overridesprice_overrides · percentage
Percentage price override +10%+20.11
running total 221.30
6Price limitsmin_price · max_price
nothing on this night
7Fixed overridesprice_overrides · fixed
nothing on this night
Price for Sat Sep 26
221.30
Stages 2, 4 and 5 compound: each multiplies the running price. Stage 3 does not: the automatic rules' percentages are added together (−10 − 15 = −25%) and applied once against the running total after stage 2, with no combined cap. The ceiling was never reached, so stage 6 left no line.

Presets at a glance

Three rules ship with presets. A preset takes no settings; custom requires the full settings shown in each rule below. Every other rule is custom only.

Rule conservative balanced aggressive
Last minute opens 7 days out, down to −8% opens 21 days out, down to −15% opens 45 days out, down to −25%
Far future +0% at 270 days out, rising to +5% at one year +0% at 180 days, rising to +10% at one year +0% at 120 days, rising to +15% at one year
Gap day −4% / −2% / 0% for 1 / 2 / 3-night gaps −8% / −4% / −2% −12% / −8% / −4%

Gap-day presets cover gaps of one to three nights; longer gaps are left alone unless you define your own bands.

Rules cookbook

Fragments below drop into pricing_rules (or the top-level key named in the heading). Each rule has three examples that build on each other: the first is the smallest working request, the last shows the rule interacting with overrides or other rules. Each example gives the request fragment and what it did to real nights.

Last minutepresets + custom

Discount (or raise) nights that are close to arrival and still unsold.

Nights inside the last-minute window are discounted, more deeply the closer they are to today 27 21 14 -3% 7 -8% today -15% window opens · start_days = 21 days before arrival
Only nights inside the window, counted back from today, are touched. The balanced preset is shown: the closer the unsold night, the deeper the cut. Reserved and blocked nights are skipped.
Field Values What it does
mode disabled conservative balanced aggressive custom Presets need nothing else.
settings.start_days 1 – 90 Window opens this many days before arrival (inclusive).
settings.adjustment_percent > −100 The full percentage. Negative discounts, positive raises.
settings.adjustment_type flat gradual Same every night, or ramping toward arrival.
settings.end_days 0 – start_days − 1, default 0 Where a gradual ramp reaches the full percentage; nights closer to arrival keep it.
overrides months / date_ranges Different settings for certain nights. Custom mode only.
Flat applies the full percentage on every night in the window; gradual starts at zero and grows toward arrival "adjustment_type": "flat" 20 14 -10% 7 -10% today -10% "adjustment_type": "gradual" 20 14 7 -5% today -10% days before arrival · start_days = 14
Same window and percentage, two shapes. flat gives every night in the window the full percentage. gradual starts at 0% on the first day of the window and reaches the full percentage on the day of arrival.
Example 1 · Start with a presetTurn on the balanced preset
{
  "pricing_rules": {
    "last_minute": { "mode": "balanced" }
  }
}
NightWhat the rule didPrice
Mon Sep 14−15% (−28.51)190.09 → 161.58
Sat Sep 19−9.98% (−24.87)249.15 → 224.28
Thu Sep 24−5.69% (−13.59)238.77 → 225.18
Sun Oct 4−0.16% (−0.33)208.05 → 207.72
Mon Oct 5no adjustment194.42 → 194.42
Tonight gets the full discount. The cut shrinks quickly as you move away from today (the balanced curve is convex), and from 21 days out nothing is applied.
Example 2 · Custom settings: a flat discountDiscount the last two weeks by a flat 10%
{
  "pricing_rules": {
    "last_minute": {
      "mode": "custom",
      "settings": {
        "start_days": 14,
        "adjustment_percent": -10,
        "adjustment_type": "flat"
      }
    }
  }
}
NightWhat the rule didPrice
Mon Sep 14−10% (−19.01)190.09 → 171.08
Mon Sep 21−10% (−19.41)194.10 → 174.69
Mon Sep 28−10% (−19.47)194.72 → 175.25
Tue Sep 29no adjustment198.33 → 198.33
Every night from today through Mon Sep 28 is exactly 10% cheaper; Tue Sep 29 is the first untouched night.
Example 3 · A gradual ramp, with an override for specific datesRamp to −25%, but protect a busy weekend
{
  "pricing_rules": {
    "last_minute": {
      "mode": "custom",
      "settings": {
        "start_days": 30,
        "adjustment_percent": -25,
        "adjustment_type": "gradual"
      },
      "overrides": {
        "date_ranges": [
          {
            "start_date": "2026-10-04",
            "end_date": "2026-10-06",
            "settings": {
              "start_days": 30,
              "adjustment_percent": -5,
              "adjustment_type": "flat"
            }
          }
        ]
      }
    }
  }
}
NightWhat the rule didPrice
Mon Sep 14−25% (−47.52)190.09 → 142.57
Tue Sep 29−12.5% (−24.79)198.33 → 173.54
Sun Oct 4−5% (−10.40)208.05 → 197.65
Tue Oct 6−5% (−9.90)198.10 → 188.20
Wed Oct 7−5.83% (−12.25)210.13 → 197.88
Wed Oct 14no adjustment211.53 → 211.53
The ramp runs from 0% at 30 days out to −25% tonight; Tue Sep 29 sits halfway. The three protected nights Sun Oct 4 – Tue Oct 6 get a flat −5% instead, and the ramp resumes on Wed Oct 7. An override replaces the whole settings block for its nights; nothing is inherited from the default.
Far futurepresets + custom

Raise (or discount) nights that are far from arrival.

Nights inside the far-future window are raised, more the further out they are +3.1% +6.9% +10% today 180 365 window opens · start_days = 180 days before arrival · one cell per two weeks
The mirror image of last minute: the window opens at start_days and runs to the end of the calendar. The balanced preset is shown, one cell per two weeks: nothing until 180 days out, then a steady climb to +10% at one year, held for anything further out. Usually a raise, because early bookers are less price-sensitive and you keep the option to discount later.
Field Values What it does
mode disabled conservative balanced aggressive custom Presets ramp linearly, reach full strength one year out and hold it beyond.
settings.start_days 60 or more Window opens this many days out and runs to the end of the calendar, up to two years out.
settings.adjustment_percent > −100 The full percentage. Positive raises, negative discounts.
settings.adjustment_type flat gradual Same every night, or ramping up from start_days.
settings.end_days after start_days, default 365 Where a gradual ramp reaches the full percentage; nights further out keep it.
overrides months / date_ranges Different settings for certain nights. Custom mode only.
Example 1 · Start with a presetTurn on the balanced preset
{
  "pricing_rules": {
    "far_future": { "mode": "balanced" }
  }
}
NightWhat the rule didPrice
Thu Feb 11no adjustment172.83 → 172.83
Sat Mar 13no adjustment211.83 → 211.83
Fri Jun 11+4.86% (+16.67)343 → 359.67
Tue Sep 14+10% (+19.37)193.67 → 213.04
Sat May 6+10% (+23.30)232.92 → 256.22
Nothing happens before 180 days out. From there the raise grows linearly, reaches +10% one year out and stays at +10% for anything further.
Example 2 · Custom settings: a flat raiseAdd a flat 8% to anything more than 6 months out
{
  "pricing_rules": {
    "far_future": {
      "mode": "custom",
      "settings": {
        "start_days": 180,
        "adjustment_percent": 8,
        "adjustment_type": "flat"
      }
    }
  }
}
NightWhat the rule didPrice
Fri Mar 12no adjustment223.50 → 223.50
Sat Mar 13+8% (+16.95)211.83 → 228.78
Tue Oct 19+8% (+16.08)200.91 → 216.99
Sat May 6+8% (+18.64)232.92 → 251.56
Every night from 180 days out onward gets the same +8%.
Gap daypresets + custom

Discount short runs of open nights that are wedged between bookings.

A calendar with a one-night gap and a two-night gap between reservations Thu 24 reserved Fri 25 reserved Sat 26 open Sun 27 reserved Mon 28 reserved Tue 29 open Wed 30 open Thu 1 reserved Fri 2 reserved 1-night gap 2-night gap
A gap is a run of open nights with a reserved or blocked night on both sides. The rule looks up the gap's length in your bands and applies that band's percentage to every night in the gap.
Field Values What it does
mode disabled conservative balanced aggressive custom Presets cover 1, 2 and 3-night gaps and include weekends.
settings[] list of bands Each band: min_days, max_days (1 – 30, inclusive) and adjustment_percent. Bands must not overlap.
apply_on_weekends true / false Whether Friday and Saturday nights may be adjusted. Required in custom mode.
overrides months / date_ranges Different bands for certain nights. Custom mode only.

Needs a calendar in the request. Gap lengths that no band covers get no adjustment.

Example 1 · Start with a presetTurn on the balanced preset
{
  "calendar": [
    { "date": "2026-09-24", "status": "reserved" },
    { "date": "2026-09-25", "status": "reserved" },
    { "date": "2026-09-26", "status": "available" },
    { "date": "2026-09-27", "status": "reserved" },
    { "date": "2026-09-28", "status": "reserved" },
    { "date": "2026-09-29", "status": "available" },
    { "date": "2026-09-30", "status": "available" },
    { "date": "2026-10-01", "status": "reserved" },
    { "date": "2026-10-02", "status": "reserved" }
  ],
  "pricing_rules": {
    "gap_day": { "mode": "balanced" }
  }
}
NightWhat the rule didPrice
Fri Sep 25no adjustment257.83 → 257.83
Sat Sep 26−8% (−19.51)243.86 → 224.35
Tue Sep 29−4% (−7.93)198.33 → 190.40
Wed Sep 30−4% (−8.41)210.24 → 201.83
The one-night gap gets −8%, both nights of the two-night gap get −4%. Reserved nights are priced but not adjusted.
Example 2 · Custom bands, weekends excludedDeeper cuts, but never on a Friday or Saturday
{
  "pricing_rules": {
    "gap_day": {
      "mode": "custom",
      "apply_on_weekends": false,
      "settings": [
        {
          "min_days": 1,
          "max_days": 1,
          "adjustment_percent": -20
        },
        {
          "min_days": 2,
          "max_days": 3,
          "adjustment_percent": -10
        }
      ]
    }
  }
}
NightWhat the rule didPrice
Sat Sep 26no adjustment243.86 → 243.86
Tue Sep 29−10% (−19.83)198.33 → 178.50
Wed Sep 30−10% (−21.02)210.24 → 189.22
Same calendar as above. The one-night gap is a Saturday, and apply_on_weekends is false, so it keeps its price. The two-night gap (Tue Sep 29 – Wed Sep 30) gets −10%.
Adjacent daycustom only

Adjust the open nights right next to an existing booking, so they get filled.

Open nights immediately before and after a reservation Wed 23 open Thu 24 open Fri 25 open Sat 26 reserved Sun 27 reserved Mon 28 reserved Tue 29 open Wed 30 open Thu 1 open 1 before 1 after
The rule walks outward from each reservation: days_before open nights on the left, days_after on the right. Only reservations anchor it; blocked nights do not.
Field Values What it does
mode disabled custom No presets.
settings.days_before 0 – 30 How many open nights before a reservation to adjust. 0 = none.
settings.days_after 0 – 30 How many open nights after a reservation to adjust. 0 = none.
settings.adjustment_percent > −100 Applied once per night, even if it is adjacent on both sides.
apply_on_weekends true / false Whether Friday and Saturday nights may be adjusted. Required.
overrides months / date_ranges Different settings for certain nights.

Needs a calendar. If a night also qualifies for a nonzero gap-day adjustment, gap day wins and this rule is skipped for it.

Example 1 · The basic setupNudge the night before and after each booking
{
  "calendar": [
    { "date": "2026-09-23", "status": "available" },
    { "date": "2026-09-24", "status": "available" },
    { "date": "2026-09-25", "status": "available" },
    { "date": "2026-09-26", "status": "reserved" },
    { "date": "2026-09-27", "status": "reserved" },
    { "date": "2026-09-28", "status": "reserved" },
    { "date": "2026-09-29", "status": "available" },
    { "date": "2026-09-30", "status": "available" },
    { "date": "2026-10-01", "status": "available" }
  ],
  "pricing_rules": {
    "adjacent_day": {
      "mode": "custom",
      "apply_on_weekends": true,
      "settings": {
        "days_before": 1,
        "days_after": 1,
        "adjustment_percent": -5
      }
    }
  }
}
NightWhat the rule didPrice
Thu Sep 24no adjustment238.77 → 238.77
Fri Sep 25−5% (−12.90)257.83 → 244.93
Sat Sep 26no adjustment243.86 → 243.86
Tue Sep 29−5% (−9.92)198.33 → 188.41
Wed Sep 30no adjustment210.24 → 210.24
Exactly one open night on each side of the reservation is adjusted. Two nights away, nothing.
Example 2 · One side only, and a raise instead of a cutReach two nights before, and raise instead of cut
{
  "pricing_rules": {
    "adjacent_day": {
      "mode": "custom",
      "apply_on_weekends": true,
      "settings": {
        "days_before": 2,
        "days_after": 0,
        "adjustment_percent": 8
      }
    }
  }
}
NightWhat the rule didPrice
Wed Sep 23no adjustment210.17 → 210.17
Thu Sep 24+8% (+19.10)238.77 → 257.87
Fri Sep 25+8% (+20.62)257.83 → 278.45
Tue Sep 29no adjustment198.33 → 198.33
Positive percentages work too. days_after: 0 switches that side off, so the night after the reservation is untouched.
Occupancy pacingcustom only

Price by how booked you already are for a given lead time: discount when the near term is empty, raise when it is filling up.

A lookup grid: lead-time columns across, occupancy rows down, one percentage per cell 0 – 7 days 8 – 30 days 31 – 90 days how far out the night is · lead_time_ranges 0 – 39% booked 40 – 69% booked 70 – 100% booked how booked that window is · occupancy_ranges -15% -5% 0% -5% 0% +5% +5% +10% +15% ringed: a night 10 days out whose window is 30% booked → −5% empty and soon → discount hardest · full and far out → raise hardest adjustment_percent[row][column]
A lookup grid you define: lead-time bands across, occupancy bands down, one percentage per cell. A night's lead time picks the column. How booked that column's whole window already is (reserved ÷ reserved + available) picks the row, so every open night in a window lands in the same cell.
Field Values What it does
mode disabled custom No presets.
settings.lead_time_ranges[] {min_days, max_days} 0 – 365 Columns: how far out the night is. Ascending, non-overlapping.
settings.occupancy_ranges[] {min_percent, max_percent} 0 – 100 Rows: how booked the column's window already is. Ascending, non-overlapping.
settings.adjustment_percent [[row0col0, row0col1…], [row1…]] One inner list per row, one number per column.
overrides months / date_ranges Different matrix for certain nights.

Needs a calendar that covers every night of each column's window. Blocked nights are left out of the ratio.

Example 1 · The smallest grid: one column, two rowsDiscount when the next two weeks are quiet
{
  "calendar": [
    { "date": "2026-09-14", "status": "available" },
    { "date": "2026-09-15", "status": "available" },
    { "date": "2026-09-16", "status": "reserved" },
    { "date": "2026-09-17", "status": "reserved" },
    { "date": "2026-09-18", "status": "available" },
    { "date": "2026-09-19", "status": "available" },
    { "date": "2026-09-20", "status": "available" },
    { "date": "2026-09-21", "status": "available" },
    { "date": "2026-09-22", "status": "reserved" },
    { "date": "2026-09-23", "status": "reserved" },
    { "date": "2026-09-24", "status": "available" },
    { "date": "2026-09-25", "status": "available" },
    { "date": "2026-09-26", "status": "available" },
    { "date": "2026-09-27", "status": "available" },
    { "date": "2026-09-28", "status": "available" }
  ],
  "pricing_rules": {
    "occupancy_pacing": {
      "mode": "custom",
      "settings": {
        "lead_time_ranges": [
          { "min_days": 0, "max_days": 14 }
        ],
        "occupancy_ranges": [
          { "min_percent": 0, "max_percent": 49 },
          { "min_percent": 50, "max_percent": 100 }
        ],
        "adjustment_percent": [
          [-10],
          [5]
        ]
      }
    }
  }
}
NightWhat the rule didPrice
Mon Sep 14−10% (−19.01)190.09 → 171.08
Wed Sep 16no adjustment207.06 → 207.06
Mon Sep 21−10% (−19.41)194.10 → 174.69
Mon Sep 28−10% (−19.47)194.72 → 175.25
Tue Sep 29no adjustment198.33 → 198.33
The window is 27% booked, so every open night in the next 14 days gets the top row's −10%. Day 15 is outside every column: no adjustment, no warning.
Example 2 · Reading the 3 × 3 grid from the illustrationA full pacing grid
{
  "pricing_rules": {
    "occupancy_pacing": {
      "mode": "custom",
      "settings": {
        "lead_time_ranges": [
          { "min_days": 0, "max_days": 7 },
          { "min_days": 8, "max_days": 30 },
          { "min_days": 31, "max_days": 90 }
        ],
        "occupancy_ranges": [
          { "min_percent": 0, "max_percent": 39 },
          { "min_percent": 40, "max_percent": 69 },
          { "min_percent": 70, "max_percent": 100 }
        ],
        "adjustment_percent": [
          [-15, -5, 0],
          [-5, 0, 5],
          [5, 10, 15]
        ]
      }
    }
  }
}
NightWhat the rule didPrice
Mon Sep 14+5% (+9.51)190.09 → 199.60
Mon Sep 21+5% (+9.71)194.10 → 203.81
Thu Sep 24−5% (−11.94)238.77 → 226.83
Fri Oct 9−5% (−22.12)442.49 → 420.37
Thu Dec 3+15% (+30.01)200.03 → 230.04
Sun Dec 13+15% (+26.54)176.98 → 203.52
Reading the grid: adjustment_percent[row][column]. Nights 0 – 7 days out sit in a window that is 6 of 8 booked (75%) → bottom row, first column → +5%. Nights 8 – 30 days out sit in a window 7 of 23 booked (30%) → top row, second column → −5%, the ringed cell in the illustration. Nights 31 – 90 days out sit in a window 45 of 60 booked (75%) → bottom row, third column → +15%.
Day of weekcustom only

Add your own weekday pattern.

Your weekday percentages repeat every week Mon Tue Wed Thu Fri +5% Sat +10% Sun Mon Tue Wed Thu Fri +5% Sat +10% Sun week 1 week 2 · the same seven percentages, every week weekday is the property's local weekday
Your own weekday percentages, repeated every week, on top of the weekday effect the model already applies. Applied after the automatic rules (stage 4).
Field Values What it does
mode disabled custom No presets.
settings.adjustment_percent object, all seven lowercase weekday keys −75 to 500 each. Weekday is the property's local weekday.
overrides months / date_ranges Different percentages for certain nights.
Example 1 · The basic setupWeekend uplift
{
  "pricing_rules": {
    "day_of_week": {
      "mode": "custom",
      "settings": {
        "adjustment_percent": {
          "monday": 0,
          "tuesday": 0,
          "wednesday": 0,
          "thursday": 0,
          "friday": 5,
          "saturday": 10,
          "sunday": 0
        }
      }
    }
  }
}
NightWhat the rule didPrice
Tue Sep 22no adjustment198.01 → 198.01
Fri Sep 25+5% (+12.89)257.83 → 270.72
Sat Sep 26+10% (+24.39)243.86 → 268.25
Sun Sep 27no adjustment208.41 → 208.41
Zero is a valid value and all seven keys are required. The receipt line is labelled by the weekday it hit, e.g. Custom Saturday rule.
Example 2 · Discounts and premiums togetherMidweek discount, weekend premium
{
  "pricing_rules": {
    "day_of_week": {
      "mode": "custom",
      "settings": {
        "adjustment_percent": {
          "monday": -8,
          "tuesday": -8,
          "wednesday": -8,
          "thursday": -8,
          "friday": 5,
          "saturday": 12,
          "sunday": 0
        }
      }
    }
  }
}
NightWhat the rule didPrice
Tue Sep 22−8% (−15.84)198.01 → 182.17
Fri Sep 25+5% (+12.89)257.83 → 270.72
Sat Sep 26+12% (+29.27)243.86 → 273.13
Sun Sep 27no adjustment208.41 → 208.41
Stay rulestop-level key · stay_rules

Minimum nights and allowed check-in / check-out weekdays.

Check-in allowed on Friday and Saturday, with a two-night minimum Mon Tue Wed Thu Fri check-in Sat check-in Sun Mon Tue Wed Thu Fri check-in Sat check-in Sun min_stay 2 · a Friday arrival covers Fri + Sat min_stay 2 no check-in Mon – Thu, Sun prices are unchanged; your PMS enforces what is returned
Check-in allowed on Friday and Saturday only, with a two-night minimum. Stay rules do not change prices. They are returned on every night (min_stay, check_in_allowed, check_out_allowed) and they decide whether a gap is bookable.
Rule Fields What it does
min_stay settings.min_nights 1 – 365 Minimum nights for a stay starting on that night.
check_in_out settings.allowed_check_in_days, settings.allowed_check_out_days Lists of lowercase weekdays, at least one each.
length_of_stay settings[] of {min_nights, adjustment_percent} Accepted and validated, not applied: nightly prices cannot know the guest's stay length. Apply these in your booking system.

All three take mode: disabled or custom and accept overrides. AirROI returns the restrictions; your PMS or channel manager has to enforce them.

Example 1 · Minimum stayTwo-night minimum
{
  "stay_rules": {
    "min_stay": {
      "mode": "custom",
      "settings": { "min_nights": 2 }
    }
  }
}
NightReturned on the nightPrice
Thu Sep 24min_stay 2 · check-in yes · check-out yes238.77
Fri Sep 25min_stay 2 · check-in yes · check-out yes257.83
Example 2 · Check-in and check-out daysWeekend check-ins only
{
  "stay_rules": {
    "min_stay": {
      "mode": "custom",
      "settings": { "min_nights": 2 }
    },
    "check_in_out": {
      "mode": "custom",
      "settings": {
        "allowed_check_in_days": ["friday", "saturday"],
        "allowed_check_out_days": ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]
      }
    }
  }
}
NightReturned on the nightPrice
Thu Sep 24min_stay 2 · check-in no · check-out yes238.77
Fri Sep 25min_stay 2 · check-in yes · check-out yes257.83
Sat Sep 26min_stay 2 · check-in yes · check-out yes243.86
Sun Sep 27min_stay 2 · check-in no · check-out yes208.41
Price limits and overridestop-level keys · price_limits · price_overrides

Guard-rails and hand-set prices for specific dates.

Nights above the ceiling are lowered to it and nights below the floor are raised to it 180 Mon 180 Tue 210 Wed 250 Thu 260 Fri 260 Sat 220 Sun 180 Mon 190 Tue 235 Wed 260 Thu 260 Fri 260 Sat 200 Sun max_price 260 min_price 180 grey = inside the limits · orange = pushed to a limit: hollow above the ceiling is cut off, light up to the floor is added
Limits are a floor and a ceiling on the computed price. Omitted bounds default to 70% and 1000% of the base price. Fixed overrides are the one thing that ignores them.
Key Fields What it does
price_limits min_price, max_price Either may be omitted or null; each defaults independently.
price_overrides[] start_date, end_date, adjustment_type, adjustment_amount Inclusive, absolute date ranges that must not overlap.
adjustment_type: percentage Multiplies the running price before limits. −100 < amount ≤ 500.
adjustment_type: fixed Replaces the price after limits, ignoring both. A positive amount in the request currency.
Example 1 · A floor and a ceilingKeep every night between 150 and 230
{
  "price_limits": { "min_price": 150, "max_price": 230 }
}
NightWhat the rule didPrice
Tue Sep 15inside the limits194.52 → 194.52
Sat Sep 19lowered to the ceiling −19.15249.15 → 230
Sun Sep 20inside the limits207.52 → 207.52
The receipt shows a maximum_price_limit or minimum_price_limit line only on nights that were actually clamped.
Example 2 · A percentage overrideAdd 25% for a three-night event
{
  "price_overrides": [
    {
      "start_date": "2026-10-14",
      "end_date": "2026-10-16",
      "adjustment_type": "percentage",
      "adjustment_amount": 25
    }
  ]
}
NightWhat the rule didPrice
Tue Oct 13no adjustment199.22 → 199.22
Wed Oct 14+25% (+52.89)211.53 → 264.42
Fri Oct 16+25% (+65.04)260.19 → 325.23
Sat Oct 17no adjustment246.42 → 246.42
A percentage override behaves like one more multiplier, applied after all rules and before the limits.
Seasonal overridesmonths + date_ranges on any custom rule

Different settings for certain months or exact dates, on any custom rule.

Every custom rule accepts overrides.months (recurring, lowercase month names) and overrides.date_ranges (absolute, inclusive). Date ranges beat months, months beat the default settings. The most specific match wins and replaces the entire settings block; nothing is inherited from the level below.

Example 1 · Default, month and date-range settings togetherThree scopes on one rule
{
  "pricing_rules": {
    "day_of_week": {
      "mode": "custom",
      "settings": {
        "adjustment_percent": {
          "monday": 0,
          "tuesday": 0,
          "wednesday": 0,
          "thursday": 0,
          "friday": 0,
          "saturday": 10,
          "sunday": 0
        }
      },
      "overrides": {
        "months": {
          "october": {
            "settings": {
              "adjustment_percent": {
                "monday": 5,
                "tuesday": 5,
                "wednesday": 5,
                "thursday": 5,
                "friday": 5,
                "saturday": 20,
                "sunday": 5
              }
            }
          }
        },
        "date_ranges": [
          {
            "start_date": "2026-10-10",
            "end_date": "2026-10-30",
            "settings": {
              "adjustment_percent": {
                "monday": 30,
                "tuesday": 30,
                "wednesday": 30,
                "thursday": 30,
                "friday": 30,
                "saturday": 30,
                "sunday": 30
              }
            }
          }
        ]
      }
    }
  }
}
NightWhat the rule didPrice
Mon Sep 14no adjustment190.09 → 190.09
Wed Oct 7+5% (+10.50)210.13 → 220.63
Sat Oct 10+30% (+125.64)418.81 → 544.45
Wed Oct 14+30% (+63.46)211.53 → 274.99
Fri Oct 30+30% (+74.47)248.23 → 322.70
Sat Oct 31+20% (+46.70)233.52 → 280.22
A night outside October uses the default block. An October night uses the month block (+5% weekdays, +20% Saturday). The three-week run Sat Oct 10 – Fri Oct 30 uses the date-range block (+30% every night, Saturdays included) even though those nights are also in October; the day after it ends, Sat Oct 31, drops back to the month block.
The same shape works on every rule: "overrides": {"months": {"december": {"settings": …}}, "date_ranges": [{"start_date": …, "end_date": …, "settings": …}]}. Gap-day and adjacent-day scopes also need their own apply_on_weekends.
Advanced model controlstop-level key · advanced

Turn the model's own effects up or down.

Think of each dial as a volume knob on one of the model's own effects. 0 mutes it, 100 is the default (exactly what the model computed), 200 doubles it, and anything in between scales it: 50 is half the swing, 150 is one and a half times. The dials never touch your own rules, overrides or limits.

Field Values What it does
seasonality_sensitivity_percent 0 – 200, default 100 How hard the season, the weekday and holidays/events move the price. 0 gives a flat year, 200 makes every high and low twice as high or low.
demand_sensitivity_percent 0 – 200, default 100 How hard live market demand moves the price. Whatever you set, the demand line stays within −15% and +400%.
apply_negative_demand_adjustments true / false, default true false lets demand raise a price but never cut it: on a soft night the market_demand line is left off the receipt.
Example 1 · Seasonality off: 0A travel-nurse rental that charges the same all year

A furnished apartment near the hospital district books 30-night stays from nurses on contract, so the host wants no seasonal or weekday swing at all: the base price, adjusted only for live demand.

{
  "advanced": { "seasonality_sensitivity_percent": 0 }
}
NightModel line on the receiptPrice
Tue Sep 15seasonality +0% (0) · day of week +0% (0)194.52 → 200
Sat Sep 26seasonality +0% (0) · day of week +0% (0)243.86 → 200
The lines stay on the receipt, now at 0%: Tue Sep 15 went from +8.15% seasonality to 0%, Sat Sep 26 from +10.52% on the weekday line to 0%. The weekday and holiday effects sit on the same dial as the season, so all three switch off together.
Example 2 · Half strength: 50A first-season host who finds the swings too bold

A new host in a downtown condo trusts the direction of the model but wants gentler moves until they have a few months of reviews. Halving the dial keeps every high and low, at half the size.

{
  "advanced": { "seasonality_sensitivity_percent": 50 }
}
NightModel line on the receiptPrice
Tue Sep 15seasonality +4.07% (+8.15) · day of week −5.03% (−10.48)194.52 → 197.67
Sat Sep 26seasonality +5.16% (+10.32) · day of week +5.26% (+11.07)243.86 → 221.39
Every model percentage is half its default distance from zero: Tue Sep 15 seasonality +8.15% → +4.07%, Sat Sep 26 weekday +10.52% → +5.26%.
Example 3 · Double strength: 200A weekend-and-events house that lives on the peaks

A four-bedroom house near the venues empties out midweek and sells out for every weekend and festival. The host wants the model's peaks and troughs doubled so slow Tuesdays are cheaper and big Saturdays dearer.

{
  "advanced": { "seasonality_sensitivity_percent": 200 }
}
NightModel line on the receiptPrice
Tue Sep 15seasonality +16.29% (+32.59) · day of week −20.14% (−46.84)194.52 → 185.75
Sat Sep 26seasonality +20.64% (+41.29) · day of week +21.05% (+50.78)243.86 → 292.07
Every model percentage is twice its default distance from zero: Tue Sep 15 seasonality +8.15% → +16.29%, Sat Sep 26 weekday +10.52% → +21.05%.
Example 4 · Demand at 150, cuts switched offRide the hot nights, never discount the soft ones

A host whose place always fills eventually is happy to chase demand upward when a big weekend lands, but refuses to let a quiet market pull the price below what the season alone would say.

{
  "advanced": {
    "demand_sensitivity_percent": 150,
    "apply_negative_demand_adjustments": false
  }
}
NightModel line on the receiptPrice
Sat Oct 31line omitted233.52 → 245.09
Fri Oct 9+107.5% (+277.03)442.49 → 534.84
On Sat Oct 31 the market is soft, so the demand line (−4.7% by default) is dropped from the receipt rather than shown at 0%. On Fri Oct 9 it is strong, and the lift is one and a half times the modeled +71.6%: +107.5%.
Calendar inputtop-level key · calendar

Tell the engine what is already booked so the calendar-aware rules can work.

One row per night with a status of available, reserved or blocked. A calendar is evidence about your bookings, not a way to choose output dates. A date you do not send is unknown, which is different from open.

available reserved blocked not sent
Priced and returned yes yes yes yes
Last-minute / far-future applied skipped skipped applied
Can be a gap night yes — — no, and it breaks any gap it touches
Bounds a gap no yes yes no
Anchors adjacent-day no yes no no
Counted in occupancy as open as booked left out breaks the window (warning)
Example 1 · Reserved stays, one gap, one blocked night, and three rules reading themThree weeks of a real calendar

Three weeks starting Mon Sep 14: a guest checks out Tue Sep 15, a three-night stay runs Thu Sep 17 – Sat Sep 19, Wed Sep 23 is blocked for cleaning, a four-night stay runs Thu Sep 24 – Sun Sep 27 and a long weekend Fri Oct 2 – Sun Oct 4 is already sold. A flat last-minute discount, a one-night gap rule and an adjacent-night rule are all on.

{
  "calendar": [
    { "date": "2026-09-14", "status": "reserved" },
    { "date": "2026-09-15", "status": "reserved" },
    { "date": "2026-09-16", "status": "available" },
    { "date": "2026-09-17", "status": "reserved" },
    { "date": "2026-09-18", "status": "reserved" },
    { "date": "2026-09-19", "status": "reserved" },
    { "date": "2026-09-20", "status": "available" },
    { "date": "2026-09-21", "status": "available" },
    { "date": "2026-09-22", "status": "available" },
    { "date": "2026-09-23", "status": "blocked" },
    { "date": "2026-09-24", "status": "reserved" },
    { "date": "2026-09-25", "status": "reserved" },
    { "date": "2026-09-26", "status": "reserved" },
    { "date": "2026-09-27", "status": "reserved" },
    { "date": "2026-09-28", "status": "available" },
    { "date": "2026-09-29", "status": "available" },
    { "date": "2026-09-30", "status": "available" },
    { "date": "2026-10-01", "status": "available" },
    { "date": "2026-10-02", "status": "reserved" },
    { "date": "2026-10-03", "status": "reserved" },
    { "date": "2026-10-04", "status": "reserved" }
  ],
  "pricing_rules": {
    "last_minute": {
      "mode": "custom",
      "settings": {
        "start_days": 21,
        "adjustment_percent": -10,
        "adjustment_type": "flat"
      }
    },
    "gap_day": {
      "mode": "custom",
      "apply_on_weekends": true,
      "settings": [
        {
          "min_days": 1,
          "max_days": 1,
          "adjustment_percent": -15
        }
      ]
    },
    "adjacent_day": {
      "mode": "custom",
      "apply_on_weekends": true,
      "settings": {
        "days_before": 1,
        "days_after": 1,
        "adjustment_percent": -5
      }
    }
  }
}
NightWhat the rule didPrice
Mon Sep 14nothing applied190.09 → 190.09
Wed Sep 16last-minute rule −10% (−20.70) · gap-night rule −15% (−31.06)207.06 → 155.30
Sun Sep 20last-minute rule −10% (−20.75) · adjacent-night rule −5% (−10.38)207.52 → 176.39
Mon Sep 21last-minute rule −10% (−19.41)194.10 → 174.69
Wed Sep 23nothing applied210.17 → 210.17
Mon Sep 28last-minute rule −10% (−19.47) · adjacent-night rule −5% (−9.74)194.72 → 165.51
Thu Oct 1last-minute rule −10% (−23.87) · adjacent-night rule −5% (−11.93)238.63 → 202.83
Fri Oct 2nothing applied257.50 → 257.50
Mon Sep 14 and Fri Oct 2 are reserved, Wed Sep 23 is blocked: still priced and returned, but every rule steps over them. Wed Sep 16 is a one-night gap between two stays, so it gets the gap cut and the last-minute discount; the adjacent cut is not stacked on top of a gap cut. Sun Sep 20, Mon Sep 28 and Thu Oct 1 each touch one reservation and get the adjacent cut; Mon Sep 21 touches nothing and only sees last-minute. Send up to 1,000 rows, in any order; a calendar-aware rule with no calendar at all still prices every night and adds an INCOMPLETE_CALENDAR warning.
Warnings you may seeresponse · warnings[]

A 200 can still carry one warning, INCOMPLETE_CALENDAR. It means a calendar-aware rule could not do its job: on every night, because no calendar was sent, or on some nights, because rows it needed were not sent. field names the rule and message says which case it is. One entry per rule, so a sparse calendar with all three rules on can produce three.

Case What to do
No calendar in the request Send the calendar.
Gap-day or adjacent-day could not see both sides of an open night Send contiguous rows around your bookings.
An occupancy-pacing window has a date with no row Send every night of every column's window; the message names the window and how many dates are missing.

affected_date_count counts the affected nights across the full calculated calendar, not just the rows you asked for.

Daily recommendations

Returns one to two years of consecutive dates starting today in the property's timezone when start_date and end_date are omitted or null. Both are optional and inclusive: set start_date to begin later than today (for example, to sync just next month), set end_date to stop earlier, or set both for a window. The same day in both returns one row. Past or malformed dates return 422, and so does a start_date after end_date or beyond the available calendar. An end_date beyond the available calendar is simply clamped to it. coverage reports the calculation date (today), the returned range, the available end date, the row count and the timezone. The boundaries select output rows only: last-minute and far-future lead times still count from today, and full-calendar calculation and warnings are unchanged. Reserved and blocked dates are included, so recheck availability before publishing through your integration.

Use your own base price or the Recommend a Base Price result. Amounts are whole currency units, not cents. For longer guides see the Pricing Rules index.

Request Body schema: application/json
required
required
object (Property location)

Exact property coordinates. AirROI uses them to resolve local pricing curves and the property's local timezone.

currency
required
string (Currency) = 3 characters ^[A-Z]{3}$

Supported uppercase ISO 4217 currency code for every monetary input and output. No currency conversion is performed. Lowercase codes are rejected; unsupported codes return UNSUPPORTED_CURRENCY.

base_price
required
number <double> > 0

Year-round nightly rate before date-specific adjustments, in currency. Use your own value or recommended_base_price from the Base Price endpoint. Exclude cleaning fees, taxes, and platform fees. Must be positive and use the currency's decimal precision (2 places for USD, 0 for JPY, 3 for BHD).

start_date
string or null <date> ^[0-9]{4}-[0-9]{2}-[0-9]{2}$

Optional inclusive first output date (YYYY-MM-DD). Omitted or null starts today in the property's timezone. Must not be after end_date (422 INVALID_DATE_RANGE). A past date returns 422 START_DATE_IN_PAST; a date after the available calendar returns 422 START_DATE_BEYOND_AVAILABLE_HORIZON. Empty string, impossible date, or wrong JSON type returns 422. Only selects returned rows: lead-time rules still count from today, and calculation, evidence and warnings cover the full available calendar.

end_date
string or null <date> ^[0-9]{4}-[0-9]{2}-[0-9]{2}$

Optional inclusive output end date (YYYY-MM-DD). Omitted or null returns the full available calendar (one to two years from start_date or today). start_date and end_date on the same day return one row. A past date, empty string, impossible date, or wrong JSON type returns 422. A date beyond the available calendar is clamped; coverage.end_date reports the last date returned. Only limits returned rows: calculation, evidence and warnings still cover the full available calendar.

Array of objects (Calendar day) <= 1000 items

Booking and availability data, not the requested output dates. Required for gap-day, adjacent-day, and occupancy-pacing adjustments. Include consecutive dates and surrounding reservations or blocks. Missing dates are unknown; nights a calendar-dependent rule cannot evaluate are skipped with an INCOMPLETE_CALENDAR warning, and so is every night when calendar is omitted or [] while such a rule is enabled. Reserved and blocked rows also suppress last-minute and far-future adjustments.

object (Pricing rules)

Optional adjustments; omitted rules are disabled. Each supplied rule needs a mode. Only custom mode accepts settings, overrides, or apply_on_weekends. Each automatic-rule percentage is rounded HALF_UP to two decimal places before use. The five automatic rules then add their signed percentages against the same post-model price, without a combined cap. Custom day_of_week follows; price limits apply later.

object (Stay rules)

Optional stay restrictions; each rule accepts disabled or custom. Enabled minimum-stay and check-in/out rules appear in recommendations and inform gap eligibility. To govern actual bookings, these restrictions must be supported and enforced by your channel manager, PMS, or OTA integration; AirROI does not publish or enforce them on booking channels. length_of_stay is accepted but not applied. Configure longer-stay discounts separately in a supporting booking integration, which can evaluate the guest's selected dates and stay length.

object (Price limits)

Nightly floor and ceiling, applied after percentage adjustments. Each omitted or null bound defaults independently: minimum to 70% of base_price, maximum to 1000% (10 times) base_price, rounded HALF_UP to the currency's precision. An explicit bound replaces only that default. The effective minimum must not exceed the effective maximum; otherwise HTTP 422 returns INVALID_PRICE_LIMITS in the error details. Fixed price overrides bypass both default and explicit limits.

Array of objects (Price override)

Explicit percentage or fixed-price instructions for inclusive stay-date ranges. Applied after model and automatic pricing-rule adjustments. An empty array is accepted. Date ranges across the entire list must not overlap (inclusive of endpoints).

object (Advanced model controls)

Controls the strength of model effects, independently of custom rules. Defaults apply when omitted.

Responses

Request samples

Content type
application/json
Example

A one-bedroom casita outside Joshua Tree National Park, listed at 180 a night. The host wants to see what the model does before adding any rules: coordinates, currency and the base price, nothing else. With no dates set, the response is the full available calendar from today in the property's timezone, and the default limits (126 to 1,800) apply.

{
  • "location": {
    },
  • "currency": "USD",
  • "base_price": 180
}

Response samples

Content type
application/json
Example

Three of the 730 rows are shown, the Friday to Sunday 11 days out; the rest are omitted here. Each night carries the base price and the four model lines (seasonality, weekday, holiday/event, market demand), and the amounts always sum to price. coverage gives the calculation date and the returned range; with no end_date sent, that range is the whole available calendar. warnings is empty.

{
  • "location": {
    },
  • "currency": "USD",
  • "coverage": {
    },
  • "warnings": [ ],
  • "recommendations": [
    ]
}