{
  "code": 0,
  "message": "ok",
  "data": {
    "service": "api-selector",
    "version": "2.0.0",
    "origin": "http://liyuming.icu",
    "generatedAt": "2026-10-15T06:20:42.033Z",
    "responseEnvelope": {
      "code": "0 表示成功，非 0 为错误码",
      "message": "人类可读的结果说明",
      "data": "业务数据",
      "meta": "数据来源、缓存状态、参数等运行时信息"
    },
    "endpoints": [
      {
        "method": "GET",
        "path": "/api/v1/health",
        "description": "健康检查"
      },
      {
        "method": "GET",
        "path": "/api/v1/meta",
        "description": "本接口的接入文档（就是你现在看的这个）"
      },
      {
        "method": "GET",
        "path": "/api/v1/views",
        "description": "已发布的接口清单"
      },
      {
        "method": "GET",
        "path": "/api/v1/group_personscore/items",
        "description": "排兵布阵 · 列表（参数透传 / 搜索 / 排序 / 分页）"
      },
      {
        "method": "GET",
        "path": "/api/v1/group_personscore/schema",
        "description": "排兵布阵 · 列定义与填充率"
      },
      {
        "method": "GET",
        "path": "/api/v1/grouprank_lap/items",
        "description": "田径场队伍排名 · 列表（参数透传 / 搜索 / 排序 / 分页）"
      },
      {
        "method": "GET",
        "path": "/api/v1/grouprank_lap/schema",
        "description": "田径场队伍排名 · 列定义与填充率"
      },
      {
        "method": "GET",
        "path": "/api/v1/individualspeed/items",
        "description": "选手信息 · 列表（参数透传 / 搜索 / 排序 / 分页）"
      },
      {
        "method": "GET",
        "path": "/api/v1/individualspeed/schema",
        "description": "选手信息 · 列定义与填充率"
      },
      {
        "method": "GET",
        "path": "/api/v1/notice/items",
        "description": "现场提示语 · 列表（参数透传 / 搜索 / 排序 / 分页）"
      },
      {
        "method": "GET",
        "path": "/api/v1/notice/schema",
        "description": "现场提示语 · 列定义与填充率"
      },
      {
        "method": "GET",
        "path": "/api/v1/versus/items",
        "description": "对阵数据 · 列表（参数透传 / 搜索 / 排序 / 分页）"
      },
      {
        "method": "GET",
        "path": "/api/v1/versus/schema",
        "description": "对阵数据 · 列定义与填充率"
      }
    ],
    "queryParameters": {
      "items 端点": {
        "<上游参数>": "发布时勾选「留活口」的参数，调用时可以直接换值（例如 matchid=808）",
        "format": "full = 带列标题与外壳的完整响应（默认）；array = 直接返回裸数组。可覆盖发布时的设定",
        "pretty": "（无此参数）完整格式固定美化输出；array 格式固定压缩输出",
        "q": "关键字，在所有已选列里模糊匹配",
        "sort": "按某一列排序，取值为你发布时定的输出列名",
        "order": "asc | desc，默认 asc",
        "page": "页码，从 1 开始（不传则一次返回全部数据）",
        "pageSize": "每页条数，1-100（不传则一次返回全部数据）",
        "force": "true 时跳过缓存强制回源"
      }
    },
    "adminEndpoints": {
      "description": "发布/改动接口需要口令（服务器 .env 里的 ADMIN_TOKEN），请求头带 Authorization: Bearer <口令>",
      "enabled": true,
      "inspect": "POST /api/v1/admin/inspect   body: {\"url\":\"上游地址\",\"listPath\":\"data\"}",
      "createView": "POST /api/v1/admin/views    body: {\"id\":\"接口名\",\"url\":\"上游地址\",\"columns\":[{\"key\":\"输出列名\",\"from\":\"上游字段名\"}]}",
      "listViews": "GET /api/v1/admin/views",
      "deleteView": "DELETE /api/v1/admin/views/<接口名>"
    },
    "views": [
      {
        "id": "group_personscore",
        "title": "排兵布阵",
        "description": "一个队伍的总成绩 + 队员明细",
        "kind": "upstream",
        "columnCount": 5,
        "format": "array",
        "currentText": null,
        "columns": [
          {
            "key": "groupname",
            "label": "groupname"
          },
          {
            "key": "unit",
            "label": "unit"
          },
          {
            "key": "score",
            "label": "score"
          },
          {
            "key": "time",
            "label": "time"
          },
          {
            "key": "persons",
            "label": "persons"
          }
        ],
        "passThroughParams": [
          "trackid",
          "gnum"
        ],
        "sticky": true,
        "currentParams": {
          "trackid": "572",
          "gnum": "8"
        },
        "paramsUpdatedAt": "2026-10-15T06:11:48.633Z",
        "endpoint": "/api/v1/group_personscore/items",
        "endpoints": {
          "items": "http://liyuming.icu/api/v1/group_personscore/items",
          "schema": "http://liyuming.icu/api/v1/group_personscore/schema"
        }
      },
      {
        "id": "grouprank_lap",
        "title": "田径场队伍排名",
        "description": null,
        "kind": "upstream",
        "columnCount": 3,
        "format": "array",
        "currentText": null,
        "columns": [
          {
            "key": "lap",
            "label": "lap"
          },
          {
            "key": "groupname",
            "label": "groupname"
          },
          {
            "key": "tscoretime",
            "label": "tscoretime"
          }
        ],
        "passThroughParams": [
          "matchid",
          "trackid"
        ],
        "sticky": false,
        "currentParams": null,
        "paramsUpdatedAt": null,
        "endpoint": "/api/v1/grouprank_lap/items",
        "endpoints": {
          "items": "http://liyuming.icu/api/v1/grouprank_lap/items",
          "schema": "http://liyuming.icu/api/v1/grouprank_lap/schema"
        }
      },
      {
        "id": "individualspeed",
        "title": "选手信息",
        "description": "某场活动的选手资料与三项 PB（按 activity_sub_id + number 查）",
        "kind": "upstream",
        "columnCount": 10,
        "format": "array",
        "currentText": null,
        "columns": [
          {
            "key": "number",
            "label": "号码"
          },
          {
            "key": "name",
            "label": "姓名"
          },
          {
            "key": "university",
            "label": "学校"
          },
          {
            "key": "abbreviation",
            "label": "学校简称"
          },
          {
            "key": "groupnumber",
            "label": "组"
          },
          {
            "key": "leg",
            "label": "棒次"
          },
          {
            "key": "tenkm",
            "label": "10km"
          },
          {
            "key": "half_marathon",
            "label": "半马"
          },
          {
            "key": "marathon",
            "label": "全马"
          },
          {
            "key": "id",
            "label": "内部ID"
          }
        ],
        "passThroughParams": [
          "activity_sub_id",
          "number"
        ],
        "sticky": true,
        "currentParams": {
          "activity_sub_id": "130",
          "number": "A0101"
        },
        "paramsUpdatedAt": "2026-10-15T05:47:17.934Z",
        "endpoint": "/api/v1/individualspeed/items",
        "endpoints": {
          "items": "http://liyuming.icu/api/v1/individualspeed/items",
          "schema": "http://liyuming.icu/api/v1/individualspeed/schema"
        }
      },
      {
        "id": "notice",
        "title": "现场提示语",
        "description": null,
        "kind": "text",
        "columnCount": 1,
        "format": "array",
        "currentText": "喝电解质，补电解质！农夫山泉电解质，补水更补电，助你满电续航！官方指定用水农夫山泉全程为赛事保驾护航，陪你跑赢每一公里！",
        "columns": [
          {
            "key": "text",
            "label": "文字"
          }
        ],
        "passThroughParams": [],
        "sticky": false,
        "currentParams": null,
        "paramsUpdatedAt": "2026-10-15T05:25:28.224Z",
        "endpoint": "/api/v1/notice/items",
        "endpoints": {
          "items": "http://liyuming.icu/api/v1/notice/items",
          "schema": "http://liyuming.icu/api/v1/notice/schema"
        }
      },
      {
        "id": "versus",
        "title": "对阵数据",
        "description": "两人逐圈对比",
        "kind": "upstream",
        "columnCount": 11,
        "format": "array",
        "currentText": null,
        "columns": [
          {
            "key": "name01",
            "label": "name01"
          },
          {
            "key": "school01",
            "label": "school01"
          },
          {
            "key": "group01",
            "label": "group01"
          },
          {
            "key": "grade01",
            "label": "grade01"
          },
          {
            "key": "name02",
            "label": "name02"
          },
          {
            "key": "school02",
            "label": "school02"
          },
          {
            "key": "group02",
            "label": "group02"
          },
          {
            "key": "grade02",
            "label": "grade02"
          },
          {
            "key": "lap01",
            "label": "lap01"
          },
          {
            "key": "lap02",
            "label": "lap02"
          },
          {
            "key": "ctr",
            "label": "ctr"
          }
        ],
        "passThroughParams": [
          "matchid",
          "trackid",
          "number01",
          "number02"
        ],
        "sticky": true,
        "currentParams": {
          "matchid": "838",
          "trackid": "572",
          "number01": "A0103",
          "number02": "A0201"
        },
        "paramsUpdatedAt": "2026-10-15T05:00:06.621Z",
        "endpoint": "/api/v1/versus/items",
        "endpoints": {
          "items": "http://liyuming.icu/api/v1/versus/items",
          "schema": "http://liyuming.icu/api/v1/versus/schema"
        }
      }
    ],
    "examples": [
      "curl \"http://liyuming.icu/api/v1/group_personscore/items?pageSize=5\"",
      "curl \"http://liyuming.icu/api/v1/group_personscore/schema\""
    ]
  }
}