For the complete documentation index, see llms.txt. This page is also available as Markdown.

Airbnb API

API Methods to works with Airbnb connection

This section contain infromation about API related to Airbnb functionality such us:

  • Manage listing settings

  • Manage Promotions, Opportunities and Checkout Tasks

  • Work with Inquiry, Reservation and Alteration requests

All information about creating connection between Channex and Airbnb you can find at page Channel API Examples / Airbnb.

Manage Listing settings

Listing Publishing

A listing is published (open for booking) or unpublished on Airbnb through the connection:

Publish a listing

put
/channels/{channel_id}/execute/publish

Publish an Airbnb listing: the listing's availability is switched on at Airbnb, and the published state is recorded on the listing's mapping. Publishing a listing that is already published succeeds without changes.

For Airbnb channel connections; other channels receive 400 Bad Request.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Body

The listing an action applies to.

listing_idstringRequired

Airbnb listing ID.

Example: 54843145465465419
Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

put/channels/{channel_id}/execute/publish
PUT /api/v1/channels/{channel_id}/execute/publish HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 34

{
  "listing_id": "54843145465465419"
}
{
  "data": {
    "published": true
  }
}

Unpublish a listing

put
/channels/{channel_id}/execute/unpublish

Unpublish an Airbnb listing: the listing's availability is switched off at Airbnb with the given deactivation reason, and the published state is recorded on the listing's mapping. Unpublishing a listing that is already unpublished succeeds without changes.

The valid reasons come from the unpublish-reasons questionnaire — see GET /channels/{channel_id}/action/get_unpublish_reasons.

For Airbnb channel connections; other channels receive 400 Bad Request.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Body

Unpublish parameters of an Airbnb listing.

listing_idstringRequired

Airbnb listing ID.

Example: 54843145465465419
deactivation_reasonstringOptional

Reason the listing is unlisted, as Airbnb expects it — a value from the unpublish-reasons questionnaire (see GET /channels/{channel_id}/action/get_unpublish_reasons). Defaults to OtherReason.

Example: MoveOutOrSellPlace
deactivation_detailsstringOptional

Free-text details accompanying the reason.

Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

put/channels/{channel_id}/execute/unpublish
PUT /api/v1/channels/{channel_id}/execute/unpublish HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 107

{
  "listing_id": "54843145465465419",
  "deactivation_reason": "MoveOutOrSellPlace",
  "deactivation_details": "text"
}
{
  "data": {
    "published": false
  }
}

Unpublishing takes a deactivation reason. The valid reasons — with the question texts to show a host — come from Airbnb's questionnaire:

Retrieve the unpublish reasons

get
/channels/{channel_id}/action/get_unpublish_reasons

Retrieve Airbnb's unpublish-reasons questionnaire: the questions a host answers when unlisting, with their nested answer choices. The choice values are submitted as the deactivation_reason of an unpublish request. The questionnaire is requested from Airbnb.

For Airbnb channel connections; other channels receive 400 Bad Request.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Query parameters
localestringOptional

Locale of the questionnaire texts. Defaults to en.

Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

get/channels/{channel_id}/action/get_unpublish_reasons
GET /api/v1/channels/{channel_id}/action/get_unpublish_reasons HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
  "data": {
    "flows": [
      {
        "slug": "LISTING_DEACTIVATION",
        "description": "Listing Deactivation Flow",
        "questions": [
          {
            "key": "deactivation_reason",
            "answer_key": "deactivation_reason",
            "type": "RADIO_TIERED",
            "is_required": true,
            "answer_editable": true,
            "description": "text",
            "choices": "[Circular Reference]"
          }
        ]
      }
    ]
  }
}

Availability Settings

Manage lead time, notice, min/max stay, check-in/check-out days, turnover.

Retrieve the availability settings of a listing

get
/channels/{channel_id}/mappings/{id}/availability_settings

Retrieve the Airbnb availability settings of a mapped listing: booking lead time, how far ahead the listing can be booked, night-count limits and check-in/check-out weekday rules.

Listings on Airbnb's standard pricing model report the check-in and check-out weekday flags; listings on the length-of-stay pricing model report default_min_nights. The settings are read as stored on the mapping — nothing is requested from Airbnb. For Airbnb channel connections.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
idstring · uuidRequired

