AirDNA Property/Listing Data

Search and explore individual short-term rental listings by term, coordinates, country, market, submarket, or radius; fetch listing details and historical performance metrics for one or many listings.

OpenAPI Specification

airdna-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: AirDNA Enterprise API
  description: >-
    The AirDNA Enterprise API exposes short-term rental market analytics and
    individual property data for Airbnb and Vrbo. It is organized into Market
    Data, Property Valuations & Comps (STR listing data and Rentalizer),
    Rentalizer Lead Gen, and Smart Rates Data. All requests are authenticated
    with a Bearer token obtained from AirDNA sales.
  termsOfService: https://www.airdna.co/terms-of-service
  contact:
    name: AirDNA API Support
    email: api@airdna.co
  version: 2.0.0
servers:
  - url: https://api.airdna.co/api/enterprise/v2
security:
  - bearerAuth: []
tags:
  - name: Market Data
    description: Market and submarket discovery, metrics, and future pricing.
  - name: STR Listing Data
    description: Short-term rental listing search, details, history, and comps.
  - name: Rentalizer
    description: Revenue estimates for individual and bulk addresses.
  - name: Rentalizer Lead Gen
    description: Summarized performance estimates for lead generation.
  - name: Smart Rates
    description: Pricing strategy base rates and smart rates for listings.
