数据开放
医械价通的数据通过同一套 REST 接口提供:网页端、后续的微信公众号以及你的内部系统都可以直接调用。
概览
- 基础地址
- 与网站同域的
/api路径,例如https://<网站域名>/api/bids。开发环境中前端http://127.0.0.1:3100/api会原样转发到后端http://127.0.0.1:8100/api。 - 数据格式
- 请求与响应均为 JSON(UTF-8);POST 请求需带
Content-Type: application/json。 - 字段约定
- 金额单位统一为「元」;日期格式为
YYYY-MM-DD;多选参数用英文逗号分隔,如province=广东,浙江。 - 分页
page从 1 开始,page_size默认 20、最大 100。列表接口统一返回{ items, total, page, page_size, max_page },其中max_page是当前身份可翻阅的最大页数(null表示不限)。- 数据来源
- 每条记录带
source字段(演示数据 / AI采集 / 文件导入 等)。「演示数据」由系统生成,仅用于体验功能,不代表真实成交价格。 - 跨域
- 服务端调用不受限制;在浏览器中跨域调用,需要先把你的域名加入后端的 CORS 白名单(CORS_ORIGINS 配置)。
开发环境可访问 http://127.0.0.1:8100/docs 查看交互式接口文档(Swagger UI,可在线试调),完整的 OpenAPI 描述位于 http://127.0.0.1:8100/openapi.json。
后续上线的微信公众号会直接复用这套接口与账号体系:登录方式、会员权益和分页限制与网页端一致,数据实时同步,无需另行对接。
鉴权
- 1调用
POST /api/auth/login,请求体为{"phone": "手机号", "password": "密码"},返回token和用户信息。还没有账号可先调用POST /api/auth/register注册,新账号赠送 3 天会员试用。 - 2之后的每个请求在请求头加上
Authorization: Bearer <token>。token 有效期 30 天,过期后重新登录获取即可。 - 3不带 token(或 token 已失效)时按游客处理:公开接口照常返回,但受游客分页限制;需要登录的接口返回
LOGIN_REQUIRED。
curl -s -X POST "https://<网站域名>/api/auth/login" \
-H "Content-Type: application/json" \
-d '{"phone": "<手机号>", "password": "<密码>"}'
# 之后的请求带上请求头:
# Authorization: Bearer <token>{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.…",
"user": {
"id": 12,
"phone": "138****0000",
"nickname": "用户0000",
"company": null,
"role": "user",
"vip_until": "2026-10-02T10:00:00",
"is_vip": true
}
}会员与分页限制
接口与网页端共用同一套权限规则,按调用者身份(游客 / 注册用户 / 会员)区分:
| 能力 | 游客 | 注册用户 | 会员 |
|---|---|---|---|
| 列表翻页(带「分页限制」标记的接口) | 前 3 页 | 前 10 页 | 不限 |
| 每页条数 page_size | ≤ 100 | ≤ 100 | ≤ 100 |
| 导出 CSV(/api/bids/export) | — | — | 单次 ≤ 5000 条 |
| AI 次数(chat / param-analysis / market-insight) | 5 次 / 天(按 IP) | 30 次 / 天 | 300 次 / 天 |
| 医院、供应商联系方式 | 脱敏 | 脱敏 | 完整 |
超出可翻阅页数时返回 HTTP 403。建议先读取列表响应中的 max_page,不要请求超过该页码的数据。管理员账号不受以上限制。
错误响应
出错时 HTTP 状态码非 2xx,响应体为 {"detail": {"code": "错误码", "message": "中文说明"}},可直接把 message 展示给用户。
| HTTP | detail.code | 含义 |
|---|---|---|
| 403 | LOGIN_REQUIRED | 游客超出可翻阅页数,或调用需要登录的功能(如导出) |
| 401 | LOGIN_REQUIRED | 需要登录的接口未携带有效 token(如 /api/auth/me) |
| 403 | VIP_REQUIRED | 普通用户超出可翻阅页数,或调用会员功能 |
| 400 | BAD_CREDENTIALS | 手机号或密码错误 |
| 404 | NOT_FOUND | 记录不存在 |
| 422 | — | 参数校验失败(FastAPI 默认格式,detail 为数组) |
| 429 | AI_QUOTA | 今日 AI 次数已用完 |
| 503 | LLM_UNAVAILABLE | 大模型服务暂不可用 |
接口清单
以下为主要接口,路径参数用 {id} 表示;带 分页限制 标记的列表接口受上文翻页规则约束,会员 仅会员可用,AI 计次 计入每日 AI 次数。完整参数以交互式文档为准。
| 方法 | 路径 | 主要参数 | 说明 |
|---|---|---|---|
| 账号与鉴权 | |||
| POST | /api/auth/login | phone, password(JSON 请求体) | 手机号 + 密码登录,返回 token 与用户信息 |
| POST | /api/auth/register | phone, password(≥6 位), nickname?, company? | 注册账号,新账号赠送 3 天会员试用 |
| GET | /api/auth/me | — | 当前账号信息与会员有效期登录 |
| 中标数据 | |||
| GET | /api/bids | keyword, record_type(设备 / 维保 / 软件), category_id, brand, model, province, city, hospital_level, purchase_method, date_from, date_to, min_price, max_price, sort, page, page_size, with_summary | 中标记录检索。keyword 支持同义词与品牌别名;价格单位为元;with_summary=true 时附带均价、中位数、去极值均价等统计。sort:date_desc / date_asc / price_desc / price_asc / amount_desc分页限制 |
| GET | /api/bids/{id} | — | 单条中标详情:招标参数、产品、采购单位、供应商(非会员联系方式脱敏)、同型号价格统计与相关记录 |
| GET | /api/bids/export | 与 /api/bids 相同的筛选参数与 sort | 按筛选条件导出 CSV(UTF-8 带 BOM,可直接用 Excel 打开),单次最多 5000 条会员 |
| 产品与市场 | |||
| GET | /api/products | keyword, category_id, brand_id, origin(国产 / 进口), sort(hot / latest / price_asc / price_desc), page, page_size | 品牌型号列表,含平均 / 最低 / 最高中标价、中标次数和参数摘要分页限制 |
| GET | /api/products/{id} | years(统计近 N 年,0 为全部) | 产品详情:参数与配置、价格统计与区间分布、各省 / 历年 / 医院等级分布、注册证 |
| GET | /api/market/analysis | keyword, category_id, province, year_from, year_to, record_type | 市场分析:历年规模、品牌份额及逐年变化、国产与进口、省份、TOP 供应商、医院等级、采购方式、热门型号 |
| GET | /api/categories | — | 器械分类树(category_id 的取值来源),含同义词 |
| 机构与商机 | |||
| GET | /api/hospitals | keyword, province, city, level, type, sort(bids / amount / beds), page, page_size | 采购单位(医院、卫生院等)列表及采购次数、金额分页限制 |
| GET | /api/suppliers | keyword, province, brand, category_id, sort(amount / bids / capital), page, page_size | 供应商列表及中标次数、金额、主营品牌分页限制 |
| GET | /api/tenders | keyword, province, category_id, notice_type, status(进行中 / 已截止 / 意向), date_from, min_budget, page, page_size | 招标公告与采购意向(商机)分页限制 |
| 目录数据 | |||
| GET | /api/consumables | keyword, name, register_no, manufacturer, spec, province, sort(latest / price_asc / price_desc), page, page_size | 耗材挂网价;有筛选条件时附带 summary(条数、均价、最低价、最高价)分页限制 |
| GET | /api/service-prices | keyword, province, code, page, page_size | 医疗服务价格项目(三级 / 二级 / 一级医院价格、医保类别)分页限制 |
| GET | /api/service-prices/compare | code(项目编码) | 同一项目的各省价格对比 |
| GET | /api/registrations | keyword, registrant, mgmt_class(Ⅰ / Ⅱ / Ⅲ), origin(国产 / 进口), page, page_size | 医疗器械注册证分页限制 |
| GET | /api/standards | keyword, level1(子目录), page, page_size(≤200) | 医疗器械分类目录条目,返回 directories 子目录列表 |
| AI 能力 | |||
| POST | /api/ai/chat | messages: [{role, content}](最多 40 条) | AI 数据助手,以 SSE(text/event-stream)流式返回,事件格式见下文AI 计次 |
| POST | /api/ai/param-match | text(招标参数原文), category_id?, top?(1–20,默认 8) | 根据招标参数反推候选型号:逐条比对满足情况,并统计每条参数有几个品牌满足(不调用大模型) |
| POST | /api/ai/param-analysis | text, category_id? | 在参数反推基础上,由大模型分析指向性 / 排他性参数并给出修改建议(Markdown)AI 计次 |
| POST | /api/ai/market-insight | keyword, category_id, province, year_from, year_to | 根据统计数据生成市场洞察报告(Markdown)AI 计次 |
示例响应
以下是 2026 年 9 月调用本站接口得到的真实响应(内容为演示数据),为便于阅读已截短,以 // 开头的行为说明文字。
// GET /api/bids?keyword=彩超&page_size=1&with_summary=true
{
"items": [
{
"id": 9410,
"record_type": "设备",
"title": "襄阳市中心医院便携式彩超院内采购结果公示",
"item_name": "便携式彩超",
"product_id": 62,
"category": "彩超",
"brand_name": "西门子医疗",
"model": "ACUSON Redwood",
"buyer_name": "襄阳市中心医院",
"hospital_level": "三甲",
"supplier_name": "武汉德瑞生物科技有限公司",
"province": "湖北",
"city": "襄阳",
"quantity": 1.0,
"unit": "台",
"unit_price": 1274000.0,
"total_price": 1274000.0,
"bid_date": "2026-09-25",
"purchase_method": "院内采购",
"source": "演示数据"
// … 其余字段(category_id、brand_id、hospital_id、supplier_id、project_no 等)略
}
],
"total": 2348,
"page": 1,
"page_size": 1,
"max_page": 3,
"summary": {
"count": 2348,
"avg_price": 968131.2734241908,
"min_price": 21300.0,
"max_price": 3347000.0,
"total_amount": 3571089730.0,
"total_quantity": 3781.0,
"median_price": 816600.0,
"trimmed_avg_price": 935860.4068117313
}
}调用示例
把 <网站域名>、<手机号>、<密码> 换成实际值即可运行;本地开发时基础地址可用 http://127.0.0.1:3100/api。
BASE="https://<网站域名>/api"
# 1) 登录,取出 token(此处用 jq 解析,也可以手动复制返回的 token)
TOKEN=$(curl -s -X POST "$BASE/auth/login" \
-H "Content-Type: application/json" \
-d '{"phone": "<手机号>", "password": "<密码>"}' | jq -r .token)
# 2) 查询中标记录:彩超,广东 + 浙江,附带价格统计
curl -s -G "$BASE/bids" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "keyword=彩超" \
--data-urlencode "province=广东,浙江" \
-d page=1 -d page_size=20 -d with_summary=true
# 3) 耗材挂网价:广东的药物洗脱支架,按单价从低到高
curl -s -G "$BASE/consumables" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "keyword=药物洗脱支架" \
--data-urlencode "province=广东" \
-d sort=price_asc
# 4) 参数反推型号(无需登录)
curl -s -X POST "$BASE/ai/param-match" \
-H "Content-Type: application/json" \
-d '{"text": "1. 探头数量≥3个\n2. 最大扫描深度≥30cm\n3. 主机显示器≥21英寸", "top": 5}'AI 流式对话(SSE)
POST /api/ai/chat 的请求体为 {"messages": [{"role": "user", "content": "问题"}]}(多轮对话时按顺序带上历史消息,role 为 user / assistant)。响应类型为 text/event-stream,每个事件是一行 data: {JSON},事件之间以空行分隔,type 字段区分事件类型:
| type | 含义 | 主要字段 |
|---|---|---|
| meta | 本次对话使用的模型、是否可联网 | provider, model, web_search |
| status | 进度提示,如「正在联网搜索…」 | text |
| tool_start | AI 开始调用数据工具(检索中标记录、统计价格等) | id, name, label, args |
| tool_end | 工具调用结束 | id, name, summary, is_error, preview |
| sources | 联网检索到的来源链接 | items |
| text | 回答文本增量,按顺序拼接即为完整回答(Markdown) | delta |
| error | 出错信息 | message |
| done | 本轮结束 | elapsed(秒) |
| ping | 心跳(每 15 秒无事件时发送),可忽略 | — |
# BASE、TOKEN 同上文「调用示例」;-N 关闭缓冲,逐条输出事件;不带 token 时按游客计次
curl -N -X POST "$BASE/ai/chat" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"messages": [{"role": "user", "content": "近一年广东彩超的平均中标价是多少?"}]}'data: {"type": "meta", "provider": "通义千问", "model": "qwen-plus", "web_search": true}
data: {"type": "tool_start", "id": "price_statistics-…", "name": "price_statistics", "label": "统计价格", "args": {"category": "彩超", "province": "广东", …}}
data: {"type": "tool_end", "id": "price_statistics-…", "name": "price_statistics", "summary": "…", "is_error": false, "preview": …}
data: {"type": "text", "delta": "近一年广东省彩超共 …"}
data: {"type": "text", "delta": "…"}
data: {"type": "done", "elapsed": …}AI 次数用完时返回 HTTP 429(AI_QUOTA);大模型未配置或不可用时,会以 error 事件说明原因后结束。
使用须知
- 接口数据整理自政府采购网、公共资源交易平台、医院官网、医保局挂网公告等公开信息,仅供参考,请以原始公告为准。
source为「演示数据」的记录由系统生成,用于体验功能,不代表真实成交价格,请勿用于正式报价或决策。- 请合理控制调用频率;需要批量获取数据时,请使用导出接口,或联系平台按区域 / 品类定制数据。
- 接口仍在迭代中,新增字段不会提前通知;字段和参数以交互式接口文档为准,解析时请忽略未知字段。