开放平台/API 文档

平台概览

冰梭开放平台以 REST API 形式开放平台的文件传输、协作与文件管理能力。服务端、浏览器、脚本或移动端——任何能发起 HTTP 请求的环境,都可以通过统一的签名鉴权调用这些端点,把冰梭的能力嵌入你自己的产品。

能力域

能力域基础路径端点能力说明
传输/api/open/transfer 等10P2P 直传、安全中转、任务查询与整文件下载
空间/api/open/workspace7空间上下文、角色与成员管理
项目/api/open/projects12项目生命周期、项目成员与项目文件(文件上传走直传会话)
文件库/api/open/drive 等15个人文件库目录树、文件管理与分块直传上传
交付/api/open/delivery7交付链接创建、配置、回执与下载
计费/api/open/billing3积分与流量余额、消耗流水、套餐配额
审核/api/open/review2AI 质检报告、审片标注汇总(交付背书能力开放)

调用方式

1
创建应用
应用管理中创建应用,获取 AppKey 与 AppSecret
→
2
签名调用
每次请求携带五个签名认证头,支持 SM3 / SHA-256
→
3
处理响应
统一 code / data / message 结构,业务数据在 data
身份与权限:API 请求以「应用创建者」本人身份执行,与页面登录同一套账号体系、同一套角色与权限判定——页面里能做什么,API 就能做什么。
计费规则:接口调用免费;文件下载按量消耗权益流量与积分,与页面端同一套规则。

快速开始

从创建应用到收到第一个响应,通常只需几分钟。建议先通读本节建立整体认识,再按场景深入 签名鉴权、SDK 与左侧「API 参考」。

第一步:创建应用

  1. 注册并登录冰梭账号,进入 应用管理
  2. 创建应用,获取 AppKey 与 AppSecret——Secret 仅在创建时展示一次,请妥善保管,泄露可随时重置
  3. 按需配置 IP 白名单(最多 5 条);未配置则不校验来源

第二步:选择调用方式

  • 浏览器 / Web 应用:使用官方 JavaScript SDK,签名、WebRTC 信令、分块上传等细节全部内置,见 SDK 安装与初始化
  • 服务端 / 脚本:按 签名鉴权 自行计算签名并携带五个认证头调用,支持 SM3(默认)与 SHA-256 两种算法

第三步:发出第一个请求

以「传输策略查询」为例——GET 请求、无请求体,返回当前权益下可用的传输模式与限额:

PowerShell
$appKey    = "your-app-key"
$appSecret = "your-app-secret"
$timestamp = [DateTimeOffset]::UtcNow.ToUnixTimeSeconds()
$nonce     = [Guid]::NewGuid().ToString("N")
$method    = "GET"
$path      = "/api/open/transfer/strategy"

# GET 请求无请求体,bodyHash 为空字符串,直接裸拼接后做 HMAC-SHA256
$stringToSign = $appKey + $timestamp + $nonce + $method + $path
$hmac       = New-Object System.Security.Cryptography.HMACSHA256
$hmac.Key   = [Text.Encoding]::UTF8.GetBytes($appSecret)
$signature  = -join ($hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($stringToSign)) | ForEach-Object { $_.ToString("x2") })

Invoke-RestMethod -Uri "https://www.wringcloud.com$path" -Headers @{
  "X-App-Key"   = $appKey
  "X-Timestamp" = $timestamp
  "X-Nonce"     = $nonce
  "X-Algorithm" = "SHA-256"
  "X-Signature" = $signature
}

下一步

SDK 安装与初始化

冰梭开放平台提供 iceshuttle-js JavaScript SDK,适用于浏览器环境,内部封装了签名认证、WebRTC 信令、分块上传/下载等全部复杂逻辑。

JS
iceshuttle-js

浏览器端 SDK,支持 P2P 直传、安全中转和分块直传三种传输模式

引入方式

JavaScript
// 方式一:本地引入(下载 SDK 文件后放置到项目中)
import { IceShuttle, downloadBlob } from './sdk/iceshuttle.esm.js';

// 方式二:官网下载引入(适合无构建工具的项目)
// 下载地址:https://www.wringcloud.com/sdk/iceshuttle-js/dist/iceshuttle.min.js
<script src="./sdk/iceshuttle.min.js"></script>
<script>
  const { IceShuttle, downloadBlob } = window.IceShuttle;
