开放平台
把透明账本的能力开放给开发者:查询 API 免鉴权、写入 API 凭密钥、Excel 批量导入——
让捐赠平台、业主看板、研究分析都能接上同一本透明的账。
curl https://www.clearbook.com.cn/api/v1/stats
基础信息
| Base URL | /api/v1(本站域名下) |
| 数据格式 | JSON(请求与响应);金额一律为元,两位小数字符串,如 "2880.50" |
| 跨域 | 支持 CORS(Access-Control-Allow-Origin: *),浏览器可直连 |
| 隐私口径 | 打码姓名、隐藏经手人与网页完全一致;内部公开团体受门禁保护 |
认证:API 密钥
- 查询端点免鉴权;写入端点需要 API 密钥;
- 密钥由团体管理员在「工作台 → 团体设置 → 开放 API」生成:
cbk_前缀,只在生成时展示一次,可随时撤销(立即失效); - 密钥等同该团体的记账权限,请像保管口令一样保管,只放在服务端环境变量/密钥管理器中;
- 两种携带方式等价:
Authorization: Bearer cbk_你的密钥 # 或 X-Api-Key: cbk_你的密钥
查询端点(公开)
/api/v1/stats平台统计。响应示例:
{
"data": { "orgs": 5, "ledgers": 6, "entries": 51, "questions_answered": 7 }
}
/api/v1/orgs团体搜索。参数:
| 参数 | 说明 |
|---|---|
q | 关键词(匹配名称/地区/简介) |
type | 场景过滤:公益机构 / 社区/业委会 / 班级/家委会 / 社团 / 临时活动 / 互助小组 |
响应(节选)——内部公开团体会返回 visibility:"internal",其内容端点需门禁(见内部公开访问):
{
"data": [{
"slug": "wutong", "name": "梧桐社区互助会",
"org_type": "公益机构", "region": "江苏 · 南京 · 梧桐街道",
"visibility": "public", "verified": true,
"ledger_count": 2, "entry_count": 16, "url": "/org/wutong"
}],
"meta": { "q": "互助", "type": null }
}
/api/v1/orgs/:slug团体详情:汇总收支、账本列表(每个账本带 entries_url)。响应(节选):
{
"data": {
"slug": "wutong", "name": "梧桐社区互助会", "visibility": "public",
"totals": { "income": "47032.50", "expense": "16424.50", "balance": "30608.00" },
"ledgers": [{
"id": 1, "name": "社区老人关爱基金", "status": "open",
"goal": "50000.00", "income": "47032.50", "expense": "16424.50",
"entries_url": "/api/v1/orgs/wutong/ledgers/1/entries"
}]
}
}
/api/v1/orgs/:slug/ledgers/:id/entries账本流水分页查询——本平台最常用的端点。参数:
| 参数 | 说明 |
|---|---|
month | 按月过滤,如 2026-09 |
kind | income / expense |
q | 关键词(匹配摘要/备注/来源去向/分类) |
page · per_page | 分页,默认 1 · 50,per_page 上限 200 |
order | asc / desc(按日期+编号,默认 desc) |
响应(节选)——每笔带 balance_after 逐笔结余,meta.summary 为全账本汇总:
{
"data": [{
"id": 15, "seq": 15, "date": "2026-09-10",
"kind": "expense", "kind_label": "支出",
"title": "中秋慰问礼包(米 10 斤、油 5L、月饼)52 份",
"category": "物资采购", "amount": "7488.00",
"counterparty": "惠民超市(梧桐店)", "handler": "志愿者 周芸",
"status": "normal", "balance_after": "3202.00",
"url": "/org/wutong/ledger/1#entry-15"
}],
"meta": {
"total": 16, "page": 1, "per_page": 50,
"summary": { "income": "47032.50", "expense": "16424.50", "balance": "30608.00" }
}
}
/api/v1/entries/:id单笔详情:凭证图片 URL、公开问答、修改/作废留痕——完整信任链数据。响应(节选):
{
"data": {
"id": 15, "title": "中秋慰问礼包……", "amount": "7488.00",
"attachments": [{ "url": "/uploads/seed-fapiao-zhongqiu.svg", "name": "惠民超市-中秋礼包发票.svg" }],
"questions": [{ "asker": "陈阿姨(社区居民)", "question": "礼包里的月饼是什么牌子、单价多少?",
"answer": "是本地老字号的散装广式月饼,18 元/盒……" }],
"revisions": [{ "action": "edit", "reason": "与超市按实际结算价开票,金额由 7,696.00 更正为 7,488.00" }]
}
}
写入端点(API 密钥)
/api/v1/ledgers列出自己团体的账本(获取 ledger_id 用)。
/api/v1/entriesAPI 记一笔——保存即公开,与手工记录同规则(连续编号、可修正不可删除)。参数:
| 字段 | 必填 | 说明 |
|---|---|---|
ledger_id | ✓ | 账本 id(GET /ledgers 获取) |
kind | ✓ | income / expense(也接受 收入/支出) |
title | ✓ | 事项摘要 4~100 字,请写清楚为谁、买了什么 |
amount | ✓ | 金额(元),最多两位小数 |
category | ✓ | 分类,须在系统分类表内(见下方分类表) |
date | — | YYYY-MM-DD,缺省为当天 |
counterparty | — | 来源/去向 |
mask_counterparty | — | true 时对公众打码显示;缺省跟随团体设置 |
handler · note | — | 经手人 / 备注 |
成功响应 201(节选);字段错误返回 400 并逐字段说明:
# 请求
curl -X POST /api/v1/entries \
-H "Authorization: Bearer cbk_你的密钥" -H "Content-Type: application/json" \
-d '{
"ledger_id": 1, "kind": "income", "date": "2026-09-29",
"title": "线上捐赠(小程序渠道,23 人)",
"amount": "1268.50", "category": "个人捐赠",
"counterparty": "23 位爱心网友", "mask_counterparty": true
}'
# 201 成功
{ "data": { "id": 17, "seq": 17, "amount": "1268.50", "url": "/org/wutong/ledger/1#entry-17" },
"message": "已记入「社区老人关爱基金」第 17 笔,保存即公开" }
# 400 字段错误
{ "error": "bad_request", "message": "参数校验未通过",
"fields": { "title": "事项摘要需 4~100 字", "category": "分类不在收入分类表内" } }
分类表——收入:成员缴费/AA、个人捐赠、企业/单位捐赠、公共收益/租金、活动/义卖收入、基金会/政府资助、利息及其他;支出:物资采购、餐饮聚餐、活动执行、场地租赁、交通差旅、补助/慰问金、对外捐赠、宣传印刷、押金/退款、运营杂费、其他。
内部公开团体的访问
业主基金、班费等内部公开团体,其 orgs/:slug、entries 端点默认返回 403。两种合法访问方式:
- 先在网页端输入访问口令解锁(
/org/:slug/unlock),之后带 Cookie 请求 API(30 天有效); - 每次请求携带口令头:
X-View-Password: 访问口令(口令由团体发到成员群)。
curl -H "X-View-Password: 业主群内发布的口令" /api/v1/orgs/cuihu/ledgers/4/entries
请勿用爬虫绕过门禁抓取内部公开数据——门禁是团体隐私边界的一部分。
错误码与限流
| 状态码 | error | 含义 |
|---|---|---|
| 400 | bad_request | 参数校验未通过(fields 逐字段说明) |
| 401 | unauthorized | 缺少/无效 API 密钥 |
| 403 | forbidden | 内部公开团体未解锁 |
| 404 | not_found | 团体/账本/记录不存在 |
| 429 | rate_limited | 超限流:公开 120 次/分钟/IP,密钥 60 次/分钟 |
Excel / CSV 批量导入
适合历史账目补录与表格迁移(在工作台 → 管理流水 → 📥 Excel 导入操作):下载 CSV/XLSX 模板 → 上传后逐行校验预览(错误定位到行)→ 确认导入。模板列契约:
| 列名 | 必填 | 规则 |
|---|---|---|
| 日期 | ✓ | 2026-09-01(也接受 2026/9/1、2026年9月1日) |
| 类型 | ✓ | 收入 / 支出 |
| 事项摘要 | ✓ | 4~100 字 |
| 分类 | ✓ | 须在系统分类表内(同上) |
| 金额(元) | ✓ | 数字,最多两位小数 |
| 来源/去向 | — | ≤80 字 |
| 姓名打码 | — | 是 / 否 / 留空(跟随团体默认) |
| 经手人 · 备注 | — | ≤40 字 / ≤300 字 |
限制:单次 ≤500 行、≤2MB;CSV 需 UTF-8。导入记录与手工记录无差别——没有「批量后门」。
应用场景
- 捐赠平台自动同步——收款成功后回调
POST /entries,善款当天进入公开账本; - 业主自建看板——用
X-View-Password拉取公共收益数据,在业主群机器人/大屏展示; - 研究与媒体——分页拉取公开账本做公益透明度分析,引用时请附记录 URL(如
/org/wutong/ledger/1#entry-15); - 财务迁移——从旧表格用 Excel 导入一次性搬迁,逐行校验防错。
使用规范
- 遵守限流,缓存公开数据(数据更新频率以团体记账为准);
- 尊重隐私边界:不绕过内部公开门禁,不聚合展示已打码个人的可识别信息;
- API 数据与网页同源同口径;若发现不一致,欢迎通过关于页联系方式反馈。