paths:
  /market/search:
    post:
      operationId: searchMarkets
      tags:
        - Market Data
      summary: Search for markets or submarkets by term or coordinates.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MarketSearchRequest'
      responses:
        '200':
          description: Matching markets and submarkets.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MarketSearchResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /market/{marketId}:
    get:
      operationId: getMarket
      tags:
        - Market Data
      summary: Fetch details for a specific market.
      parameters:
        - $ref: '#/components/parameters/MarketId'
      responses:
        '200':
          description: Market details.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /country/{countryCode}/markets:
    post:
      operationId: exploreCountryMarkets
      tags:
        - Market Data
      summary: Explore markets within a country.
      parameters:
        - $ref: '#/components/parameters/CountryCode'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExploreRequest'
      responses:
        '200':
          description: Markets within the country.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /market/{marketId}/metrics/occupancy:
    post:
      operationId: getMarketOccupancy
      tags:
        - Market Data
      summary: Occupancy metrics for a market.
      parameters:
        - $ref: '#/components/parameters/MarketId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MetricsRequest'
      responses:
        '200':
          description: Occupancy metrics time series.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /market/{marketId}/metrics/revenue:
    post:
      operationId: getMarketRevenue
      tags:
        - Market Data
      summary: Average revenue metrics for a market.
      parameters:
        - $ref: '#/components/parameters/MarketId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MetricsRequest'
      responses:
        '200':
          description: Revenue metrics time series.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /market/{marketId}/metrics/adr:
    post:
      operationId: getMarketAdr
      tags:
        - Market Data
      summary: Average daily rate (ADR) metrics for a market.
      parameters:
        - $ref: '#/components/parameters/MarketId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MetricsRequest'
      responses:
        '200':
          description: ADR metrics time series.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /market/{marketId}/metrics/revpar:
    post:
      operationId: getMarketRevpar
      tags:
        - Market Data
      summary: RevPAR metrics for a market.
      parameters:
        - $ref: '#/components/parameters/MarketId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MetricsRequest'
      responses:
        '200':
          description: RevPAR metrics time series.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /market/{marketId}/metrics/booking-lead-time:
    post:
      operationId: getMarketBookingLeadTime
      tags:
        - Market Data
      summary: Booking lead time metrics for a market.
      parameters:
        - $ref: '#/components/parameters/MarketId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MetricsRequest'
      responses:
        '200':
          description: Booking lead time metrics time series.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /market/{marketId}/metrics/length-of-stay:
    post:
      operationId: getMarketLengthOfStay
      tags:
        - Market Data
      summary: Average length of stay metrics for a market.
      parameters:
        - $ref: '#/components/parameters/MarketId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MetricsRequest'
      responses:
        '200':
          description: Length of stay metrics time series.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /market/{marketId}/metrics/active-listings:
    post:
      operationId: getMarketActiveListings
      tags:
        - Market Data
      summary: Active listings count for a market.
      parameters:
        - $ref: '#/components/parameters/MarketId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MetricsRequest'
      responses:
        '200':
          description: Active listings metrics time series.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /market/{marketId}/pricing/future:
    post:
      operationId: getMarketFuturePricing
      tags:
        - Market Data
      summary: Future daily pricing data for a market.
      parameters:
        - $ref: '#/components/parameters/MarketId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExploreRequest'
      responses:
        '200':
          description: Future daily pricing.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /submarket/{submarketId}:
    get:
      operationId: getSubmarket
      tags:
        - Market Data
      summary: Fetch details for a specific submarket.
      parameters:
        - $ref: '#/components/parameters/SubmarketId'
      responses:
        '200':
          description: Submarket details.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /market/{marketId}/submarkets:
    post:
      operationId: exploreMarketSubmarkets
      tags:
        - Market Data
      summary: Explore submarkets within a market.
      parameters:
        - $ref: '#/components/parameters/MarketId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExploreRequest'
      responses:
        '200':
          description: Submarkets within the market.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /listing/search:
    post:
      operationId: searchListings
      tags:
        - STR Listing Data
      summary: Search listings by term or coordinates.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ListingSearchRequest'
      responses:
        '200':
          description: Matching listings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /market/{marketId}/listings:
    post:
      operationId: exploreMarketListings
      tags:
        - STR Listing Data
      summary: Explore listings within a market.
      parameters:
        - $ref: '#/components/parameters/MarketId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExploreRequest'
      responses:
        '200':
          description: Listings within the market.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /listings/radius:
    post:
      operationId: exploreListingsRadius
      tags:
        - STR Listing Data
      summary: Explore listings within a radius of coordinates.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExploreRequest'
      responses:
        '200':
          description: Listings within the radius.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /listing/{listingId}:
    get:
      operationId: getListing
      tags:
        - STR Listing Data
      summary: Fetch details for a specific listing.
      parameters:
        - $ref: '#/components/parameters/ListingId'
      responses:
        '200':
          description: Listing details.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /listings/details:
    post:
      operationId: getListingsDetails
      tags:
        - STR Listing Data
      summary: Fetch details for multiple listings.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                listing_ids:
                  type: array
                  items:
                    type: string
      responses:
        '200':
          description: Details for the requested listings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /listing/{listingId}/metrics/historical:
    post:
      operationId: getListingHistoricalMetrics
      tags:
        - STR Listing Data
      summary: Historical performance metrics for a listing.
      parameters:
        - $ref: '#/components/parameters/ListingId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MetricsRequest'
      responses:
        '200':
          description: Historical listing metrics.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /listing/{listingId}/comps:
    post:
      operationId: getListingComps
      tags:
        - STR Listing Data
      summary: Fetch comparable listings (comp set) for a listing.
      parameters:
        - $ref: '#/components/parameters/ListingId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExploreRequest'
      responses:
        '200':
          description: Comparable listings for the given listing.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /listing/{listingId}/pricing/future:
    post:
      operationId: getListingFuturePricing
      tags:
        - STR Listing Data
      summary: Future pricing for a listing.
      parameters:
        - $ref: '#/components/parameters/ListingId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExploreRequest'
      responses:
        '200':
          description: Future pricing for the listing.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /rentalizer/individual:
    post:
      operationId: rentalizerIndividual
      tags:
        - Rentalizer
      summary: Detailed Rentalizer performance estimate for a single address.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RentalizerRequest'
      responses:
        '200':
          description: Rentalizer estimate for the address.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /rentalizer/bulk:
    post:
      operationId: rentalizerBulk
      tags:
        - Rentalizer
      summary: Summarized Rentalizer estimates for multiple addresses.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                addresses:
                  type: array
                  items:
                    $ref: '#/components/schemas/Address'
      responses:
        '200':
          description: Summarized Rentalizer estimates.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /rentalizer-lead-gen/summary:
    post:
      operationId: rentalizerLeadGenSummary
      tags:
        - Rentalizer Lead Gen
      summary: Summarized performance estimate for lead generation.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RentalizerRequest'
      responses:
        '200':
          description: Summarized lead-gen performance estimate.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /smart-rates/{listingId}:
    get:
      operationId: getSmartRatesBase
      tags:
        - Smart Rates
      summary: Fetch pricing strategy base rates for a listing.
      parameters:
        - $ref: '#/components/parameters/ListingId'
      responses:
        '200':
          description: Base rates for the listing.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: getSmartRates
      tags:
        - Smart Rates
      summary: Fetch smart rates for a listing.
      parameters:
        - $ref: '#/components/parameters/ListingId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExploreRequest'
      responses:
        '200':
          description: Smart rates for the listing.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Bearer token supplied in the Authorization header
        (Authorization: Bearer {API_KEY}). API keys are obtained from AirDNA
        sales at api@airdna.co.
  parameters:
    MarketId:
      name: marketId
      in: path
      required: true
      schema:
        type: string
      description: Unique identifier of the market.
    SubmarketId:
      name: submarketId
      in: path
      required: true
      schema:
        type: string
      description: Unique identifier of the submarket.
    ListingId:
      name: listingId
      in: path
      required: true
      schema:
        type: string
      description: Unique identifier of the listing.
    CountryCode:
      name: countryCode
      in: path
      required: true
      schema:
        type: string
      description: ISO country code.
  responses:
    Unauthorized:
      description: Missing or invalid Bearer token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ResponseEnvelope'
  schemas:
    Pagination:
      type: object
      properties:
        page_size:
          type: integer
        offset:
          type: integer
    PageInfo:
      type: object
      properties:
        page_size:
          type: integer
        offset:
          type: integer
    Filter:
      type: object
      description: Filter object applied to explore/metrics queries.
      properties:
        field:
          type: string
          description: Attribute name to filter on.
        type:
          type: string
          enum:
            - select
            - multi_select
            - gt
            - gte
            - lt
            - lte
            - range
            - jsonb_boolean
            - jsonb_array
        value:
          description: Filter value (string, number, boolean, or array).
    Status:
      type: object
      properties:
        type:
          type: string
          description: success or error.
        response_id:
          type: string
        message:
          type: string
    ResponseEnvelope:
      type: object
      properties:
        payload:
          type: object
          description: Endpoint-specific data object.
        status:
          $ref: '#/components/schemas/Status'
    MarketSearchRequest:
      type: object
      properties:
        search_term:
          type: string
        pagination:
          $ref: '#/components/schemas/Pagination'
    MarketSearchResult:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        type:
          type: string
          description: Market type (neighborhood, city, etc.).
        listing_count:
          type: integer
        location_name:
          type: string
        location:
          type: object
        legacy_location:
          type: object
    MarketSearchResponse:
      type: object
      properties:
        payload:
          type: object
          properties:
            page_info:
              $ref: '#/components/schemas/PageInfo'
            results:
              type: array
              items:
                $ref: '#/components/schemas/MarketSearchResult'
        status:
          $ref: '#/components/schemas/Status'
    ListingSearchRequest:
      type: object
      properties:
        search_term:
          type: string
        pagination:
          $ref: '#/components/schemas/Pagination'
    ExploreRequest:
      type: object
      properties:
        pagination:
          $ref: '#/components/schemas/Pagination'
        filters:
          type: array
          items:
            $ref: '#/components/schemas/Filter'
        currency:
          type: string
          description: ISO 4217 currency code (default USD).
        sort_order:
          type: string
        bounding_box:
          type: object
          description: Geographic bounding box for spatial filtering.
    MetricsRequest:
      type: object
      properties:
        num_months:
          type: integer
          minimum: 12
          maximum: 60
          description: Number of months of metrics to return (12-60).
        currency:
          type: string
          description: ISO 4217 currency code (default USD).
        filters:
          type: array
          items:
            $ref: '#/components/schemas/Filter'
    Address:
      type: object
      properties:
        address:
          type: string
        bedrooms:
          type: integer
        bathrooms:
          type: number
        accommodates:
          type: integer
    RentalizerRequest:
      type: object
      properties:
        address:
          type: string
        bedrooms:
          type: integer
        bathrooms:
          type: number
        accommodates:
          type: integer
        currency:
          type: string
          description: ISO 4217 currency code (default USD).