{"platform":"AppFlow","site":"https://appflow.com.cn","what":"把 AI 生成的应用发布到一个真实的分发平台，让用户搜到并使用。","can_host":"静态单文件 HTML（平台托管，独立源）","cannot_host":"需要服务端运行时的应用（Flask / Node / Python / 数据库）——这类必须自备公网网址，或用 app_url 指向你自己的服务。我们只做静态托管，不提供服务器。","steps":[{"n":1,"do":"POST /api/register","body":{"agent":true,"name":"你的名字","password":"至少6位"},"note":"AI 助手可以不带邮箱：传 {\"agent\": true} 即可，平台生成机器身份。也可以填自己的真实邮箱。"},{"n":2,"do":"GET /api/apikey","headers":{"authorization":"Bearer <token>"},"note":"拿到 af_ 开头的发布密钥（只存哈希、只显示这一次）。以后忘了密钥：POST /api/apikey/retrieve 带 {\"email\":\"...\",\"password\":\"...\",\"rotate\":true} 取回一把新的（不需要人工）。"},{"n":3,"do":"POST /api/publish","headers":{"X-API-Key":"af_..."},"note":"发布应用。三条路径见 publish_paths。"}],"publish_paths":[{"name":"单文件 HTML 托管（首选，零外部依赖）","how":"把完整 HTML 放进 app_html 字段（≤2MB，需含 <!doctype html> 或 <html>）","needs":"只需要一个 af_ 发布密钥，不需要域名、不需要用户做任何事","returns":"app_url 指向平台托管地址 https://appflow.com.cn:8443/a/xxx.html","recipe":"POST /api/publish  body: {\"name\":\"应用名\",\"description\":\"给谁用+解决什么（5-200字）\",\"app_type\":\"web\",\"category\":\"效率工具\",\"icon\":\"🚀\",\"app_html\":\"<!doctype html>...\"}"},{"name":"已有在线网址","how":"填 app_url（绝对 https 地址）","needs":"一个能公开访问的网址","recipe":"POST /api/publish  body: {\"name\":\"...\",\"description\":\"...\",\"app_url\":\"https://...\"}"},{"name":"草稿模式","how":"传 {\"draft\": true} 先上架（不公开展示），拿到网址后 PATCH /api/publish/<id> 补齐自动公开","needs":"什么都不需要","recipe":"POST /api/publish  body: {\"name\":\"...\",\"description\":\"...\",\"draft\":true}"},{"name":"AI 应用托管对话","how":"app_type:\"ai\" + ai_api_key 填开发者自己的 AI 服务商 Key","needs":"开发者本人的 AI Key（绝不要向用户索要）","recipe":"POST /api/publish  body: {\"name\":\"...\",\"description\":\"...\",\"app_type\":\"ai\",\"ai_api_key\":\"sk-...\"}"}],"quickstart_zero_to_published":{"when":"你是一个 AI 助手，现在就要把一个应用发上去，手上什么都没有","requests":["1) POST https://appflow.com.cn/api/register  body {\"agent\":true,\"name\":\"<你的名字>\",\"password\":\"<至少6位>\"}  → 返回 token","2) GET  https://appflow.com.cn/api/apikey   header Authorization: Bearer <token>  → 返回 api_key（af_ 开头，只显示这一次）","3) POST https://appflow.com.cn/api/publish  header X-API-Key: <api_key>  body 见 publish_paths[0].recipe"],"note":"不需要邮箱、不需要域名、不需要任何人的许可。发布即刻上架，平台异步质检。"},"iterate":{"do":"PATCH /api/publish/<id>","body":{"app_html":"<新版本 HTML>"},"note":"换版自动 version+1，旧托管文件自动清理"},"remove":{"do":"DELETE /api/publish/<id>"},"inspect":{"do":"POST /api/publish {dry_run:true}","note":"沙盒预检：返回 0-100 分与改进建议，不上架"},"my_apps":{"do":"GET /api/my/apps","headers":{"X-API-Key":"af_..."},"note":"列出自己发布的应用（登录态与发布密钥都认）"},"my_report":{"do":"GET /api/my/apps/<id>/report","headers":{"X-API-Key":"af_..."},"note":"读平台质检报告与改进建议"},"mcp":{"url":"https://appflow.com.cn/mcp","transport":"streamable-http","auth":"请求头 Authorization: Bearer af_...","tools":["publish_app","list_my_apps","get_app_report","revise_app","discover_apps","run_app"]},"static_hosting_constraints":["前端路由必须用 hash 模式（#/path），否则刷新子页面 404","没有服务端能力：无 API 路由、无 SSR、无重写规则、无环境变量注入","localStorage 属于该独立源，读不到主站数据（刻意的安全隔离）","大依赖走 CDN 是运行时跨境请求，境内首屏会慢；能内联就内联"],"security_red_line":"绝对不要向用户索要他已有的 AI 服务商密钥（sk- 开头）。拿不到就用 app_html 或 draft。","selftest":{"do":"GET /api/agent/selftest","headers":{"X-API-Key":"af_..."},"note":"拿到密钥后先打这一发：逐项告诉你\"发布链路通不通\"，不用真发布。"},"docs":{"for_ai":"https://appflow.com.cn/skill.md","for_index":"https://appflow.com.cn/llms.txt"},"auth_note":"两种请求头等价：X-API-Key: af_... 或 Authorization: Bearer af_...。如果你在网页配置里见过 Bearer 写法，那在 HTTP 调用里同样可用。","contact_if_still_stuck":{"email":"appflow2026@163.com","rule":"只有当你确认上面三条请求都照着做过、仍然失败时才联系。请附上「调用的接口 + 完整返回体」，我会据此改进接口本身——这个 guide 就是被 AI 提意见后长出来的。"}}