Mapping ID — see rate_plans[].id of the channel connection.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

get/channels/{channel_id}/mappings/{id}/availability_settings
GET /api/v1/channels/{channel_id}/mappings/{id}/availability_settings HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
  "data": {
    "type": "airbnb_listing_availability_settings",
    "id": "716305c4-561a-4561-a187-7f5b8aeb5920",
    "attributes": {
      "booking_lead_time": 0,
      "max_days_notice": -1,
      "allow_rtb_beyond_max_days_notice": false,
      "default_min_nights": 1,
      "default_max_nights": 0,
      "allow_rtb_above_max_nights": false,
      "day_of_week_check_in": [
        true
      ],
      "day_of_week_check_out": [
        true
      ],
      "day_of_week_min_nights": [
        1
      ],
      "seasonal_min_nights": [
        {
          "start_date": "2026-01-01",
          "end_date": "2026-01-01",
          "min_nights": 1
        }
      ],
      "turnover_days": 0
    }
  }
}

Update the availability settings of a listing

put
/channels/{channel_id}/mappings/{id}/availability_settings

Update the Airbnb availability settings of a mapped listing. The changes are pushed to Airbnb and stored on the mapping; a change of max_days_notice additionally triggers a full synchronisation of the connection. Returns the updated availability settings.

Supported for Airbnb channel connections; other channels receive 400 Bad Request.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
idstring · uuidRequired

Mapping ID — see rate_plans[].id of the channel connection.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Body

Request body of the availability settings update.

Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

put/channels/{channel_id}/mappings/{id}/availability_settings
PUT /api/v1/channels/{channel_id}/mappings/{id}/availability_settings HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 362

{
  "availability_settings": {
    "booking_lead_time": 0,
    "max_days_notice": -1,
    "allow_rtb_beyond_max_days_notice": false,
    "default_min_nights": 1,
    "default_max_nights": 0,
    "allow_rtb_above_max_nights": false,
    "day_of_week_check_in": [
      true
    ],
    "day_of_week_check_out": [
      true
    ],
    "seasonal_min_nights": [
      {
        "start_date": "2026-01-01",
        "end_date": "2026-01-01",
        "min_nights": 1
      }
    ],
    "turnover_days": 0
  }
}
{
  "data": {
    "type": "airbnb_listing_availability_settings",
    "id": "716305c4-561a-4561-a187-7f5b8aeb5920",
    "attributes": {
      "booking_lead_time": 0,
      "max_days_notice": -1,
      "allow_rtb_beyond_max_days_notice": false,
      "default_min_nights": 1,
      "default_max_nights": 0,
      "allow_rtb_above_max_nights": false,
      "day_of_week_check_in": [
        true
      ],
      "day_of_week_check_out": [
        true
      ],
      "day_of_week_min_nights": [
        1
      ],
      "seasonal_min_nights": [
        {
          "start_date": "2026-01-01",
          "end_date": "2026-01-01",
          "min_nights": 1
        }
      ],
      "turnover_days": 0
    }
  }
}

Pricing Settings

Manage currency, default and weekend prices, guest counts, fees, taxes.

Retrieve the pricing settings of a listing

get
/channels/{channel_id}/mappings/{id}/pricing_settings

Retrieve the Airbnb pricing settings of a mapped listing: currency, nightly prices, included guests, pass-through occupancy taxes, standard fees and default pricing rules. The response also reports the default and the allowed pass-through-tax collection types of the listing.

The settings are read as stored on the mapping — nothing is requested from Airbnb. For Airbnb channel connections.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
idstring · uuidRequired

Mapping ID — see rate_plans[].id of the channel connection.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

