AirDNA Enterprise API (2.0.0)

Download OpenAPI specification:Download

E-mail: api@airdna.co License: Apache 2.0

Introduction

Welcome to the All-New AirDNA API!

The AirDNA API provides direct access to our industry-leading data & analytics. Whether you’re looking to discover a property’s earning potential, compare markets side by side, or run comps to inform your revenue management strategy, you can do so with the endpoints found here.

The AirDNA API is divided into four packages, each with their own value and use cases:

  • Market Data: Unlock market-level data to compare entire different locations side by side, and future data to how properties in that market are priced for upcoming days.
  • Property Valuations & Comps: Conduct property-level research with advanced filtering and comp analysis to inform your acquisitions, benchmarking, pricing, and more.
  • Rentalizer Lead Gen: Determine the earning potential, occupancy, and nightly rate for any address, anywhere in the world.
  • Smart Rates Data: Use Smart Rates — AirDNA’s proprietary dynamic pricing solution – to receive recommended nightly rates for each of your properties.

For more information on our API and its use cases, Contact Sales to get started with an API Key.

Authentication

All requests to AirDNA's APIs require an Authorization HTTP header with a Bearer token.

For example, if your API Key is a1b2c3d4e5f6g7h8i9j0k1l2, then your Authorization header will be:

Authorization: "Bearer a1b2c3d4e5f6g7h8i9j0k1l2"

Example: Valid Token

The following example uses cURL to demonstrate how to perform a successful request. This assumes:

  • Your API Key has not expired.
  • Your account has been authorized to access the API Package that the endpoint belongs to.

Request

curl -i -X POST \
  https://api.airdna.co/api/enterprise/v2/market/search \
  -H 'Authorization: Bearer a1b2c3d4e5f6g7h8i9j0k1l2' \
  -H 'Content-Type: application/json' \
  -d '{
    "search_term": "Denver",
    "pagination": {
      "page_size": 1,
      "offset": 0
    }
  }'

Response 200

{
  "payload": {
    "page_info": {
      "page_size": 1,
      "offset": 0
    },
    "results": [
      {
        "id": "airdna-163",
        "name": "Denver",
        "type": "market",
        "listing_count": 15231,
        "location_name": "Denver, Colorado, United States, US",
        "location": {
          "state": "Colorado",
          "country": "United States",
          "country_code": "us"
        },
        "legacy_location": {
          "city_names": [],
          "zipcodes": [],
          "neighborhoods": []
        }
      }
    ]
  },
  "status": {
    "type": "success",
    "response_id": "API-S-011",
    "message": "Successfully fetched 1 Market for the requested parameters."
  }
}

Example: Invalid Token

The following example uses cURL to demonstrate what happens if you provide an invalid token.

Request

curl -i -X POST \
  https://api.airdna.co/api/enterprise/v2/market/search \
  -H 'Authorization: Bearer invalidToken' \
  -H 'Content-Type: application/json' \
  -d '{
    "search_term": "Denver",
    "pagination": {
      "page_size": 1,
      "offset": 0
    }
  }'

Response 401

{
    "error": {
        "type": "invalid_credentials",
        "message": "Unauthorized"
    }
}

Example: Missing Token

The following example uses cURL to demonstrate what happens if you omit a token.

Request

curl -i -X POST \
  https://api.airdna.co/api/enterprise/v2/market/search \
  -H 'Content-Type: application/json' \
  -d '{
    "search_term": "Denver",
    "pagination": {
      "page_size": 1,
      "offset": 0
    }
  }'

Response 401

{
    "error": {
        "type": "invalid_credentials",
        "message": "Authorization token is missing"
    }
}

Intro to Filters

Filtering is an essential feature to help you obtain data that is relevant to your business needs.

In the following sections, we will explain the do's and don'ts of filtering, and you'll also find a list of available filters that can be used to refine your queries.

⚠️ Notice

  • Filters are not required for every data scenario, but we encourage using them when available.
  • To use one or more filters on a supported endpoint, you will need to send an array of supported Filter Objects.
  • The order of the filters does not matter.

The Filter Object

The Filter Object is how you will use filters with supported endpoints.

The following table describes each of the required properties for any Filter Object.

Property Data Type(s) Description
"field" "string" The data attribute that you want to filter on.
"type" "string" The type of filter that you want to apply.
  • "select"
  • "multi_select"
  • "lt"
  • "lte"
  • "gt"
  • "gte"
  • "range"
"value"
  • "string"
  • "number"
  • "boolean"
  • "array"
The value(s) for the field that you want to filter on.

