座位图克隆端点

座位图克隆会创建完整副本,包含座位布局、全部区域、排和座位、座位元数据与坐标,以及价格区域(作为模板复制,ID 不相同)。适用于创建布局变体、快速配置相似场地或复制座位图用于测试。

克隆是异步操作。发起后立即返回操作 UUID,复制在后台进行,您需轮询结果端点直至完成。

身份验证

两个端点都属于私有 Booking API,需要在 X-API-Key 请求头中提供私密 API 密钥:

X-API-Key: {organizationToken}

可在 Editor 管理面板的 Organization Details 中获取 Secret API key。组织管理员的 Editor 登录响应也包含 user.organizationToken。将其视为不透明字符串,配置到后端凭据存储后原样发送。

第 1 步:发起克隆

POST /api/private/v2.0/schemas/clone/{id}
参数 位置 必填 说明
id path 是 待克隆座位图的数字 ID。

响应正文为克隆操作 UUID:

curl -X POST \
  "https://booking.seatmap.pro/api/private/v2.0/schemas/clone/1001" \
  -H "X-API-Key: ${ORG_TOKEN}"
# 200
# "123e4567-e89b-12d3-a456-426614174000"
状态 含义
200 克隆已启动,正文包含操作 UUID。
403 您的组织无权访问此座位图。
404 座位图不存在。

第 2 步:轮询结果

GET /api/private/v2.0/schemas/clone/result/{uuid}
参数 位置 必填 说明
uuid path 是 发起克隆时返回的操作 UUID。
curl "https://booking.seatmap.pro/api/private/v2.0/schemas/clone/result/123e4567-e89b-12d3-a456-426614174000" \
  -H "X-API-Key: ${ORG_TOKEN}"

仍在运行时:

{
  "uuid": "123e4567-e89b-12d3-a456-426614174000",
  "state": "IN_PROCESS",
  "schemaId": 1001,
  "newSchemaId": null
}

完成时:

{
  "uuid": "123e4567-e89b-12d3-a456-426614174000",
  "state": "DONE",
  "schemaId": 1001,
  "newSchemaId": 1002
}

newSchemaId 是副本 ID,后续针对副本的 API 调用使用此值。

操作状态

state 含义
CREATED 已登记操作,尚未开始复制。
IN_PROCESS 复制中,继续轮询。
DONE 终态,副本已就绪,读取 newSchemaId。
ERROR 终态,克隆失败,重试发起调用。

普通座位图推荐轮询间隔为 2–5 秒。

轮询示例

async function cloneSchema(schemaId, orgToken, baseUrl = 'https://booking.seatmap.pro') {
  const headers = { 'X-API-Key': orgToken };

  const startRes = await fetch(`${baseUrl}/api/private/v2.0/schemas/clone/${schemaId}`, {
    method: 'POST',
    headers,
  });
  if (!startRes.ok) throw new Error(`Clone initiation failed: ${startRes.status}`);
  const operationUuid = await startRes.json();

  const deadline = Date.now() + 60_000;
  while (Date.now() < deadline) {
    const res = await fetch(`${baseUrl}/api/private/v2.0/schemas/clone/result/${operationUuid}`, {
      headers,
    });
    if (!res.ok) throw new Error(`Clone result poll failed: ${res.status}`);
    const result = await res.json();
    if (result.state === 'DONE') return result.newSchemaId;
    if (result.state === 'ERROR') throw new Error(`Clone ${operationUuid} failed`);
    await new Promise((resolve) => setTimeout(resolve, 3_000));
  }
  throw new Error(`Clone ${operationUuid} did not complete in time`);
}

说明

  • 副本完全独立,编辑不会影响来源。
  • 价格区域作为模板复制,不携带具体活动的价格分配。
  • 上述身份验证、发起与轮询流程由跨产品端到端测试覆盖。

另请参阅

  • API 参考:交互式 API 浏览器与完整参考。

输入功能、设置、端点或 SDK 方法。