openapi: 3.0.0
info:
  title: Airbnb Experience Details API
  description: |
    Retrieve detailed information about a specific Airbnb Experience, including descriptions, pricing, availability, host details, reviews, and similar experiences.

    **Cross-linking**: The `experience_id` parameter required by this API is obtained from the Airbnb search results when searching for experiences. Each experience in the search results includes an `id` that can be used with this API to fetch detailed experience information.
  version: 1.0.0
servers:
  - url: https://www.searchapi.io/api/v1
paths:
  /search:
    get:
      summary: Airbnb Experience Details
      security:
        - ApiKeyAuth: []
        - ApiKeyQuery: []
      parameters:
        - name: engine
          in: query
          required: true
          description: Set to `airbnb_experience_details` for this API
          schema:
            type: string
            enum: ["airbnb_experience_details"]
            default: "airbnb_experience_details"
        - name: experience_id
          in: query
          required: true
          description: Airbnb experience ID. Must be a numeric value. Obtained from Airbnb search results.
          schema:
            type: string
        - name: airbnb_domain
          in: query
          required: false
          description: Airbnb domain to use. Affects language and regional results.
          schema:
            type: string
            enum: ["airbnb.com", "sw.airbnb.com", "sq.airbnb.com", "ar.airbnb.com", "airbnb.com.ar", "airbnb.am", "airbnb.com.au", "airbnb.at", "airbnb.az", "airbnb.be", "fr.airbnb.be", "airbnb.com.bz", "airbnb.com.bo", "airbnb.ba", "airbnb.com.br", "bg.airbnb.com", "airbnb.ca", "fr.airbnb.ca", "airbnb.cl", "airbnb.cn", "airbnb.com.co", "airbnb.co.cr", "hr.airbnb.com", "airbnb.cz", "airbnb.dk", "airbnb.com.ec", "airbnb.com.sv", "airbnb.com.ee", "airbnb.fi", "airbnb.fr", "ka.airbnb.com", "airbnb.de", "airbnb.gr", "airbnb.com.gt", "airbnb.gy", "airbnb.com.hn", "airbnb.com.hk", "airbnb.hu", "airbnb.is", "airbnb.co.in", "hi.airbnb.co.in", "kn.airbnb.co.in", "mr.airbnb.co.in", "airbnb.co.id", "airbnb.ie", "ga.airbnb.ie", "he.airbnb.com", "airbnb.it", "airbnb.jp", "airbnb.lv", "airbnb.lt", "airbnb.lu", "de.airbnb.lu", "airbnb.com.my", "mt.airbnb.com.mt", "airbnb.mx", "airbnb.me", "airbnb.nl", "airbnb.co.nz", "airbnb.com.ni", "mk.airbnb.com", "airbnb.no", "airbnb.com.pa", "airbnb.com.py", "airbnb.com.pe", "airbnb.com.ph", "airbnb.pl", "airbnb.pt", "airbnb.com.ro", "airbnb.ru", "airbnb.rs", "airbnb.com.sg", "sk.airbnb.com", "airbnb.si", "xh.airbnb.co.za", "zu.airbnb.co.za", "airbnb.co.kr", "airbnb.cat", "airbnb.es", "airbnb.se", "fr.airbnb.ch", "airbnb.ch", "it.airbnb.ch", "airbnb.com.tw", "th.airbnb.com", "airbnb.com.tr", "airbnb.com.ua", "airbnb.ae", "airbnb.co.uk", "zh.airbnb.com", "zh-t.airbnb.com", "es.airbnb.com", "airbnb.co.ve", "airbnb.com.vn"]
            default: "airbnb.com"
        - name: currency
          in: query
          required: false
          description: Currency code for pricing. Must be uppercased.
          schema:
            type: string
            enum: ["USD", "AUD", "BRL", "BGN", "BAM", "CAD", "CLP", "CNY", "COP", "CRC", "CZK", "DKK", "EGP", "AED", "EUR", "GHS", "GTQ", "HNL", "HKD", "HUF", "INR", "IDR", "ILS", "JPY", "KZT", "KES", "MYR", "MXN", "MAD", "TWD", "NZD", "NOK", "PEN", "PHP", "PLN", "GBP", "QAR", "RON", "RUB", "SAR", "SGD", "ZAR", "KRW", "SEK", "CHF", "THB", "TRY", "UGX", "UAH", "UYU", "VND"]
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExperienceDetailsResponse'
        '400':
          description: Validation Error. There is an issue with query parameters, such as missing required parameters or invalid values.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Authentication Error. The API key is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate Limit Exceeded. The number of allowed requests has been exceeded. Consider upgrading your plan or waiting for the limit to reset.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Server Error. Internal server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: Timeout. We could not retrieve results in 90 seconds.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: 'Use Bearer authentication. Format: "Bearer YOUR_API_KEY"'
    ApiKeyQuery:
      type: apiKey
      in: query
      name: api_key
      description: Pass API key as query parameter
  schemas:
    ExperienceDetailsResponse:
      type: object
      properties:
        search_metadata:
          $ref: '#/components/schemas/SearchMetadata'
        search_parameters:
          $ref: '#/components/schemas/SearchParameters'
        experience:
          $ref: '#/components/schemas/Experience'
        host:
          $ref: '#/components/schemas/Host'
        reviews:
          type: array
          description: List of reviews for this experience
          items:
            $ref: '#/components/schemas/Review'
        similar_experiences:
          type: array
          description: List of similar experiences suggested by Airbnb
          items:
            $ref: '#/components/schemas/SimilarExperience'
        error:
          type: string
          description: Error message when no results are found

    SearchMetadata:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier for the search request
        status:
          type: string
          description: Status of the search request
        created_at:
          type: string
          format: date-time
          description: Timestamp when the search was created
        request_time_taken:
          type: number
          description: Time taken to make the request in seconds
        parsing_time_taken:
          type: number
          description: Time taken to parse the results in seconds
        total_time_taken:
          type: number
          description: Total time taken for the search in seconds
        request_url:
          type: string
          description: Airbnb URL for this experience
        html_url:
          type: string
          description: URL to view HTML results
        json_url:
          type: string
          description: URL to view JSON results

    SearchParameters:
      type: object
      properties:
        engine:
          type: string
          description: Search engine used
        airbnb_domain:
          type: string
          description: Airbnb domain used
        currency:
          type: string
          description: Currency code for pricing
        experience_id:
          type: string
          description: Airbnb experience ID

    Experience:
      type: object
      properties:
        id:
          type: string
          description: Unique experience ID
        title:
          type: string
          description: Experience title
        description:
          type: string
          description: Short description or byline of the experience
        link:
          type: string
          description: URL to the experience details page
        product_type:
          type: string
          description: Type of the experience product
        category:
          type: string
          description: Primary category of the experience
        rating:
          type: number
          format: float
          description: Average rating score
        reviews:
          type: integer
          description: Total number of reviews
        language:
          type: string
          description: Language and duration description of the experience
        is_upgraded:
          type: boolean
          description: Whether the experience has been upgraded
        meeting_types:
          type: array
          description: Types of meetings available (e.g., in-person, online)
          items:
            type: string
        meeting_point:
          type: string
          description: Host-supplied meeting point label (e.g., "Saint-Germain-des-Près Workshop")
        vetting:
          $ref: '#/components/schemas/ExperienceVetting'
        pre_screening_help_link:
          type: string
          description: URL to the Airbnb help-center article about host pre-screening
        location:
          $ref: '#/components/schemas/ExperienceLocation'
        price:
          $ref: '#/components/schemas/ExperiencePrice'
        cover_image:
          type: string
          description: URL of the hero image Airbnb selects for the experience
        media:
          type: array
          description: Photos and videos of the experience
          items:
            $ref: '#/components/schemas/Medium'
        highlights:
          type: array
          description: Key highlights of the experience
          items:
            $ref: '#/components/schemas/Highlight'
        agenda_preamble:
          type: string
          description: Introductory text Airbnb shows above the agenda items
        agenda:
          type: array
          description: Itinerary or agenda items for the experience
          items:
            $ref: '#/components/schemas/AgendaItem'
        next_available_start_at_utc:
          type: string
          format: date-time
          description: ISO-8601 UTC timestamp of the next upcoming instance of the experience
        availability:
          type: array
          description: Available time slots for the experience
          items:
            $ref: '#/components/schemas/TimeSlot'
        guest_requirements:
          $ref: '#/components/schemas/GuestRequirements'
        things_to_know:
          type: array
          description: Important information and guidelines for the experience
          items:
            $ref: '#/components/schemas/ThingToKnow'
        accessibility_features:
          type: array
          description: Accessibility features available for the experience
          items:
            $ref: '#/components/schemas/AccessibilityFeature'
        accessibility_help_link:
          type: string
          description: URL to the Airbnb help-center article about accessibility features
        cancellation_policy:
          $ref: '#/components/schemas/CancellationPolicy'

    ExperienceLocation:
      type: object
      properties:
        address:
          type: string
          description: Formatted address of the experience location
        locality:
          type: string
          description: City or locality name
        administrative_zone:
          type: string
          description: State, province, or administrative zone
        country:
          type: string
          description: Country name
        display_label:
          type: string
          description: Display label for the location
        latitude:
          type: number
          format: float
          description: Latitude coordinate
        longitude:
          type: number
          format: float
          description: Longitude coordinate

    ExperienceVetting:
      type: object
      properties:
        title:
          type: string
          description: Vetting headline (e.g., "Cooking classes are vetted for quality")
        subtitle:
          type: string
          description: Supporting copy explaining the vetting program
        image:
          type: string
          description: URL of the badge image Airbnb shows alongside the vetting copy
        help_center_link:
          type: string
          description: URL to the Airbnb help-center article describing the vetting program

    ExperiencePrice:
      type: object
      properties:
        price_label:
          type: string
          description: Full price label with accessibility text
        price:
          type: string
          description: Discounted price display text
        extracted_price:
          type: number
          format: float
          description: Numeric price value extracted from the price text
        qualifier:
          type: string
          description: Price qualifier text (e.g., per person)
        original_price:
          type: string
          description: Original (pre-discount) price display text. Present only when a discount is applied.
        extracted_original_price:
          type: number
          format: float
          description: Numeric original price value extracted from original_price. Present only when a discount is applied.
        notes:
          type: array
          description: Explanatory notes Airbnb attaches to the price (e.g., "Early bird discount applied"). Present only when the source returns explanation entries.
          items:
            type: string
        breakdown:
          type: array
          description: Detailed price breakdown items
          items:
            $ref: '#/components/schemas/PriceBreakdownItem'

    PriceBreakdownItem:
      type: object
      properties:
        description:
          type: string
          description: Breakdown item description
        price:
          type: string
          description: Breakdown item price display text
        extracted_price:
          type: number
          format: float
          description: Numeric breakdown item price

    Medium:
      type: object
      properties:
        type:
          type: string
          description: Media type
          enum: ["image", "video"]
        image:
          type: string
          description: Image URL
        caption:
          type: string
          description: Caption or alt text for the media
        width:
          type: integer
          description: Width of the media in pixels
        height:
          type: integer
          description: Height of the media in pixels
        orientation:
          type: string
          description: Orientation of the media
        hls_url:
          type: string
          description: HLS video stream URL (for video type)
        mp4_url:
          type: string
          description: MP4 video URL (for video type)

    Highlight:
      type: object
      properties:
        type:
          type: string
          description: Highlight type identifier
        name:
          type: string
          description: Highlight name
        description:
          type: string
          description: Highlight description
        image:
          type: string
          description: Highlight image URL

    AgendaItem:
      type: object
      properties:
        position:
          type: integer
          description: Position of the agenda item in the itinerary
        title:
          type: string
          description: Agenda item title
        description:
          type: string
          description: Agenda item description
        image:
          type: string
          description: Cover image URL for the agenda item

    TimeSlot:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier of the time slot
        day:
          type: string
          description: Day of the time slot
        duration:
          type: string
          description: Duration of the time slot
        start_time:
          type: string
          description: Start time of the time slot
        availability_description:
          type: string
          description: Description of availability status
        is_available:
          type: boolean
          description: Whether the time slot is available for booking
        has_low_remaining_availability:
          type: boolean
          description: Whether the time slot has low remaining availability
        remaining_capacity:
          type: integer
          description: Number of remaining spots available
        maximum_capacity:
          type: integer
          description: Maximum number of guests for this time slot

    GuestRequirements:
      type: object
      properties:
        min_age:
          type: integer
          description: Minimum age required for guests
        is_min_age_enabled:
          type: boolean
          description: Whether the minimum age requirement is enabled
        is_children_allowed:
          type: boolean
          description: Whether children are allowed
        children_min_age:
          type: integer
          description: Minimum age for children
        children_max_age:
          type: integer
          description: Maximum age for children
        is_infants_allowed:
          type: boolean
          description: Whether infants are allowed

    ThingToKnow:
      type: object
      properties:
        type:
          type: string
          description: Type identifier for the thing to know
        title:
          type: string
          description: Title of the thing to know
        description:
          type: string
          description: Description text
        icon:
          type: string
          description: Icon identifier

    AccessibilityFeature:
      type: object
      properties:
        type:
          type: string
          description: Accessibility feature type identifier
        name:
          type: string
          description: Accessibility feature name

    CancellationPolicy:
      type: object
      properties:
        type:
          type: string
          description: Cancellation policy type identifier
        name:
          type: string
          description: Cancellation policy name
        description:
          type: string
          description: Cancellation policy description
        icon:
          type: string
          description: Icon identifier for the cancellation policy (e.g., "SYSTEM_CALENDAR")

    Host:
      type: object
      properties:
        id:
          type: string
          description: Unique host identifier
        name:
          type: string
          description: Host display name
        profile_link:
          type: string
          description: URL to the host's Airbnb profile page
        title:
          type: string
          description: Host title text
        about:
          type: string
          description: About the host text
        tagline:
          type: string
          description: Host tagline (one-line UGC subtitle)
        avatar:
          type: string
          description: Host profile picture URL

    Review:
      type: object
      properties:
        review_id:
          type: string
          description: Unique review identifier
        text:
          type: string
          description: Review text content
        highlighted_comment:
          type: string
          description: Search-highlight snippet Airbnb renders on the review preview card
        source_locale:
          type: string
          description: Locale code of the original review (e.g., "en", "fr")
        translated_to_locale:
          type: string
          description: Locale code the review text was translated to. Differs from source_locale only when translation occurred.
        rating:
          type: integer
          description: Review rating score
        date:
          type: string
          description: Date when the review was posted
        user:
          $ref: '#/components/schemas/User'

    User:
      type: object
      properties:
        id:
          type: string
          description: Unique user identifier
        name:
          type: string
          description: User display name
        location:
          type: string
          description: User location
        avatar:
          type: string
          description: User profile picture URL

    SimilarExperience:
      type: object
      properties:
        id:
          type: string
          description: Unique experience ID
        title:
          type: string
          description: Experience title
        link:
          type: string
          description: URL to the experience details page
        category:
          type: string
          description: Primary category of the experience
        rating:
          type: number
          format: float
          description: Average rating score
        reviews:
          type: integer
          description: Total number of reviews
        price:
          type: string
          description: Price display text
        extracted_price:
          type: number
          format: float
          description: Numeric price value extracted from the price text
        duration:
          type: string
          description: Duration of the experience formatted as a human-readable string (e.g., "1h 30m")
        location:
          type: string
          description: Locality where the experience takes place
        images:
          type: array
          description: Array of image URLs for the experience
          items:
            type: string

    ErrorResponse:
      type: object
      required: [error]
      properties:
        error:
          type: string
          description: Error message describing what went wrong
