Guide/Stack Overflow 上的汇率 API

Stack Overflow 上的汇率 API:开发者常见报错,逐一解答

开发者在 Stack Overflow 上遇到的外汇 API 报错,逐一解决:401 认证错误、429 限流、浏览器端 CORS 错误、周末汇率不更新、如何换算金额,以及如何获取历史或时间序列数据。

ERexchangerate.dev·Jun 30, 2026·6 分钟阅读

集成出错时,开发者会把报错粘到 Stack Overflow。对于汇率 API,问题几乎总是那几类:密钥被拒、触达限流上限、CORS 错误,或者周末汇率看起来没有变化。以下是直接的解决方案,以 exchangerate.dev 为实例。每段代码片段都是针对 https://api.exchangerate.dev 的真实调用。

Key points
401 错误几乎总是因为缺少 Bearer 前缀,或者密钥因复制粘贴而带入了多余的换行符。
在触发上限前跟踪 X-RateLimit-Remaining。收到 429 时读取 X-RateLimit-ScopeRetry-After
允许浏览器匿名调用。绝不要把账户密钥放进前端 JavaScript。
每条响应中的 sourcemarket_session 会告诉你汇率为何没有变动。

基础 URL 为 https://api.exchangerate.dev。首次调用可匿名进行(按 IP 限速),因此你可以在注册免费密钥之前重现以下任意示例。

401 Unauthorized——密钥被拒

密钥需放入 Authorization 请求头,以 Bearer Token 形式传递,且必须有 Bearer 加一个空格。密钥前缀为 exr_live_

curl · authenticatedcopy
curl https://api.exchangerate.dev/v1/latest/USD \
  -H "Authorization: Bearer exr_live_YOUR_KEY"

401 的常见原因:缺少 Bearer 前缀、复制粘贴时密钥带入了多余的换行符或引号,或者持有密钥的环境变量未加载。对于无法设置 Authorization 头的平台,也可以使用 X-API-Key 请求头传递密钥。

429 Too Many Requests——处理限流

成功且计入用量的响应会携带 X-RateLimit-Remaining。429 会返回 Retry-After,请等待指定时间后再重试。X-RateLimit-Scope 会说明触发的是每分钟上限、匿名访问每小时上限,还是每月配额。免费套餐每分钟 12 个请求,基础版 120 个,专业版 500 个。账户的剩余配额和每月重置时间可通过 GET /v1/account 查看。

CORS 错误——从浏览器调用 API

CORS 允许匿名读取,也允许 AuthorizationX-API-Key 请求头。但这不会让带密钥的浏览器请求保密:任何打开开发者工具的人都能复制 exr_live_...。公开演示可使用匿名调用;要使用账户配额,请通过自己的后端转发,并将密钥留在服务端。

javascript · your backend routecopy
// the key never reaches the browser
const r = await fetch("https://api.exchangerate.dev/v1/latest/USD", {
  headers: { Authorization: `Bearer ${process.env.EXCHANGERATE_API_KEY}` },
});
const data = await r.json();

如何安全缓存汇率?

缓存完整的成功观测值,把汇率、sourcemarket_sessiondata_updated_at 一起保存。对活跃货币对,可先在服务端缓存 60 秒。这样能减少重复调用,但不会让每日参考汇率变得更新。

  • 把多种货币合并到一个 symbols 请求中,不要为每个货币对单独发起 HTTP 调用。
  • 只缓存成功的 2xx 响应。不要把 401、429 或上游错误当作汇率保存。
  • 收到 429 时使用 Retry-AfterX-RateLimit-Scope,不要自行设定固定等待时间。
  • 账户密钥只放在服务端配置中,绝不要放进公开的浏览器缓存或前端包。

汇率看起来没有变化,或周末不更新

这是预期行为,响应本身会告诉你原因。交易活跃的货币会实时刷新(交易日约每 60 秒更新一次);当前覆盖范围由 API 直接报告,而不是固定的宣传数字,其余货币使用 ECB 和 FRED 的每日参考汇率。周末银行间市场休市,实时推送暂停,每日参考定盘价沿用周五数据。以下两个字段对此有明确说明:

字段值含义更新时机
source: live聚合即期共识价盘中(约 60 秒),交易周内
source: ecb_daily官方参考定盘价每个交易日一次
market_session: weekend银行间市场已关闭实时推送暂停;参考价沿用周五数据

如何换算金额,而不只是读取汇率?

使用 /v1/convert/{from}/{to}/{amount}。它会同时返回汇率和换算后的金额,无需手动相乘:

curl · convert 100 USD to EURcopy
curl https://api.exchangerate.dev/v1/convert/USD/EUR/100 \
  -H "Authorization: Bearer exr_live_YOUR_KEY"

如何获取历史或时间序列数据?

查询某个历史日期,只需在路径中指定日期:GET /v1/{YYYY-MM-DD}/{base},历史数据最早可追溯至 1999-01-04。如需一次性获取某个日期范围的完整序列,使用 GET /v1/range 并传入 start_dateend_date;该接口采用键集分页,请跟随游标翻页,不要一次请求过大的时间范围。

从其他外汇 API 迁移时遇到报错?

请求参数遵循常见的外汇 API 惯例(基础货币加上 symbols 过滤参数),因此大多数迁移只需更换基础 URL,无需重写代码。响应格式的差异在于,本 API 会新增字段(sourcemarket_sessionnotice)而非删除字段——如果你的响应解析代码假设了固定的字段集合,请检查一下。

最简单的可用调用

无需密钥,无需依赖:

curl · no keycopy
curl https://api.exchangerate.dev/v1/latest/USD

你将获得汇率数据,以及 sourcemarket_session,让你清楚每条数据的新鲜程度。申请免费密钥 可将限额提升至每月 10,000 次调用,注册只需一分钟。

指示性数据,不用于结算
汇率仅供参考、分析和展示,不是可执行报价,不得用于结算交易。在对外发布的产品中展示汇率需要 Basic 或 Pro 套餐;免费版仅供内部使用。
ER
exchangerate.dev
面向开发者的集成指南。

Keep reading

GuideReddit 上的汇率 API:开发者常见问题解答Read Comparison免费汇率 API 横向比较Read
更多比较Fixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
学习Reading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youECB reference rates, explained
实时汇率EUR/USDGBP/USDUSD/JPY