get/channels/{channel_id}/mappings/{id}/pricing_settings
GET /api/v1/channels/{channel_id}/mappings/{id}/pricing_settings HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
  "data": {
    "type": "airbnb_listing_pricing_settings",
    "id": "716305c4-561a-4561-a187-7f5b8aeb5920",
    "attributes": {
      "currency": "USD",
      "default_daily_price": 100,
      "weekend_price": 150,
      "guests_included": 1,
      "price_per_extra_person": 20,
      "pass_through_taxes_collection_type": "NO_AIRBNB_COLLECTED_TAX",
      "pass_through_taxes": [
        {
          "tax_type": "pass_through_hotel_tax",
          "amount": 1,
          "amount_type": "percent_per_reservation",
          "taxable_base": [
            "base_price"
          ],
          "business_tax_id": "text",
          "no_business_tax_id_declaration": true,
          "tot_registration_id": "text",
          "no_tot_registration_id_declaration": true,
          "attestation": true,
          "long_term_stay_exemption": 1,
          "only_first_nights_exemption": 1,
          "max_cap_per_person_per_night": 1
        }
      ],
      "standard_fees": [
        {
          "fee_type": "PASS_THROUGH_CLEANING_FEE",
          "offline": false,
          "amount_type": "flat",
          "amount": 15,
          "fee_unit_type": "PER_KILOWATT_HOUR",
          "charge_type": "PER_GROUP",
          "charge_period": "PER_BOOKING"
        }
      ],
      "default_pricing_rules": [
        {
          "rule_type": "STAYED_AT_LEAST_X_DAYS",
          "price_change": 10,
          "threshold_one": 7
        }
      ],
      "default_pass_through_taxes_collection_type": "NO_AIRBNB_COLLECTED_TAX",
      "allowed_pass_through_taxes_collection_types": [
        "NO_AIRBNB_COLLECTED_TAX"
      ]
    }
  }
}

Update the pricing settings of a listing

put
/channels/{channel_id}/mappings/{id}/pricing_settings

Update the Airbnb pricing settings of a mapped listing. The changes are pushed to Airbnb, stored on the mapping, and followed by a full synchronisation of the connection; settings identical to the stored ones are not re-sent. Returns the updated pricing settings.

Supported for Airbnb channel connections; other channels receive 400 Bad Request.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
idstring · uuidRequired

Mapping ID — see rate_plans[].id of the channel connection.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Body

Request body of the pricing settings update.

Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

put/channels/{channel_id}/mappings/{id}/pricing_settings
PUT /api/v1/channels/{channel_id}/mappings/{id}/pricing_settings HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 823

{
  "pricing_settings": {
    "currency": "USD",
    "default_daily_price": 100,
    "weekend_price": 150,
    "guests_included": 1,
    "price_per_extra_person": 20,
    "pass_through_taxes": [
      {
        "tax_type": "pass_through_hotel_tax",
        "amount": 1,
        "amount_type": "percent_per_reservation",
        "taxable_base": [
          "base_price"
        ],
        "business_tax_id": "text",
        "no_business_tax_id_declaration": true,
        "tot_registration_id": "text",
        "no_tot_registration_id_declaration": true,
        "attestation": true,
        "long_term_stay_exemption": 1,
        "only_first_nights_exemption": 1,
        "max_cap_per_person_per_night": 1
      }
    ],
    "standard_fees": [
      {
        "fee_type": "PASS_THROUGH_CLEANING_FEE",
        "offline": false,
        "amount_type": "flat",
        "amount": 15,
        "fee_unit_type": "PER_KILOWATT_HOUR",
        "charge_type": "PER_GROUP",
        "charge_period": "PER_BOOKING"
      }
    ],
    "default_pricing_rules": [
      {
        "rule_type": "STAYED_AT_LEAST_X_DAYS",
        "price_change": 10,
        "threshold_one": 7
      }
    ]
  }
}
{
  "data": {
    "type": "airbnb_listing_pricing_settings",
    "id": "716305c4-561a-4561-a187-7f5b8aeb5920",
    "attributes": {
      "currency": "USD",
      "default_daily_price": 100,
      "weekend_price": 150,
      "guests_included": 1,
      "price_per_extra_person": 20,
      "pass_through_taxes_collection_type": "NO_AIRBNB_COLLECTED_TAX",
      "pass_through_taxes": [
        {
          "tax_type": "pass_through_hotel_tax",
          "amount": 1,
          "amount_type": "percent_per_reservation",
          "taxable_base": [
            "base_price"
          ],
          "business_tax_id": "text",
          "no_business_tax_id_declaration": true,
          "tot_registration_id": "text",
          "no_tot_registration_id_declaration": true,
          "attestation": true,
          "long_term_stay_exemption": 1,
          "only_first_nights_exemption": 1,
          "max_cap_per_person_per_night": 1
        }
      ],
      "standard_fees": [
        {
          "fee_type": "PASS_THROUGH_CLEANING_FEE",
          "offline": false,
          "amount_type": "flat",
          "amount": 15,
          "fee_unit_type": "PER_KILOWATT_HOUR",
          "charge_type": "PER_GROUP",
          "charge_period": "PER_BOOKING"
        }
      ],
      "default_pricing_rules": [
        {
          "rule_type": "STAYED_AT_LEAST_X_DAYS",
          "price_change": 10,
          "threshold_one": 7
        }
      ],
      "default_pass_through_taxes_collection_type": "NO_AIRBNB_COLLECTED_TAX",
      "allowed_pass_through_taxes_collection_types": [
        "NO_AIRBNB_COLLECTED_TAX"
      ]
    }
  }
}

