用户意图阅读章节查产品、计划、保障对比、算保费咨询下单、支付、订单查询、保单/确认书下载投保退保、批量退保、退费退保经纪侧开票、查询、红冲( /broker/...)开票经纪侧
两套路由并存,按场景选用, 不要混用同一业务流程中的步骤:
路径适用场景接口前缀A. 保单路径订单已出单;与投保/订单详情中的 policyNum 一致;Agent 流程从下单延续过来POST/GET /policies/{policyNum}/invoiceB. 经纪路径需走经纪工作台式开票:多保单 policyNo[]、 POST /broker/invoice、 POST /broker/invoiceQuery、 POST /broker/redInvoice``/broker/invoice 等
isMainOrder、 invoiceMode( merge / separate)说明,以用户要求的集成入口为准;若用户只说「按保单开票且已对接订单接口」,优先路径 A。Base URL: https://prod.uzyun.cn/api/agent/v1
用户 token:除下面「无需 token」的路径外,其余接口均需登录后在请求头携带:
Authorization: Bearer <token> 或 X-User-Token: <token>无需 token 的路径(与 GET /schema 中 auth.noAuthPaths 一致): POST /sms/send、 POST /register、 POST /login、 GET /schema。
注册与登录:均为 手机号 + 短信验证码, 不使用用户名、密码;具体 Body 字段名与是否可选以 GET /schema 为准。
POST /sms/send — Body: event = register, mobile = 手机号(大陆号码按平台要求)。POST /register — Body: mobile(必填)、 code(必填,上一步短信验证码)、 inviteCode(可选); username 可不传,服务端默认使用 mobile 填充。token、 expires、 id、 username,可直接进入后续业务调用;具体字段校验与错误信息以 GET /schema 为准。与注册相同: 手机号 + 短信验证码, 不使用密码。
POST /sms/send — Body: event = login, mobile = 手机号。
POST /login — Body: mobile(必填)、 code(必填,短信验证码)。
响应含 token、 expires(过期时间戳)、 id 等;若服务端仍返回 username 等展示字段,可写入状态文件便于展示, 鉴权仅依赖 token。后续请求携带 Authorization: Bearer <token>。
Agent 通过工作区根目录的 .agent-state.json 文件持久化 token 和常用人员信息,避免每次对话重复登录和重复收集信息。
date "+%Y-%m-%d %H:%M:%S %Z" 获取当前本地时间,记录到对话上下文中(用于 token 过期判断、起保日期建议等)。.agent-state.json。token 存在且 expires > 当前时间戳,直接使用该 token, 跳过登录。policyholder 或 frequentInsured 有数据,后续下单时优先使用,无需再向用户收集。将登录响应写入 .agent-state.json(保留已有的 policyholder 和 frequentInsured);建议同时写入 mobile,便于下次 token 过期时发起短信登录。
json
{
"token": "<登录返回的 token>",
"expires": 1735689600,
"userId": 1001,
"mobile": "13800138000"
}
若登录响应含
username等字段,可一并写入.agent-state.json供展示;登录方式仍为手机号 + 验证码,无密码。
若请求返回 401 或 expires 已过期:使用保存的 mobile(或让用户再次提供手机号)走「登录」短信验证流程,登录成功后更新 .agent-state.json 中的 token。 短信验证码不在状态文件中持久化。
Schema 数据纯静态(仅在服务端代码部署时变更),可本地缓存避免每次对话都调用 GET /schema:
GET /schema,将返回的完整内容存入 .agent-state.json 的 schemaCache 字段,同时记录 schemaVersion(取自响应的 version 字段)。.agent-state.json 中已有 schemaCache,直接使用缓存内容, 不调用 GET /schema。version 与本地 schemaVersion,若不同则更新 schemaCache 和 schemaVersion。GET /schema 并更新缓存。json
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"expires": 1735689600,
"userId": 1001,
"mobile": "13800138000",
"policyholder": {
"holderType": "individual",
"fullName": "张三",
"idNumber": "310101199001011234",
"mobileNumber": "13800138000"
},
"frequentInsured": [
{ "fullName": "张三", "idNumber": "310101199001011234" },
{ "fullName": "李四", "idNumber": "310101199101011234" }
],
"schemaVersion": "2026.3",
"schemaCache": {}
}
schemaCache的值为GET /schema返回的完整 JSON 对象,此处省略。
模型自身不感知实时时间。 对话开始时必须执行以下命令获取当前时间,并在整个对话中使用:
bash
date "+%Y-%m-%d %H:%M:%S %Z"
当前时间用于:
expires 时间戳与当前时间对比,判断是否需要重新登录。POST /login 获取 token。查询旅游意外险产品信息并获取保费报价:产品列表、产品详情与保障对比、计划列表、计算保费。 不包含下单、支付。
GET /products — 获取产品列表(含描述),得到 productId。GET /products/{productId}/detail — (可选)获取产品详情与保障明细对比矩阵。GET /products/{productId}/plans — 获取该产品的计划列表,得到 planId 和 planCode。POST /quote — 传入 productId、planId、起止日期、insuredAges[],得到保费。接口参数细节请通过本地缓存的 Schema 或调用 GET /schema 获取。以下仅列出核心要点。
获取产品列表。返回产品名称、描述、状态等。
获取产品详情,包含保障明细对比矩阵。
获取指定产品的计划列表,返回 planId、planCode、保障额度等。
字段类型必填说明productIdint是产品IDplanIdint是计划IDcoverageStartTimestring是起保日期 YYYY-MM-DDcoverageEndTimestring是止保日期 YYYY-MM-DDinsuredAges[]int是被保险人年龄数组
枚举值查询接口, 无需 token。
type 值说明sex性别country_code国家/地区代码individual_id_type证件类型policy_holder_type投保人类型relation_to与投保人关系unit_type单位性质
响应为 [{value, label}, ...],用 value 作为请求体字段值,用 label 展示给用户。
完成旅游意外险投保全流程:创建订单、提交到保司、获取支付链接、查询订单状态、下载保单/确认书;出单后可通过 路径 A 申请/查询电子发票。支持 智能填表(中国身份证场景下被保险人只需姓名+证件号)。
POST /orders — 创建订单(身份证场景只需姓名+证件号),得到 orderSn。POST /orders/{orderSn}/submit — 传入 paymentMethod,提交到保司并获取 paymentUrl。GET /orders / GET /orders/{orderSn} / GET /orders/{orderSn}/pay-url — 列表、详情、支付链接。GET /policies/{policyNum}/assets; GET /policies/{policyNum}/download?type=policy|confirmation — 下载 PDF(推荐)。POST /policies/{policyNum}/invoice; GET /policies/{policyNum}/invoice?queryType=1|2。https://prod.uzyun.cn/api/agent/v1Authorization: Bearer <token>(或 X-User-Token)。policyNum 来自订单详情或列表(出单后才有);仅 当前登录用户本人订单 可访问。方式一(推荐):直接下载 PDF
文档请求保单GET /policies/{policyNum}/download?type=policy( type 可省略,默认即为保单)投保确认书GET /policies/{policyNum}/download?type=confirmationbash
curl -sSL -H "Authorization: Bearer $TOKEN" \
-o "${policyNum}_保单.pdf" \
"https://prod.uzyun.cn/api/agent/v1/policies/${policyNum}/download?type=policy"
curl -sSL -H "Authorization: Bearer $TOKEN" \
-o "${policyNum}_投保确认书.pdf" \
"https://prod.uzyun.cn/api/agent/v1/policies/${policyNum}/download?type=confirmation"
方式二: GET /policies/{policyNum}/assets 返回 JSON: policyUrl、 confirmationUrl(可能暂时为空)。
policyNum 来自订单详情;主订单拆单时路径中可为 任一子单保单号(见 isMainOrder)。申请开票 — POST /policies/{policyNum}/invoice,JSON body:
场景必填 body说明传统单笔invoiceTitle、 isMainOrder: false抬头:个人一般为姓名,企业为税务一致全称主单拆单isMainOrder: true、 invoiceMode: merge 或 separate合并一张票 / 各子单一票
响应核心字段: policyNums、 brokerStatus(如 1000 表示经纪受理成功)、 invoiceUrl / policyInvoiceUrls。
查询进度 — GET /policies/{policyNum}/invoice?queryType=1(蓝字); queryType=2(红冲)。 data.items: billStatus( 0 开具中, 1 成功, 2 失败)、 shortUrl、 errorMessage。
若需 路径 B( /broker/invoice 等),见下文「开票经纪侧」章节。
API 支持从 中国居民身份证号 自动推导(仅在字段为空/零值时填充,显式传入不覆盖):
自动推导字段说明idType``"ID"``dateOfBirth身份证第7-14位 YYYY-MM-DDgender第17位奇偶 → male/femaleagedateOfBirth + coverageStartTime 周岁
被保险人最少必填:中国身份证 → fullName + idNumber;护照/其他 → fullName + idType + idNumber + dateOfBirth。 idType 枚举以 GET /options/individual_id_type 为准。
投保人最少必填:个人身份证 → holderType + fullName + idNumber;企业 → holderType( corporate)+ companyName + unifiedSocialCreditCode。
下单成功后写入 .agent-state.json(按 idNumber 去重):覆盖 policyholder;追加 frequentInsured。后续下单优先使用已存数据并向用户确认。
拿到 paymentUrl 后必须在回复中同时输出:
paymentUrl 原文;██/空格),不得以仅图片替代。推荐:Node qrcode-terminal、Python qrcode、或 qrencode;禁止依赖第三方在线转码站。若无法生成二维码,至少输出链接并说明降级原因。
POST /orders — 草稿订单; 须再 POST /orders/{orderSn}/submit 才提交保司。paymentMethod: wechat、 alipay、 credit、 recharge、 insurance; channelPartnerId 不传,服务端默认渠道。GET /schema 为准。单张保单退保、主订单批量退保(异步)、查询批量退保进度、订单退费。
单张退保:确认 policyNum,状态为 underwriting_approved → POST /broker/surrender。
批量退保:确认 mainOrderId → POST /broker/batchSurrender 得 taskId → 轮询 GET /broker/batchSurrenderProgress?taskId= 至 completed / failed。
退费: POST /broker/refund,传入 orderSn。
字段类型必填说明policyNumstring是保单号
字段类型必填说明mainOrderIdint64是主订单ID
响应含 taskId、 total。
字段说明statuspending/ processing/ completed/ failedsuccessCount / failedCount / failedList / progress进度与结果
字段类型必填orderSnstring是
orderSn 与 policyNum 二选一。
policyNum、 mainOrderId、 orderSn。通过 路径 B: POST /broker/invoice 开具、 POST /broker/invoiceQuery 查询、 POST /broker/redInvoice 红冲。支持传统订单与主订单(合并/分开)。
policyNo[](最多 100 张)等 broker 文档场景。POST /broker/invoice(参数见下表)。POST /broker/invoiceQuery( type: 1 发票 / 2 红冲)。POST /broker/redInvoice。字段类型必填说明policyNo[]string是保单号列表(最多100张)invoiceTitlestring条件必填传统订单必填;主订单由后端获取isMainOrderbool否默认 falseinvoiceModestring否主订单: merge / separate(默认)
开票模式:传统订单必传抬头;主订单合并/分开见字段说明。
字段必填说明policyNum是保单号type是1 发票 / 2 红冲
响应 data 项: billStatus、 shortUrl、 errorMessage 等。
字段必填policyNum是
/policies/{policyNum}/invoice)是否足够。