Channel API
API Methods to work with Channels.
This guide describes the core API methods for building a channel mapping UI inside your application.
Connecting a channel: the common flow
Connecting a channel means creating a channel connection — the link between one or more properties and a booking channel, carrying the channel's connection settings and the mappings between the properties' rate plans and the channel's rooms and rates. Every channel defines its own settings and mapping fields, but the connection is built the same way for almost all of them.
Get the adapter descriptor
Every channel is described by an adapter descriptor: the connection settings it needs (params), the fields each mapping needs (rate_params), its restrictions, and whether it connects to a single property or several (property_mapping).
GET /api/v1/channels/adapter?code={code}The catalog of all supported adapters is available at GET /api/v1/channels/list.
Collect the connection settings
Collect a value for each field in params — typically the property's identifier on the channel side (a hotel ID or hotel code), for some channels the account credentials or an access token. Some channels report the available values themselves: for them, call POST /api/v1/channels/connection_details with the account credentials and let the user pick the property or contract from the response.
Test the settings
POST /api/v1/channels/test_connectionSend the adapter code and the collected settings as {"channel": "...", "settings": {...}}. The settings are sent to the channel, and the response reports whether the channel accepted them. No connection is created — if the response is success: false, correct the settings and test again.
Read both sides of the mapping
The channel side. Request the rooms and rates the channel exposes for the given settings:
POST /api/v1/channels/mapping_details
The request body is the same as for the test connection. For some channels, POST /api/v1/channels/connection_details additionally reports connection-level details to take into account when mapping — the currency the property trades in, for example.
The Channex side. Pick the property (or properties) to connect, then list its room types and rate plans:
GET /api/v1/room_types/options?filter[property_id]={property_id}
GET /api/v1/rate_plans/options?filter[property_id]={property_id}&multi_occupancy=trueBuild the mapping
For each Channex rate plan to be sold on the channel, build a mapping item: the rate_plan_id and a settings object with the fields listed in the adapter's rate_params, filled with the codes returned by the mapping details — the channel-side room and rate identifiers, the occupancy, the pricing type.
Check readiness and activate
POST /api/v1/channels/{id}/check_readiness
POST /api/v1/channels/{id}/activateThe readiness check lists the problems blocking activation; an empty list means the connection is ready. Activation starts the data exchange: a full synchronisation pushes availability, rates and restrictions to the channel, and bookings begin to flow back.
After the connection is live
PUT /api/v1/channels/{id}Update the settings or the mapping. A mapping is removed by sending it withsettings: null.POST /api/v1/channels/{id}/deactivateStop the exchange with the channel.DELETE /api/v1/channels/{id}Remove deactivated channel.
Channels are different!
Some channels follow a different pipeline. Individual steps may be skipped (a channel with nothing to map has no mapping details), reordered (some channels report their available properties and contracts through the connection details before the settings can be collected), or replaced entirely — Airbnb requires an OAuth authorization instead of connection settings and is covered by its own guide. Always check the channel's own guide for the exact flow.
Channel-specific guides
API References
Channel Adapters info
List the short codes and names of known booking channels.
API key for programmatic access, sent in the user-api-key header.
The request has succeeded.
A plain data-array envelope without pagination — used by reference/dictionary endpoints.
Authentication credentials are missing or invalid.
GET /api/v1/channels/codes HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
"data": [
{
"code": "BDC",
"name": "Booking.com"
}
]
}List the descriptors of every supported channel adapter.
API key for programmatic access, sent in the user-api-key header.
The request has succeeded.
A plain data-array envelope without pagination — used by reference/dictionary endpoints.
Authentication credentials are missing or invalid.
GET /api/v1/channels/list HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
"data": [
{
"code": "BookingCom",
"title": "Booking.com",
"params": {
"slug": {
"position": 0,
"type": "slug",
"title": "Property Slug"
},
"send_email_notifications": {
"position": 1,
"type": "boolean",
"title": "Send Property Notification",
"default": false
},
"email": {
"position": 2,
"type": "string",
"title": "Property Email",
"rules": [
{
"apply": "hidden",
"when": false,
"influence_field": "send_email_notifications",
"with_value": ""
}
]
}
},
"kind": "ota",
"actions": [
"load_future_reservations"
],
"mapping_mode": "room_rate_multioccupancy",
"message_support": true,
"property_mapping": "single",
"rate_params": {
"rate_plan_code": {
"position": 0,
"type": "string",
"title": "Rate"
},
"room_type_code": {
"position": 1,
"type": "string",
"title": "Room"
},
"occupancy": {
"position": 2,
"type": "integer",
"title": "Occupancy"
},
"pricing_type": {
"position": 3,
"type": "string",
"title": "PricingType"
},
"primary_occ": {
"position": 4,
"type": "boolean",
"title": "Primary Occupancy"
}
}
}
]
}Return the descriptor of a single channel adapter.
API key for programmatic access, sent in the user-api-key header.
Adapter code.
The request has succeeded.
JSON:API document wrapping a single resource.
The request cannot be processed in the current state.
Authentication credentials are missing or invalid.
GET /api/v1/channels/adapter?code=text HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
"data": {
"code": "BookingCom",
"title": "Booking.com",
"params": {
"slug": {
"position": 0,
"type": "slug",
"title": "Property Slug"
},
"send_email_notifications": {
"position": 1,
"type": "boolean",
"title": "Send Property Notification",
"default": false
},
"email": {
"position": 2,
"type": "string",
"title": "Property Email",
"rules": [
{
"apply": "hidden",
"when": false,
"influence_field": "send_email_notifications",
"with_value": ""
}
]
}
},
"kind": "ota",
"actions": [
"load_future_reservations"
],
"mapping_mode": "room_rate_multioccupancy",
"message_support": true,
"property_mapping": "single",
"rate_params": {
"rate_plan_code": {
"position": 0,
"type": "string",
"title": "Rate"
},
"room_type_code": {
"position": 1,
"type": "string",
"title": "Room"
},
"occupancy": {
"position": 2,
"type": "integer",
"title": "Occupancy"
},
"pricing_type": {
"position": 3,
"type": "string",
"title": "PricingType"
},
"primary_occ": {
"position": 4,
"type": "boolean",
"title": "Primary Occupancy"
}
}
}
}Pre-connection Check and Probes
Test a set of channel credentials. The credentials are sent to the channel, and the response reports whether the channel accepted them.
No channel connection is created or changed, and none is needed — the credentials are supplied in the request, so they can be tested before the connection is created. Credentials the channel rejects, and a channel that cannot be reached, are reported as success: false in the response body rather than as an error.
Channels that identify a property by a single code also require that code to be free: the test fails when another channel connection already uses it.
API key for programmatic access, sent in the user-api-key header.
Channel credentials to probe.
Adapter code of the channel. See the /channels/list endpoint for supported values.
BookingComConnection settings of the channel: the credentials and identifiers the
channel needs, such as hotel_id for Booking.com. The keys are specific to
the channel adapter — see params in the adapter descriptor returned by
GET /channels/adapter.
{"hotel_id":"12152494"}The request has succeeded.
JSON:API document wrapping a single resource.
Authentication credentials are missing or invalid.
The request has missing or invalid arguments; details lists the messages per argument.
POST /api/v1/channels/test_connection HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 59
{
"channel": "BookingCom",
"settings": {
"hotel_id": "12152494"
}
}{
"data": {
"success": true,
"errors": null
}
}Retrieve the connection details a channel reports for the given credentials. Supported for Booking.com, Expedia and Agoda channels; they report the currency the property trades in, and Booking.com additionally reports the state of each connection type it exchanges data over — reservations, rates and availability, guest reviews, content and reporting.
The credentials are supplied in the request, so the details can be fetched before the channel connection is created. They are requested from the channel on every call, and the fields of attributes are defined by the channel.
API key for programmatic access, sent in the user-api-key header.
Channel credentials to probe.
Adapter code of the channel. See the /channels/list endpoint for supported values.
BookingComConnection settings of the channel: the credentials and identifiers the
channel needs, such as hotel_id for Booking.com. The keys are specific to
the channel adapter — see params in the adapter descriptor returned by
GET /channels/adapter.
{"hotel_id":"12152494"}The request has succeeded.
JSON:API document wrapping a single resource.
The channel rejected the credentials.
Authentication credentials are missing or invalid.
The request has missing or invalid arguments; details lists the messages per argument.
POST /api/v1/channels/connection_details HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 59
{
"channel": "BookingCom",
"settings": {
"hotel_id": "12152494"
}
}{
"data": {
"type": "connection_details",
"attributes": {
"currency": "EUR"
}
}
}Retrieve the mapping details of a channel: the rooms and rates the channel exposes for the given credentials, which the property's room types and rate plans are then mapped to.
The credentials are supplied in the request, so the details can be fetched before the channel connection is created. They are requested from the channel on every call. The shape of the response is defined by the channel: channels that organise their inventory differently report their own entities instead — Airbnb its listings, for one — and a channel that exposes nothing to map returns an empty object.
API key for programmatic access, sent in the user-api-key header.
Channel credentials to probe.
Adapter code of the channel. See the /channels/list endpoint for supported values.
BookingComConnection settings of the channel: the credentials and identifiers the
channel needs, such as hotel_id for Booking.com. The keys are specific to
the channel adapter — see params in the adapter descriptor returned by
GET /channels/adapter.
{"hotel_id":"12152494"}The request has succeeded.
JSON:API document wrapping a single resource.
Mapping details of a channel: the rooms and rates the channel exposes for the given credentials, in the shape defined by that channel. A channel that exposes nothing to map returns an empty object.
The request cannot be processed in the current state.
Authentication credentials are missing or invalid.
The requested resource does not exist.
The request has missing or invalid arguments; details lists the messages per argument.
A backing service is temporarily unavailable; retry the request later.
POST /api/v1/channels/mapping_details HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 59
{
"channel": "BookingCom",
"settings": {
"hotel_id": "12152494"
}
}{
"data": {}
}Channel CRUD Operations
List the channel connections of the user's properties. Results are scoped to the properties and groups the user has access to.
API key for programmatic access, sent in the user-api-key header.
Return only channel connections of this property.
716305c4-561a-4561-a187-7f5b8aeb5920Return only channel connections this room type is mapped to.
716305c4-561a-4561-a187-7f5b8aeb5920Return only channel connections of this group.
716305c4-561a-4561-a187-7f5b8aeb5920Return only channel connections of this adapter. See the /channels/list endpoint for supported values.
Return only channel connections with this exact title.
ISO 4217 alphabetic currency code. See the /currencies endpoint for supported values.
USDReturn only enabled or only disabled channel connections.
Page to return, counted from 1.
Number of items per page. Maximum is 100.
Sort direction for list results.
Sort direction for list results.
The request has succeeded.
JSON:API document wrapping a collection of resources with pagination meta.
Authentication credentials are missing or invalid.
The authenticated user lacks permission to perform this action.
A backing service is temporarily unavailable; retry the request later.
GET /api/v1/channels HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
"data": [
{
"type": "channel",
"id": "716305c4-561a-4561-a187-7f5b8aeb5920",
"attributes": {
"id": "96177287-c3b2-4d98-9eb7-5c1927795825",
"title": "Booking.com - Main",
"channel": "BookingCom",
"currency": "USD",
"is_active": true,
"settings": {
"derived_option": {}
},
"rate_plans": [
{
"id": "b217a47d-c282-4591-a873-7758f2883237",
"rate_plan_id": "7e9409b4-160b-4412-941f-09c2c205b13b",
"settings": {
"derived_option": {}
}
}
],
"properties": [
"daec1c06-a9f6-4a25-88fa-cc4e9dbea436"
],
"actions": [
"load_future_reservations"
],
"expected_removal_date": "2026-08-17",
"inserted_at": "2026-08-12T10:12:04.740476",
"updated_at": "2026-08-12T10:14:37.786888",
"status": "active"
},
"relationships": {
"group": {
"data": {
"id": "5b79c003-a0b0-45b5-8428-e006a26b6a82",
"type": "group"
}
},
"properties": {
"data": [
{
"id": "daec1c06-a9f6-4a25-88fa-cc4e9dbea436",
"type": "property"
}
]
}
}
}
],
"meta": {
"page": 1,
"limit": 10,
"total": 1,
"order_by": "inserted_at",
"order_direction": "desc"
}
}List the user's channel connections as lightweight items: id, title and adapter code.
API key for programmatic access, sent in the user-api-key header.
The request has succeeded.
A plain data-array envelope without pagination — used by reference/dictionary endpoints.
Authentication credentials are missing or invalid.
GET /api/v1/channels/options HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
"data": [
{
"id": "96177287-c3b2-4d98-9eb7-5c1927795825",
"type": "channel",
"attributes": {
"id": "96177287-c3b2-4d98-9eb7-5c1927795825",
"title": "Airbnb for Hotel A",
"channel": "AirBNB"
}
}
]
}Retrieve a single channel connection.
Unlike the list, the response carries the connection's known mappings — see the known_mappings relationship.
API key for programmatic access, sent in the user-api-key header.
Channel connection ID.
716305c4-561a-4561-a187-7f5b8aeb5920The request has succeeded.
JSON:API document wrapping a single resource.
Authentication credentials are missing or invalid.
The authenticated user lacks permission to perform this action.
The requested resource does not exist.
A backing service is temporarily unavailable; retry the request later.
GET /api/v1/channels/{id} HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
"data": {
"type": "channel",
"id": "716305c4-561a-4561-a187-7f5b8aeb5920",
"attributes": {
"id": "96177287-c3b2-4d98-9eb7-5c1927795825",
"title": "Booking.com - Main",
"channel": "BookingCom",
"currency": "USD",
"is_active": true,
"settings": {
"derived_option": {}
},
"rate_plans": [
{
"id": "b217a47d-c282-4591-a873-7758f2883237",
"rate_plan_id": "7e9409b4-160b-4412-941f-09c2c205b13b",
"settings": {
"derived_option": {}
}
}
],
"properties": [
"daec1c06-a9f6-4a25-88fa-cc4e9dbea436"
],
"actions": [
"load_future_reservations"
],
"expected_removal_date": "2026-08-17",
"inserted_at": "2026-08-12T10:12:04.740476",
"updated_at": "2026-08-12T10:14:37.786888",
"status": "active"
},
"relationships": {
"group": {
"data": {
"id": "5b79c003-a0b0-45b5-8428-e006a26b6a82",
"type": "group"
}
},
"properties": {
"data": [
{
"id": "daec1c06-a9f6-4a25-88fa-cc4e9dbea436",
"type": "property"
}
]
},
"known_mappings": {
"data": [
{
"id": "d1a48009-fc52-4940-9f68-e7f609b73f01",
"type": "known_mapping",
"attributes": {
"id": "d1a48009-fc52-4940-9f68-e7f609b73f01",
"type": "auto",
"rate_plan_code": "text",
"room_type_code": "text",
"rate_plan_id": "7e9409b4-160b-4412-941f-09c2c205b13b",
"room_type_id": "06ededd7-16c1-40f7-97ee-b98bf8796fb9"
}
}
]
}
}
}
}Create a channel connection: the link between one or more properties and a booking channel, carrying the channel's connection settings and the mappings between the properties' rate plans and the channel's rates.
The connection is created disabled and exchanges no data until it is activated — see POST /channels/{id}/activate. Channels that identify a property by a single code allow only one connection per code. For channels that expose derived rates, known mappings are recorded automatically — see the known_mappings relationship.
The connection settings and the mapping settings are defined by the channel adapter — see params and rate_params in the descriptor returned by GET /channels/adapter.
API key for programmatic access, sent in the user-api-key header.
201 Created response wrapping a resource body.
JSON:API document wrapping a single resource.
Authentication credentials are missing or invalid.
The request has missing or invalid arguments; details lists the messages per argument.
A backing service is temporarily unavailable; retry the request later.
POST /api/v1/channels HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 320
{
"channel": {
"channel": "text",
"group_id": "5b79c003-a0b0-45b5-8428-e006a26b6a82",
"title": "text",
"properties": [
"daec1c06-a9f6-4a25-88fa-cc4e9dbea436"
],
"currency": "USD",
"is_active": true,
"settings": {
"derived_option": {}
},
"rate_plans": [
{
"rate_plan_id": "7e9409b4-160b-4412-941f-09c2c205b13b",
"settings": {
"derived_option": {}
}
}
]
}
}{
"data": {
"type": "channel",
"id": "716305c4-561a-4561-a187-7f5b8aeb5920",
"attributes": {
"id": "96177287-c3b2-4d98-9eb7-5c1927795825",
"title": "Booking.com - Main",
"channel": "BookingCom",
"currency": "USD",
"is_active": true,
"settings": {
"derived_option": {}
},
"rate_plans": [
{
"id": "b217a47d-c282-4591-a873-7758f2883237",
"rate_plan_id": "7e9409b4-160b-4412-941f-09c2c205b13b",
"settings": {
"derived_option": {}
}
}
],
"properties": [
"daec1c06-a9f6-4a25-88fa-cc4e9dbea436"
],
"actions": [
"load_future_reservations"
],
"expected_removal_date": "2026-08-17",
"inserted_at": "2026-08-12T10:12:04.740476",
"updated_at": "2026-08-12T10:14:37.786888",
"status": "active"
},
"relationships": {
"group": {
"data": {
"id": "5b79c003-a0b0-45b5-8428-e006a26b6a82",
"type": "group"
}
},
"properties": {
"data": [
{
"id": "daec1c06-a9f6-4a25-88fa-cc4e9dbea436",
"type": "property"
}
]
}
}
}
}Update a channel connection. Fields absent from the request keep their stored values; see the request fields for the replace semantics of the connection settings and of the mapping set.
Updating an active connection pushes a full synchronisation to the channel in the background. Mapping and settings changes are recorded as channel events — see the Channel Events resource.
API key for programmatic access, sent in the user-api-key header.
Channel connection ID.
716305c4-561a-4561-a187-7f5b8aeb5920The request has succeeded.
JSON:API document wrapping a single resource.
Authentication credentials are missing or invalid.
The authenticated user lacks permission to perform this action.
The requested resource does not exist.
The request has missing or invalid arguments; details lists the messages per argument.
A backing service is temporarily unavailable; retry the request later.
PUT /api/v1/channels/{id} HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 303
{
"channel": {
"channel": "text",
"group_id": "5b79c003-a0b0-45b5-8428-e006a26b6a82",
"title": "text",
"properties": [
"daec1c06-a9f6-4a25-88fa-cc4e9dbea436"
],
"currency": "USD",
"settings": {
"derived_option": {}
},
"rate_plans": [
{
"rate_plan_id": "7e9409b4-160b-4412-941f-09c2c205b13b",
"settings": {
"derived_option": {}
}
}
]
}
}{
"data": {
"type": "channel",
"id": "716305c4-561a-4561-a187-7f5b8aeb5920",
"attributes": {
"id": "96177287-c3b2-4d98-9eb7-5c1927795825",
"title": "Booking.com - Main",
"channel": "BookingCom",
"currency": "USD",
"is_active": true,
"settings": {
"derived_option": {}
},
"rate_plans": [
{
"id": "b217a47d-c282-4591-a873-7758f2883237",
"rate_plan_id": "7e9409b4-160b-4412-941f-09c2c205b13b",
"settings": {
"derived_option": {}
}
}
],
"properties": [
"daec1c06-a9f6-4a25-88fa-cc4e9dbea436"
],
"actions": [
"load_future_reservations"
],
"expected_removal_date": "2026-08-17",
"inserted_at": "2026-08-12T10:12:04.740476",
"updated_at": "2026-08-12T10:14:37.786888",
"status": "active"
},
"relationships": {
"group": {
"data": {
"id": "5b79c003-a0b0-45b5-8428-e006a26b6a82",
"type": "group"
}
},
"properties": {
"data": [
{
"id": "daec1c06-a9f6-4a25-88fa-cc4e9dbea436",
"type": "property"
}
]
}
}
}
}Delete a channel connection. Deactivate the connection first — an active connection cannot be deleted.
Deletion is permanent: the connection, its property and rate plan mappings, and its channel events are all removed. Bookings received through the connection are kept, but no longer reference it.
API key for programmatic access, sent in the user-api-key header.
Channel connection ID.
716305c4-561a-4561-a187-7f5b8aeb5920The request has succeeded.
Success response carrying only a meta message (no resource body).
Authentication credentials are missing or invalid.
The authenticated user lacks permission to perform this action.
The requested resource does not exist.
The request body failed validation.
A backing service is temporarily unavailable; retry the request later.
DELETE /api/v1/channels/{id} HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
"meta": {
"message": "Success"
}
}Activate a channel connection. The connection starts exchanging data with the channel: a full synchronisation pushes availability, rates and restrictions, and any scheduled removal date is cleared. Reviews and scores begin to be collected for Airbnb, Booking.com and Expedia connections.
The connection must be mapped first — it needs at least one property, and at least one mapped rate plan unless the channel does not require rate mapping. Activating an already active connection succeeds without changes.
API key for programmatic access, sent in the user-api-key header.
Channel connection ID.
716305c4-561a-4561-a187-7f5b8aeb5920The request has succeeded.
Success response carrying only a meta message (no resource body).
Authentication credentials are missing or invalid.
The authenticated user lacks permission to perform this action.
The requested resource does not exist.
The request body failed validation.
A backing service is temporarily unavailable; retry the request later.
POST /api/v1/channels/{id}/activate HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
"meta": {
"message": "Success"
}
}Deactivate a channel connection. The connection stops sending updates to the channel, and its removal is scheduled for 30 days later — see expected_removal_date. No synchronisation is sent to the channel.
Existing mappings are kept. A connection spanning more than one property, and an Airbnb connection, must have its rate plan mappings removed before it can be deactivated. Deactivating an already inactive connection succeeds without changes.
API key for programmatic access, sent in the user-api-key header.
Channel connection ID.
716305c4-561a-4561-a187-7f5b8aeb5920The request has succeeded.
Success response carrying only a meta message (no resource body).
Authentication credentials are missing or invalid.
The authenticated user lacks permission to perform this action.
The requested resource does not exist.
The request body failed validation.
A backing service is temporarily unavailable; retry the request later.
POST /api/v1/channels/{id}/deactivate HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
"meta": {
"message": "Success"
}
}Check whether a channel connection is ready to be activated. The response lists the problems blocking activation — a mapping that has not been set up, for example; an empty list means the connection is ready. Resolve every reported problem before activating the connection.
API key for programmatic access, sent in the user-api-key header.
Channel connection ID.
716305c4-561a-4561-a187-7f5b8aeb5920The request has succeeded.
Result of a channel connection readiness check. data lists the problems
keeping the connection from being activated; an empty list means the
connection is ready.
Authentication credentials are missing or invalid.
The authenticated user lacks permission to perform this action.
The requested resource does not exist.
A backing service is temporarily unavailable; retry the request later.
POST /api/v1/channels/{id}/check_readiness HTTP/1.1
Host: app.channex.io
user-api-key: YOUR_API_KEY
Accept: */*
{
"data": [
{
"id": "96177287-c3b2-4d98-9eb7-5c1927795825",
"type": "entity",
"entity": "Channel",
"relation": "Mapping",
"error_code": "required"
}
],
"meta": {
"message": "Success"
}
}Last updated