Skip to content
登录
Veridien Docs

客人与会员积分

客人就是预订所归属的人。每位客人都属于某一家酒店,并可以带一个会员积分账户,在已确认的住宿上赚取积分,并可用于抵扣。


POST /guests

权限范围: guests:write

(property, email) 找出客人,找不到就创建一个。它对邮箱是幂等的:用同一个邮箱再调一次,会关联到已有客人而不是创建重复档案,因此在每次结账时调用都很安全。

请求体字段必填说明
email用作匹配键。
first_name
last_name
phone
nationality自由文本或 ISO 国家代码。
curl -X POST "$VRDN_BASE/guests" \
  -H "Authorization: Bearer $VRDN_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "email": "[email protected]", "first_name": "Ada", "last_name": "Lovelace", "nationality": "GB" }'
{ "guest_id": "3f8a2c1b-9d4e-4c6a-8b7f-5e2d1a9c0b34", "created": true }

新建客人时返回 201"created": true;关联到已有客人时返回 200"created": false


GET /guests/{id}

权限范围: guests:read(个人身份信息字段还需要 guests:read:pii

curl "$VRDN_BASE/guests/3f8a2c1b-9d4e-4c6a-8b7f-5e2d1a9c0b34" -H "Authorization: Bearer $VRDN_KEY"

只持有 guests:read 时:

{
  "id": "3f8a2c1b-9d4e-4c6a-8b7f-5e2d1a9c0b34",
  "first_name": "Ada",
  "last_name": "Lovelace",
  "nationality": "GB",
  "status": "active",
  "is_local_verified": false
}

持有 guests:read:pii 时,响应会额外包含 emailphoneaddressdate_of_birthid_typeid_number

字段类型说明
statusstringactivevipblocked
is_local_verifiedboolean该客人是否已核验为本地居民(用于解锁仅限本地居民的房价)。

PATCH /guests/{id}

权限范围: guests:write

更新任意可变字段。只发送有变化的部分。管理流程就是通过设置 local_verified 把客人标记为已核验的本地居民(同时会记下核验时间)。

请求体字段说明
first_namelast_namephonenationalityaddress档案字段。
statusactivevipblocked
local_verified布尔值。true 会为这位客人解锁仅限本地居民的房价。
curl -X PATCH "$VRDN_BASE/guests/3f8a2c1b-9d4e-4c6a-8b7f-5e2d1a9c0b34" \
  -H "Authorization: Bearer $VRDN_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "local_verified": true }'

返回更新后的客人,结构与 GET /guests/{id} 相同。


GET /guests/{id}/loyalty

权限范围: loyalty:read

返回一位客人的积分余额、累计积分、当前等级、距下一等级的进度,以及最近的流水。还没有任何积分活动的客人会返回一个清零的账户,而不是 404

curl "$VRDN_BASE/guests/3f8a2c1b-9d4e-4c6a-8b7f-5e2d1a9c0b34/loyalty" -H "Authorization: Bearer $VRDN_KEY"
{
  "points_balance": 1260,
  "lifetime_points": 1260,
  "tier": "Coral",
  "next_tier": { "name": "Lagoon", "min_points": 5000 },
  "points_to_next_tier": 3740,
  "recent_transactions": [
    { "type": "earn", "points": 1260, "description": "Stay B7XKQ4M2NZ", "created_at": "2026-06-19T08:46:00.000Z" }
  ]
}
字段类型说明
points_balanceinteger可使用的积分。
lifetime_pointsinteger累计赚取的积分(决定等级,永不扣减)。
tierstring当前等级名称。
next_tierobject | null下一个等级及其门槛;已在最高等级时为 null
recent_transactionsarray最近最多 10 条流水(earnredeemexpireadjust)。

POST /loyalty/redemptions

权限范围: loyalty:write

扣减客人的积分,并记录一条 redeem 流水。余额校验是原子的,因此兑换绝不会透支;超额兑换会返回 409 insufficient_points

请求体字段必填说明
guest_id必须属于这家酒店。
points正整数。
reservation_id把这次兑换关联到一次住宿;必须属于这家酒店和这位客人。
curl -X POST "$VRDN_BASE/loyalty/redemptions" \
  -H "Authorization: Bearer $VRDN_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "guest_id": "3f8a2c1b-9d4e-4c6a-8b7f-5e2d1a9c0b34", "points": 1000, "reservation_id": "7d5dc2ea-1f4e-4bfa-9a52-6c3f08b41e27" }'
{
  "redeemed_points": 1000,
  "redeemed_value_usd": 10,
  "new_balance": 260,
  "tier": "Coral"
}

在你自己的结账流程里,把 redeemed_value_usd 当作要抵扣的金额。以美元结算的已确认住宿会自动赚取积分(参见预订)。

  • 预订:赚取积分的锁房与确认。
  • 身份认证:个人身份信息的权限范围是怎么运作的。