Skip to content

API 参考 ​

IP 优选实验室 ​

所有实验室接口仅管理员可访问,实验开关关闭时返回 404。写操作要求真实管理员会话,不接受静态 API Key;域名授权绑定签发记录的管理员。

方法路径说明
GET/api/lab/ip-selector探测与 DNS 配置;只返回 has_secret_key,不返回 Secret Key
PUT/api/lab/ip-selector保存配置;Host / SNI 变化保留独立域名验证,未授权时关闭定时
GET/api/lab/ip-selector/statusstatus 含进度、授权、预算、限速、next_allowed_at 和错误;runs 为最近 20 条历史
POST/api/lab/ip-selector/ownership/challenge请求体为 {"domain":"example.com"};返回 TXT record_name 与 token,撤销旧授权和定时
POST/api/lab/ip-selector/ownership/verify复查当前 TXT;成功返回授权状态,失败为 403
GET/api/lab/ip-selector/ownership/dns真实管理员会话查询本人当前 DNS 连接,返回 available、account_name(可选)和 message;不返回凭据,也不保证有目标域名写入权限
POST/api/lab/ip-selector/ownership/dns请求体为 {"domain":"example.com"};用当前连接添加验证 TXT 并复查 DNS,返回 verification、record_created、verified 和 message
POST/api/lab/ip-selector/run只使用已保存配置,任务启动返回 202;不接受请求体覆盖探测目标
POST/api/lab/ip-selector/stop取消当前任务并关闭定时,返回 stopped: true 表示停止请求已受理

配置或挑战参数无效返回 400,执行时授权、预算或冷却校验失败返回 403,已有任务运行时返回 409。202 和 stopped: true 都不表示后台任务已执行完毕,需轮询状态。预算按完整候选数量预留、取消不退还,每日按 UTC 重置并跨重启保留。详见 IP 优选实验室。

新历史项含 probe(本次 host、sni、path、statuses 快照)、rejected(未命中总数)及最多 100 条 diagnostics(ip、status、latency_ms、error)。失败任务也保留诊断;results 仍仅为排名靠前的命中结果。旧历史可能没有新增字段,零未命中时可省略计数和诊断。

TXT 签发和一键填写只使用请求中的验证域名,不依赖或修改探测 Host / SNI,客户端无需先保存探测配置。未绑定账户、无域名权限或写入失败返回 400,可回退到手动添加。写入成功但解析尚未生效时返回 200、verified: false,需等待后复查;record_created: false 可表示相同记录已存在。重试复用有效挑战,不覆盖其他记录,不启用定时或扫描。操作写入 lab_ownership_dns 审计。

管理员通过 GET/PUT /api/admin/settings 读取和修改 lab_daily_request_limit(1–10000000,默认 100000)、lab_requests_per_second(1–1000,默认 10)、lab_max_workers(1–256,默认 32)。只接受整数,省略字段保留原值,非法值返回 400 且不保存。限制从下一轮生效,调低预算不重置已预留用量;这些是实例限制,不是云平台额度。状态接口返回当前配置限制,运行中任务保留启动时快照。读取探测配置时,并发数按当前上限显示;实际执行也按上限限制。

AI 助手 ​

助手接口需要真实用户会话 X-Auth-Token,不接受静态 API Key 作为会话所有者。会话与任务仅向所属用户开放,管理员共享连接不会共享历史。

方法路径说明
GET/api/assistant/settings有效模式与配置状态,密钥不返回;普通用户在共享模式下看不到共享端点
PUT/api/assistant/settings保存 scope: personal/shared、endpoint、model、api_key、api_format: chat_completions/responses 和 reasoning_summary;共享范围仅管理员可写,可附 shared_enabled
GET/api/assistant/conversations本人会话、消息与任务
POST/api/assistant/conversations新建会话
DELETE/api/assistant/conversations/{conversationID}删除会话记录,不删除业务资源;执行中禁止删除
POST/api/assistant/conversations/{conversationID}/messagesmessage 与 include_resources,调用模型并保存回复及待确认任务;stream: true 返回 SSE,不执行写操作
POST/api/assistant/conversations/{conversationID}/tasks/{taskID}action 为 edit、execute、pause、resume、cancel、retry;编辑提交 arguments 与 expected_revision