</script>
文件格式说明:
  • iceshuttle.min.js — 压缩版,体积最小,适合生产环境(script 标签引入)
  • iceshuttle.esm.js — ES Module 格式,可读性好,适合开发调试(import 引入)
  • iceshuttle.umd.js — UMD 格式,兼容 script 标签和 import 两种引入方式

初始化客户端

使用 AppKey 和 AppSecret 初始化 SDK 客户端,SDK 会自动处理签名认证。

JavaScript
import { IceShuttle } from 'iceshuttle-js';

const client = new IceShuttle({
  appKey: 'your-app-key',         // 必填:应用 Key
  appSecret: 'your-app-secret',   // 必填:应用 Secret
  serverDomain: 'https://www.wringcloud.com',  // 可选:服务器地址
  debug: false                       // 可选:是否开启调试日志
});

初始化参数

参数类型必填说明
appKeystring必填应用 Key,在开放平台应用管理中获取
appSecretstring必填应用 Secret,在开放平台应用管理中获取
serverDomainstring可选服务器地址,默认 https://www.wringcloud.com
debugboolean可选是否开启调试日志,默认 false

大文件分块直传(v2.1.0+)

除 P2P 与安全中转外,SDK 还封装了开放平台的分块直传能力:文件字节由客户端凭预签名 URL 直连对象存储,不经过冰梭应用服务器,支持断点续传与并发上传。高层入口 uploadFile 一行完成全部五步(算哈希 → 初始化会话 → 并发上传 → 逐块回执 → 合并落地):

JavaScript
// 高层 API:自动断点续传 + 并发上传(默认 3 并发,可调 1-8)
const result = await client.uploadFile(file, {
  bizType: 'drive',            // drive=文件库 / project=项目 / collect=收集链接
  bizRef: { folderId: 0 },     // 按 bizType 传入:目录 ID / 项目 ID / 收集 token
  onProgress: (p) => console.log(p + '%')
});
// result:drive 返回 { transferId };project 返回 { transferId, fileId, projectId };
// collect 返回 { fileName, fileSize, autoAccepted }

// 需要自行控制 complete 时机(或中途取消)时,使用低层 API
//(createUploader 需完整会话参数,fileHash 可用 SDK 导出的 sha256Hex(file) 计算)
const uploader = await client.createUploader({
  bizType: 'drive', bizRef: { folderId: 0 },
  fileName: file.name, fileSize: file.size,
  fileHash: await sha256Hex(file), concurrency: 4
});
try {
  await uploader.upload(file);          // 仅完成分块直传与回执
  const landed = await client.completeUploadSession(uploader.sessionKey);
} catch (e) {
  await uploader.abort();   // 清理会话与已传分块
}
断点续传与计费:
  • 同一用户对相同内容(fileHash)重复上传时自动命中未完成会话,已确认分块直接跳过
  • 文件库上传不计费;安全中转与交付下载按权益扣流量,配额校验在 complete 落地时发生
  • 协议细节见 文件库域 的分块直传会话说明与时序图

签名鉴权

所有开放 API 均需携带五个认证头。服务端验证签名、时间窗与 Nonce 唯一性后,以「App 创建者本人」身份执行请求——与页面登录同权。

认证头

请求头必填说明
X-App-Key必填应用的 AppKey,在应用管理页获取
X-Timestamp必填Unix 秒级时间戳,与服务器时差超过 ±300 秒即拒绝
X-Nonce必填随机串(建议 UUID),服务端校验唯一性,防止重放
X-Algorithm可选摘要算法:SM3(默认,国密)或 SHA-256,用于请求体哈希与 HMAC 摘要
X-Signature必填HMAC 签名,十六进制小写(算法与 X-Algorithm 对应)

签名算法

  1. 请求体哈希:bodyHash = SM3(body) 或 SHA-256(body)(与 X-Algorithm 一致,默认 SM3),输出十六进制小写;GET 请求或空请求体时为空字符串。
  2. 构造签名串:按 appKey + timestamp + nonce + METHOD + path + bodyHash 裸拼接(无分隔符、无换行)。METHOD 大写(GET/POST/PUT/DELETE);path 为请求路径(如 /api/open/workspace/members/invite,不含域名与 query 参数)。
  3. 计算签名:X-Signature = HMAC(appSecret, 签名串)。X-Algorithm 为 SHA-256 时用 HMAC-SHA256;SM3(默认)时用 HMAC-SM3。
  4. 发起请求:携带上述五个认证头调用任意开放 API。