⚠️ Notice

  • Each Property described in the table is required
  • The supported values for "type" and "value" will depend on the "field" you are filtering on.

Using a Single Filter

If you only need to use a single filter in your query, you can simply add it to the filters array.

[Example]: Basic Usage

In the following example, we use the filters array to retrieve a dataset where the Listings can accommodate a minimum of 8 people.

{
  "filters": [
    {
      "type": "gte"
      "field": "accommodates",
      "value": 8
    }
  ]
}

⚠️ Notice

Filters must be sent from the filters property via an array.

Some examples of how you might use this example filter:

Using Multiple Filters

The ability to combine multiple filters is a key element that allows you to obtain data that meets your specific Business needs.

⚠️ Notice

  • Each field can only have one filter applied in any given query.

[Example #1]: Using Numeric Constraints

In the following example, we filter data where the Listings' bedrooms have a minimum=2 and maximum=6.

Instead of trying to use both gte and lte filters, you can instead use the range filter.

❎ INVALID

Applying multiple filters on the same field is unsupported.

{
  "filters": [
    {
      "type": "gte"
      "field": "bedrooms",
      "value": 2
    },
    {
      "type": "lte"
      "field": "bedrooms",
      "value": 6
    }
  ]
}

✅ VALID

The supported way of using both gte and lte filtering is to use the range filter.

{
  "filters": [
    {
      "type": "range"
      "field": "bedrooms",
      "value": [2, 6]
    }
  ]
}

[Example #2]: Filtering Exact Values

There may be some circumstances where you want each field to match an exact value. For this purpose, we have the select filter.

In the following example, we filter data where Listings have exactly 2 bedrooms AND accommodates 4 people.

{
  "filters": [
    {
      "type": "select"
      "field": "bedrooms",
      "value": 2
    },
    {
      "type": "select"
      "field": "accommodates",
      "value": 4
    }
  ]
}

[Example #3]: Filtering A Field To Multiple Exact Values

You may also want to filter data where each field matches one or more values. For this purpose, we have the multi_select filter.

In the following example, we filter data where Listings can accommodate exactly 4 people, AND that the data belongs to two distinct markets ("airdna-163" and "airdna-414").

{
  "filters": [
    {
      "type": "select"
      "field": "accommodates",
      "value": 4
    },
    {
      "type": "multi_select"
      "field": "market_id",
      "value": ["airdna-163", "airdna-414"]
    }
  ]
}

Market Filters

Investability

Use this filter to only include results where the market's investability score matches the requested parameters.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "investability").

Value: "investability"
value
required
number [ 0 .. 100 ]

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "investability",
  • "value": 60
}

Listing Count

Use this to filter results where the market's total active listing_count matches the requested parameters.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "listing_count").

Value: "listing_count"
value
required
number >= 0

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "listing_count",
  • "value": 3000
}

Market ID

Use this filter to only include results that belong to the provided market(s).

One of:

Filter the field to a specific single value. Used for == operations.

type
required
string

Filter type (i.e. "select").

Value: "select"
field
required
string

Field to filter on (i.e. "market_id").

Value: "market_id"
value
required
string

Filter value. Must be a number, string, or boolean.

{
  • "type": "select",
  • "field": "market_id",
  • "value": "airdna-163"
}

Market Type

Use this filter to only include results where the market_type matches the requested types.

One of:

Filter the field to a specific single value. Used for == operations.

type
required
string

Filter type (i.e. "select").

Value: "select"
field
required
string

Field to filter on (i.e. "market_type").

Value: "market_type"
value
required
string

Filter value. Must be a number, string, or boolean.

Enum: "coastal" "mid_size_city" "mountains_lakes" "rural" "suburban" … 1 more
{
  • "type": "select",
  • "field": "market_type",
  • "value": "urban_metro"
}

Regulation

Use this filter to only include results where the market's regulation score matches the requested parameters.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "regulation").

Value: "regulation"
value
required
number [ 0 .. 100 ]

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "regulation",
  • "value": 60
}

Rental Demand

Use this filter to only include results where the market's rental_demand score matches the requested parameters.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "rental_demand").

Value: "rental_demand"
value
required
number [ 0 .. 100 ]

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "rental_demand",
  • "value": 70
}

Revenue Growth

Use this filter to only include results where the market's revenue_growth score matches the requested parameters.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "revenue_growth").

Value: "revenue_growth"
value
required
number [ 0 .. 100 ]

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "revenue_growth",
  • "value": 60
}

Seasonality

Use this filter to only include results where the market's seasonality score matches the requested parameters.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "seasonality").

Value: "seasonality"
value
required
number [ 0 .. 100 ]

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "seasonality",
  • "value": 60
}

