Customer Open API · v2.1
一套 Session,安全配对本地 Runner
账号密码和 Customer API Key 都先换取短期 Open Session;账户资源和 Runner 管理使用同一权限模型,本地动作只有在 Runner v14 签名确认后才成为成功状态。
快速开始
Base URL
https://shop.robocloud.store/api/open/v2
先用账号密码或具名 API Key 换取 8 小时 Open Session。Session、新 API Key、配对秘密和 Runner Token 的完整值都只显示一次,请保存在操作系统凭据存储中。
curl -X POST https://shop.robocloud.store/api/open/v2/auth/sessions \
-H 'Authorization: Bearer rbl_live_example_xxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"auth_method":"api_key","device_summary":"home-computer","required_scopes":["runner.read","runner.pair","runner.control"]}'
后续业务请求只接受返回的 rbl_sess_…。浏览器 Cookie 和原始 Customer API Key 不能直接调用 v2 业务接口。
权限
account.read / wallet.read- 读取统一账户身份与整数最小货币单位余额。
plans.read / services.read- 读取套餐目录、服务列表与异步操作。
connection.read- 读取脱敏连接状态,不包含配置秘密。
configuration.read / nodes.read- 读取经过认证的配置 payload 与脱敏节点元数据。新 Key 必须显式拥有
configuration.read。 usage.read- 读取流量、计费和钱包快照。
active_dynamic.read- 读取主动动态线路、地区与轮转任务。
active_dynamic.control- 切换出口地区、设置轮转策略和执行手动轮转。
payg.open- 独立开通按量服务;与新增付费线路一起使用时仍要求幂等键和报价快照。
runner.read- 读取账户所属 Runner、真实 operation 状态和已确认的本地出口。
runner.pair- 创建一次性配对、查询配对和解绑 Runner。
runner.control- 向同账户、在线且版本受支持的 Runner 提交固定类型命令。
完整控制模板会显式保存全部 14 项权限。受限自定义模板只提交明确勾选项。旧 client:read / payg:open Key 会如实显示 integrationStatus=limited 和 missingRequiredScopes;迁移期仅保留原有连接/配置读取兼容,不会获得新增的显式 configuration.read、主动动态控制或 Runner 权限。
升级时先创建并验证新 Key,在 Session 请求中声明 required_scopes,确认 requestedScopesSatisfied=true 后切换消费端,最后撤销旧 Key。
接口
POST /auth/sessions统一登录
账号密码或 API Key 换取同一种短期 Session。登录不接受 Idempotency-Key,只读 Key 会返回 integrationStatus=limited 和缺失权限。
GET /me · GET /wallet账户与余额
两种认证来源在同一账户下返回完全相同的数据;金额始终使用整数分。
GET /plans套餐目录与节点
展示全部有效套餐。套餐节点是该 SKU 当前可提供的公开节点,包含地区、协议、公开倍率和可用状态;只有开放的按量套餐会返回 apiPurchasable=true。
GET /services已有服务
支持游标分页。不同套餐及同一套餐的多个服务彼此独立。
GET /services/{id}/connection安全连接状态
只返回 revision、ready、stale 和节点数量,不返回稳定订阅 URL 或节点凭据。
GET /services/{id}/configuration认证配置 payload
在 Session 和服务归属检查后返回 Clash 配置本体,响应禁止缓存。
GET /services/{id}/nodes脱敏节点元数据
返回名称、地区、协议、倍率和可用性,不返回代理认证字段。
GET /services/{id}/usage流量与扣费
返回原始流量、倍率计费流量、累计扣费金额和当前钱包余额。
POST /payg/services开通按量服务
需要 payg.open、完整费率快照、自动扣费确认和唯一的 Idempotency-Key。
GET /operations/{id}任务进度
开通异步执行。响应保留首次提交的 requestId,终态失败提供脱敏 lastErrorCode / lastError;幂等重放不覆盖关联 ID。建议从 2 秒开始退避轮询,最大间隔 15 秒。
/services/{id}/active-dynamic/*云端主动动态控制
地区切换、轮转策略、手动轮转和线路调整复用现有异步任务与账户级幂等约束;任务查询同样返回首次 requestId 与脱敏终态错误。
POST /runner-pairings · POST /runners/pair一次性设备配对
Open Session 创建五分钟有效的一次性秘密;Runner 用 Ed25519 私钥持有证明消费它。最低版本为 v14.0.0,v13.2.0 返回 runner_pairing_unsupported。
GET /runners · GET/DELETE /runners/{id}Runner 管理
读取和解绑严格限定当前账户。Runner Token 是设备凭据,不能充当 Open Session。
/runners/{id}/*固定 Runner 命令
选择服务、测速、启动、停止和刷新均要求 Idempotency-Key,返回真实异步 operation;Runner 确认前不显示成功。
GET /runners/{id}/exports已确认本地出口
只返回 networkScope=runner_local 的回环地址;该地址只能由 Runner 所在设备使用,并非云端可访问代理。
Runner v14 协议
Runner 使用立即返回的短请求,不使用阻塞长轮询:POST /runner/heartbeat、POST /runner/commands/claim、POST /runner/operations/{operation_id}/results。
每次请求同时携带 Authorization: Runner rbl_run_…、X-RoboCloud-Runner-Timestamp、唯一 X-RoboCloud-Runner-Nonce 和 X-RoboCloud-Runner-Signature。Ed25519 签名 canonical 文本如下:
METHOD
/api/open/v2/NORMALIZED_ABSOLUTE_PATH
X-ROBOCLOUD-RUNNER-TIMESTAMP
X-ROBOCLOUD-RUNNER-NONCE
SHA256_HEX_OF_EXACT_BODY_BYTES
仅允许 service.select、service.status、nodes.read、nodes.test、node.start、node.stop、exports.read、runner.refresh;没有 shell、脚本、自由 URL 或任意命令。
claim 返回有限租约、deadline、服务与 Runner revision。heartbeat 固定上报稳定 deviceId、配对 accountId,服务端与 Runner Token 的权威绑定做恒等校验;选择服务后还必须上报本机实际应用的 selectedServiceRevision,云端不能拿最新 revision 冒充。过期命令不得在重连后执行;同一 operation 重领时复用本地保存结果,不能重复副作用。敏感配置只在 claim 时即时生成,经签名 HTTPS 通道交付,不写入普通命令记录或日志。
按量开通
curl -X POST https://shop.robocloud.store/api/open/v2/payg/services \
-H 'Authorization: Bearer rbl_sess_example_xxxxxxxxxxxx' \
-H 'Idempotency-Key: 018f-example-unique-key' \
-H 'Content-Type: application/json' \
-d '{
"sku": "home-payg",
"expectedPlanVersion": 7,
"expectedBasePriceMinorPerGb": 200,
"expectedCurrency": "CNY",
"confirmAutomaticDebit": true
}'
- 余额达到套餐返回的最低开通要求即可创建,开通时不预扣套餐费。
- 每个新幂等键创建一个独立服务;重复同一个幂等键不会重复创建。
- 多个服务共享账户余额并分别记账;余额耗尽时停止,充值后自动恢复。
数据约定
- 金额
- 整数分为权威值,例如
200表示 ¥2.00。 - 流量
1 GB = 1,000,000,000 bytes,上传和下载均计入。- 倍率
- 千分制整数:
800=0.8x、1000=1x。 - 时间
- UTC ISO 8601,例如
2026-08-21T08:30:00Z。
Open Session、API Key、Runner Token、pairing secret、密码、配置 payload、订阅 URL 和节点凭据都属于敏感值,不得写入 URL 查询参数、普通日志、截图、遥测或错误报告。
本地出口 host 只允许 127.0.0.1 或 ::1,并始终带 networkScope=runner_local。云端调用者不得直接连接该回环地址,也不得把云端节点元数据当作本地出口。
错误与重试
错误响应统一为 {"error":{"code","message","requestId","details"}}。程序只判断 code;message 用于展示,requestId 用于脱敏排障。
- 认证
robocloud_auth_required、robocloud_auth_invalid、robocloud_session_expired、robocloud_session_revoked、robocloud_account_disabled、robocloud_api_key_revoked。- 权限与归属
robocloud_scope_required、service_not_found、robocloud_service_inactive、package_inactive。不存在和不属于当前账户的服务均返回同一个 404,避免泄露其他账户资源。- 幂等与报价
idempotency_key_required、idempotency_key_reused、quote_required、quote_changed、line_quote_changed。同一键同一请求可安全重放;同一键不同请求必须换新键。- 余额与容量
insufficient_balance、payg_minimum_balance_required、payg_service_exists、line_limit_reached、line_operation_running。- 请求与临时故障
request_too_large、robocloud_rate_limited、database_busy、robocloud_upstream_unavailable。仅对后三种临时错误采用带抖动的指数退避,并复用原幂等键。- Runner 配对与认证
runner_pairing_invalid、runner_pairing_expired、runner_pairing_consumed、runner_pairing_unsupported、runner_auth_invalid、runner_token_revoked、runner_signature_invalid、runner_request_replayed、runner_version_unsupported。- Runner 控制
runner_not_found、runner_offline、runner_capability_required、runner_revision_conflict、runner_operation_expired、runner_lease_invalid、runner_result_invalid。Runner 离线或尚未确认不等于成功。
完整的常用错误码目录同时写入 OpenAPI 根级 x-error-code-catalog,领域接口还可能返回其在 OpenAPI 响应中说明的更具体错误码。