signature = HMAC(appSecret, appKey + timestamp + nonce + METHOD + path + bodyHash)
// 裸拼接,无分隔符;bodyHash 与 HMAC 使用 X-Algorithm 声明的同一算法
安全机制:
  • 时间戳窗口 ±300 秒,请校准服务器时钟
  • Nonce 在有效窗口内必须唯一,重复即判重放(401)
  • AppSecret 仅在创建应用时展示一次,可重置(原 Secret 立即失效),切勿写入前端代码
  • 应用可配置最多 5 个 IP / 域名白名单,来源不符直接拦截(403)

统一响应格式

所有接口统一返回 {"code":num,"data":...,"message":"..."}:业务数据在 data,错误说明在 message,code 同时反映在 HTTP 状态码中。

PowerShell 调用示例(SHA-256)

PowerShell
# 0. 准备参数(时间戳为秒级)
$appKey    = "your-app-key"
$appSecret = "your-app-secret"
$timestamp = [DateTimeOffset]::UtcNow.ToUnixTimeSeconds()
$nonce     = [Guid]::NewGuid().ToString("N")
$method    = "POST"
$path      = "/api/open/workspace/members/invite"
$body      = '{"contact":"dev@example.com","roleId":2,"expireDays":7}'

# 1. 请求体哈希(X-Algorithm=SHA-256;SM3 需国密库)
$sha      = [System.Security.Cryptography.SHA256]::Create()
$bodyHash = -join ($sha.ComputeHash([Text.Encoding]::UTF8.GetBytes($body)) | ForEach-Object { $_.ToString("x2") })

# 2. 签名串裸拼接 + HMAC-SHA256
$stringToSign = $appKey + $timestamp + $nonce + $method + $path + $bodyHash
$hmac       = New-Object System.Security.Cryptography.HMACSHA256
$hmac.Key   = [Text.Encoding]::UTF8.GetBytes($appSecret)
$signature  = -join ($hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($stringToSign)) | ForEach-Object { $_.ToString("x2") })

# 3. 携带五个认证头发起请求
Invoke-RestMethod -Method Post -Uri "https://www.wringcloud.com$path" -Body $body -ContentType "application/json" -Headers @{
  "X-App-Key"   = $appKey
  "X-Timestamp" = $timestamp
  "X-Nonce"     = $nonce
  "X-Algorithm" = "SHA-256"
  "X-Signature" = $signature
}

P2P 直传

P2P 直传:基于 WebRTC 的点对点传输,文件不经过服务器中转,2G 内免费。发送方需保持页面打开,接收方通过链接直接接收,与冰梭首页体验一致。

传输流程

1
创建发送任务
调用 createP2PSender
→
2
获取接收链接
分享给接收方
→
3
发送文件
调用 sendFile
→
4
接收方接收
通过链接接收文件

发送文件

JavaScript
// 1. 创建 P2P 发送任务
const sender = await client.createP2PSender({
  fileName: file.name,             // 必填:文件名
  fileSize: file.size,             // 必填:文件大小(字节)
  password: '可选密码',            // 可选:传输密码
  maxReceiveCount: 1              // 可选:最大接收次数
});

// 2. 获取接收链接,分享给接收方
const receiveLink = sender.getReceiveLink();
console.log('接收链接:', receiveLink);

// 3. 发送文件(SDK 自动并传输)
await sender.sendFile(file, {
  onProgress: (percent) => {
    console.log(`传输进度: ${percent.toFixed(1)}%`);
  },
  onComplete: (info) => {
    console.log('传输完成', info);
  },
  onError: (err) => {
    console.error('传输失败:', err);
  },
  onProcessing: (info) => {
    console.log(info.message); // 如 "正在校验文件..."
  }
});

// 4. 取消传输(可选)
await sender.cancel();

createP2PSender 参数

参数类型必填说明
fileNamestring必填文件名
fileSizenumber必填文件大小(字节)
passwordstring可选传输密码
maxReceiveCountnumber可选最大接收次数

sendFile 回调

回调参数说明
onProgresspercent: number传输进度百分比(0-100)
onCompleteinfo: {fileName, fileSize}传输完成
onErrorerr: string传输错误
onProcessinginfo: {message}处理中状态(如校验文件)

P2PSender 方法

方法返回值说明
getReceiveLink()string获取接收链接,分享给接收方
sendFile(file, callbacks)Promise发送文件,自动
cancel()Promise取消传输

接收文件

接收方通过链接中的 transferId 和 token 接收文件。