Listing Filters

Accommodates

Use this filter to only include results where the number of accommodates (guests) matches the requested parameters.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "accommodates").

Value: "accommodates"
value
required
number >= 0

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "accommodates",
  • "value": 4
}

Amenities

Use this filter to include results where the Listings match the requested amenity filters.

type
required
string

Type of filter (i.e. "jsonb_boolean").

Value: "jsonb_boolean"
field
required
string

Field to filter on (i.e. "amenities").

Value: "amenities"
required
object

Key-value pairs of Amenity filters.

  • A value of true means the Amenity must be present.
  • A value of false means the Amenity must not be present.
{
  • "field": "amenities",
  • "type": "jsonb_boolean",
  • "value": {
    • "has_aircon": true,
    • "has_breakfast": true,
    • "has_cable_tv": true,
    • "has_dryer": true,
    • "has_elevator": true,
    • "has_gym": true,
    • "has_heating": true,
    • "has_hottub": true,
    • "has_kitchen": true,
    • "has_parking": true,
    • "has_pets_allowed": true,
    • "has_pool": true,
    • "has_smoking": true,
    • "has_tv": true,
    • "has_washer": true,
    • "has_wireless_internet": true
    }
}

Bathrooms

Use this filter to only include results where the number of bathrooms matches the requested parameters.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "bathrooms").

Value: "bathrooms"
value
required
number >= 0

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "bathrooms",
  • "value": 2
}

Bedrooms

Use this filter to only include results where the number of bedrooms matches the requested parameters.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "bedrooms").

Value: "bedrooms"
value
required
number >= 0

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "bedrooms",
  • "value": 2
}

Days Available LTM

Use this filter to only include results where the days_available_ltm matches the requested parameters.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "days_available_ltm").

Value: "days_available_ltm"
value
required
number [ 0 .. 365 ]

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "days_available_ltm",
  • "value": 90
}

Instant Book

Use this filter to only include results where the Listing's value for instant_book matches the requested parameter.

type
required
string

Filter type (i.e. "select").

Value: "select"
field
required
string

Field to filter on (i.e. "instant_book").

Value: "instant_book"
value
required
boolean

Filter value. Must be true or false.

{
  • "type": "select",
  • "field": "instant_book",
  • "value": true
}

Listing Type

Use this to filter results where the listings' listing_type matches the requested value(s).

  • For markets or submarkets, this means returning only markets/submarkets that have listings with the requested value(s) for listing_type.
  • For listings, this means returning only listings with the requested value(s) for listing_type.
One of:

Filter the field to a specific single value. Used for == operations.

type
required
string

Filter type (i.e. "select").

Value: "select"
field
required
string

Field to filter on (i.e. "listing_type").

Value: "listing_type"
value
required
string

Filter value. Must be a number, string, or boolean.

Enum: "entire_place" "private_room" "shared_room"
{
  • "type": "select",
  • "field": "listing_type",
  • "value": "entire_place"
}

Occupancy Rate LTM

Use this to filter results where the listings' occupancy in the last 12 months matches the requested parameters.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "occupancy_rate_ltm").

Value: "occupancy_rate_ltm"
value
required
number [ 0 .. 1 ]

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "occupancy_rate_ltm",
  • "value": 0.6
}

Price Tier

Use this to filter results where the listings' price_tier matches the value(s).

  • For markets or submarkets, this means returning only markets/submarkets that have listings with the requested value(s) for price_tier.
  • For listings, this means returning only listings with the requested value(s) for price_tier.
One of:

Filter the field to a specific single value. Used for == operations.

type
required
string

Filter type (i.e. "select").

Value: "select"
field
required
string

Field to filter on (i.e. "price_tier").

Value: "price_tier"
value
required
string

Filter value. Must be a number, string, or boolean.

Enum: "budget" "economy" "luxury" "midscale" "upscale"
{
  • "type": "select",
  • "field": "price_tier",
  • "value": "budget"
}

Professionally Managed

Use this filter to only include results where the listings' value for professionally_managed matches the requested parameter.

type
required
string

Filter type (i.e. "select").

Value: "select"
field
required
string

Field to filter on (i.e. "professionally_managed").

Value: "professionally_managed"
value
required
boolean

Filter value. Must be true or false.

{
  • "type": "select",
  • "field": "professionally_managed",
  • "value": true
}

Property Type

Use this to filter results where the listings' property_type matches the requested parameters.

One of:

Filter the field to a specific single value. Used for == operations.

type
required
string

Filter type (i.e. "select").

Value: "select"
field
required
string