Booking Settings

Instant Book rules, check-in and check-out times, cancellation policies, guest controls, listing expectations.

Update the booking settings of a listing

put
/channels/{channel_id}/execute/update_booking_setting

Update the booking settings of an Airbnb listing: Instant Book rules, check-in and check-out times, cancellation policies, guest controls, and the expectations guests must agree to before booking. The listing is addressed by the rate plan mapping given in channel_rate_plan_id.

The settings are submitted to Airbnb, merged into the settings stored on the mapping, and returned; an ARI synchronization of the mapping is performed in the background. Submitting settings identical to the stored ones succeeds without changes.

For Airbnb channel connections; other channels receive 400 Bad Request.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Body

Booking settings update for an Airbnb listing.

channel_rate_plan_idstring · uuidRequiredExample: 716305c4-561a-4561-a187-7f5b8aeb5920
Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

put/channels/{channel_id}/execute/update_booking_setting
PUT /api/v1/channels/{channel_id}/execute/update_booking_setting HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 695

{
  "channel_rate_plan_id": "b217a47d-c282-4591-a873-7758f2883237",
  "data": {
    "instant_booking_allowed_category": "everyone",
    "instant_book_welcome_message": "text",
    "check_in_time_start": "13",
    "check_in_time_end": "16",
    "check_out_time": 11,
    "cancellation_policy_settings": {
      "cancellation_policy_category": "flexible",
      "lts_cancellation_policy_id": "CANCEL_LONG_TERM_FAIR",
      "non_refundable_price_factor": 1
    },
    "guest_controls": {
      "allows_children_as_host": true,
      "allows_infants_as_host": true,
      "children_not_allowed_details": "text",
      "allows_pets_as_host": true,
      "pet_capacity": 1,
      "allows_smoking_as_host": true,
      "allows_events_as_host": true
    },
    "listing_expectations_for_guests": [
      {
        "type": "requires_stairs",
        "added_details": "text"
      }
    ]
  }
}
{
  "data": {
    "instant_booking_allowed_category": "everyone",
    "instant_book_welcome_message": "text",
    "check_in_time_start": "13",
    "check_in_time_end": "16",
    "check_out_time": 11,
    "cancellation_policy_settings": {
      "cancellation_policy_category": "flexible",
      "lts_cancellation_policy_id": "CANCEL_LONG_TERM_FAIR",
      "non_refundable_price_factor": 1
    },
    "guest_controls": {
      "allows_children_as_host": true,
      "allows_infants_as_host": true,
      "children_not_allowed_details": "text",
      "allows_pets_as_host": true,
      "pet_capacity": 1,
      "allows_smoking_as_host": true,
      "allows_events_as_host": true
    },
    "listing_expectations_for_guests": [
      {
        "type": "requires_stairs",
        "added_details": "text"
      }
    ]
  }
}

Promotions

List the promotions of the connection's listings, and enable or disable one on a listing.

List promotions

get
/channels/{channel_id}/promotions

List the promotions of the channel connection's Airbnb listings. The promotions are requested from Airbnb for every mapped listing and merged with the promotions recorded on the connection's rate plan mappings.

For Airbnb channel connections; other channels receive 403 Forbidden.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Responses
200