JavaScript
// 从接收链接中解析 transferId 和 token
const receiver = await client.createP2PReceiver(transferId, token);

// 获取文件信息
console.log('文件名:', receiver.getFileName());

// 接收文件
await receiver.receiveFile({
  onProgress: (percent) => {
    console.log(`接收进度: ${percent.toFixed(1)}%`);
  },
  onComplete: ({ blob, fileName, fileSize }) => {
    // 触发浏览器下载
    downloadBlob(blob, fileName);
  },
  onError: (err) => {
    console.error('接收失败:', err);
  }
});

createP2PReceiver 参数

参数类型必填说明
transferIdstring必填传输 ID,从接收链接中获取
tokenstring必填接收令牌,从接收链接中获取

P2PReceiver 方法

方法返回值说明
getFileName()string获取文件名
receiveFile(callbacks)Promise接收文件,onComplete 参数为 {blob, fileName, fileSize}

安全中转

安全中转:文件经冰梭服务器安全中转存储,支持离线传输和多次下载,消耗套餐积分配额。发送方上传完成后即可关闭页面,接收方可随时下载。

传输流程

1
创建中转任务
调用 createRelaySender
→
2
获取下载链接
分享给接收方
→
3
上传文件
调用 sendFile
→
4
接收方下载
通过链接下载文件

发送文件

JavaScript
// 1. 创建安全中转任务
const sender = await client.createRelaySender({
  fileName: file.name,             // 必填:文件名
  fileSize: file.size,             // 必填:文件大小(字节)
  password: '可选密码',            // 可选:传输密码
  maxReceiveCount: 5,             // 可选:最大下载次数
  expireHours: 168               // 可选:链接有效期(小时)
});

// 2. 获取下载链接,分享给接收方
const downloadLink = sender.getDownloadLink();
console.log('下载链接:', downloadLink);

// 3. 上传文件(SDK 自动处理分块上传)
await sender.sendFile(file, {
  onProgress: (percent) => {
    console.log(`上传进度: ${percent.toFixed(1)}%`);
  },
  onComplete: (info) => {
    console.log('上传完成,等待接收方下载');
  },
  onError: (err) => {
    console.error('上传失败:', err);
  }
});

// 4. 取消传输(可选)
await sender.cancel();

createRelaySender 参数

参数类型必填说明
fileNamestring必填文件名
fileSizenumber必填文件大小(字节)
passwordstring可选传输密码
maxReceiveCountnumber可选最大下载次数
expireHoursnumber可选链接有效期(小时)

RelaySender 方法

方法返回值说明
getDownloadLink()string获取下载链接,分享给接收方
sendFile(file, callbacks)Promise上传文件,SDK 自动处理分块
cancel()Promise取消传输

接收文件

接收方通过链接中的 transferId 和 token 下载文件。

JavaScript
// 从下载链接中解析 transferId 和 token
const receiver = await client.createRelayReceiver(transferId, token);

// 获取文件信息
console.log('文件名:', receiver.getFileName());

// 下载文件为 Blob
const blob = await receiver.receiveFileAsBlob({
  onProgress: (percent) => {
    console.log(`下载进度: ${percent.toFixed(1)}%`);
  }
});

// 触发浏览器下载
downloadBlob(blob, receiver.getFileName());

createRelayReceiver 参数

参数类型必填说明
transferIdstring必填传输 ID,从下载链接中获取
tokenstring必填下载令牌,从下载链接中获取

RelayReceiver 方法

方法返回值说明
getFileName()string获取文件名
receiveFileAsBlob(callbacks)Promise<Blob>下载文件为 Blob

查询、取消与下载

查询任务状态

JavaScript
// 查询 P2P 传输状态
const p2pStatus = await client.getP2PTransferStatus(transferId);

// 查询安全中转传输状态
const relayStatus = await client.getRelayTransferStatus(transferId);

取消传输

JavaScript
// 取消 P2P 传输
await client.cancelP2PTransfer(transferId);

// 取消安全中转传输
await client.cancelRelayTransfer(transferId);

// 或直接调用 sender.cancel()
await sender.cancel();

下载工具

SDK 提供 downloadBlob 工具函数,用于触发浏览器文件下载。

JavaScript
import { downloadBlob } from 'iceshuttle-js';

// 触发浏览器下载
downloadBlob(blob, '文件名.txt');

错误码

所有接口统一返回 {"code":num,"data":...,"message":"..."}:业务数据在 data,错误说明在 message。

