Skip to content

This document was written by AI and has been manually reviewed.

API 参考

基础路径:/api

所有端点均返回 JSON。需要认证的端点接受三种凭据中的任意一种:登录时颁发的会话 JWT(Authorization: Bearer <token>)、标准授权码流颁发的 OAuth access token,或前缀为 prism_pat_ 的 PAT。接受 OAuth token 的端点通常挂载在 /api/oauth/me/*

/api/* 的 CORS 锁定为 APP_URL/api/proxy/image/*/.well-known/*/api/users/:username(公开资料)不附带 Access-Control-Allow-Credentials,便于安全嵌入。

初始化

GET /api/init/status

返回实例是否已完成初始化。

响应{ "initialized": false }

POST /api/init

创建第一个管理员账号。仅在 initialized = false 时有效。

json
{
  "email": "admin@example.com",
  "username": "admin",
  "password": "s3cur3",
  "display_name": "Admin",
  "site_name": "My Prism"
}

响应{ "token": "...", "user": { ... } }

站点

GET /api/site

供前端读取的公开站点配置。无需认证。仅返回安全字段,绝不暴露任何 secret。

json
{
  "site_name": "Prism",
  "site_description": "...",
  "site_icon_url": null,
  "allow_registration": true,
  "invite_only": false,
  "captcha_provider": "none",
  "captcha_site_key": "",
  "pow_difficulty": 20,
  "accent_color": "#0078d4",
  "custom_css": "",
  "initialized": true,
  "require_email_verification": false,
  "email_verify_methods": "both",
  "enable_public_profiles": true,
  "disable_user_create_team": false,
  "disable_user_create_app": false,
  "enable_sub_teams": true,
  "max_team_depth": 5,
  "inherit_team_membership": true,
  "inherit_team_domains": true,
  "default_team_profile_show_sub_teams": true,
  "enabled_sources": [
    { "slug": "github", "provider": "github", "name": "GitHub" },
    { "slug": "google", "provider": "google", "name": "Google" }
  ]
}

认证

POST /api/auth/register

json
{
  "email": "user@example.com",
  "username": "alice",
  "password": "hunter2",
  "display_name": "Alice",
  "captcha_token": "...",
  "pow_challenge": "...",
  "pow_nonce": 12345,
  "invite_token": "..."
}

仅根据当前启用的验证码 provider 携带相应字段;站点为「仅限邀请」模式时 invite_token 必填。

响应{ "token": "...", "user": { ... } }

POST /api/auth/login

json
{
  "identifier": "alice",
  "password": "hunter2",
  "totp_code": "123456",
  "captcha_token": "..."
}

identifier 接受用户名、主邮箱或任意已验证的次要邮箱(allow_alt_email_login 为 true 时)。仅在用户启用了 TOTP 时需要 totp_code;Passkey 走专用端点。

响应{ "token": "...", "user": { ... } }

若启用了 TOTP 但未提供 code:

json
{ "totp_required": true, "available_methods": ["totp", "passkey", "backup"] }

POST /api/auth/logout

撤销当前会话。需认证。

GET /api/auth/verify-email?token=<token>

通过邮件中的 token 验证邮箱。

POST /api/auth/email-verify-code

返回一个验证地址,让用户通过发送邮件来验证。Cloudflare Email Workers 模式下格式为 verify-<code>@<domain>;IMAP 模式下为配置的邮箱地址(验证码作为邮件主题)。需认证。

json
{ "address": "verify-abc123@example.com", "code": "abc123" }

POST /api/auth/check-email-verification

供长轮询用:返回 { "verified": boolean }。在用户主动发邮件验证期间用得上。

POST /api/auth/resend-verify-email

重新发送验证链接。需认证,可携带可选验证码字段。

GET /api/auth/pow-challenge

获取 PoW 挑战。

json
{ "challenge": "...", "difficulty": 20, "expires_at": 1741568400 }

TOTP(多认证器)

需认证。

GET /api/auth/totp/list

列出已启用的 TOTP 认证器。

POST /api/auth/totp/setup

生成新 TOTP secret,返回 secret 与 otpauth:// URI。可传 name 标记新认证器(如 "Pixel 9")。

json
{ "name": "Pixel 9", "secret": "...", "uri": "otpauth://totp/..." }

POST /api/auth/totp/verify

提交首次正确码以确认绑定。首次为账号添加任意认证器时还会返回备用码。

DELETE /api/auth/totp/:id

按 ID 移除单个认证器。需要当前 TOTP code、备用码或 Passkey 二次验证之一 — 资料 → 安全 中的对话框会自动选择已启用的方式。

POST /api/auth/totp/backup-codes

重新生成备用码。需要有效 TOTP code。

Passkey(WebAuthn)

POST /api/auth/passkey/register/begin / /finish

为已登录用户添加 Passkey。

POST /api/auth/passkey/auth/begin / /finish

用 Passkey 登录。begin 可传 username 限定凭据范围,省略则使用 discoverable credential。

POST /api/auth/passkey/verify/begin / /finish

已登录态的 Passkey 二次验证 — 用于步骤提升场景(例如移除最后一个 TOTP 认证器)。

GET /api/auth/passkeys

列出当前用户的 Passkey。

DELETE /api/auth/passkeys/:id

删除 Passkey。

GPG 公钥

POST /api/auth/gpg-challenge

请求登录挑战。每 IP 每分钟 30 次限流。

json
{ "identifier": "alice" }

响应{ "challenge": "...", "text": "Prism login\n..." }

gpg_challenge_prefix 配置会插入到站点头与随机挑战之间,让用户能验证签名文本来自你的站点。

POST /api/auth/gpg-login

提交 gpg --clearsign 签名后的挑战。每 IP 每分钟 10 次限流。挑战一次性使用,5 分钟过期。

json
{ "identifier": "alice", "signed_message": "-----BEGIN PGP SIGNED MESSAGE-----\n..." }

响应{ "token": "...", "user": { ... } }

GET /api/user/gpg / POST /api/user/gpg / DELETE /api/user/gpg/:id

会话认证下的 GPG 公钥管理。POST 接受 ASCII armor 或二进制 public_key 加可选 name;同时支持 RSA/EdDSA 等经典算法和 ML-DSA 后量子算法。

GET /users/:username.gpg

公开联邦端点。返回该用户全部已注册公钥(ASCII armor 块按空行分隔),Content-Type: application/pgp-keys

OAuth scope 版 GPG 端点

MethodPathScope
GET/api/oauth/me/gpg-keysgpg:read
POST/api/oauth/me/gpg-keysgpg:write
DELETE/api/oauth/me/gpg-keys/:idgpg:write

请求/响应格式与会话认证版相同。

会话

GET /api/auth/sessions / DELETE /api/auth/sessions/:id

列出和撤销当前用户的活跃会话。

用户

需认证。

GET /api/user/me / PATCH /api/user/me

读取与部分更新当前用户(显示名、头像、公开资料开关、通知偏好)。部分字段下方有专用端点。

POST /api/user/me/change-password

json
{ "current_password": "...", "new_password": "..." }

POST /api/user/me/avatar

multipart/form-data,字段 avatar,最大 2 MB。接受 JPEG、PNG、WebP、GIF。绑定 R2 时存 R2,否则内联存 D1。

POST /api/user/me/readme / POST /api/user/me/readme/sync

手写 markdown README,或从 GitHub 用户仓库 README(github.com/<login>/<login>)同步。同步会遵守 github_readme_cache_ttl_seconds 缓存以及 github_readme_token PAT 配置。

GET /api/user/me/emails / POST / DELETE /api/user/me/emails/:id

次要邮箱管理。POST /:id/resend 重发验证;POST /:id/set-primary 在验证后切换主邮箱。

GET /api/user/me/notifications / PUT

读写用户通知偏好(事件 × 通道 × brief|full 等级)。详见 通知

GET /api/user/me/notification-rulesets / POST / PUT /:id / DELETE /:id

具名规则集 — 按顺序执行的 match/action 规则,可基于账号 key 过滤,并支持 stop。表达力比扁平偏好更强。详见 通知

GET /api/user/tokens / POST / DELETE /:id

个人访问令牌。明文仅在创建响应中一次性返回。详见 个人访问令牌

DELETE /api/user/me

永久删除账号。{ "password": "...", "confirm": "DELETE" }

OAuth 应用

需认证。完整流程见 OAuth / OIDC 指南跨应用权限

MethodPath说明
GET/api/apps列出当前用户的应用
POST/api/apps创建应用
GET/api/apps/:id读取
PATCH/api/apps/:id更新;包含 oidc_fieldsoptional_scopesuse_jwt_tokensallow_self_manage_exported_permissions
POST/api/apps/:id/rotate-secret轮换 client_secret
DELETE/api/apps/:id删除
GET/api/apps/:id/scope-definitions列出导出 scope 定义
POST / PATCH / DELETE/api/apps/:id/scope-definitions[/:scope]管理 scope 定义(allow_self_manage_exported_permissions 开启后应用可用 HTTP Basic 自管)
GET / POST / DELETE/api/apps/:id/scope-access-rules[/:ruleId]owner-allow / owner-deny / app-allow / app-deny 规则
GET / POST / PATCH / DELETE/api/apps/:appId/webhooks[/:id]应用通知 webhook,详见 应用通知

/api/apps/:appId/events/sse…/events/ws 是 SSE / WebSocket 流,详见 应用通知

团队

完整指南见 团队。端点速览:

MethodPath说明
GET/api/teams列出当前用户可达的团队(直接 + 通过子团队继承可见;每条携带 parent_team_idinherited_from
POST/api/teams创建团队。可选 parent_team_id 表示创建子团队 — 调用者需在上级团队上是 admin+(直接或继承),且深度 ≤ max_team_depth
GET/api/teams/:id团队详情 + my_role(有效)、inherited_fromancestors[](直接父 → 根)、sub_teams[](直接子团队 + 成员数)、直接成员
PATCH/api/teams/:id更新名称、描述、头像、公开资料开关(含 profile_show_sub_teams)、parent_team_id(owner-only,校验环 & 深度)、require_2farequire_verified_email
DELETE/api/teams/:id解散(owner,直接或继承)。级联到所有子团队;每一层的应用回退给该层自己的 owner
GET/api/teams/:id/sub-teams列出直接子团队。上级团队的成员(直接或继承)可查看
POST/api/teams/:id/sub-teams:id 下创建子团队 — 等价于 POST /api/teamsparent_team_id
POST/api/teams/:id/members按用户名/ID 添加成员(admin 及以上)
PATCH/api/teams/:id/members/:userId修改角色
DELETE/api/teams/:id/members/:userId移除成员;:userId = self 即退出团队
PATCH/api/teams/:id/membership/show-on-profile单成员开关:是否出现在团队公开成员列表
POST/api/teams/:id/transfer-ownership把所有权转给另一名成员
GET/api/teams/:id/invites列出有效邀请 token
POST/api/teams/:id/invites生成邀请 token(可选邮箱锁定 + 最大次数 + 过期)
DELETE/api/teams/:id/invites/:token撤销邀请
GET/api/teams/join/:token(认证可选)查看邀请 — 返回团队、门槛、未满足项
POST/api/teams/join/:token接受邀请
GET / POST / DELETE/api/teams/:id/domains[/:domainId]团队域名。GET 同时返回上级团队拥有的域名作为只读条目,带 inherited_from 标记(受 inherit_team_domains 控制)
POST/api/teams/:id/domains/:domainId/verify触发重新核验
POST/api/teams/:id/domains/:domainId/to-personal把已验证域名转回所有者个人空间
POST/api/teams/:id/domains/:domainId/share-to-team把个人域名共享给团队
POST/api/teams/:id/domains/:domainId/share-to-personal反向操作
GET / POST/api/teams/:id/apps团队 OAuth 应用
POST/api/teams/:id/apps/transfer把个人应用转入团队
DELETE/api/teams/:id/apps/:appId/transfer把团队应用转回原所有者

域名

MethodPath说明
GET/api/domains列出当前用户的域名
POST/api/domains添加域名,返回 verification_method 选项与每种方法的具体说明(DNS TXT、HTML meta、.well-known
POST/api/domains/:id/verify用所选方法触发重新核验
DELETE/api/domains/:id删除

社交连接

MethodPath说明
GET/api/connections列出当前用户已绑定的社交账号
GET/api/connections/:slug/begin跳转到源的授权 URL。?mode=login(默认)或 ?mode=connect
GET/api/connections/:slug/callbackOAuth 回调(由 provider 跳转触发)
GET/api/connections/telegram/callbackTelegram widget 回调(无 :slug,因为 Telegram 用另一种流程)
POST/api/connections/:id/refresh从 provider 刷新显示名/头像
DELETE/api/connections/:id解绑

OAuth scope 版本:

MethodPathScope
GET/api/oauth/me/social-connectionssocial:read
DELETE/api/oauth/me/social-connections/:idsocial:write

OAuth 2.0 / OIDC

完整流程见 OAuth / OIDC 指南

MethodPath说明
GET/api/oauth/authorize返回应用信息与请求 scope,供同意页使用
POST/api/oauth/authorize同意 / 拒绝
POST/api/oauth/tokenauthorization_coderefresh_token 两种 grant
GET/api/oauth/userinfoOIDC UserInfo
POST/api/oauth/introspectRFC 7662
POST/api/oauth/revokeRFC 7009
GET/.well-known/openid-configurationDiscovery
GET/.well-known/jwks.jsonID Token 与 JWT access token 的 RSA 公钥

步骤提升 2FA

MethodPath认证
POST/api/oauth/2fa/challenges应用凭据(HTTP Basic)或 PKCE
GET/api/oauth/2fa/info可选用户会话 — 驱动 SPA
POST/api/oauth/2fa/authorize用户会话 — 提交 TOTP/Passkey/备用码或 sudo 旁路
POST/api/oauth/2fa/sudo/revoke用户会话 — 主动结束 sudo 宽限期
POST/api/oauth/2fa/verify应用凭据 — 用回跳 code 兑换验证结果

/api/oauth/me/*(按 token 鉴权的用户 API)

接受 OAuth access token 或 PAT。所需 scope 见 OAuth → Scopes管理员 → OAuth scope 参考

路径Scope
GET /me/profileprofile
PATCH /me/profileprofile:write
GET /me/apps / POST /me/apps / PATCH /me/apps/:id / DELETE /me/apps/:idapps:read / apps:write
GET /me/team-appsapps:read
GET /me/teams / POST / PATCH /me/teams/:id / DELETEteams:read / teams:write / teams:create / teams:delete — 列表包含通过子团队继承可见的团队(带 inherited_from)。PATCH/DELETE 使用有效角色(继承的 admin/owner 同样有效)
POST /me/teams/:id/members / DELETEteams:write — 使用有效角色
GET /me/domains / POST / POST :domain/verify / DELETEdomains:read / domains:write
GET /me/gpg-keys / POST / DELETEgpg:read / gpg:write
GET /me/social-connections / DELETEsocial:read / social:write
GET /me/webhooks / POST / PATCH / DELETE / GET …/deliverieswebhooks:read / webhooks:write
GET /me/admin/users / PATCH / DELETEadmin:users:read / :write / :delete
GET /me/admin/config / PATCHadmin:config:read / :write
POST /me/invites / GET / DELETEadmin:invites:create / :read / :delete
GET /me/admin/webhooksadmin:webhooks:read / :write / :delete
GET /me/site/users[/:id]admin:users:read
GET /me/team/:teamId/info / PATCHteams:read / teams:write
GET /me/team/:teamId/members / POST / DELETE / PATCH …/roleteams:read / teams:write
GET /me/team/:teamId/members/:userId/profileteams:read

GET /api/oauth/consents / DELETE /api/oauth/consents/:client_id

管理当前用户已授权的应用。DELETE 同时撤销该应用的所有未过期 token。

公开资料

GET /api/users/:username

按可见性开关返回用户公开资料;用户不存在、私有或 enable_public_profiles 关闭都返回 404,且响应体一致以避免泄露用户名是否存在。可携带可选 Bearer — 资料拥有者自己的 token 即使在私密状态也能看到自己。详见 公开资料

GET /api/public/teams/:id

返回团队公开资料;同样的 404 一致性。任意成员的 token 即可在私密时看到完整数据(便于预览)。

启用子团队且团队所有者开启该分区后(profile_show_sub_teams,或站点默认 default_team_profile_show_sub_teams),响应包含 sub_teams[] 数组 —— 仅包括自身也已公开的子团队,避免私密子团队的名字被父团队顺带泄露。若团队的父团队自身也是公开的,响应还会带 parent_team 面包屑 {id, name, avatar_url}

图片代理

GET /api/proxy/image/:id

按已注册映射推送图片,SVG 会被消毒。:idPOST /api/proxy/image/register(需认证)返回的不透明 ID — 不接受 URL 透传,杜绝被用作 SSRF 中继。响应附带跨源头便于嵌入。

POST /api/proxy/image/register

为前端需要展示的远程图片 URL(markdown 预览、ImageUrlInput 预览等)注册映射。需认证。返回 { "id": "...", "url": "/api/proxy/image/<id>" }

管理员

role = admin

配置

MethodPath说明
GET/api/admin/config读取所有配置(敏感字段已脱敏)
PATCH/api/admin/config批量更新;绑定了 SECRETS_KEY 时敏感字段自动加密

统计 / 仪表盘

GET /api/admin/stats{ users, apps, verified_domains, active_tokens }

用户

MethodPath说明
GET/api/admin/users?page=…&search=…分页用户列表
GET/api/admin/users/:id详情(含会话、应用、连接)
PATCH/api/admin/users/:idroleis_activeemail_verified、按用户 TTL 覆写
DELETE/api/admin/users/:id永久删除
DELETE/api/admin/users/:id/sessions撤销该用户全部会话

应用 / OAuth Sources / 邀请 / Webhook / 团队

路径说明
GET / PATCH /api/admin/apps[/:id]验证或停用
GET / POST / PATCH / DELETE /api/admin/oauth-sources[/:id]源 CRUD
GET /api/admin/oauth-sources/discover自动获取 OIDC 发现
POST /api/admin/oauth-sources/migrate一次性:把旧的 site_config 社交字段导入为 sources
GET / POST / DELETE /api/admin/invites[/:id]站点邀请 token
GET /api/admin/teams / DELETE /:id列出 / 解散团队
POST /api/admin/test-email发送测试发件邮件
POST /api/admin/test-email-receiving生成验证邮箱接收测试码
GET / POST / PATCH / DELETE /api/admin/webhooks[/:id]站点级审计 webhook

审计 / 请求日志 / 登录错误

MethodPath说明
GET/api/admin/audit-log?page=…审计事件
GET/api/admin/login-errors失败登录表
GET/api/admin/request-logs可筛选的请求日志
GET/api/admin/request-logs/export当前筛选导出 CSV
GET/api/admin/request-logs/:id/details单条请求详情
DELETE/api/admin/request-logs全部清空
DELETE/api/admin/request-logs/spectate清空 spectate 缓冲

密钥迁移 / Danger Zone

MethodPath说明
GET/api/admin/secrets/statusSECRETS_KEY 是否绑定,多少 site_config 行尚未加密
POST/api/admin/secrets/migrate加密 site_config / oauth source / oauth app 的剩余明文 secret
GET/api/admin/d1-secrets/statusbearer 类字段的同上状态
POST/api/admin/d1-secrets/migrate哈希尚未迁移的 token / code
GET / POST/api/admin/teams-as-users-status & /migrate-teams-as-users为每个团队补建 kind = 'team' 用户行
GET / POST/api/admin/image-proxy-status & /migrate-image-proxy为旧头像/图标补建图片代理映射
POST/api/admin/sweep-image-proxy立即清理孤儿映射(同时也会被 cron 调用)
GET / DELETE/api/admin/image-proxy[/:id]浏览 / 删除代理映射
POST/api/admin/migrate-recovery-codes重新哈希历史明文备用码
GET / POST/api/admin/reset/status & /request & /cancel & /confirm邮件签署的站点重置流程
GET / POST/api/admin/debug部署诊断的内部开关

健康检查

GET /api/health

总是返回 { "ok": true }。无需认证。

在 GPL-3.0 许可协议下发布.