一个固定地址 + 一个密码,直接调 Schwab 官方接口。token 由本服务托管并自动续期。
README.md 拿到密码。X-API-Key 请求头)。/api/ 后面的路径,原样换成 Schwab 官方文档里的路径。README.md 中,在本页下方的自测框里输入一次,浏览器会替你记住。当前地址:https://schwab-proxy.365200.xyz 回调:/callback
三种都支持,推荐第一种:
| 方式 | 写法 | 备注 |
|---|---|---|
| 请求头 | X-API-Key: <密码> | 推荐,无转义问题 |
| Bearer | Authorization: Bearer <密码> | 和官方风格一致 |
| 查询参数 | ?api_key=<密码> | 必须 URL 编码,见下 |
& + % 等字符,不编码时 & 会被当成参数分隔符、把密码截断(历史踩坑)。当前密码是纯字母数字,暂不受影响;换密码时若含特殊字符,请把密码做 URL 编码后再放进 ?api_key=。左边是官方路径,右边是经本代理的写法。前缀 /api 后的路径会原样转发(版本号 /v1 自动补全)。
| 用途 | 调用 |
|---|---|
| 账户与持仓 | GET /api/trader/accounts?fields=positions |
| 单账户详情 | GET /api/trader/accounts/{accountHash} |
| 订单列表 | GET /api/trader/accounts/{accountHash}/orders |
| 下单 / 撤单 | POST|DELETE /api/trader/accounts/{accountHash}/orders |
| 交易者信息 | GET /api/trader/userPreference |
| 实时报价 | GET /api/marketdata/quotes?symbols=AAPL,MSFT |
| 历史K线 | GET /api/marketdata/pricehistory?symbol=AAPL&periodType=day |
| 期权链 | GET /api/marketdata/chains?symbol=AAPL |
| 行情快照 | GET /api/marketdata/AAPL?fields=quote,fundamental |
完整清单见 Schwab 开发者文档。
BASE='https://schwab-proxy.365200.xyz'
KEY='<密码>'
curl -H "X-API-Key: $KEY" "$BASE/api/trader/accounts?fields=positions"
curl -H "X-API-Key: $KEY" "$BASE/api/marketdata/quotes?symbols=AAPL"import requests
BASE = "https://schwab-proxy.365200.xyz"
HEAD = {"X-API-Key": "<密码>"}
r = requests.get(BASE + "/api/marketdata/quotes",
params={"symbols": "AAPL"}, headers=HEAD)
r.raise_for_status()
print(r.json())const BASE = "https://schwab-proxy.365200.xyz";
const HEAD = { "X-API-Key": "<密码>" };
const r = await fetch(BASE + "/api/marketdata/quotes?symbols=AAPL", { headers: HEAD });
console.log(await r.json());| 端点 | 作用 | 需密码 |
|---|---|---|
GET / | 本手册页 | 否 |
GET /login | 跳转 Schwab 授权 | 否 |
GET /health | 健康检查 | 否 |
GET /api/token | 查看 token 剩余有效期 | 是 |
POST /api/refresh | 强制立即刷新 | 是 |
密码填在这里,只存进你自己浏览器的 localStorage,页面源码里不含明文。
等待测试…| 现象 | 原因与处理 |
|---|---|
401 unauthorized | 密码错或没带。检查 X-API-Key 头;用查询参数时确认已 URL 编码。 |
500 尚未授权 | token 没换到。打开 /login 走一遍授权。 |
Schwab 返回 404 | 路径拼错。核对官方文档的完整路径与参数名。 |
Schwab 返回 429 | 触发限频。稍后重试,官方限额 120 次/分钟。 |
| 浏览器 302 跳 cloudflareaccess.com | 该域名被 Cloudflare Access 圈住了,删掉对应 Access 应用即可。 |
redirect_uri mismatch | 授权页报这个,说明你点 /login 所在域名与 Schwab 后台登记的回调地址不一致。改在登记的那个域名上点授权即可(本服务的 redirect_uri 会自动跟随当前域名)。 |
curl 报 000 超时 | 只发生在旧地址 *.workers.dev(解析到 199.16.156.75,本机直连不通)。改用正式域名 schwab-proxy.365200.xyz 即可直连;若坚持用旧地址,需加 --proxy http://127.0.0.1:7897。 |
正常情况下永远不需要手动重新授权。Schwab 的刷新令牌 7 天滚动有效 —— 每次刷新都会下发新令牌并把有效期重置回 7 天;本服务每 2 天自动刷新一次,7 天窗口内有 3 次重试机会。
只有这三种情况需要重做授权:连续 7 天刷新全失败、你改了 Schwab 密码、或撤销了本应用的第三方授权。本页顶部的徽章与告警会实时反映刷新健康度。
重新授权时,请在「Schwab 后台登记了回调地址的那个域名」上打开 /login;本服务的回调地址会自动跟随当前域名,因此两个域名都能用,只要别交叉着用就行。
| 项 | 说明 |
|---|---|
| client_secret | 存在 Worker 加密 Secret,不在代码与 KV 中 |
| 密码比对 | 恒定时间算法,防时序侧信道 |
| 本页是否暴露密码 | 否。本页免鉴权、公开可见,但正文与源码都不含密码明文;自测框里填的值只存于你自己的浏览器 localStorage |
cd C:/Users/a4487/WorkBuddy/schwab-proxy
printf '%s' '新密码' | npx wrangler@3 secret put PROXY_PASSWORDcd C:/Users/a4487/WorkBuddy/schwab-proxy
export CLOUDFLARE_API_TOKEN=<token> CLOUDFLARE_ACCOUNT_ID=8e43ef2043266e0898cf9e02ca53df2f
npx wrangler@3 tail源码与完整文档:C:\Users\a4487\WorkBuddy\schwab-proxy · 自检脚本 bash smoke.sh