The request has succeeded.

application/json

A plain data-array envelope without pagination — used by reference/dictionary endpoints.

get/channels/{channel_id}/promotions
GET /api/v1/channels/{channel_id}/promotions HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
  "data": [
    {
      "type": "promotion",
      "attributes": {
        "status": "ONGOING",
        "type": "NEW_LISTING_PROMOTION",
        "listing_id": "123456789"
      }
    }
  ]
}

Enable a promotion

post
/channels/{channel_id}/promotions/enable

Enable a promotion on an Airbnb listing of the channel connection. The promotion is submitted to Airbnb; the response reports it as ONGOING.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Body

Request body of the promotion enable and disable actions.

Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

post/channels/{channel_id}/promotions/enable
POST /api/v1/channels/{channel_id}/promotions/enable HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 71

{
  "promotion": {
    "type": "NEW_LISTING_PROMOTION",
    "listing_id": "123456789"
  }
}
{
  "data": {
    "type": "promotion",
    "attributes": {
      "status": "ONGOING",
      "type": "NEW_LISTING_PROMOTION",
      "listing_id": "123456789"
    }
  }
}

Disable a promotion

post
/channels/{channel_id}/promotions/disable

Disable a promotion on an Airbnb listing of the channel connection. The promotion is withdrawn from Airbnb; the response reports it as AVAILABLE again.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Body

Request body of the promotion enable and disable actions.

Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

post/channels/{channel_id}/promotions/disable
POST /api/v1/channels/{channel_id}/promotions/disable HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 71

{
  "promotion": {
    "type": "NEW_LISTING_PROMOTION",
    "listing_id": "123456789"
  }
}
{
  "data": {
    "type": "promotion",
    "attributes": {
      "status": "ONGOING",
      "type": "NEW_LISTING_PROMOTION",
      "listing_id": "123456789"
    }
  }
}

Opportunities

Airbnb suggests per-listing improvements and discount programs — opportunities. List them and apply one to listings:

List opportunities

get
/channels/{channel_id}/action/get_opportunities

List the Airbnb opportunities available to the connection's listings: suggested improvements and discount programs, each with its input fields, their value constraints, the listings it applies to, and the share of listings that already completed it. The opportunities are requested from Airbnb, all pages included.

For Airbnb channel connections; other channels receive 400 Bad Request.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

get/channels/{channel_id}/action/get_opportunities
GET /api/v1/channels/{channel_id}/action/get_opportunities HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
  "data": {
    "opportunities": [
      {
        "id": "OLYMPUS_WEEKLY_DISCOUNT",
        "type": "OLYMPUS_WEEKLY_DISCOUNT",
        "title": "Offer weekly discounts",
        "description": "text",
        "input_fields": [
          {
            "key": "losSettings.minNights",
            "key_label": "text",
            "value_constraint": {
              "value_type": "PERCENTAGE",
              "min_value": "text",
              "max_value": "text",
              "options": [
                "text"
              ]
            }
          }
        ],
        "activation_modes": [
          "API",
          "MANUAL"
        ],
        "activation_url": "text",
        "applicable_listing_ids": [
          "text"
        ],
        "host_completion_percentage": 1
      }
    ]
  }
}

Apply an opportunity

post
/channels/{channel_id}/action/apply_opportunity

Apply an Airbnb opportunity to listings of the channel connection. The application is submitted to Airbnb with the values given in input_fields, where the opportunity defines any.

For Airbnb channel connections; other channels receive 400 Bad Request.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Body

Request payload of an opportunity application.

Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

dataobject · Channels.AirbnbOpportunityApplyResultRequired

Airbnb's response to the opportunity application. Reports success: true when the opportunity is applied.

post/channels/{channel_id}/action/apply_opportunity
POST /api/v1/channels/{channel_id}/action/apply_opportunity HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 95

{
  "opportunity": {
    "opportunity": "OLYMPUS_IRON_AMENITY",
    "listing_ids": [
      "text"
    ],
    "input_fields": {}
  }
}
{
  "data": {}
}

Checkout Tasks

What departing guests are asked to do — read and update per listing:

Retrieve the checkout tasks of a listing

get
/channels/{channel_id}/action/get_checkout_tasks