错误码场景说明
200成功业务数据在 data 中
400参数错误参数校验失败;或任务状态不允许(已取消 / 已完成 / 链接过期 / 不支持整文件下载)
401认证失败缺少认证参数 / 无效的 AppKey / 签名验证失败 / 时间戳过期(±300 秒)/ Nonce 重放
403禁止访问应用被禁用或拉黑(拉黑时 message 携带原因)/ 无权限(非管理员、越权访问、直传会话跨应用操作)/ IP 白名单拦截 / 无效 token
404资源不存在请求的资源不存在或已删除
410资源已失效保留期已过或接收 / 下载次数达上限
413文件超限单文件大小超出套餐限额,或超出套餐剩余积分额度
429限流请求过于频繁(默认每应用 100 次/分钟;分块直传凭证与回执端点放宽至 600 次/分钟),请稍后重试
500服务器错误服务端异常,请稍后重试
排障建议:401 优先检查时间戳(秒级)与签名串拼接顺序;403 区分应用级(禁用 / 拉黑 / 白名单)与资源级(非管理员、越权);410 属于业务终态,应引导调用方创建新任务。

常见问题

P2P、安全中转和分块直传如何选择?

  • P2P 直传:发送方和接收方同时在线,文件 2G 以内,追求速度和免费
  • 安全中转:接收方可能离线,需要多次下载,文件较大,有套餐积分池权益
  • 分块直传:把文件传进文件库 / 项目 / 收集链接(落库管理),任意大小,断点续传

AppSecret 丢失怎么办?

在 应用管理 页面,点击「重置Secret」获取新的 AppSecret。原 Secret 立即失效。

SDK 是否支持自动降级?

SDK 不支持自动降级。P2P 直传、安全中转和分块直传是三种独立的传输模式,需分别调用 createP2PSender、createRelaySender 或 uploadFile / createUploader。开发者可根据业务场景自行实现降级逻辑。

调用频率限制?

默认每个应用 100次/分钟。如需更高配额,请联系平台。

如何从接收链接中获取 transferId 和 token?

JavaScript
// P2P 接收链接格式:https://www.wringcloud.com/p2p/{transferId}?token={token}
// 安全中转下载链接格式:https://www.wringcloud.com/r/{transferId}?token={token}

function parseLink(link) {
  const url = new URL(link);
  const transferId = url.pathname.split('/').pop();
  const token = url.searchParams.get('token');
  return { transferId, token };
}

在线 Demo

我们提供了完整的 Demo 页面,包含 P2P 直传、安全中转、分块直传、文件接收的全部交互逻辑,开发者可基于此 Demo 定制自己的界面。

Demo
在线演示

完整交互界面,可直接体验 P2P 直传、安全中转和分块直传

打开 Demo
下载
Demo 源码

下载 Demo 页面源码,本地运行或集成到项目中

本地运行 Demo:
  1. 下载 demo/index.html 和 dist/iceshuttle.esm.js
  2. 保持相对路径关系(demo 目录与 dist 目录同级)
  3. 用浏览器直接打开 index.html 即可运行

完整示例代码

JavaScript
import { IceShuttle, downloadBlob } from 'iceshuttle-js';

// 初始化
const client = new IceShuttle({
  appKey: 'your-app-key',
  appSecret: 'your-app-secret'
});

// ===== P2P 直传 =====
async function p2pSend(file) {
  const sender = await client.createP2PSender({
    fileName: file.name,
    fileSize: file.size
  });
  console.log('接收链接:', sender.getReceiveLink());
  await sender.sendFile(file, {
    onProgress: (p) => console.log(p + '%'),
    onComplete: () => console.log('完成')
  });
}

async function p2pReceive(transferId, token) {
  const receiver = await client.createP2PReceiver(transferId, token);
  await receiver.receiveFile({
    onProgress: (p) => console.log(p + '%'),
    onComplete: ({ blob, fileName }) => downloadBlob(blob, fileName)
  });
}

// ===== 安全中转 =====
async function relaySend(file) {
  const sender = await client.createRelaySender({
    fileName: file.name,
    fileSize: file.size
  });
  console.log('下载链接:', sender.getDownloadLink());
  await sender.sendFile(file, {
    onProgress: (p) => console.log(p + '%'),
    onComplete: () => console.log('上传完成')
  });
}

