/api/health
缺少示例请求
健康检查:返回服务版本与 D1 迁移状态。
该端点缺少示例请求,已标红并在 CI 告警(不阻断构建)。
由 docs/source/endpoints.mjs 生成。缺示例请求的端点标红;CI 只告警不阻断。
/api/health
缺少示例请求
健康检查:返回服务版本与 D1 迁移状态。
该端点缺少示例请求,已标红并在 CI 告警(不阻断构建)。
/api/plans
公开套餐目录投影(仅 is_public 且未下架),支持 ?locale=en|zh。
GET /api/plans?locale=en&limit=10
{
"docs": [
{
"id": "019a1f4e-7b3c-7d2e-8f01-1234567890ab",
"slug": "starter",
"name": "Starter",
"description": "For small teams, includes 5 licensed users.",
"currency": "USD",
"price_monthly_minor": 9900,
"price_yearly_minor": 99000,
"licensed_users_max": 100
}
],
"totalDocs": 1
}
/api/auth/signup
客户自助注册;成功后发送验证邮件(staging 不暴露 token)。
POST /api/auth/signup
Content-Type: application/json
{"email":"ops@example.com","password":"Str0ngPassw0rd","company":"Example Media"}
HTTP 201
{"user":{"id":"...","email":"ops@example.com","status":"pending"},"org":{"id":"...","name":"Example Media"}}
/api/auth/login
客户登录,返回会话 cookie(biz-token)与用户信息。
POST /api/auth/login
Content-Type: application/json
{"email":"ops@example.com","password":"Str0ngPassw0rd"}
HTTP 200
{"user":{"id":"...","email":"ops@example.com","status":"active"},"token":"<jwt>"}
/api/me
当前用户与所属 org(控制台所有 own-org 判定的唯一入口)。
GET /api/me
Cookie: biz-token=<jwt>
{"user":{"id":"...","email":"ops@example.com"},"org":{"id":"...","name":"Example Media"}}
/api/console/overview
控制台概览:实例/授权/发票/上报状态计数。
GET /api/console/overview
Cookie: biz-token=<jwt>
{"instances":1,"licenses":1,"invoices":2,"reports":{"status":"ok"}}
/api/console/instances
本人 org 的实例列表(跨 org 一律 403/空)。
GET /api/console/instances
Cookie: biz-token=<jwt>
{"docs":[{"id":"...","domain":"video.example.com","status":"active","version":"1.0.0"}]}
/api/console/instances/:id
实例详情:部署进度、版本/上报、授权状态、升级历史。
GET /api/console/instances/<instance-id>
Cookie: biz-token=<jwt>
{"doc":{"id":"...","status":"active","license":{"status":"active","days_to_expiry":30}}}
/api/console/instances/:id/upgrade
一键升级触发:双闸门(凭据 + 授权 active)、幂等 job、失败回滚。
POST /api/console/instances/<instance-id>/upgrade
Content-Type: application/json
{"to_version":"1.2.0"}
HTTP 202
{"job_id":"...","job":{"status":"running","stage":"migrate_d1"}}
/api/console/instances/:id/renew
续费下单:复用同档 renewal 单,awaiting_payment 唯一(重复 409)。
POST /api/console/instances/<instance-id>/renew
Cookie: biz-token=<jwt>
HTTP 201
{"doc":{"id":"...","kind":"renewal","status":"awaiting_payment","amount_minor":99000}}
/api/console/tickets
工单列表 + 双向消息(附件只返回元数据/签名 URL)。
GET /api/console/tickets
Cookie: biz-token=<jwt>
{"docs":[{"id":"...","subject":"Deploy help","status":"open","messages":[]}]}
/api/console/tickets
提交工单;进入 CRM 队列,SLA 按优先级计时。
POST /api/console/tickets
Content-Type: application/json
{"subject":"Deploy help","body":"TXT record not verified","category":"technical","priority":"high"}
HTTP 201
{"doc":{"id":"...","status":"open","priority":"high","sla_due_at":"..."},"message":{...}}
/api/console/notifications
站内通知列表 + 未读数(org 级最小面)。
GET /api/console/notifications
Cookie: biz-token=<jwt>
{"docs":[{"id":"...","kind":"ticket_reply","title":"New reply on ticket: Deploy help","read_at":null}],"unread_count":1}
/api/console/notifications/read
全部标为已读(org 级)。
POST /api/console/notifications/read
Cookie: biz-token=<jwt>
{"updated":1}
/api/crm/customers
CRM 客户列表(客户 = platform-orgs;sales 只看自己名下)。
GET /api/crm/customers
Authorization: JWT <staff-jwt>
{"docs":[{"id":"...","name":"Example Media","counts":{"instances":1,"licenses":1,"orders":2,"tickets":1}}]}
/api/crm/customers/:id
客户详情:org、实例、授权、订单、工单聚合。
GET /api/crm/customers/<org-id>
Authorization: JWT <staff-jwt>
{"doc":{"id":"...","name":"Example Media"},"instances":[...],"licenses":[...]}
/api/crm/tickets
CRM 工单队列 + SLA 高亮(超时且无更晚 staff 回复)。
GET /api/crm/tickets
Authorization: JWT <staff-jwt>
{"docs":[{"id":"...","subject":"Deploy help","sla_breached":false}],"sla_breached_count":0}
/api/crm/tickets/:id/reply
员工回复工单;触发客户站内通知 + 邮件 outbox。
POST /api/crm/tickets/<ticket-id>/reply
Authorization: JWT <staff-jwt>
Content-Type: application/json
{"body":"We are checking the TXT record."}
{"doc":{"id":"...","author_type":"staff"},"ticket":{"status":"pending"}}