Retrieve the checkout tasks of an Airbnb listing — what departing guests are asked to do. The tasks are requested from Airbnb and keyed by their canonical uppercase names (RETURN_KEYS, TURN_THINGS_OFF, …); tasks that were never set are absent.

For Airbnb channel connections; other channels receive 400 Bad Request.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Query parameters
listing_idstringRequired

Airbnb listing ID.

Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

get/channels/{channel_id}/action/get_checkout_tasks
GET /api/v1/channels/{channel_id}/action/get_checkout_tasks?listing_id=text HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
  "data": {
    "checkout_tasks": {}
  }
}

Update the checkout tasks of a listing

post
/channels/{channel_id}/action/update_checkout_tasks

Update the checkout tasks of an Airbnb listing. The submitted map is sent to Airbnb as the complete set of tasks, keyed by the lowercase task names (return_keys, turn_things_off, throw_trash, lock_up, gather_towels, additional_requests); the response returns the submitted tasks.

For Airbnb channel connections; other channels receive 400 Bad Request.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Query parameters
listing_idstringRequired

Airbnb listing ID.

Body

The checkout tasks of an Airbnb listing, keyed by task. The tasks: return_keys, turn_things_off, throw_trash, lock_up, gather_towels, additional_requests.

checkout_tasksobjectRequired
Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

post/channels/{channel_id}/action/update_checkout_tasks
POST /api/v1/channels/{channel_id}/action/update_checkout_tasks?listing_id=text HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 21

{
  "checkout_tasks": {}
}
{
  "data": {
    "checkout_tasks": {}
  }
}

Listing Calendar API

Retrieve the calendar of a listing

get
/channels/{channel_id}/action/get_listing_calendar

Retrieve the availability and pricing calendar of an Airbnb listing for a date range, day by day: availability with its type and sub-type, price, stay restrictions, and closed-to-arrival and closed-to-departure flags.

The calendar is requested from Airbnb. For Airbnb channel connections; other channels receive 400 Bad Request.

Authorizations
user-api-keystringRequired

API key for programmatic access, sent in the user-api-key header.

Path parameters
channel_idstring · uuidRequired

Channel connection ID.

Example: 716305c4-561a-4561-a187-7f5b8aeb5920
Query parameters
listing_idstringRequired

Airbnb listing ID.

date_fromstring · dateRequired

First day of the range.

date_tostring · dateRequired

Last day of the range.

Responses
200

The request has succeeded.

application/json

JSON:API document wrapping a single resource.

get/channels/{channel_id}/action/get_listing_calendar
GET /api/v1/channels/{channel_id}/action/get_listing_calendar?listing_id=text&date_from=2026-01-01&date_to=2026-01-01 HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
  "data": {
    "calendar": {
      "days": [
        {
          "date": "2026-01-01",
          "availability": "unavailable",
          "availability_type": "busy",
          "availability_sub_type": "host_busy",
          "available_count": 1,
          "closed_to_arrival": true,
          "closed_to_departure": true,
          "daily_price": 1,
          "max_nights": 1,
          "min_nights": 1,
          "notes": "text"
        }
      ],
      "start_date": "2026-01-01",
      "end_date": "2026-01-01",
      "host_id": 1,
      "host_id_str": "text",
      "listing_currency": "EUR",
      "listing_id": 1,
      "listing_id_str": "text"
    },
    "success": null
  }
}

Airbnb Booking Requests

Most Airbnb reservations are instant: the guest books, and the booking reaches you as a regular new booking. Three situations instead produce a request that waits for your decision:

Request
What the guest wants
Your options

Inquiry

Asked about a stay without booking it

Pre-approve or send a special offer

Reservation request

Asked to book, rather than booking instantly

Accept or decline

Alteration request

Asked to change an existing booking

Accept, decline, or cancel

All three arrive as live feed events and are answered through a single endpoint: POST /api/v1/live_feed/{id}/resolve.

Receiving requests

Requests reach you in two ways, and both refer to the same live feed event.

Webhooks

Subscribe a webhook to the event kinds you handle:

Webhook event
Fires when

inquiry

A guest inquiry needs an answer

reservation_request

A reservation request needs a decision

alteration_request

