概述
TooServer 允许通过 API 集成到你程序中,进行查询产品、订单、服务器信息、余额与流水,产品下单与续费,以及服务器电源控制、重装系统、重置密码等运维操作。
基础地址: https://my.tooserver.net/v1
频率限流:查询类接口 60 次/分钟,下单/续费/重装/改密接口 10 次/分钟。
每日额度:默认每天 20 笔新购订单(续费不计入)。如需提升请联系客服。
创建条件:邮箱已激活 且 有过一次消费记录。 前往申请 API
下单与续费: 仅支持余额扣款 请提前在网站充值。
注意:令牌拥有查询、下单、续费的完整权限,凡涉及下单、续费的接口都会从账户余额扣款。
格式与代码说明
| 请求头(每个请求需携带令牌) | |
|---|---|
| Header | 值 |
Authorization | Bearer ts_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
Content-Type | application/json(POST 请求需要) |
| 响应结构(所有接口返回均为 JSON,UTF-8) | ||
|---|---|---|
| ||
| 字段 | 类型 | 说明 |
code | int | 0 表示成功,非 0 表示错误 |
message | string | 结果描述 |
data | object/null | 返回数据,错误时可能为 null |
| 错误码(HTTP 状态码与 code 对应) | ||
|---|---|---|
| code | HTTP | 说明 |
| 0 | 200 | 成功 |
| 4000 | 400 | 参数错误 |
| 4001 | 400 | 金额/价格异常 |
| 4002 | 400 | 余额不足(订单已创建待付款) |
| 4011–4015 | 401 | 令牌缺失/无效/已吊销/已过期/账户异常 |
| 4031 | 403 | 无操作权限 |
| 4033 | 403 | 该服务器不支持此 API 操作 |
| 4041 | 404 | 资源不存在 |
| 4090 | 409 | 该服务器有未完成的操作 |
| 4092 | 409 | 库存不足 |
| 4290 | 429 | 请求过于频繁 |
| 4291 | 429 | 已达每日下单上限 |
| 5001 | 500 | 服务器错误 |
| 限流 / 额度超限返回示例 | ||
| ||
| 订单状态(status) | |
|---|---|
| 值 | 说明 |
unpaid | 待支付 |
partial | 部分支付 |
paid | 已支付(已履约) |
cancelled | 已取消 |
refunded | 已退款 |
接口
| GET/v1/regions | ||
|---|---|---|
| 说明 | 获取地区列表 | |
| 返回示例 | | |
| GET/v1/products | ||
|---|---|---|
| 说明 | 获取产品列表;代理账户返回中额外包含 agent_price | |
| 参数 | 类型 | 说明(均可选) |
region | int | 地区 ID |
cat | int | 线路/分类 ID |
type | string | 产品类型 |
filter | string | 标签过滤 |
| 示例 | GET /v1/products?region=19&cat=61 | |
| 返回示例 | | |
| POST/v1/orders 会扣余额 | ||
|---|---|---|
| 说明 | 创建订单并用余额支付,价格由服务端计算。返回的 order_no 为账单号(P 开头) | |
| 参数 | 类型 | 说明 |
pricing_id | int | 定价 ID(必填) |
billing_cycle | string | 周期,必填:month / quarter / half_year / year / two_year |
user_remark | string | 备注(可选) |
| 计价 | 普通用户按 sale_price 打折;代理按 agent_price 不打折 | |
| 返回示例 | | |
| 余额不足 | 返回 4002,订单以待付款保留,可在网站充值后支付:
| |
| GET/v1/orders | ||
|---|---|---|
| 说明 | 获取订单列表 | |
| 参数 | 类型 | 说明(均可选) |
status | string | unpaid / partial / paid / cancelled / refunded |
page | int | 页码,默认 1 |
limit | int | 每页数量,默认 20,最大 100 |
| 返回示例 | | |
| GET/v1/orders/{order_no} | ||
|---|---|---|
| 说明 | 获取订单详情,仅可查询本人订单 | |
| 返回示例 | | |
| 返回 | 不存在或非本人返回 4041 | |
| GET/v1/servers | ||
|---|---|---|
| 说明 | 获取服务器列表,按到期时间升序(临期靠前) | |
| 参数 | 类型 | 说明(均可选) |
status | int | 1 正常 / 0 到期 |
page | int | 页码 |
limit | int | 每页数量 |
| GET/v1/servers/{id} | ||
|---|---|---|
| 说明 | 获取服务器详情 | |
| 返回示例 | | |
| 安全 | 不返回登录密码、IPMI 等任何登录凭证,凭证只能在网站内查看 | |
| POST/v1/servers/{id}/renew 会扣余额 | ||
|---|---|---|
| 说明 | 服务器续费,续费周期与金额固定跟随该服务器的既有配置,成功后自动延长到期时间。无需也不接受传入周期参数 | |
| 参数 | 类型 | 说明 |
user_remark | string | 备注(可选) |
| 返回示例 | | |
| 不支持 | 若该服务器无有效周期/牌价,返回 4001,请联系客服 | |
| 余额不足 | 返回 4002,续费单以待付款保留 | |
| GET/v1/servers/{id}/status | ||
|---|---|---|
| 说明 | 查询服务器电源状态。无面板接口的服务器返回 supported: false、state: unknown,此时无法通过 API 判断电源状态,需在网页端查看 | |
| 返回字段 | 类型 | 说明 |
state | string | running 运行中 / stopped 已关机 / installing 重装中 / unknown 未知(含不支持的情况) |
supported | bool | 该服务器是否支持 API 状态查询 |
| 返回示例 | | |
| POST/v1/servers/{id}/power | ||
|---|---|---|
| 说明 | 电源操作:开机 / 关机 / 重启。无面板接口的服务器返回 4033,需在网页端处理。重启会自动生成一条工单便于跟踪 | |
| 参数 | 类型 | 说明 |
action | string | 必填:boot 开机 / shutdown 关机 / reboot 重启 |
| 返回示例 | | |
| 不支持示例 | | |
| 操作冲突 | 若该服务器有未完成的操作(如重装中),返回 4090 | |
| GET/v1/servers/{id}/templates | ||
|---|---|---|
| 说明 | 获取可用于重装的系统模板列表。重装前先调用此接口,从中取得 image_id(即模板的 id)。无面板接口的服务器返回 4033 | |
| 返回示例 | | |
| POST/v1/servers/{id}/reinstall 危险操作 | ||
|---|---|---|
| 说明 | 重装系统会清空服务器全部数据,不可恢复,请谨慎调用。image_id 从 /templates 接口获取 | |
| 参数 | 类型 | 说明 |
image_id | string | 必填,系统模板 ID(来自 templates 接口的 images[].id) |
password | string | 必填,新 root 密码,8-16 位(规则见下方密码说明) |
remote_port | int | 可选,远程端口 |
| 返回示例 | | |
| 说明 | 重装会生成一条工单用于跟踪进度。返回 code: 0 表示已提交(可能同步完成,也可能异步安装中)。可稍后用 /status 确认电源状态,或直接 SSH 登录验证。若该服务器有未完成的操作返回 4090;不支持重装返回 4033 | |
| POST/v1/servers/{id}/reset_password | ||
|---|---|---|
| 说明 | 重置服务器 root 密码。不支持返回 4033,有未完成操作返回 4090 | |
| 参数 | 类型 | 说明 |
password | string | 必填,新密码,8-16 位(规则见下方密码说明) |
| 返回示例 | | |
| GET/v1/servers/{id}/task/{task_id} | ||
|---|---|---|
| 说明 | 查询异步任务(重装/改密)进度。无面板接口的服务器返回 4033 | |
| 返回示例 | | |
| 密码规则(reinstall / reset_password 通用) | ||
|---|---|---|
长度 8-16 位;不能以 / 开头;必须同时包含小写字母、大写字母、数字各至少一个,以及至少一个特殊字符。允许的特殊字符: ~ ! @ # $ & * ( ) _ - + = | { } [ ] ; : < > ? , . /部分服务商对特殊字符兼容性有限制,建议优先使用 ! @ # $ * - 等常见符号。
|
| GET/v1/account/balance | ||
|---|---|---|
| 说明 | 查询当前余额 | |
| 返回示例 | | |
| GET/v1/account/balance/logs | ||
|---|---|---|
| 说明 | 查询余额变动记录 | |
| 参数 | 类型 | 说明(均可选) |
type | string | income / expense |
page | int | 页码 |
limit | int | 每页数量 |
| 返回 | 每条含金额、类型、来源、变动前后余额、备注、时间 | |
使用流程
下单自动化流程:
1. 网站内充值 → 2. GET /v1/products 查产品 → 3. POST /v1/orders 下单扣款 → 4. GET /v1/orders 查订单状态 → 5. 开通后 GET /v1/servers 查服务器 → 6. 临期时 POST /v1/servers/{id}/renew 续费。
运维操作流程:
电源控制:直接 POST /v1/servers/{id}/power,action 传 boot/shutdown/reboot;可先用 GET /v1/servers/{id}/status 确认当前状态。
重装系统:先 GET /v1/servers/{id}/templates 拿到目标系统的 image_id → 再 POST /v1/servers/{id}/reinstall 提交 image_id 和 password → 异步任务可用 GET /v1/servers/{id}/task/{task_id} 查进度,或稍后 SSH 登录验证。
重置密码:直接 POST /v1/servers/{id}/reset_password 提交新 password。
无面板接口的服务器,电源/重装/改密会返回 4033,状态查询返回 supported: false,此类机器请在网页端提交工单处理。有未完成操作时返回 4090。
调用示例(以下单为例)
curl -X POST "https://my.tooserver.net/v1/orders" \
-H "Authorization: Bearer 你的令牌" \
-H "Content-Type: application/json" \
-d '{"pricing_id": 2681, "billing_cycle": "month"}'
<?php
$ch = curl_init("https://my.tooserver.net/v1/orders");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer 你的令牌",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"pricing_id" => 2681,
"billing_cycle" => "month",
]),
]);
$resp = curl_exec($ch);
curl_close($ch);
$data = json_decode($resp, true);
if ($data["code"] === 0) {
echo "下单成功:" . $data["data"]["order_no"];
} else {
echo "失败:" . $data["message"];
}
import requests
resp = requests.post(
"https://my.tooserver.net/v1/orders",
headers={
"Authorization": "Bearer 你的令牌",
"Content-Type": "application/json",
},
json={"pricing_id": 2681, "billing_cycle": "month"},
)
data = resp.json()
if data["code"] == 0:
print("下单成功:", data["data"]["order_no"])
else:
print("失败:", data["message"])
const res = await fetch("https://my.tooserver.net/v1/orders", {
method: "POST",
headers: {
"Authorization": "Bearer 你的令牌",
"Content-Type": "application/json",
},
body: JSON.stringify({ pricing_id: 2681, billing_cycle: "month" }),
});
const data = await res.json();
if (data.code === 0) {
console.log("下单成功:", data.data.order_no);
} else {
console.log("失败:", data.message);
}
续费只需把 URL 换成 /v1/servers/{id}/renew,请求体可留空或仅传 user_remark(续费周期跟随机器,不需指定)。运维接口(power / reinstall / reset_password)写法相同,只是 URL 和请求体不同。