Field to filter on (i.e. "property_type").

Value: "property_type"
value
required
string

Filter value. Must be a number, string, or boolean.

Enum: "apartment" "barn" "bed_and_breakfast" "boat" "building" … 55 more
{
  • "type": "select",
  • "field": "property_type",
  • "value": "apartment"
}

Ratings

Use this filter to only include results where the listings' ratings matches the requested parameters.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "ratings").

Value: "ratings"
value
required
number [ 0 .. 5 ]

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "ratings",
  • "value": 4.5
}

Real Estate Type

Use this to filter results where the listings' real_estate_type matches the requested value(s).

  • For markets or submarkets, this means returning only markets/submarkets that have listings with the requested value(s) for real_estate_type.
  • For listings, this means returning only listings with the requested value(s) for real_estate_type.
One of:

Filter the field to a specific single value. Used for == operations.

type
required
string

Filter type (i.e. "select").

Value: "select"
field
required
string

Field to filter on (i.e. "real_estate_type").

Value: "real_estate_type"
value
required
string

Filter value. Must be a number, string, or boolean.

Enum: "apartment" "bed_and_breakfast" "house" "unique"
{
  • "type": "select",
  • "field": "real_estate_type",
  • "value": "apartment"
}

Review Count

Use this filter to only include results where the listings' reviews_count matches the requested parameters.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "reviews_count").

Value: "reviews_count"
value
required
number >= 0

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "reviews_count",
  • "value": 10
}

Superhost

Use this filter to only include results where the Listing's value for superhost matches the requested parameter.

type
required
string

Filter type (i.e. "select").

Value: "select"
field
required
string

Field to filter on (i.e. "superhost").

Value: "superhost"
value
required
boolean

Filter value. Must be true or false.

{
  • "type": "select",
  • "field": "superhost",
  • "value": true
}

Percent Active

Use this filter to only include results where the listings are active for that percentage of the month.

One of:

Filter the field by numerical data. Used for numeric comparison operations.

type
required
string

Numeric Equality Filter type

enum operator description
"gt" > Greater Than
"gte" >= Greater Than or Equal
"lt" < Less Than
"lte" <= Less Than or Equal
Enum: "gt" "gte" "lt" "lte"
field
required
string

Field to filter on (i.e. "percent_active")

Value: "percent_active"
value
required
number ( 0 .. 1 ]

Filter value. Must be a single number.

{
  • "type": "gte",
  • "field": "percent_active",
  • "value": 0.5
}

Market Data

Whether you're looking to discover trending markets, learn about a market's historical performance, or gauge its future outlook, these endpoints can support your research.

Historical Market Data

We provide between 12 and 60 months of monthly historical data for the following key metrics:

  • Booking Data
    • Occupancy
    • Booking Demand
    • Booking Lead Time
    • Average Length of Stay
  • Pricing Data
    • Average Revenue
    • Average Daily Rate
    • RevPAR (Revenue Per Available Rental)

Explore Markets

  • In addition to our historical data, our endpoints can help you explore and evaluate markets using a combination of the following:
  • To find the market_id for a known Market, you can use our Market Search endpoint.

Search for a Market or Submarket by Search Term.

If you need to find AirDNA Markets or Submarkets, this endpoint allows you to find them via a simple search_term.

Each result will provide:

  • A unique id that can be used in other endpoints for obtaining data.
  • The Name of the market
  • Whether it is a Market or Submarket
  • Basic Location details
SecurityheaderAuth
Request
Request Body schema: application/json
required

Schema for performing a request to search for a Market or Submarket

required
object (PaginationRequestSchema)

Use this object to request a specific page of data.

search_term
required
string

A search term to find a Market. It's recommended this be a city, a state or a neighborhood

Responses
200

Successful Market Search Response

Response Schema: application/json
required
object (MarketSearchResponseSchema)
required
object (Status)

The Status object on the response envelope

400

The request was invalid.

500

An internal server error occurred.

post/market/search
Request samples
application/json
{
  • "search_term": "Denver",
  • "pagination": {
    • "page_size": 25,
    • "offset": 0
    }
}
Response samples
application/json
{
  • "payload": {
    • "page_info": {
      },
    • "results": [
      ]
    },
  • "status": {
    • "type": "success",
    • "response_id": "API-S-011",
    • "message": "Successfully fetched 2 Markets & 23 Submarkets for the requested parameters."
    }
}

Fetch details about a specific Market.

Provides basic information about a specific Market. Includes key data such as:

  • Summary Metrics (Last 12 Months)
    • Market Score
    • Occupancy
    • Revenue
    • RevPAR