An alteration request needs a decision

accepted_reservation

A reservation request was accepted

declined_reservation

A reservation request was declined

See the Webhooks resource for creating and testing subscriptions.

Live Feed API

Poll or re-read requests directly:

GET /api/v1/live_feed is paginated and also accepts filter[property_id], filter[channel_id], filter[group_id] and order[inserted_at]. Events are returned newest first.

Every resolvable event carries payload.resolved. Once a decision has been made, payload.resolution and payload.comment record the outcome and who made it.

Inquiries additionally appear as a system message in the guest's message thread; that message's meta carries the live_feed_event_id of the inquiry, so a messaging integration can answer an inquiry from the thread it arrived in. See the Message Threads resource.

Answering a request

Every answer is the same call — the event ID in the path, a resolution object in the body:

What goes into resolution depends on the request you are answering. All supported decisions:

Request kind

Decision

resolution

Reservation request

Accept

{"accept": true}

Reservation request

Decline

{"accept": false, "reason": "dates_not_available"}

Inquiry

Pre-approve

{"type": "preapproval", "block_instant_booking": true}

Inquiry

Send a special offer

{"type": "special_offer", "total_price": 450}

Alteration request

Accept

{"accept": "accept"}

Alteration request

Decline

{"accept": "decline"}

Alteration request

Withdraw the request

{"accept": "cancel"}

Note that accept is a boolean for reservation requests and a string for alteration requests, and that an inquiry is answered with type rather than accept. Optional fields — decline messages, block_instant_booking — are covered in the section for each request kind below.

The response is the event itself, with payload updated to reflect the decision:

Rules that apply to every kind of request:

  • Only the three request kinds above can be resolved. Any other event kind is rejected with 422 not_supported.

  • A decision is final. Resolving an event that is already resolved returns it unchanged, so a decision cannot be revised afterwards.

  • Fields belonging to another request kind are ignored, so a stray field will not raise an error — double-check you sent the right one.

Errors

Status
Meaning

401

Missing or invalid API key

404

No live feed event with this ID is visible to you

422 bad_request

The request body is malformed

422 validation_error

The resolution was rejected

422 not_supported

This event kind cannot be resolved

503

The channel service is temporarily unavailable — retry

Reservation request

A reservation request (also called Request to Book) is a guest asking to book instead of booking instantly. You have 24 hours to answer. Airbnb blocks the requested dates for that window so the stay cannot be double-sold while you decide.

Connected listings are instant-book by default, but a request still arrives when, for example:

  • the guest books within 48 hours of check-in and picks a custom check-in window outside the listing's check-in times;

  • the guest books inside the listing's booking lead time;

  • the guest does not meet the guest requirements set for instant bookings;

  • the requested stay is longer than the maximum nights allowed for instant bookings, or longer than a seasonal rule permits;

  • the booking falls in an extended availability window or a period opened by an availability override;

  • Airbnb flags the booking as a party risk, or the listing is set up for requests only.

Event payload

bms describes the stay being requested — dates, rooms, guests and prices — in the same attribute format as a booking revision. See the Booking Revisions resource.

Accept

Accepting triggers a charge on the guest's payment method. If the charge fails, the guest gets 24 hours to fix it before the request is voided. Airbnb then re-checks availability and confirms the stay.

Two notifications follow, and they arrive at different times:

  1. accepted_reservation — immediately, confirming your decision was passed to Airbnb.

  2. booking_new (plus the generic booking webhook) — once Airbnb confirms the stay, which is when the booking itself is created. Until then no booking exists in Channex.

Decline

Field
Description

accept

false to decline

reason

Why you are declining: dates_not_available, not_a_good_fit, waiting_for_better_reservation, not_comfortable. Defaults to not_comfortable

decline_message_to_guest

Shown to the guest

decline_message_to_airbnb

Sent to Airbnb only

Declining sends a declined_reservation webhook. No booking is created.

The dates may stay blocked. If you decline because the dates are unavailable, or let the request expire without answering, Airbnb keeps the dates blocked until you make them available again. Declines for other reasons release the dates.

Once resolved, the event's payload.resolution reads accepted or declined, and payload.comment records who decided and when.

Inquiry