edit 只校验并保存待确认参数,返回新的 revision,不执行写操作;删除任务不可编辑。execute 必须提供 confirmed: true,已编辑任务还须提供核对时的 expected_revision。retry 仅适用于 unknown 状态,必须同时提供 confirmed: true 与 checked_resources: true,表示已核对真实资源。执行参数从服务端保存的任务读取,不能在执行请求中替换。旧版本、已完成或正在执行的任务不可重复执行。任务接口的 HTTP 200 表示状态已保存,执行成功须看 status: succeeded。

流式消息返回 Content-Type: text/event-stream,事件包括 status、text、reasoning、ping、done 和 error;最终 done 包含保存后的会话。反向代理须允许流式响应并关闭缓冲,失败或断流不能当作任务已生成。

详情及限制见 AI 助手。

通用鉴权 ​

所有接口均以 /api 为前缀。鉴权方式:

  • 用户会话:登录后获得 X-Auth-Token,所有受保护接口接受
  • API Key:X-API-Key 头(或 ?api_key=),等同管理员权限的机器调用

普通业务接口按用户组权限校验(隧道管理 / 域名绑定 / DNS 记录 / 服务监控 / Cloudflare 授权),管理员不受限制;/api/admin/* 下的管理后台接口仅管理员可用。会话保存在数据库中,重启服务不会失效。

健康检查 ​

方法路径说明鉴权
GET/api/health健康检查,返回当前版本号无

安装引导 ​

面板还没有管理员账户时,进程只挂载这一组接口与前端页面;安装完成后它们一律返回 404。

方法路径说明鉴权
GET/api/setup/status安装状态:存储是否由环境变量接管、当前的数据库配置(凭据已脱敏)、数据目录与配置文件路径无
POST/api/setup/test用表单里的数据库配置试连一次,不落盘无
POST/api/setup/complete保存存储配置、建表并创建管理员账户,成功后进程自行重启无

注册与身份 ​

方法路径说明鉴权
GET/api/auth/config注册策略:是否开放注册、邀请码模式、是否需要邮箱验证码,以及人机验证(Turnstile)开关与 Site Key无
POST/api/auth/register注册并自动登录;邀请码与验证码按服务端策略校验无
POST/api/auth/send-code发送注册邮箱验证码(需已配置 SMTP,60 秒冷却)无
POST/api/auth/forgot-password发送密码重置验证码(需已配置 SMTP)无
POST/api/auth/reset-password使用重置验证码设置新密码,成功后踢掉所有会话无
GET/api/auth/me当前登录身份:ID、用户名、昵称、头像、邮箱、角色与权限列表用户会话

OIDC 登录与账户绑定 ​

方法路径说明鉴权
GET/api/auth/oidc/providers已启用接入方的 ID 与名称无
POST/api/auth/oidc/startprovider_id 与按需提供的 cf_turnstile_response;返回 authorization_url无
GET/api/auth/oidc/callback接入方回调,校验授权后返回本站 Web 登录页OIDC state 与浏览器 Cookie
POST/api/auth/oidc/completeticket 与按需提供的邮箱 code;完成登录 / 绑定,或返回邮箱验证、二步验证、首次密码设置结果ticket 与浏览器 Cookie;绑定 / 设置密码还需原用户会话
POST/api/auth/oidc/send-code为待完成的 ticket 发送本站邮箱验证码ticket 与浏览器 Cookie
GET/api/account/oidc当前账户是否有本站密码及已绑定身份,不返回接入方密钥用户会话
POST/api/account/oidc/startprovider_id、action: bind/password;新增绑定还需确认本站 password用户会话
POST/api/account/oidc/password重新认证后用 ticket 设置首个本站 password,不能覆盖已有密码用户会话与单次 ticket
DELETE/api/account/oidc/{id}按接入方 ID 解绑;须保留至少一种可用登录方式用户会话
GET/api/admin/oidc/providers管理配置,仅返回 has_client_secret管理员
POST / PUT/api/admin/oidc/providers、/api/admin/oidc/providers/{id}新增 / 编辑名称、Issuer、Client ID、回调、Scopes、启用与排序;密钥留空保留,clear_secret 清除管理员
DELETE/api/admin/oidc/providers/{id}删除接入方,有关联身份时拒绝管理员

账户接口仅接受真实用户会话,静态 API Key 不能代替账户所有者。首次登录的邮箱归属和新用户策略见 多用户与管理后台。

登录与会话 ​

所有认证入口(登录、两步验证、通行密钥登录、注册、邮箱验证码、找回与重置密码)都受登录限流保护:账号与来源 IP 分别计数,额度耗尽时返回 429,响应头带 Retry-After(秒),响应体带 retry_after 与提示文案;阈值与开关见「系统设置 → 登录保护」,机制详见安全与管理员认证。

方法路径说明鉴权
POST/api/admin/login登录(account 支持邮箱或用户名),开启 2FA 时返回 challenge无
POST/api/admin/login/2fa使用 TOTP / 恢复码完成登录Challenge
POST/api/admin/logout退出当前会话用户会话
GET/api/admin/status检查会话有效性,返回用户名与角色用户会话
PUT/api/admin/password修改当前用户密码(成功后撤销该用户全部会话)用户会话
PUT/api/admin/username修改当前用户用户名(需密码确认)用户会话
PUT/api/admin/email绑定或修改当前用户邮箱(需密码确认)用户会话
PUT/api/admin/profile更新当前用户自定义名称与头像地址用户会话
POST/api/account/avatar上传头像图片(multipart file),自动保存到当前账户用户会话
GET/api/notify/settings当前用户的通知设置(渠道、事件、邮箱、Telegram 配置状态)用户会话
PUT/api/notify/settings保存通知设置;tg_bot_token 留空表示保持不变,响应不返回 Token用户会话
POST/api/notify/test按当前配置发送测试通知用户会话
GET/api/admin/2fa/status获取当前用户 2FA 状态用户会话
POST/api/admin/2fa/setup开始绑定验证器用户会话
POST/api/admin/2fa/confirm确认启用并生成恢复码用户会话
POST/api/admin/2fa/disable关闭 2FA(需密码 + 动态码 / 恢复码)用户会话

管理后台(仅管理员) ​

用户管理 ​

方法路径说明
GET/api/admin/users列出全部用户(含用户组与最近登录)
POST/api/admin/users创建用户(可指定角色与用户组)
PUT/api/admin/users/{id}/status启用 / 禁用(禁用同时踢下线)
PUT/api/admin/users/{id}/group调整用户组
PUT/api/admin/users/{id}/password重置密码(该用户被踢下线)
DELETE/api/admin/users/{id}删除用户(不能删除自己或最后一名管理员)

用户组 ​

方法路径说明
GET/api/admin/groups列出用户组与权限集
POST/api/admin/groups创建用户组
PUT/api/admin/groups/{id}更新名称与权限(内置组仅可改权限)
DELETE/api/admin/groups/{id}删除用户组(内置组、有成员的组不可删)

邀请码 ​

方法路径说明
GET/api/admin/invites列出邀请码
POST/api/admin/invites生成邀请码(绑定用户组、次数、有效期)
PUT/api/admin/invites/{code}启用 / 停用
DELETE/api/admin/invites/{code}删除邀请码

系统设置 ​

方法路径说明
GET / PUT/api/admin/settings注册开关、邀请码模式、默认用户组、邮箱验证开关、人机验证(Turnstile Site Key / Secret)、审计日志保留天数(audit_retention_days)、通行密钥依赖方(passkey_rp_id / passkey_origins)、全局禁用密码登录(password_login_disabled)与登录限流(rate_limit_enabled、rate_limit_per_account、rate_limit_per_ip、rate_limit_window_minutes、rate_limit_familiar_multiplier、rate_limit_notify);省略字段保持原值
GET / PUT/api/admin/oauthCloudflare OAuth 客户端(Client ID / Secret / 回调 / Scopes),优先于环境变量
GET / PUT/api/admin/encryption-key应用加密密钥(环境变量优先;更换后需重启)
GET / PUT/api/admin/smtpSMTP 邮件服务(加密 / 不加密两种模式)
POST/api/admin/smtp/test发送测试邮件

审计日志 ​

记录管理后台与业务变更操作:登录与登出、用户与用户组、邀请码、系统设置、隧道与隧道规则、域名绑定、DNS 记录、监控项目与目标。只读浏览不计入。保留时长在系统设置中配置,超期日志每小时自动清理。

方法路径说明
GET/api/admin/audit-logs分页查询审计日志;支持 actor(用户名模糊匹配,也接受账号 ID)、category、action、from / to(Unix 秒)与 page / page_size(默认 50,上限 200)
GET/api/admin/audit-logs/stats统计概览:days(默认 7,上限 90)窗口内的操作总数 total、失败数 failed、活跃账号数 actors 与今日操作数 today

每条日志包含时间、操作人(账号 ID 与用户名)、分类与操作类型、目标对象、来源 IP 与成功 / 失败结果。

通行密钥(WebAuthn) ​

通行密钥用设备上的指纹、面容或硬件安全密钥替代密码。依赖方 ID 默认按访问域名自动推导(沿用面板域名),反向代理或多域名场景可在「系统设置 → 通行密钥」覆盖;要求 HTTPS(localhost 例外)。依赖方解析失败时账户页会提示,且不会展示绑定入口。

方法路径说明鉴权
POST/api/auth/passkey/login/begin开始免密登录;account 可选,填了只缩小浏览器提供的凭据范围,留空为无用户名(discoverable)流程无
POST/api/auth/passkey/login/finish校验断言并完成登录;通行密钥本身即强因子,不再叠加 TOTP无
POST/api/admin/login/2fa/passkey/begin密码登录进入 2FA 后,改用通行密钥完成第二步Challenge
POST/api/admin/login/2fa/passkey/finish校验断言并完成 2FA 登录Challenge
GET/api/account/passkeys列出本账户的通行密钥、依赖方信息与密码登录开关状态用户会话
POST/api/account/passkeys/begin开始绑定,需提交当前密码用户会话
POST/api/account/passkeys/finish完成绑定并保存凭据(name 为备注名,留空自动编号)用户会话
PUT/api/account/passkeys/{id}重命名用户会话
DELETE/api/account/passkeys/{id}删除,需当前密码;已禁用密码登录时不允许删除最后一个用户会话
PUT/api/account/password-login开关本账户的密码登录,需当前密码;开启(禁用密码登录)前必须已绑定通行密钥用户会话
PUT/api/admin/users/{id}/password-login管理员强制开关某账户的密码登录,用于账户丢失通行密钥后恢复管理员

所有注册流程都返回 {ceremony_token, public_key},public_key 为浏览器 WebAuthn 字典,ceremony_token 需在对应的 finish 请求中原样回传(一次性、5 分钟有效)。命令行 -allow-password-login 可关闭全局开关并清除所有账户开关,用于面板被锁死时恢复。

原生 App 还需要数字资产链接,后端在站点根路径提供(无需鉴权):

方法路径说明
GET/.well-known/assetlinks.jsonAndroid 数字资产链接:包名与 SHA-256 签名指纹取自系统设置(passkey_android_package / passkey_android_fingerprints,留空时用仓库共用调试密钥的指纹);没有有效指纹时返回 404 而不是错误内容

Cloudflare OAuth ​

每个用户可授权多个 Cloudflare 账户,连接之间随时切换。

方法路径说明鉴权
GET/api/cloudflare/oauth/status连接列表、当前激活连接与可用账户用户会话
POST/api/cloudflare/oauth/start创建 OAuth 授权请求(新增账户不会覆盖旧连接)需要 oauth_connect
GET/api/cloudflare/oauth/callbackCloudflare OAuth 回调,生成新连接并自动激活OAuth State
PUT/api/cloudflare/oauth/connection切换当前使用的连接需要 oauth_connect
PUT/api/cloudflare/oauth/account切换当前连接下的 Cloudflare 账户需要 oauth_connect
DELETE/api/cloudflare/oauth撤销并删除连接(?connection_id= 指定,缺省为当前连接)需要 oauth_connect

配置与站点品牌 ​

隧道选择与转发地址为每用户独立;站点品牌、优选 CNAME 为全局配置(管理员)。

方法路径说明鉴权
GET/api/config获取配置(全局品牌 + 当前用户选择)用户会话
GET/api/site获取公开站点品牌信息无
POST/api/config/tunnel设置当前用户的隧道用户会话
POST/api/config/service设置当前用户的转发地址用户会话
POST/api/config/preferred-cname设置全局优选 CNAME管理员
PUT/api/config/site更新站点品牌信息管理员
PUT/api/config/cname-presets更新常用 CNAME 组管理员

隧道管理 ​

需要用户组权限 tunnels;调用当前用户激活连接对应的 Cloudflare 账户。

方法路径说明
GET/api/tunnels列出隧道
POST/api/tunnels新建隧道并返回连接令牌
GET/api/tunnels/{tunnelID}获取隧道详情与路由
DELETE/api/tunnels/{tunnelID}删除隧道
POST/api/tunnels/{tunnelID}/ingress新增应用程序路由
PUT/api/tunnels/{tunnelID}/ingress更新应用程序路由
DELETE/api/tunnels/{tunnelID}/ingress删除路由,可选连带删除 DNS 记录

DNS 记录 ​

需要用户组权限 dns。

方法路径说明
GET/api/zones列出 Zone
GET/api/zones/{zoneID}/dns-records查询 Zone 的 DNS 记录
POST/api/zones/{zoneID}/dns-records新增 DNS 记录
PUT/api/zones/{zoneID}/dns-records/{recordID}编辑 DNS 记录
DELETE/api/zones/{zoneID}/dns-records/{recordID}删除 DNS 记录

新增与编辑仅接受 A / AAAA / CNAME / TXT / MX / NS / SRV / CAA / PTR。未知类型只读,编辑/删除会先用当前用户的 CF 客户端读取原记录确认类型。所有写入继续使用当前用户凭据、dns 权限与逐条审计。

字段规则
type, name必填;类型转大写,名称去首尾空白与末尾点,支持 @、通配符、ASCII/Punycode
ttl省略默认 1(自动);其他有效值 60–86400 整数;0 / null 拒绝
proxied省略默认 false,null 拒绝;只有 A / AAAA / CNAME 可代理,其他类型强制 false
content七种非结构化类型必填,最多 4096 字节;TXT 保留空白。A/AAAA 校验地址族,CNAME/MX/NS/PTR 校验目标域名
priorityMX 必填,0–65535 整数;空 MX 的 content:"." 要求 priority:0
dataSRV/CAA 必填,其他类型不接受;SRV/CAA 不使用 content 字符串

SRV 使用完整 _service._protocol.name 和 data.priority/weight/port/target;前三者为 0–65535 整数,target 为域名或 .。兼容并保留已存在的 data.service/proto/name,改名时按顶层 name 同步。CAA 使用 data.flags(0–255 整数)、data.tag(1–15 个字母数字)、data.value(单行,最多 4096 字节,可为空)。缺失、错误类型、未知字段、尾随 JSON 和超过 64 KiB 的请求体返回 400。

json
{"type":"SRV","name":"_sip._tcp.example.com","ttl":300,"data":{"priority":0,"weight":5,"port":5060,"target":"sip.example.com"}}
json
{"type":"CAA","name":"example.com","data":{"flags":128,"tag":"iodef","value":"mailto:security@example.com"}}

GET 返回原始 data(包括未知类型的字段);不要将其丢弃后更新。POST 成功返回 201 和记录,PUT 成功返回 200 和记录。Web/Android 的批量新增没有新增端点:仅针对 A / AAAA / TXT / MX / NS / PTR,每批最多 100 非空行,客户端预览校验/去重后串行 POST,每条独立审计,不提供原子性。明确失败保留重试;网络/响应不确定时标记“结果未知”并停队列,必须核对实际记录再手动重试,不能将传输错误解释为未创建。

域名绑定 ​

需要用户组权限 domain_bind。

方法路径说明
POST/api/domain/bind绑定单组域名(支持 mode 区分简化/优选模式)
POST/api/domain/bind-batch批量绑定域名,每组独立选择模式与转发地址
POST/api/domain/fallback设置回退源

服务监控与状态页 ​

需要用户组权限 monitors。监控项目按创建者隔离:普通用户仅见自己的项目,管理员可见全部。创建 / 更新接口支持公开页、告警开关与收件邮箱配置。

方法路径说明
GET/api/monitors列出监控与目标状态
POST/api/monitors新建监控
GET/api/monitors/overview全局概览统计;每个时间桶带 issues 数组(omitempty,只列出当天出现过异常的目标),内含目标标识、warn / down 计数、incident_count 与 incidents 异常时间段(起止时间、状态、连续次数、状态码与错误信息),供图表下钻
PUT/api/monitors/{monitorID}更新监控配置(公开页 / 告警开关 / 收件邮箱等)
DELETE/api/monitors/{monitorID}删除监控
POST/api/monitors/{monitorID}/check立即执行一次检测
GET/api/monitors/{monitorID}/alerts最近 100 条告警记录(是否成功送达 / 失败原因)
POST/api/monitors/{monitorID}/targets添加探测目标
PUT/api/monitors/{monitorID}/targets/{targetID}编辑探测目标
DELETE/api/monitors/{monitorID}/targets/{targetID}删除探测目标
GET/api/public/status/{token}公开状态数据,token 可为系统令牌或短路径
GET/api/alerts?since=<unix秒>告警游标流,供手机 App 轮询;since=0 只回游标不重放历史

PUT /api/monitors/{monitorID} 的自定义域名字段:

字段说明
public_domain状态页访问域名,留空则只保留面板域名下的公开链接
public_domain_modesimple 为直连,preferred 为优选
public_aux_domain优选模式必填,橙云回源到 Tunnel 的辅助域名
public_preferred_cname本监控使用的优选 CNAME,留空时读取全局默认值
domain_warning响应字段,表示设置已保存,但 Cloudflare 自动配置失败

优选模式下,访问域名、辅助回源域名不能相同,优选 CNAME 也不能与访问域名相同。修改上述任一字段都会重新执行 Cloudflare 自动配置。自动配置失败返回 HTTP 200,并通过 domain_warning 说明原因。

自定义域名只允许访问当前监控的公开页和相关静态资源。其他状态页、管理后台和受保护 API 会返回 404。

上传与 Telegram ​

Telegram 远程控制为每用户独立功能:每个账号配置自己的 Bot Token 与授权 TG ID,Bot 只操作该账号自己的资源。管理员历史全局 Bot 配置会在启动时自动迁移为管理员的个人配置。

方法路径说明鉴权
POST/api/uploads上传公开状态页图片需要 monitors
GET/api/telegram/settings获取当前用户的 Bot 设置用户会话
PUT/api/telegram/settings保存当前用户的 Bot 设置并重启其 Bot用户会话
GET/api/telegram/status获取当前用户的 Bot 状态用户会话
POST/api/telegram/test向当前用户的授权 TG ID 发送测试消息用户会话
PUT/api/telegram/endpoint设置面板级 Telegram API 端点(自定义反代),所有用户 Bot 生效管理员
POST/api/telegram/webhook旧全局 Bot 的 Webhook 入口(向后兼容)Secret Token
POST/api/telegram/webhook/{userID}每用户 Bot 的 Webhook 入口,仅分发到 URL 中 userID 对应的 BotSecret Token

Cloudflare Tunnel 可视化管理面板