用户开放 API
API 文档
基础地址是 https://www.52frp.com/api/v1。机器可读规格是 GET https://www.52frp.com/api/v1/openapi.json,不需要令牌。下面先按插件会调用的顺序写,再按接口列字段。
服务地址
所有路径都在 https://www.52frp.com/api/v1 下面。示例里的主机名就是这个地址。机器可读规格是 GET /api/v1/openapi.json,不需要令牌。规格里的 servers 已经含 /api/v1,路径按规格里的写法拼接。
鉴权
登录后打开 https://www.52frp.com/user/#/user-center ,在「API 访问令牌」创建。创建时要填当前账号密码。请求头写 Authorization: Bearer,后面是 hz_ 开头的访问令牌,明文只显示一次。这是 API 访问令牌。frpc 的 user、auth.token、节点 X-API-Token 和网页登录令牌各有各的用途。Cookie 无效。查询参数里出现 token、access_token、apitoken、api_token 会返回 400。已登录改密不吊销;找回密码和管理员改密会吊销。
前置
| 前置 | 说明 |
|---|---|
account:read | 查看账户、通知偏好、通知和活动,并把通知标为已读。默认有。 |
account:write | 修改通知开关。默认没有。 |
identity:read | 查看是否已实名。默认有。 |
tunnels:read | 查看隧道与客户端。默认有。 |
tunnels:write | 创建和修改隧道与客户端。默认有。 |
nodes:read | 查看节点、负载和测速。默认有。 |
packages:read | 查看套餐和流量统计。默认有。 |
packages:write | 自动续费、换绑和清理过期套餐。默认有。 |
shop:read | 查看可购方案。默认有。 |
billing:read | 查看订单。默认有。 |
rewards:read | 查看推荐信息。默认有。 |
billing:pay | 余额下单和取消。默认没有,创建令牌时另勾。 |
billing:gateway | 支付宝或微信购买套餐,不能给余额充值。默认没有。 |
billing:redeem | 查看并兑换自己的充值码。默认没有。 |
support:read | 查看平台工单和社区节点工单。默认没有。 |
support:write | 创建、回复和关闭工单。默认没有。 |
请求与成功
有 JSON 正文时带 Content-Type: application/json。不带时,创建和编辑返回 400,文案是参数错误。成功时 HTTP 200,正文 ok 为 true,业务数据在 data。检查名称、检查端口在名称非法或端口冲突时仍是 HTTP 200,要看 data.available 或 data.valid。
开放 API 不提供签到、组网、云服务器、成长等级、给余额充值、改资料、改密、客服、代理和入驻节点。充值码需要 billing:redeem。工单需要 support:read 或 support:write。不能用令牌再签发令牌,没有 WebSocket,也不能提交实名材料。
失败体
失败时 ok 为 false,并带 error.code 和 error.message。响应里没有 RequestId。要追查一次调用,用调用记录里的时间、方法、路径、状态码和 error_code。
{ "ok": false, "error": { "code": "validation_error", "message": "参数错误" } }公共错误码
下面这些码每个接口都可能碰到。单接口页只列该接口特有的行,401、429、405 和 5xx 以这里为准。
| HTTP | error.code | 典型文案 | 何时出现 | 怎么处理 |
|---|---|---|---|---|
| 401 | unauthenticated | API 访问令牌无效 | 缺少 Authorization,或令牌不对、已吊销 | 到个人中心重新创建令牌,放在请求头里 |
| 403 | scope_denied | API 访问令牌缺少权限 | 令牌没有该接口要求的前置 | 创建令牌时勾上对应权限 |
| 403 | account_disabled | 账号不可用 | 校验令牌时账号已停用或封禁 | 先恢复账号,再重试 |
| 403 | validation_error | 沿用业务原文,例如需要先完成实名认证 | 未实名、无权使用该节点。HTTP 是 403,error.code 仍是 validation_error | 先看 GET /identity。开放 API 不能提交实名材料 |
| 400 | validation_error | 参数错误 | 缺字段、类型不对或业务规则不通过。查询参数里出现 token、access_token、apitoken、api_token 也是这个码 | 按该接口的请求参数修改 |
| 404 | not_found | 资源不存在 | 编号不存在,或失败文案里带「不存在」。未注册路径的文案是接口不存在 | 核对编号对照里的 id |
| 405 | method_not_allowed | 方法不允许 | 路径存在,但 HTTP 方法不对 | 改成文档里写的方法 |
| 409 | conflict | 请求正在处理,请稍后用相同 Idempotency-Key 重试 | 相同幂等键的上一笔还没结束 | 稍后再用同一个键重试 |
| 409 | idempotency_conflict | 相同 Idempotency-Key 的请求体不一致 | 键相同但正文不同 | 换一个新键,或改回第一次的正文 |
| 429 | rate_limited | 请求过于频繁,请稍后再试 | 超过该接口的每分钟次数。响应没有 Retry-After | 等满一分钟。窗口按令牌和接口分开计算 |
| 5xx | internal | 系统错误,请稍后重试 | 服务端 5xx。HTTP 状态保持原样,error.code 改成 internal | 稍后重试。响应里没有 RequestId,排查时看调用记录 |
限流与幂等
每个令牌对同一接口每分钟最多 60 次。余额下单、网关下单和取消是 10 次,兑换充值码是 5 次。窗口按令牌和接口各自计算,满 1 分钟后重新计数。超过返回 429,error.code 是 rate_limited。响应没有 Retry-After。
余额下单和网关下单认 Idempotency-Key,长度 1 到 128。相同键且请求体相同会原样重放第一次的响应,包括当时的余额不足。上一笔还在处理时返回 409 conflict。键相同但请求体不同是 409 idempotency_conflict。创建隧道、导入、开关、清理过期套餐没有幂等键,重复调用会再次执行。
分页
用 page 和 page_size,也接受 pageSize。带 list 的成功响应含 page、page_size 和 total。节点、节点分组、可购方案和流量分布的 data 是数组,不分页。
建一条能运行的隧道
- GET确认实名GET /api/v1/identity。data.identity_verified 为 false 时,创建、导入、编辑、开关隧道和创建客户端都会 403,error.code 仍是 validation_error。开放 API 不能提交实名材料。
- GET选可用节点GET /api/v1/nodes。data 是数组。建隧道只用 available 为 true 的 id。一个都没有就先走下面的购买顺序,不要直接创建。
- GET检查名称和端口GET /api/v1/tunnels/check-name。tcp 或 udp 再调 check-port 或 occupied-ports。这两处不可用时仍是 HTTP 200,要看 data.available 或 data.valid。
- POST创建POST /api/v1/tunnels,带 Content-Type: application/json。tcp 要有 proxy_name、proxy_type、node_id、local_ip、local_port、remote_port。成功时 data 就是隧道对象,隧道 id 在 data.id,不在 data.proxy。没有幂等键,再 POST 一次会再建一条。
- GET下载能运行的配置GET /api/v1/nodes/{node_id}/config/file?proxy_ids={data.id}&format=toml。toml 含 user 和 auth.token,可以交给 frpc。download=1 时正文是 text/plain。不要用单条 YAML 去跑:那份文件没有 serverAddr、user、auth.token。不必先创建客户端。
没有可用节点时先购买
- GET确认能付令牌要有 billing:pay。创建令牌时默认没有。GET /api/v1/identity 未实名时,下单同样 403 validation_error。
- GET选方案GET /api/v1/shop/plans。owner_type 为 platform 或 user。user 是社区方案,不能余额购买,用 POST /api/v1/orders/gateway。单价字段只用于估算。
- GET选首购节点看 GET /api/v1/nodes 的 accepts_new_binding_by_type,不要看 available。available 只表示已经买过、可以建隧道。
- POST下单POST /api/v1/orders,请求头带 Idempotency-Key,payment_type 只能是 balance。成功时 data 只有 order_no、amount、status,没有数字订单 id,也没有套餐组编号。
- GET再确认节点GET /api/v1/packages 看到新套餐后,重新 GET /api/v1/nodes。目标节点 available 为 true,再回到创建隧道。
交给客户端托管
这一段不是建隧道的前置条件。节点 toml 已经可以运行 frpc。需要本机 webServer 时再走这里。
编号对照
| 要拿的值 | 从哪读 |
|---|---|
| 隧道 id | 创建、编辑、开关的 data.id。列表的 data.list[].id。详情的 data.proxy.id。配置文件的 proxy_ids 用这个数。 |
| 节点 id | 节点列表的 data[].id。创建请求的 node_id。创建响应在 data.node_id,列表才同时有 node 和 node_name。 |
| 是否启用 | 看 status。0 启用,1 停用,2 流量用完,3 已封禁。列表的 enabled 按 status 为 0 计算。创建响应里的 enabled 可能是 false,不能拿来判断没开。 |
| 远程端口 | 请求可以是数字或字符串。响应里的 remote_port 是字符串。 |
| 订单 | 下单成功的 data.order_no 不能填进路径。取消和查详情用订单列表的 data.list[].id。 |
| 套餐 | 自动续费和换绑用 data.list[].id。续费、追加填的 custom_plan_group_order_id 是同一行的 order_id。 |
| 客户端 | 路径用 data.client.id。client_proxy_id 是内部管理隧道,不能放进 proxy_ids。 |
| 连接凭证 | user 和 auth.token 只在节点配置 JSON、节点 toml、客户端配置正文里。账户、隧道详情、单条 YAML 都没有。 |