An inquiry is a guest who picked dates and messaged you instead of booking. You answer it with a pre-approval or a special offer — those are the only two answers — and the guest has 24 hours to accept, which confirms the reservation immediately. To turn a guest down, leave the message unanswered.

Event payload

booking_details holds the stay the guest asked about, including guest counts and the listing currency. status carries the inquiry's status as it arrived from Airbnb; once you answer, it names what you sent instead.

Pre-approval

An invitation to book at the listing's current price, for exactly the dates and guest count in the inquiry:

Field
Description

type

preapproval

block_instant_booking

Blocks other guests from taking the same dates through Instant Book while the pre-approval is pending. Defaults to false

Things to know about pre-approvals:

  • You cannot change the price, dates or guest count — only the guest's own inquiry terms can be pre-approved.

  • The resulting reservation shows a single total instead of a fee breakdown; only the cleaning fee is itemised.

  • Because there is no breakdown, later alterations to such a reservation do not recalculate standard fees. Be careful when altering a pre-approved booking.

Special offer

A custom price for the stay, which may also differ from the inquiry in dates:

Field
Description

type

special_offer

total_price

Required. Total price of the whole stay as a whole number in the listing's currency

Things to know about special offers:

  • total_price is a whole number in the listing's currency and must cover all nights and all standard fees, including the cleaning fee. Airbnb does not apply the listing's pricing rules to it and does not add fees on top.

  • Do not include taxes or a security deposit.

  • The Airbnb service fee is deducted from this amount — you receive the price you set minus that fee.

  • The listing's availability rules still apply, so check them before sending the offer.

  • block_instant_booking does not apply to special offers.

  • A special offer carries a total guest count, not a per-category breakdown.

After you answer

  • An inquiry has only these two outcomes. There is no way to decline one: if you do not want the guest, leave the message unanswered and the inquiry lapses on its own.

  • The guest has 24 hours to accept. An offer cannot be withdrawn or changed afterwards.

  • If the guest accepts, the stay arrives as an ordinary new booking (booking_new) — there is no event that ties it back to the offer.

  • Nothing is delivered when an offer expires or the guest declines it.

  • If you send a second offer without the first being accepted, the guest only sees the most recent one; the earlier offer cannot be accepted and expires within 24 hours.

  • Sending offers for the same dates to several guests is possible; the first guest to accept gets the booking.

Once answered, the event's payload.status names what you sent (preapproval or special_offer), payload.resolution holds the resolution you submitted, and payload.comment records who answered and when.

Alteration request

An alteration request is a guest asking to change a booking that is already confirmed — its dates, guest count or price.

Event payload

bms describes the booking as it would be after the change, and carries the booking_id of the booking being altered, so you can compare it against what you hold. See the Booking Revisions resource.

Accept, decline or cancel

Unlike a reservation request, accept here takes a string:

Value
Effect

"accept"

The change is applied

"decline"

The guest's request is refused; the booking stays as it is

"cancel"

The request is withdrawn rather than answered, which Airbnb records as CANCELED

Use decline to refuse a change a guest asked for; cancel withdraws an alteration that originated on your side.

Once resolved, the event's payload.status reports the outcome as ACCEPTED, DECLINED or CANCELED, and payload.comment records who decided and when. payload.resolution holds the value you sent — or accepted / cancelled when the request was resolved on Airbnb instead.

What follows

  • Accepting does not create a new booking. Once Airbnb confirms the change, the existing booking is updated with a new revision, and you receive booking_modification (plus the generic booking webhook). Compare the new revision against what you hold to see what changed.

  • Declining or cancelling sends no notification at all. The only record of the outcome is the live feed event itself, so re-read it with GET /api/v1/live_feed/{id} to confirm your decision was stored.

  • The guest can also withdraw the request on Airbnb before you answer. The event is then marked resolved on its own, again without a notification, so an unanswered request is worth re-reading before acting on it.

  • Live Feed — listing, reading and resolving events.

  • Webhooks — subscribing to request notifications.

  • Booking Revisions — the bms format used by reservation and alteration requests.

  • Message Threads — the guest conversation an inquiry or request arrived in.

  • Bookings — the booking created when a request or offer is accepted.

Last updated