async function relayReceive(transferId, token) {
  const receiver = await client.createRelayReceiver(transferId, token);
  const blob = await receiver.receiveFileAsBlob({
    onProgress: (p) => console.log(p + '%')
  });
  downloadBlob(blob, receiver.getFileName());
}

// ===== 分块直传(上传到文件库,v2.1.0+)=====
async function directUpload(file) {
  const landed = await client.uploadFile(file, {
    bizType: 'drive',           // drive / project / collect
    bizRef: { folderId: 0 },
    onProgress: (p) => console.log(p + '%')
  });
  console.log('落地结果:', landed);   // { transferId }
}

传输域

基础路径 /api/open/transfer 等。P2P 直传 2G 内免费;安全中转消耗套餐积分配额,支持离线接收与多次下载。

项目域

基础路径 /api/open/projects。项目生命周期、成员与项目文件。标注 项目管理员 的端点需管理员权限,非管理员调用返回 403。项目文件上传不设独立端点,走文件直传会话(bizType=project),落地时校验项目成员上传权限。

文件库域

基础路径 /api/open/drive。个人文件库目录树与文件管理(与页面端文件保护库同链路)。上传不计费;下载照走权益扣流量。

文件上传 = 分块直传会话:文件字节不经过应用服务器,客户端凭预签名 URL 直传对象存储,任意环境(服务端脚本、浏览器、CLI)均可接入。五步流程: ① POST /api/open/upload-sessions 初始化会话(bizType=drive / project / collect,相同 fileHash 自动断点续传)→ ② …/{sessionKey}/credentials 批量取分块凭证(单次≤64)→ ③ 对每个凭证按 HTTP PUT 直传分块字节 → ④ …/{sessionKey}/chunks/{index}/ack 逐块回执 → ⑤ …/{sessionKey}/complete 服务端合并并落地(配额校验与计费归因在此发生);中途放弃调 abort 清理。 会话与应用隔离:直传会话归属创建它的应用,其他应用或页面端创建的会话均不可跨应用操作(返回 403)。
第三方客户端你的应用 / 脚本 / CLI冰梭应用服务器仅控制面 · 不经手文件字节对象存储 OSS数据面 · 分块存储与合并① 初始化会话POST /api/open/upload-sessions创建会话记录,并向 OSS 发起服务端分块上传(MPU · uploadId)sessionKey · chunkSize(8MB) · totalChunks② 批量取分块凭证(≤64 个/次)POST …/{sessionKey}/credentials签发预签名 PUT:绑定对象键 + uploadId+ partNumber,仅限 PUT,1 小时过期credentials[ ] : chunkIndex · uploadUrl · expiresIn不经应用服务器③ 分块字节直传PUT uploadUrl(原始文件数据)按 partNumber 存储分块④ 分块回执POST …/{sessionKey}/chunks/{i}/ack按分块循环 ②→④断点续传:重复①同 fileHash 自动跳过已传块⑤ 完成上传POST …/{sessionKey}/completelistParts 校验总量 + CompleteMultipartUploadOSS 服务端聚合 · 元数据级秒回 · 无文件流经服务器落地结果:transferId / fileTaskId / 提交记录控制流(HMAC 签名 API)文件数据流(仅客户端 ↔ OSS 直传)响应 / 回执中途放弃:POST …/{sessionKey}/abort

图 · 开放平台大文件分块直传时序:控制面走签名 API,文件数据面由客户端直连 OSS,应用服务器全程不经手字节

交付域

基础路径 /api/open/delivery。交付链接全生命周期:创建、配置、状态控制、回执与下载。带 {id} 的端点会校验链接所属空间的归属(与页面端空间管理员同可见度)。

计费域

基础路径 /api/open/billing。三池积分、消耗明细与套餐配额。与页面端同规则:API 调用免费,下载照走权益扣流量;付费方=调用方(应用创建者)。

审核域

基础路径 /api/open/review。把平台审核能力接入你自己的系统:AI 质检报告(总结论、检查项明细与证据截图)与审片标注汇总(全量批注、锚点与解决状态)。调用者须为文件所属项目成员(与页面端审片室同口径);证据截图为预签名 URL(600 秒内有效)。与交付页「过程报告」同数据源——页面端面向被交付方输出脱敏版,开放平台面向服务方输出完整版。

空间域

基础路径 /api/open/workspace。空间上下文与成员管理。标注 空间管理员 的端点需管理员权限,非管理员调用返回 403。成员变更必须由他人操作(不能给自己设置角色、不能移除自己)。