座位图克隆端点
座位图克隆会创建完整副本,包含座位布局、全部区域、排和座位、座位元数据与坐标,以及价格区域(作为模板复制,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 浏览器与完整参考。