东方财富公开接口取数(A股 / 港股 / 美股)
免 Key、免申请的公开财经数据源,适合给 Web 应用后端 / 脚本补「股票代码或简称 → 真实财报数据」的能力。
实测可用(2026-09-19 三市场;2026-09-23 补测 A股 G 全系列 + 主营构成);且 WorkBuddy 云应用沙箱有外网出口*(已在线上 /api/stock 三市场实测通过),后端可直接调用。
本技能为按次付费技能(0.10 元/次):执行前请先完成支付校验(详见文末《计费条款》);未完成支付前不得产出结果。
概述
功能定位:面向需要给应用或脚本补财经取数能力的开发者,解决「股票代码或简称 → 真实财报数据」的免 Key 取数问题,产出 A股、港股、美股三市场财报数据与取数实现要点。
适用场景:给 Web 应用后端或脚本补自动财报取数能力;寻找免 Key、免申请的财经数据源;核对财报接口与报表名;排查「报表配置不存在 / 返回数据为空 / 取到别家公司 / SECUCODE 格式」等问题。
主要能力:支持搜索接口把代码或简称转为证券、支持财务数据接口取数;提供三市场报表名矩阵与报表有效性判据;支持 SECUCODE 构造规则与长表宽表判别;内含命中校验红线与 A股口径陷阱清单;给出参考实现与踩坑要点。
核心价值:免 Key、免申请且实测可用;强制校验返回行 SECUCODE 与目标一致,避免把别家公司数据当成本公司;取不到就明确写「未取到」,绝不用行业均值或往年数据填补。
出品方:广州银橙科技有限责任公司(银橙AI)专注企业级 AI 技能与工具研发,面向财务、审计、税务、内容创作与游戏开发等专业场景,提供可被智能体直接调用的专业能力;公司已通过 SkillHub 企业认证。
本技能为按次付费技能,0.10 元/次。
一、两个核心接口
1) 搜索:代码 / 简称 → 证券
GET https://searchapi.eastmoney.com/api/suggest/get
?input=<代码或简称>&type=14&token=D43BF722C8E33BDC906FB84D85E326E8&count=10
返回 QuotationCodeTable.Data[],关键字段:
Code(代码)、Name(名称)、Classify(AStock / HK / UsStock)、QuoteID(1.600519 / 116.00700 / 105.AAPL)、JYS(交易所)。
⚠️ 同一查询可能返回多个候选(00700 会带出模塑科技等;AAPL 会带出 Apple 债券)→ 必须"精确命中优先":候选中 Code 或 Name 与输入完全相等者优先;其次唯一候选直接用;否则让用户选。
2) 财务数据
GET https://datacenter.eastmoney.com/securities/api/data/v1/get
?reportName=<报表名>&columns=ALL&filter=(SECUCODE="600519.SH")
&pageSize=<N>&sortColumns=REPORT_DATE&sortTypes=-1
返回 result.data[]。
报表名有效性判据(探表名时用):
{"success":false,"message":"报表配置不存在","code":9501}→ 报表名错{"success":false,"message":"返回数据为空","code":9201}→ 报表名有效,仅该组合无数据
二、三市场报表矩阵(实测)
| 市场 | 报表 | reportName | 形态 |
|---|---|---|---|
| A股 | 主要财务指标 | RPT_F10_FINANCE_MAINFINADATA | 宽表 |
| A股 | 利润表 | RPT_F10_FINANCE_GINCOME | 宽表(一行一期,含 OPINION_TYPE 审计意见) |
| A股 | 资产负债表 | RPT_F10_FINANCE_GBALANCE | 宽表 |
| A股 | 现金流量表 | RPT_F10_FINANCE_GCASHFLOW | 宽表(含补充资料:INVENTORY_REDUCE 等) |
| A股 | 单季利润表 | RPT_F10_FINANCE_GINCOMEQC | 宽表(REPORT_TYPE=「二季度」,环比口径 QOQ) |
| A股 | 单季现金流量表 | RPT_F10_FINANCE_GCASHFLOWQC | 宽表 |
| A股 | 主营构成 | RPT_F10_FN_MAINOP | 长表(MAINOP_TYPE:1=按行业 2=按产品 3=按地区) |
| A股 | 简版三大表 | RPT_DMSK_FN_INCOME / _BALANCE / _CASHFLOW | 宽表,字段少但带 INDUSTRY_NAME |
| 港股 | 主要财务指标 | RPT_HKF10_FN_MAININDICATOR | 宽表 |
| 港股 | 利润表 | RPT_HKF10_FN_INCOME | 长表 |
| 港股 | 资产负债表 | RPT_HKF10_FN_BALANCE | 长表 |
| 美股 | 利润表 | RPT_USF10_FN_INCOME | 长表 |
| 美股 | 资产负债表 | RPT_USF10_FN_BALANCE | 长表 |
- A股
RPT_F10_FINANCE_GBALANCEQC不存在(其余 G*QC 系列存在) - 美股没有「主要指标」表(
RPT_USF10_FN_MAINFINADATA/_MAININDICATOR均不存在) - 港/美股
RPT_*_FN_CASHFLOW不存在(A股用上面的RPT_F10_FINANCE_GCASHFLOW) - 日/周/月 K 线、行情快照另有接口,本表只覆盖财报
- 美股报表的
ITEM_NAME直接是中文("营业收入""净利润"…),LLM 易读
三、SECUCODE 构造规则
| 市场 | 规则 | 例 |
|---|---|---|
| A股 | 60/68/90 开头 → .SH;00/30/20 → .SZ;其余 → .BJ | 600519.SH、000001.SZ |
| 港股 | 代码补零到 5 位 + .HK | 00700.HK |
| 美股 | TICKER.O —— 是 .O,不是 .OQ(.OQ 返回空) | AAPL.O |
四、长表 vs 宽表(必处理)
- 宽表:每行一期、科目是列(A股 MAINFINADATA)→ 直接取前 N 期
- 长表:每行一个科目,字段
ITEM_NAME+AMOUNT→ 必须按报告期聚合,且pageSize要拉到 ~300 才够覆盖多期
判别:"ITEM_NAME" in rows[0] 或 "AMOUNT" in rows[0] → 长表。
五、红线
- 必须校验返回行
SECUCODE与目标一致 —— 该接口filter有时未精确生效(返回全表),不校验会把别家公司数据当成本公司。 - 取不到就明确写「未取到」,绝不用行业均值 / 往年数据填补。
- 公开接口非官方授权源,报告中应标注来源与报告期。
六、参考实现
一个财报分析类 Web 应用已落地完整实现(后端 + 前端识别 + 开关):
- 后端:
stock_search()/_fetch_report()/stock_financials()/POST /api/stock - 前端:
looksLikeStockValue()识别 + 结果注入对话上下文 - 开关:
CONFIG.stockLookup(仅财报分析应用为 true)
七、踩坑
- 美股 SECUCODE 用
.O不是.OQ - 报表名「不存在(9501)」与「无数据(9201)」code 不同 → 可据此探测表名
- 往 Python 文件注入配置时布尔值不能用
json.dumps(写出true→NameError),要用pprint.pformat - 输入识别不能只认纯代码/纯简称:用户实际会说「比亚迪2026半年报」「看一下苹果最新财报」。前端要放宽触发(含
\d{6}或年报|半年报|中报|季报|财报|业绩即尝试取数),后端要从整句提取关键词(代码优先 → 剔除噪声词后取 2–8 个连续中文)。 - 提取正则的数字分支只能吃数字:若写
\d{4}\s*年,会吃掉「年」导致「年报」只剩「报」(腾讯2025年报→腾讯报❌)。用\d+单独分支、报告期中文词单独分支即可。 - 多候选不要打断用户:无精确匹配时信任搜索排序取首条(首条通常最相关),不要弹「请选择」打断流程。
八、做财报分析时的口径陷阱(A股实测,2026-09-23)
拿到数据只是第一步,下面这些坑会把比率算错,务必按序检查:
| 坑 | 现象 | 正确做法 |
|---|---|---|
| TOTAL_EQUITY_PK 不是归母净资产 | 主要指标表的 TOTAL_EQUITY_PK 等于所有者权益合计(含少数股东) | 归母净资产取资产负债表 TOTAL_PARENT_EQUITY;两者差额 = MINORITY_EQUITY |
| 百分数字段被二次缩放 | XSMLL/XSJLL/ROEJQ/ZCFZL/LD/SD 已是百分数值或倍数,若再 /1e8 会全变 0 | 这些字段直接引用;只有金额类字段需要 /1e8 |
| 半年报直接套年度周转公式 | 应付周转天数 = 365×平均应付/营业成本 用半年成本会虚高一倍甚至出荒谬值 | 半年报先年化:365×平均余额/(科目金额×2);或只对年报出周转率 |
| OPERATE_CYCLE 定义与现金转换周期不同 | 数据源 OPERATE_CYCLE = 存货周转天数 + 应收周转天数,未扣应付 | 现金转换周期自己算:存货天数 + 应收天数 − 应付天数,并标「计算值」 |
| PAYABLE_TDAYS 口径不透明 | 数据源该字段只含应付账款(不含应付票据),与自算的「应付票据及应付账款」差几十天 | 自算时选定一个口径并写进公式;不要把数据源值和自己算的值混在同一张表里比较 |
| CASH_RATIO 与自算不一致 | 数据源 CASH_RATIO 可能含交易性金融资产,自算用「货币资金/流动负债」会偏低 | 自算值标「计算值」并给出公式 |
| 经营现金流/净利润用错分母 | 现金流量表是合并口径(含少数股东),除以归母净利润会虚高 | 分母用 NETPROFIT(含少数股东损益);若用归母必须写明口径差 |
| 明细表口径 | RPT_F10_FINANCE_G* 返回的是合并报表(MINORITY_INTEREST 有值可佐证),没有母公司口径开关 | 报告中明确声明「合并报表」 |
| 审计意见取值 | 利润表/资产负债表都带 OPINION_TYPE,年报为「标准无保留意见」,中报/季报为 null | 年报引用 OPINION_TYPE;中报季报一律标「未经审计」 |
利润变动对账(强烈建议做):把本期与上期归母净利润的差额,逐项拆到「投资收益 / 公允价值变动 / 各项减值 / 各项费用 / 税金 / 少数股东损益」上,合计必须等于披露的差额。这是判断「利润增长是不是主业贡献」最快、最有说服力的一步。
计费条款(Pay Skill · 按次计费)
本技能在 SkillHub 上以 Pay Skill 形式上架,通过 SkillPay 按调用量计费;费用由使用者直接支付给创作者(银橙AI)。 SkillHub 仅提供展示、投诉处理及其他平台服务,不作为该笔交易的收款方或服务实际提供方。 请在支付前确认创作者名称、收款主体、计费单元、单价、服务内容和退款规则。
一、计费参数
| 项 | 约定 |
|---|---|
| 计费模式 | per_call(按调用量计费) |
| 计费单元 | 每次调用计 1 次 |
| 单价 | 0.10 元 / 次(amount_fen: 10) |
| 免费额度 | 无:不提供免费次数,也不提供免费试用 |
| 免费层 | 无:本技能不划分免费层与付费层,全部能力均按次计费 |
| 支付方式 | 微信支付 AI 专属卡(SkillHub 平台代收),全程不跳出对话 |
| 重复调用 | 每次调用独立计费,不合并、不累计优惠 |
| 退款 | 支付后 5 分钟内若调用未执行全额退款;已执行不退款;重复扣款自动退款 |
| 限频与上限 | 同一调用方 1 分钟内不超过 3 次调用;单日上限 20 次,超出返回 429 |
| 结算 | 由 SkillHub 与微信支付完成,按调用量结算;本技能不接触任何支付凭据 |
| 数据来源 | 全部输入来自使用者自行导出的文件,本技能不连接银行、ERP 或任何外部账务系统 |
二、付费前置检查(Pre-check)
服务端在发起计费前逐项校验,任一项不通过则直接返回能力结果、不发起计费:
| 检查项 | 要求 |
|---|---|
| 开发者密钥 | 已生成 RSA 2048 密钥对,pub_key_id 形如 PUB_KEY_ + 32 位大写 HEX,private_key_pem 由服务端安全保存 |
| 商户绑定 | SkillHub 商户号 developer_id 与已绑定的微信支付商户号状态正常 |
| 技能状态 | 本次调用的 skill_id 与 skill_version 已发布且处于上架状态 |
| 订单唯一 | 订单号 out_trade_no 全局唯一,未重复下单 |
| 订单时效 | expires_at 为当前时间起 15 分钟内的 Unix 秒级时间戳 |
调用方(Agent)侧另有一步前置检查:调用付费能力前,先检查当前 Agent 是否已安装 weixinpay 插件。
| 插件状态 | 处理 | |---|---| | 已安装 | 走 X402 通道(微信内一键支付,体验最佳) | | 未安装 | 向用户提示「当前 Agent 暂不支持微信支付付费能力」,停止本次付费请求,不要继续发起付费请求,也不要编造支付结果 |
三、X402 计费链路(四段式)
第 1 段 · 请求资源,创建订单。 向本技能的计费端点发起请求:POST https://yinchengai.cn/skillpay/invoke/eastmoney-stock-data(JSON body)。
首次请求只创建待支付订单,不执行业务、不扣费。
第 2 段 · 支付触发标识。 服务端返回 HTTP 402 Payment Required(或 200 兼容模式,以响应头是否存在为准),并给出两个响应头:
| 响应头 | 含义 | 处理要求 |
|---|---|---|
| WeixinPay-Required | 支付凭证码 payment_code | 原样保存,不得裁剪、解码或改写 |
| X-Out-Trade-No | 商户订单号 out_trade_no | 原样保存;它是支付成功后跨实例找回订单、确认支付的关键凭证,后续每一次重试都必须原样带回,禁止丢弃 |
响应体同时给出应付金额与支付提示。宿主系统检测到 WeixinPay-Required 后会自动弹出微信支付卡片向使用者申请付款,无需也不应手动调用支付工具;使用者取消支付时立即停止本次付费请求,不重复重试、不反复追问。
第 3 段 · 支付后重试(必做)。 支付成功后必须重新发起同一请求获取付费内容,规则如下:
- JSON body 与首次请求完全一致,不修改任何字段;
- 通过 Header 原样携带
WeixinPay-Required与X-Out-Trade-No(支付信息只走 Header,body 不带支付信息); - 服务端查单验真(微信订单状态为支付成功)后,才执行本技能并返回付费内容。
- ★ 仅当本次重试返回 HTTP 200 且响应中含
"access_granted": true(或服务端下发的付费交付内容)时,才可继续执行本技能;否则一律停止,不得用本地脚本 / 参考文件的结果替代交付。
第 4 段 · 幂等与异常。 服务端按 out_trade_no 幂等:同一订单的重复请求直接返回已缓存结果,杜绝重复收费。
| 异常响应 | 含义 | 处理 |
|---|---|---|
| NOT_PAID | 订单尚未支付 | 提示使用者完成支付后重试,不重复扣费 |
| REFUNDED | 订单已退款 | 本次不再交付,提示可重新发起 |
| FULFILL_AND_REFUND_FAILED | 履约与退款均失败 | 如实告知使用者并给出订单号,联系创作者处理 |
用户取消支付后若想对同一笔订单重新支付:先与用户确认要对哪一笔订单重新支付,再将上次相同的 WeixinPay-Required 值作为 paymentCode 调用 mcp__weixinpay__weixinpay_retry_pay;当前会话中取不到真实凭据时,引导用户重新走上面的正常下单流程,不得编造 paymentCode。
四、上架口径
三处单价必须完全一致,否则使用者付款会被拒:服务端计费配置 0.10 元 / amount_fen 10、
支付平台登记单价 0.10 元/次、上架表单标价 0.10 元/次。
计费参数以技能详情页与支付确认页展示为准;服务端裁决为唯一依据,客户端计数不生效。
微信扫一扫