变更日志
[3.13.0] - 2026-09-11
新增
GET /reservations新增channel_details:按订单所属渠道归类的渠道专属字段容器。首个字段是channel_details.airbnb.cancellation_policy_category——Airbnb 订单实际适用的取消政策,原样透传 Airbnb 返回的值(例如flexible、long_term_flexible、tiered_pricing_non_refundable)。Airbnb 允许客人按单在房源的标准政策与打折的不可退款价之间选择,因此同一房源下的两张订单取值可能不同,这个字段可以把它们区分开。本次发布后首次从 Airbnb 同步的订单一开始就有值;已有的订单在其下一次于 Airbnb 发生变更(例如日期、人数、价格或状态)时补上,这次变更照常通过reservation_updatedwebhook 通知,不会为补上该值单独发送 webhook。补上之前该字段为null;本次发布前就已停止与 Airbnb 同步的订单则一直为null。airbnb以外的渠道,channel_details本身为null。channel_details下的取值沿用各渠道自己的定义,不应跨渠道比较。
[3.12.1] - 2026-09-10
修复
- 携程(
ctrip)房源调用POST /listings/prices改价:此前每次都被携程拒绝(同步任务报「提交变价单失败」),原因是下发到携程的请求里没有价格。现在可以正常生效,price按客人支付的售价处理——与 Hostex 房价页里的含义一致——扣除携程佣金后得到房东的底价。
变更
- 文档写明了携程(
ctrip)房源在两个日历接口上的价格口径不同:POST /listings/calendar返回的是底价(扣除携程佣金后房东实际收到的金额),POST /listings/prices接收的是售价。不要用POST /listings/calendar读到的值推算携程的相对调价(例如涨 10%)。这一读写差异是既有行为,本次没有改变,只是写进了文档。
[3.12.0] - 2026-08-24
新增
GET /transactions与POST /transactions新增入参reservation_code——该笔收支所属的订单;GET /transactions返回的每条收支也新增reservation_code字段。它与GET /reservations返回的reservation_code是同一个编码,因此收支可以直接与订单关联,不必再做标识转换。未挂在订单上的收支(记在房源或房东名下)该字段为null。
废弃
GET /transactions与POST /transactions的入参stay_code、以及GET /transactions响应中的stay_code,均标记为废弃,请改用reservation_code。该字段仍然可用,且没有下线计划;入参上两者等价,响应中两者恒为同一个值。同一请求中同时传入两者会返回400。
变更
- 文档现在明确写出:一笔收支属于整张订单,而不是订单中的某一间房。多房订单只有一个订单编码、却有多张入住单,针对其中任意一张入住单记录的收支,都会记在整张订单上——金额随后按各房间房费比例分摊到每间房,回查时挂的是订单编码,而不是提交时用的那个入住单号。这是既有行为,本次没有改动;错的是文档——此前把该参数描述成可以把收支落到某一间房上。需要注意的是这个归一是静默的:
POST /transactions传入次房的入住单号会返回201,既不报错也没有任何提示,而建出的这笔收支回报的是订单编码。若要把金额记在某一间具体房源上,请改用property_id。
[3.11.0] - 2026-08-14
新增
POST /reservations新增可选入参channel_id——渠道侧订单号,通常是你自己系统里的订单 ID——用于让建单具备幂等性。在同一个百居易账号内,一个channel_id至多只能产生一张订单,因此超时后重试不会建出重复订单:再次提交同一个值会返回已存在的那张订单,而不是新建第二张。唯一性由数据库主键保证,不是应用层的先查后插,因此重试与首个请求并发时同样安全。作用范围是百居易账号(子账号与主账号共享同一命名空间),既不按应用划分,也与使用哪个自定义渠道无关;且该值一经使用即被永久占用,订单取消后也不释放。只允许字母和数字(^[A-Za-z0-9]+$,最长 32 位):该值会成为订单编码的一部分,而标点在某些环节会被特殊解释。传入的值会存为订单的channel_id,可通过GET /reservations?channel_id=回查——这也是超时后确认「究竟建成没有」的推荐方式。POST /reservations的响应在reservation_code之外新增status(wait_accept/wait_pay/accepted/cancelled/denied/timeout)。新建订单的status恒为accepted;当提交的channel_id已存在时,该字段反映的是那张既有订单的当前状态——重放一张已被取消的订单同样返回200,此时status为cancelled,意味着订单已取消、房态并未占用。请以该字段判断,而不是 HTTP 状态码。- 新增内置自定义渠道 Naver Reservation(
custom_channel_id = 35),无需在自定义选项页创建,GET /custom_channels对所有账号直接返回,可当作常量使用。该渠道仅在国际站https://api.hostex.io/v3提供,百居易https://api.myhostex.com/v3不会列出它。
修复
GET /transactions:系统收支项目的item_name现在同样以账号的收支项目字典为准。此前内置项目列表会覆盖字典中的条目,导致系统项目可能以字典之外的名称返回。现在字典优先,内置名称仅用于字典中没有对应条目的系统项目。
[3.10.0] - 2026-07-31
新增
-
新增三个收支流水的 webhook 事件,订阅方不必再按较宽的
action_at窗口轮询GET /transactions——编辑流水不会改变其action_at,窄窗口轮询会静默漏掉对历史流水的修改:transaction_created——流水被创建,来源包括POST /transactions、百居易网页端,以及退款等系统自动产生的流水。transaction_updated——既有流水被修改。transaction_deleted——流水被删除,请从你的镜像中移除。
载荷沿用既有的薄载荷惯例(
{ event, transaction_id, timestamp }),拿到后用GET /transactions?id={transaction_id}回捞当前状态。订阅方式与其他事件一致,通过POST /webhooks或PATCH /webhooks/{id}配置。参见 Webhook 事件类型。
[3.9.1] - 2026-07-17
变更
POST /conversations/{conversation_id}(发送消息)的文档现已明确说明:该接口不具备幂等性,也不返回消息 ID。 请求超时时结果不可知——百居易无法判断渠道是否已经把消息投递出去,这一不确定性在我们侧无法消除,因此不提供幂等保证。接口行为没有变化,只是把这一点写进了文档,并给出我们的建议:出错时请按需重试——房客收到一条重复消息,好过收不到消息。
[3.9.0] - 2026-06-25
新增
GET /reservations现在为每条预约返回payment对象,暴露与百居易网页端一致的「已收 / 未收」收款状态:total_amount(应收金额)、received_amount(已收金额)、balance_amount(未收金额,不会为负)与status(unreceived未收 /partial部分收款 /received已收 /over_received超额收款)。结算按订单级计算,因此共享同一reservation_code的各 stay 的payment值相同。该字段主要面向通过POST /transactions记录收款的 Hostex Direct(手动创建)预约。
[3.8.0] - 2026-06-17
新增
GET /listings/airbnb/price_and_rules与POST /listings/airbnb/price_and_rules新增high_rated_guest_discount与mobile_only_discount布尔字段,用于读取与开关 Airbnb 的高评分房客折扣与移动端专享折扣。
[3.7.0] - 2026-06-12
新增
- 新增
Messages接口,用于管理会话中的特惠报价与预先批准(此前仅能在 Hostex 收件箱界面操作):GET /conversations/{conversation_id}/special_offers列出会话中已发送的特惠报价与预先批准及其当前状态(active/accepted/declined/expired/withdrawn),返回的id用于撤回报价。同时作为 MCP 工具search_special_offers暴露。POST /conversations/{conversation_id}/special_offers向客人发送特惠报价:邀请客人以自定义总价price预订指定房源(listing_id)与日期,并附带人数明细(number_of_adults/number_of_children/number_of_infants/number_of_pets)。支持 Airbnb 与直订网站(booking site)会话;直订网站会话还需提供rate_plan_id与currency。报价通常在发送后 24 小时过期。同时作为 MCP 工具send_special_offer暴露。POST /conversations/{conversation_id}/preapprovals预先批准客人的咨询(仅限 Airbnb 会话),邀请客人按标准价格预订其咨询的房源与日期。同时作为 MCP 工具send_preapproval暴露。DELETE /conversations/{conversation_id}/special_offers/{special_offer_id}撤回仍处于有效状态的已发送报价。同时作为 MCP 工具withdraw_special_offer暴露。
- 新增房源级价格与规则的查询接口,与已有的更新接口配套:
GET /listings/airbnb/price_and_rules实时从 Airbnb 读取房源当前的价格、费用、折扣、预订设置与可订规则。响应与POST /listings/airbnb/price_and_rules接受的settings对象一一对应(读取到的值可直接原样写回),并额外返回eligible_cancellation_policies,即该房源cancellation_policy的合法取值。限流与写操作相同(每分钟 120 次)。GET /listings/vrbo/price_and_rules返回 Hostex 当前记录的 Vrbo 房源价格、费用与预订规则(为同步快照,并非实时读取 Vrbo)。响应与POST /listings/vrbo/price_and_rules接受的settings对象一一对应。
[3.6.0] - 2026-06-01
新增
POST /reviews/{reservation_code}新增可选的category_ratings对象,可在提交房东评价时一并提交各分项评分(overall_rating、cleanliness、communication、respect_of_house_rules、recommend)。仅对支持分项评分的渠道生效(目前为 Airbnb 和 榛果)。未传host_review_score时,使用overall_rating的值作为评价分数。- 新增用于更新房源级别价格、费用与预订规则的写接口(更新房源默认设置,而非指定日期区间;仅更新所传字段):
POST /listings/airbnb/price_and_rules更新 Airbnb 房源的价格、费用、折扣、预订设置与可订规则(base_price、weekend_price、cleaning_fee、security_deposit、pet_fee、early_bird_discount/last_minute_discount/long_term_discount、check_in_start_time/check_in_end_time/check_out_before、instant_booking、minimum_stay/maximum_stay、advance_notice、availability_window、cancellation_policy、new_listing_promotion等)。同步提交至 Airbnb。POST /listings/vrbo/price_and_rules更新 Vrbo 房源的价格、费用与预订规则(base_price或按星期的nightly_rate、cleaning_fee、security_deposit、extra_guest_fee、weekly_discount/monthly_discount、check_in_start_time/check_out_before、instant_booking、minimum_stay、advance_notice、availability_window)。同步提交至 Vrbo。
[3.5.0] - 2026-05-25
新增
Messages新增写入端点,用于管理对话线程上的房东备注(即GET /conversations/{conversation_id}已暴露为只读的note字段):PATCH /conversations/{conversation_id}/note设置或清空备注。备注仅存储在百居易内部(在百居易 Inbox 可见),绝不会发送给客人,也绝不推送到任何渠道;同一商家账号内的所有商家共享,便于团队互相留上下文。在note字段传空串或null即可清空(上限 5000 字符)。暴露为 MCP 工具update_conversation_note。
Property房间分组字典新增写入端点,补齐已有的GET /groups:POST /groups创建新分组(name必填;可选property_ids在创建时直接挂房间)。分组名在商家账号内必须唯一。暴露为 MCP 工具create_property_group。PATCH /groups/{id}更新分组。name改名;property_ids整体替换当前的房间挂载关系(传空数组即解除所有挂载)。暴露为 MCP 工具update_property_group。DELETE /groups/{id}删除分组及其关联表,房间本身不受影响。暴露为 MCP 工具delete_property_group。
Property房间标签字典新增写入端点,补齐已有的GET /tags:POST /tags创建新房间标签(name必填;可选color,须为百居易调色板枚举值;可选property_ids、room_type_ids)。每个商家最多 500 个房间标签;同名的软删标签会透明恢复。暴露为 MCP 工具create_property_tag。PATCH /tags/{id}更新标签。name/color改标签本身;property_ids/room_type_ids各自整体替换挂载列表(空数组即解除全部挂载)。暴露为 MCP 工具update_property_tag。DELETE /tags/{id}删除标签及其房间 / 房型关联表。暴露为 MCP 工具delete_property_tag。
- 新增
Reservation Tags一节,覆盖商家订单标签字典的读写(即POST /reservations/{stay_code}/tags能挂到订单上的那批标签):GET /reservation_tags列出商家的订单标签字典,含系统默认标签(is_default = true,所有商家共享)和商家自建的自定义标签。支持offset/limit分页、id精查、keyword子串搜索。暴露为 MCP 工具search_reservation_tags。POST /reservation_tags创建新自定义标签(仅tag_name,上限 15 字符)。颜色由百居易调色板自动分配。与系统默认标签或商家已有标签同名时返回 409;同名的软删标签会透明恢复。每个商家最多 500 个自定义标签。暴露为 MCP 工具create_reservation_tag。DELETE /reservation_tags/{id}删除商家某个自定义标签。系统默认标签不允许通过此 API 删除。删除时会同时解除该标签和它当时挂载的所有订单的关联。暴露为 MCP 工具delete_reservation_tag。
- 新增
Calendar Share Links一节,覆盖公开只读日历共享链接的读写(即百居易房东后台 "Share calendar" 暴露的那批对象):GET /calendar_share_links列出商家的共享链接。每条返回id、scope(entire/partial)、url以及该链接暴露的property_ids(scope = entire时为空数组)。暴露为 MCP 工具search_calendar_share_links。POST /calendar_share_links创建新共享链接。scope = entire覆盖商家所有房间(幂等:已存在则返回已有链接)。scope = partial需传非空property_ids列表,且每个 id 必须属于该商家。暴露为 MCP 工具create_calendar_share_link。DELETE /calendar_share_links/{id}失效一条共享链接;持有旧 URL 的人会拿到share link invalid错误。暴露为 MCP 工具delete_calendar_share_link。
变更
GET /tags的 x-mcp 元数据:description和intent_examples已澄清——此端点返回的是房间标签(挂在房间 / 房型上的标签),不是订单标签。订单标签字典由新加的 MCP 工具search_reservation_tags覆盖。响应体结构本身不变。GET /reservations:每条订单新增checkin_guide_images字段,返回客人通过在线入住登记上传的证件图片,覆盖该订单下的所有上传图片——包括尚未关联到客人记录的图片(这些图片client_id为null)。每个元素包含id、client_id和url(图片 CDN 上的 extra-large 尺寸)。原有的客人维度guests[].id_images字段保持不变。GET /reservations:每条预订新增rates.tax字段,单独返回预订的TAXES(税费)金额,结构为{ currency, amount }(无税费时返回null)。汇总的rates.rate与rates.details保持不变。
[3.4.1] - 2026-05-21
变更
- BREAKING
GET /knowledge_bases:property_ids查询参数从重复数组改为逗号分隔的整数串(例如1,2,3),与GET /automation/actions以及 v3 其余列表端点统一。 - BREAKING
POST /knowledge_bases和PATCH /knowledge_bases/{id}:scope_property.scope_ids改名为scope_property.ids,与GET /knowledge_bases和GET /knowledge_bases/{id}返回值的字段名对齐。
新增
GET /knowledge_bases/{id}:响应新增process_status(字符串枚举waiting/processing/done/failed),与列表端点一致。GET /automation/actions:actions[]每项新增type(message/review)和stay_code(关联订单的行程编号,可能为null)。POST /automation/actions/{plan_id}/execute:补全文档中针对不支持的计划类型,以及订单尚未退房的review计划返回400的说明。
修复
GET /knowledge_bases:用channel_types过滤不再因TypeError报错;每行返回的scope_property现在能正确反映条目实际的房间范围(all/by_property/by_group/by_room_type),不再一律回退为空的by_property集合。GET /knowledge_bases/{id}:同上scope_property修正。POST /knowledge_bases和PATCH /knowledge_bases/{id}:当scope_channel.type为all时,上游渠道列表不再被填上unknown哨兵;PATCH /knowledge_bases/{id}和DELETE /knowledge_bases/{id}的权限失败统一返回404。GET /knowledge_bases:分页现在尊重任意offset值,不再每次必整页跳进(原来用ceil(offset / limit) + 1算页号,导致offset=5, limit=10返回第 11–20 行而不是第 6–15 行)。GET /automation/actions:结果现在正确限定在商家主账号范围内,子账号 access token 不再返回空列表。total也与返回的actions[]行数一致(缺规则或详情行的 plan 在 SQL 层过滤,而不是在 PHP 层跳过)。POST /automation/actions/{plan_id}/execute:当天的评价不再被误判为"尚未退房"——退房日期比较改用订单退房时间的日期部分,而非字符串字典序比较。
[3.4.0] - 2026-05-20
新增
- 新增
Knowledge Base一节,完整覆盖自动化助手使用的 HostGPT 知识库条目的读写。每条目带正文和适用范围(房间 / 渠道):GET /knowledge_bases列出条目,支持分页和按房间或渠道过滤。GET /knowledge_bases/{id}获取单条目的完整详情。POST /knowledge_bases创建新条目。PATCH /knowledge_bases/{id}更新已有条目。DELETE /knowledge_bases/{id}删除条目。
- 新增
Channels一节,只读访问商家已接入的渠道账号以及这些账号同步过来的房源:GET /channel_accounts返回商家已接入的第三方平台账号(Airbnb、Booking.com 等),含channel_type、username、origin_account_id以及可读的auth_status枚举(active/connecting/disconnected/exception)。支持按id和channel_type过滤。channel_type=booking_site的账号会被排除。暴露为 MCP 工具search_channel_accounts。GET /listings返回挂在这些账号下的房源(渠道侧的 property),含listing_id、channel_type、channel_account_id、title、cover、url、inventory、可读的shelf_status枚举以及一个metadata透传对象,暴露百居易内部缓存的渠道侧归一化数据(地理、图片、价格表等;形状随渠道不同)。支持按channel_account_id、listing_id和channel_type过滤。暴露为 MCP 工具search_listings。
GET /tasks:新增可选id查询参数,按内部 id 取单条任务(仍限定当前商家)。其他过滤条件不变。GET /transactions:新增可选id查询参数,按内部 id 取单条收支条目。带id时start_date和end_date可省略;不带id时仍受现有日期范围(以及 366 天上限)约束。GET /reservations:guests每项新增id_images数组,暴露为该客人上传的证件影像。每项含图片id和指向图片 CDN 大图变体的url。无影像时返回空数组。GET /conversations/{id}:messages每项新增:sender_name:发送者的显示名(房东侧消息为商家账号名,HostGPT 生成的消息为HostGPT,影子预览消息为本地化的 HostGPT 标签)。客人消息以及其他无法识别发送者的情况为null。sources:HostGPT 生成该条消息引用的知识源,按type分组(如checkin_guide、automation_reply、host_knowledge、thread、host_assistant)。每组暴露docs[].title/docs[].fragment/docs[].source_type/docs[].link_id。人工发送的消息以及无引用的 HostGPT 消息为空数组。
PATCH /reservations/{stay_code}/check_in_details:新增可选id_required字段,控制客人在入住前是否需要登记 / 上传证件。字符串枚举:not_required(无需证件)、required(采集证件,无需人工审核)、required_with_review(采集证件且房东人工审核通过)。内部映射到该行程入住指南的need_credential,并触发与百居易房东后台一致的下游入住解锁逻辑。GET /reservations:check_in_details每项现在暴露对应的id_required字符串枚举(未对该行程设置时默认not_required)。GET /reservations:order_by新增支持created_at(按行创建时间排序,即订单首次同步进百居易的时间)。已有枚举值(booked_at、check_in_date、check_out_date、cancelled_at)保持不变;默认仍为booked_at。POST /tasks:新增可选stay_code字段,写入schedule_task__reservation关联表把任务与具体订单关联。stay_code不带property_id时房间由行程继承;两者都带时必须指向同一房间。LLM 流程用于"为这单订单创建清洁 / 维修任务"。GET /tasks:每条任务新增stay_code字段(字符串,可空)——任务关联到的订单;无关联返回null。Property新增写入端点:POST /properties在当前商家下创建新房间。仅title必填;其余(地址、渠道、图片、价格、默认入住 / 退房时间)一律通过百居易房东后台后续配置。受商家订阅的房间数量上限约束。
Room Type新增写入端点:POST /room_types在当前商家下创建新房型。可选property_ids在创建时直接挂房间(每个房间不能已挂在其他房型下)。受房型数量上限约束(受订阅房间数量上限封顶),Basic 版本不可用。
Listing Calendar下新增GET /pricing_ratios,返回挂在房间(property_id)或房型(room_type_id)下每个 OTA 房源的渠道侧价格比例。每条暴露channel_type、listing_id、listing_title、ratio(百分比)以及readonly。这条让技能 / 客户端层不依赖专门的服务器端点即可实现"按房间 / 房型改价"工作流:读出比例,每个非readonly房源算出target_price = round(base_price * ratio / 100),再对每个房源调一次POST /listings/prices(readonly: true的房源——例如 Airbnb 子套餐——必须跳过)。
[3.3.1] - 2026-05-11
修复
GET /transactions:start_date和end_date现在一律以商家配置的时区解读,与条目存储方式以及action_at返回值一致。原来边界可能按数据库会话默认时区计算,使非 UTC+8 商家最多偏移一天。POST /transactions和PATCH /transactions/{id}:以 UTC ISO 8601 提供的action_at现在会先转换到商家时区再落库,使GET /transactions的来回往返返回同一时刻。
[3.3.0] - 2026-05-08
新增
GET /reservations:新增可选channel_id查询参数,按渠道侧订单 ID 过滤(即响应中channel_id字段的同一个值)。
[3.2.0] - 2026-04-29
新增
- 新增
Incomes & Expenses一节,完整覆盖收支条目(账目)的读写:GET /transactions查询条目。支持按日期范围(start_date/end_date)、property_id、stay_code、direction、item_id、payment_method_id、currency和keyword过滤。每条暴露可读字符串枚举direction(income/expense)、link_type(property/reservation/operator)和status(paid/outstanding),并把item_name/payment_method_name从下方字典解析出来。POST /transactions记录新条目。关联目标按请求推断:传stay_code关联到具体行程,传property_id关联到房间,两者都不传则为商家层条目(仅主账号可用)。amount一律为正——符号由direction推导。currency必填,除非传了stay_code,此时从订单继承。PATCH /transactions/{id}更新条目的amount、item_id、payment_method_id、action_at或note。方向、关联目标和币种不可变。DELETE /transactions/{id}永久删除条目。- 新增字典端点
GET /income_items、GET /expense_items、GET /income_methods和GET /expense_methods,用于解码GET /transactions返回的item_id/payment_method_id。
Task新增写入端点:POST /tasks创建任务。可选property_id和staff_id把任务关联到房间并分配员工;level仅对清洁任务有意义。expected_date/expected_time以商家配置的时区解读。返回新任务的task_id。PATCH /tasks/{id}更新已有任务。所有字段均为可选;传property_id=0或staff_id=0解除关联。status完整生命周期(pending/in_progress/completed/cancelled)也在这里设置。expected_date/expected_time以商家配置的时区解读。DELETE /tasks/{id}删除任务。
Staff新增写入端点:POST /staffs创建员工(创建为启用状态)。用property_ids把员工限定到具体房间。国际商家须以+<国家代码> <号码>格式提供mobile。PATCH /staffs/{id}更新已有员工。传property_ids会整体替换挂载列表;传空数组即清空。is_active控制启用 / 停用。DELETE /staffs/{id}删除员工(并移除其房间挂载)。
变更
PATCH /reservations/{stay_code}(更新订单基本信息):路径参数从reservation_code改为stay_code,因为该端点更新的是具体行程的属性,而不是订单本身。URL pattern 不变。DELETE /reservations/{reservation_code}(取消)以及渠道侧的POST /reservations/{reservation_code}/approve|decline仍保留reservation_code,因为它们作用在订单层。
修复
GET /reservations:custom_channel.id现在返回与GET /custom_channels一致的 id(原来返回的是内部表主键,无法与字典匹配)。
[3.1.2] - 2026-04-28
新增
- 新增
Task端点GET /tasks和GET /staffs,用于查询任务和员工。 GET /tasks支持按日期范围(start_date/end_date)、staff_id、property_id、type和status过滤。- 任务的
type、status和level以可读字符串枚举返回(如cleaning、pending、standard)。
[3.1.1] - 2026-03-10
新增
- 新增
Property端点GET /tags,返回所有标签及其关联的房间与房型 id。 GET /properties支持tag_id过滤,每条房间新增tags数组。GET /room_types支持id和tag_id过滤,每条房型新增tags数组。
[3.1.0] - 2026-01-21
新增
- 新增
Property端点GET /groups,返回所有房间分组及其关联的房间 id。 GET /properties支持group_id过滤,每条房间新增groups数组。
[3.0.0]
新增
- 首次发布百居易 OpenAPI v3,覆盖 Property、Room Type、Reservations、Availabilities、Listing Calendar、Messaging、Reviews、Automation 和 Webhooks。
