粒方教育 · 题库中台 接口文档 v1 ← 回到后台

这套接口是干什么的

题库中台是粒方所有系统取题的唯一来源。行课系统、家校小程序、办学系统都不用再各自存一份题库,统一调这里的接口即可。后台(首页)改一道题,所有系统下一次请求就是新的。

接口根地址:—
调用方式:所有接口都要求带接入密钥,三种传法任选—— X-API-Key: qb_live_…(推荐)/?key=qb_live_…/Authorization: Bearer qb_live_…。
密钥在后台「系统接入」页创建,给每个系统单独发一个,随时可停用。
关于图片:题目返回的 stemHtml/analysisHtml 里,图片地址已经是可以直接访问的完整 URL,对方系统不需要再做任何处理,直接塞进富文本渲染即可。
公式(LaTeX)原样保留在 \( … \) 里,端上如果装了 KaTeX 会自动渲染成数学公式。

接口一览

方法路径说明
GET/api/v1/ping连通性自检,返回服务名与当前密钥对应的系统标识
GET/api/v1/combos?source={t|a|z}全部课程组合(学科 / 年级 / 版本 / 册次或学期·体系)。source、subject 可选,可叠加
GET/api/v1/tree?combo={id}某个组合的目录树,同时给「扁平数组」和「嵌套树」两种形态
GET/api/v1/knowledge-points?combo={id}该组合下所有有题的知识点
GET/api/v1/questions按条件分页取题(见下方参数表)
GET/api/v1/questions/random随机抽题,适合课堂随练 / 每日一练
GET/api/v1/questions/{题目id}单题详情(含答案解析与图片)
GET/api/v1/papers试卷列表
GET/api/v1/papers/{试卷id}试卷内容(按顺序的题目数组)

题库里的「三个来源」

组合和题目都带一个 src / source 字段,标的是这道题从哪来的。取题时可以按它筛。

组合还带一个 subject 字段(学科)。粒方题库有 数学 和 英语 两个学科 (2026-10-16 加英语),取题时可以用 &subject=英语 只要英语的; 章节序 / 爱学习体系目前只导入了数学。学科记在组合上,题目本身不带这个字段。

值来源说明
t章节序(教材版)爱学习精准学,按 年级 → 版本 → 册次 组织
a爱学习体系爱学习精准学,按 年级 → 版本 → 学期 → 体系 组织
z粒方题库粒方老师自己在后台上传的题(拍照识别 / Word·PDF 自动拆题 / 手工录入)
要不要只取粒方自建题?加 &source=z 即可: GET /api/v1/questions?combo=z_m_6_2_340&source=z&size=20。
只要英语(或只要数学)?加 &subject=英语: GET /api/v1/questions?subject=英语&source=z&size=50。
注意:粒方题库的组合(z_…)一开始都是 0 题的空壳,老师传题之后才会慢慢有内容。 取题前先用 q_uniq 判一下,不要假定某个组合一定有题。
粒方题库的组合也没有教材目录树,/api/v1/knowledge-points?combo=z_… 返回的是老师填的「知识点」分组(虚拟节点,id 形如 kp:巧算与速算), 传给 /api/v1/questions?node= 时原样带上即可。

快速上手

1)先看有哪些组合,挑一个

# curl
curl -H "X-API-Key: qb_live_xxx" BASE_URL/api/v1/combos
// 返回(节选)
{
  "combos": [
    { "id": "t_5_5_340", "grade": "四年级", "version": "苏教版", "vol": "上册",
      "title": "四年级 · 苏教版 · 上册", "q_uniq": 4520 },
    { "id": "a_7_13_3_48", "grade": "六年级", "version": "全国版",
      "period": "秋季", "system": "α体系", "title": "六年级 · 全国版 · 秋季·α体系" }
  ]
}

2)按知识点取题(行课系统最常见的用法)

// 拿到树 → 找到知识点 node id → 取题
const r = await fetch(`${BASE}/api/v1/questions?combo=t_5_5_340&node=t_5_5_340:387419&size=20`, {
  headers: { 'X-API-Key': KEY }
});
const { total, items } = await r.json();

node 传知识点节点 id 时,会连同它的所有子节点一起取,所以传「章」也能拿到整章题目。

3)随机抽 10 题做课堂随练

const r = await fetch(`${BASE}/api/v1/questions/random?combo=t_5_5_340&type=1&difficulty=2&n=10`, {
  headers: { 'X-API-Key': KEY }
});

4)在后台组好卷,线上按试卷 id 取

const r = await fetch(`${BASE}/api/v1/papers/p_m1x2k3`, { headers: { 'X-API-Key': KEY } });
const { paper, questions } = await r.json();   // questions 已按试卷顺序排好

取题参数(/api/v1/questions)

参数必填说明
combo三选一课程组合 id。例:t_5_5_340
node三选一知识点 / 章 / 模块的节点 id,含其所有子节点
kw三选一关键词,在题干+选项+答案+解析里搜
type否题型:1 选择 · 2 填空 · 3 判断 · 4 作图 · 5 解答
difficulty否难度 1–5
tag否标签名(后台可批量打标签,如「易错题」)
source否只要某一路题:t 章节序 · a 爱学习体系 · z 粒方题库。不传 = 都取
subject否只要某个学科:数学 · 英语(粒方题库有这两个)。不传 = 都取
page / size否默认 page=1、size=20;size 上限 100
n否仅 /questions/random 用,抽题数量,上限 50

单题字段说明

字段说明
id题目 id(全库唯一)
type / typeName题型数字与中文名
difficulty难度 1–5
stem / stemHtml题干。前者纯文本(做搜索、摘要用),后者富文本(渲染用)
options选项数组:[["A","正确","<p>正确</p>"], …](字母 / 纯文本 / HTML)
answers正确答案,永远是这种二元组数组:[["A","正确"], …](值 / 文字)。 选择题的「值」是选项字母;填空题 / 作图题等的「值」就是答案本身。 判断题的「值」是 0 / 1(0 = 错误),渲染时请翻成文字
answer答案的文字形式(填空题/解答题直接显示这个)
analysis / analysisHtml解析,同上两种形态
accuracy / answerCount平台统计的正确率与作答人次(可用来判断难度是否合理)
combo / chapter / knowledgePoint这题挂在哪个组合的哪一讲、哪个知识点下

各系统怎么接

行课系统(merged-app)

家校小程序(banxue)

办学系统 / 其它

错误码

状态码返回含义与处理
200{...}正常
400{"error":"…"}参数不对,看 error 文案
401{"error":"缺少或无效的接入密钥"}密钥没传 / 传错 / 已被停用
404{"error":"题目不存在"}id 不对
500{"error":"…"}服务端异常,把这个 error 原文发给我们

自检

curl -H "X-API-Key: qb_live_xxx" BASE_URL/api/v1/ping
# {"ok":true,"service":"粒方教育题库中台","version":"v1","system":"行课系统","at":"…"}