SecurityheaderAuth
Request
path Parameters
marketId
required
string (MarketIdParam)

AirDNA ID for the Market. This can often be found as market_id.

Example: airdna-163
Responses
200

Successful Market Details Response

Response Schema: application/json
required
object (Market)

General Information about a Market.

required
object (Status)

The Status object on the response envelope

400

The request was invalid.

404

Failed to find data matching your request.

500

An internal server error occurred.

get/market/{marketId}
Request samples
Response samples
application/json
{}

Explore Markets within a Country.

If you're looking to explore & compare top Markets, you can do so either by general Market characteristics, or even compare them based on specific types of Listings!

Each Market includes the following summary metrics (Last 12 months):

  • Market Score
  • Occupancy
  • Revenue
  • RevPAR

Here are some examples of the many things you can do:

  • Sort Markets by highest Market Score, Occupancy, Revenue, Average Daily Rate or Review Count.
  • Compare specific Markets in the same country by using the Market ID Filter.
  • Find Markets that have a high Seasonality score (a higher score means the Market is more stable throughout the year).
  • Find Markets that have a high Regulation score (a higher score means it's less regulated/strict).
  • Find Markets that have a high Rental Demand score (a higher score means the booking demand is higher).
  • Use Listing Filters to compare Market performance for certain types of STR Listings.
SecurityheaderAuth
Request
path Parameters
countryCode
required
string (CountryCodeParam)

ISO Country Code in the format defined by ISO 3166-1 Alpha-2.

Enum: "ad" "ae" "af" "ag" "ai" … 245 more
Example: us
Request Body schema: application/json
required

Schema for performing a request to fetch Markets relative to a Country.

required
object (PaginationRequestSchema)

Use this object to request a specific page of data.

object (BoundingBoxRequestSchema)

Use this object to include only results found within a given geographic rectangle. The rectangle is defined by two coordinates, the North East (ne) and South West (se) corners.

Array of objects (CountryMarketsFilterListSchema)

Array of filters that can be used to refine your search results.

currency
string (CurrencyISO)
Default: "usd"

ISO 4217 Currency Codes used for converting currency data.

Enum: "aed" "afn" "all" "amd" "ang" … 164 more
sort_order
string (MarketSortOrder)
Default: "market_score"

The attribute by which the retrieved results will be sorted.

  • Sorted in descending order (Highest to Lowest).
Enum: "adr" "market_score" "occupancy" "revenue" "review_count"
include_geoms
boolean
Default: false

Set this to true if you want to include the approximate geometric boundaries for the returned data.

Responses
200

Successfully retrieved Markets within a Country.

Response Schema: application/json
required
object (CountryMarketsResponseSchema)
required
object (Status)

The Status object on the response envelope

400

The request was invalid.

404

Failed to find data matching your request.

500

An internal server error occurred.

post/country/{countryCode}/markets
Request samples
application/json
{
  • "pagination": {
    • "page_size": 3,
    • "offset": 0
    },
  • "currency": "usd",
  • "sort_order": "revenue",
  • "include_geoms": false
}
Response samples
application/json
{}

Fetch Occupancy Metrics for a Market.

This endpoint provides 12 to 60 months of historical monthly occupancy data for a Market.

  • Each month shows the following metrics:

    • The month.
    • The average occupancy rate of Listings in that month.
    • The number of available Listings in that month.
    • The number of booked Listings in that month.
    • The number of days available in that month.
    • The number of days booked in that month.
  • Supports some Listing Filters to calculate historical occupancy for certain types of STR Listings within the Market.

  • Supports requests to calculate custom percentiles for occupancy rates within the Market.

SecurityheaderAuth
Request
path Parameters
marketId
required
string (MarketIdParam)

AirDNA ID for the Market. This can often be found as market_id.

Example: airdna-163
Request Body schema: application/json
required

Schema for performing a request to fetch occupancy metrics for a Market.

num_months
required
integer [ 12 .. 60 ]

The number of months to request metrics for.

Array of objects (MarketMetricsFilterListWithPercentActiveSchema)

Array of filters that can be used to refine your search results.

percentiles
Array of numbers (PercentilesRequestSchema)

An optional array of percentiles to request data for. Each percentile must be in decimal form (i.e. 0.25 for 25th percentile) and between 0 and 1.

Responses
200

Successful Market Occupancy Metrics Response.

Response Schema: application/json
required
object (MarketOccupancyMetricsResponseSchema)
required
object (Status)

The Status object on the response envelope

400

The request was invalid.

404

Failed to find data matching your request.

500

An internal server error occurred.

post/market/{marketId}/metrics/occupancy
Request samples
application/json
{
  • "num_months": 12,
  • "filters": [
    • {
      }
    ]
}
Response samples
application/json
{
  • "payload": {
    • "metrics": [
      ],
    • "monthly_pct_change": 13.03,
    • "yearly_pct_change": 0.53
    },
  • "status": {
    • "type": "success",
    • "response_id": "API-S-046",
    • "message": "Successfully retrieved Market occupancy rate metrics."
    }
}

Fetch Average Revenue Metrics for a Market.

This endpoint provides 12 to 60 months of historical monthly revenue data for a Market.

  • Supports Currency Conversion for non-USD currencies.
    • By default, all currency data is in USD.
  • Supports some Listing Filters to calculate historical revenue for certain types of STR Listings within the Market.
  • Supports requests to calculate custom percentiles for revenue within the Market.
SecurityheaderAuth
Request
path Parameters
marketId
required
string (MarketIdParam)

AirDNA ID for the Market. This can often be found as market_id.

Example: airdna-163
Request Body schema: application/json
required

Schema for performing a request to fetch average revenue metrics with currency for a Market.

num_months
required
integer [ 12 .. 60 ]

The number of months to request metrics for.

Array of objects (MarketMetricsFilterListWithPercentActiveSchema)

Array of filters that can be used to refine your search results.

currency
string (CurrencyISO)

ISO 4217 Currency Codes.

Enum: "aed" "afn" "all" "amd" "ang" … 164 more
percentiles
Array of numbers (PercentilesRequestSchema)

An optional array of percentiles to request data for. Each percentile must be in decimal form (i.e. 0.25 for 25th percentile) and between 0 and 1.

Responses
200

Successful Market Average Revenue Metrics Response

Response Schema: application/json
required
object (MarketAvgRevenueMetricsResponseSchema)
required
object (Status)

The Status object on the response envelope

400

The request was invalid.

404

Failed to find data matching your request.

500

An internal server error occurred.

post/market/{marketId}/metrics/avg_revenue
Request samples
application/json
{
  • "num_months": 12,
  • "currency": "eur"
}
Response samples
application/json
{
  • "payload": {
    • "metrics": [
      ],
    • "monthly_pct_change": 8.58,
    • "yearly_pct_change": -6.3
    },
  • "status": {
    • "type": "success",
    • "response_id": "API-S-032",
    • "message": "Successfully retrieved Market average monthly revenue metrics."
    }
}

Fetch Average Daily Rate Metrics for a Market.

This endpoint provides 12 to 60 months of historical monthly average daily rate data for a Market.

  • Supports Currency Conversion for non-USD currencies.
    • By default, all currency data is in USD.
  • Supports some Listing Filters to calculate historical ADR for certain types of STR Listings within the Market.
  • Supports requests to calculate custom percentiles for ADR within the Market.
SecurityheaderAuth
Request
path Parameters
marketId
required
string (MarketIdParam)

AirDNA ID for the Market. This can often be found as market_id.

Example: airdna-163
Request Body schema: application/json
required

Schema for performing a request to fetch Average Daily Rate metrics for a Market.

num_months
required
integer [ 12 .. 60 ]

The number of months to request metrics for.

Array of objects (MarketMetricsFilterListWithPercentActiveSchema)

Array of filters that can be used to refine your search results.

currency
string (CurrencyISO)

ISO 4217 Currency Codes.

Enum: "aed" "afn" "all" "amd" "ang" … 164 more
percentiles
Array of numbers (PercentilesRequestSchema)

An optional array of percentiles to request data for. Each percentile must be in decimal form (i.e. 0.25 for 25th percentile) and between 0 and 1.

Responses
200

Successful Market Average Daily Rate Metrics Response

Response Schema: application/json
required
object (MarketAvgDailyRateMetricsResponseSchema)
required
object (Status)

The Status object on the response envelope

400

The request was invalid.

404

Failed to find data matching your request.

500

An internal server error occurred.

post/market/{marketId}/metrics/adr
Request samples
application/json
{
  • "num_months": 12,
  • "filters": [
    • {
      }
    ],
  • "currency": "usd"
}
Response samples
application/json
{
  • "payload": {
    • "metrics": [
      ],
    • "monthly_pct_change": 4.59,
    • "yearly_pct_change": 5.28
    },
  • "status": {
    • "type": "success",
    • "response_id": "API-S-024",
    • "message": "Successfully retrieved Market average daily rate metrics."
    }
}

Fetch RevPAR Metrics for a Market.

This endpoint provides 12 to 60 months of historical monthly RevPAR (Revenue Per Available Rental) data for a Market.

  • Supports Currency Conversion for non-USD currencies.
    • By default, all currency data is in USD.
  • Supports some Listing Filters to calculate historical RevPAR for certain types of STR Listings within the Market.
SecurityheaderAuth
Request
path Parameters
marketId
required
string (MarketIdParam)

AirDNA ID for the Market. This can often be found as market_id.

Example: airdna-163
Request Body schema: application/json
required

Schema for performing a request to fetch RevPAR metrics for a Market.

num_months
required
integer [ 12 .. 60 ]

The number of months to request metrics for.

currency
string (CurrencyISO)

ISO 4217 Currency Codes.

Enum: "aed" "afn" "all" "amd" "ang" … 164 more
Array of objects (MarketMetricsFilterListSchema)

Array of filters that can be used to refine your search results.

Responses
200

Successful Market Revpar Metrics Response

Response Schema: application/json
required
object (MarketRevparMetricsResponseSchema)
required
object (Status)

The Status object on the response envelope

400

The request was invalid.

404

Failed to find data matching your request.

500

An internal server error occurred.

post/market/{marketId}/metrics/revpar
Request samples
application/json
{
  • "num_months": 12,
  • "filters": [
    • {
      }
    ],
  • "currency": "usd"
}
Response samples
application/json
{
  • "payload": {
    • "metrics": [
      ],
    • "monthly_pct_change": 1.49,
    • "yearly_pct_change": -4.27
    },
  • "status": {
    • "type": "success",
    • "response_id": "API-S-054",
    • "message": "Successfully retrieved Market revpar metrics."
    }
}

Fetch Booking Lead Time Metrics for a Market.

This endpoint provides 12 to 20 months of historical monthly booking lead time data for a Market.

  • Supports some Listing Filters to calculate booking lead time for certain types of STR Listings within the Market.
SecurityheaderAuth
Request
path Parameters
marketId
required
string (MarketIdParam)

AirDNA ID for the Market. This can often be found as market_id.

Example: airdna-163
Request Body schema: application/json
required

Schema for performing a request to fetch Booking Lead Time for a Market or Submarket.

num_months
required
integer [ 12 .. 24 ]

The number of months to request metrics for.

Array of objects (MarketMetricsFilterListSchema)

Array of filters that can be used to refine your search results.

Responses
200

Successful Market Booking Lead Time Metrics Response

Response Schema: application/json
required
object (MarketBookingLeadTimeMetricsResponseSchema)
required
object (Status)

The Status object on the response envelope

400

The request was invalid.

404

Failed to find data matching your request.

500

An internal server error occurred.

post/market/{marketId}/metrics/booking_lead_time
Request samples
application/json
{
  • "num_months": 12,
  • "filters": [
    • {
      }
    ]
}
Response samples
application/json
{
  • "payload": {
    • "metrics": [
      ],
    • "monthly_pct_change": 16.08,
    • "yearly_pct_change": 6.42
    },
  • "status": {
    • "type": "success",
    • "response_id": "API-S-036",
    • "message": "Successfully retrieved Market booking lead time metrics."
    }
}

Fetch Average Length of Stay Metrics for a Market.

This endpoint provides 12 to 20 months of historical monthly average length of stay data for a Market.

  • Supports some Listing Filters to calculate average length of stay for certain types of STR Listings within the Market.
SecurityheaderAuth
Request
path Parameters
marketId
required
string (MarketIdParam)

AirDNA ID for the Market. This can often be found as market_id.

Example: airdna-163
Request Body schema: application/json
required

Schema for performing a request to fetch Average Length of Stay for a Market or Submarket.

num_months
required
integer [ 12 .. 24 ]

The number of months to request metrics for.

Array of objects (MarketMetricsFilterListSchema)

Array of filters that can be used to refine your search results.

Responses
200

Successful Market Average Length of Stay Metrics Response

Response Schema: application/json
required
object (MarketAvgLengthOfStayMetricsResponseSchema)
required
object (Status)

The Status object on the response envelope

400

The request was invalid.

404

Failed to find data matching your request.

500

An internal server error occurred.

post/market/{marketId}/metrics/avg_length_of_stay
Request samples
application/json
{
  • "num_months": 12
}
Response samples
application/json
{
  • "payload": {
    • "metrics": [
      ],
    • "monthly_pct_change": -5.2,
    • "yearly_pct_change": -3.67
    },
  • "status": {
    • "type": "success",
    • "response_id": "API-S-028",
    • "message": "Successfully retrieved Market average length of stay metrics."
    }
}

Fetch Active Listings Count for a Market.

This endpoint provides 12 to 60 months of active listings count data for a Market.

  • Supports some Listing Filters to calculate active listings count data for certain types of STR Listings within the Market.
SecurityheaderAuth
Request
path Parameters
marketId
required
string (MarketIdParam)

AirDNA ID for the Market. This can often be found as market_id.

Example: airdna-163
Request Body schema: application/json
required

Schema for performing a request to fetch Active Listings Count for a Market.

num_months
required
integer [ 12 .. 60 ]

The number of months to request metrics for.

Array of objects (MarketMetricsFilterListSchema)

Array of filters that can be used to refine your search results.

Responses
200

Successful Market Active Listings Count Response

Response Schema: application/json
required
object (MarketActiveListingsCountResponseSchema)
required
object (Status)

The Status object on the response envelope

400

The request was invalid.

404

Failed to find data matching your request.

500

An internal server error occurred.

post/market/{marketId}/metrics/active_listings_count
Request samples
application/json
{
  • "num_months": 12,
  • "filters": [
    • {
      }
    ]
}
Response samples
application/json
{
  • "payload": {
    • "metrics": [
      ],
    • "monthly_pct_change": 10.61,
    • "yearly_pct_change": 4.22
    },
  • "status": {
    • "type": "success",
    • "response_id": "API-S-018",
    • "message": "Successfully retrieved Market active listings count."
    }
}

Fetch Future Daily Pricing for a Market.

This endpoint provides 1 to 12 months of future daily pricing data for a Market.

  • Supports some Listing Filters to calculate future pricing data for certain types of STR Listings within the Market.
  • Supports requests to calculate custom percentiles for future daily pricing within the Market.
SecurityheaderAuth
Request
path Parameters
marketId
required
string (MarketIdParam)

AirDNA ID for the Market. This can often be found as market_id.

Example: airdna-163
Request Body schema: application/json
required

Schema for performing a request to fetch future metrics with currency for a Market.

num_months
required
integer [ 1 .. 12 ]

The number of months to request metrics for.

Array of objects (MarketMetricsFilterListSchema)

Array of filters that can be used to refine your search results.

percentiles
Array of numbers

An optional array of percentiles to request data for. Each percentile must be in decimal form (i.e. 0.25 for 25th percentile) and between 0 and 1.

currency
string (CurrencyISO)

ISO 4217 Currency Codes.

Enum: "aed" "afn" "all" "amd" "ang" … 164 more
Responses
200

Successful Market Future Rates Response

Response Schema: application/json
required
object (MarketFuturePricingResponseSchema)
required
object (Status)

The Status object on the response envelope

400

The request was invalid.

404

Failed to find data matching your request.

500

An internal server error occurred.

post/market/{marketId}/future_pricing
Request samples
application/json
{
  • "num_months": 3,
  • "filters": [
    • {
      }
    ],
  • "currency": "usd"
}
Response samples
application/json
{
  • "payload": {
    • "metrics": [
      ]
    },
  • "status": {
    • "type": "success",
    • "response_id": "API-S-064",
    • "message": "Successfully retrieved Market Future Daily Pricing."
    }
}

Submarket Data

Whether you're looking to discover trending Submarkets or learn about a Submarket's historical performance, these endpoints can support your research.

Historical Submarket Data

We provide between 12 and 60 months of monthly historical data for the following key metrics:

  • Booking Data
    • Occupancy
    • Booking Demand
    • Booking Lead Time
    • Average Length of Stay
  • Pricing Data
    • Average Revenue
    • Average Daily Rate
    • RevPAR (Revenue Per Available Rental)

Explore Markets

  • In addition to our historical data, our endpoints can help you explore and evaluate Markets using a combination of the following:
  • To find the submarket_id for a known Submarket, you can use our Market Search endpoint.

Search for a Market or Submarket by Search Term.

If you need to find AirDNA Markets or Submarkets, this endpoint allows you to find them via a simple search_term.

Each result will provide:

  • A unique id that can be used in other endpoints for obtaining data.
  • The Name of the market
  • Whether it is a Market or Submarket
  • Basic Location details
SecurityheaderAuth
Request
Request Body schema: application/json
required

Schema for performing a request to search for a Market or Submarket

required
object (PaginationRequestSchema)

Use this object to request a specific page of data.

search_term
required
string

A search term to find a Market. It's recommended this be a city, a state or a neighborhood

Responses
200

Successful Market Search Response

Response Schema: application/json
required
object (MarketSearchResponseSchema)
required
object (Status)

The Status object on the response envelope

400

The request was invalid.

500

An internal server error occurred.