Guide/Stack Overflow 上的汇率 API
Guide

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

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

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

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

Key points
401 错误几乎总是因为缺少 Bearer 前缀,或者密钥因复制粘贴而带入了多余的换行符。
读取 X-RateLimit-Remaining 并在归零前降速;免费套餐每分钟限 12 个请求。
永远不要在前端 JS 中携带你的密钥直接调用 API——通过你的后端代理转发。
每条响应中的 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。读取它并在归零前主动降速,而不是盲目轮询。免费套餐每分钟 12 个请求,基础版 120 个,专业版 500 个。你可以随时通过 GET /v1/account 查看剩余配额和每月重置时间。参考汇率不会每秒变化,因此客户端短暂缓存通常就能让你轻松控制在限额以内。

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

不要在前端 JavaScript 中携带你的密钥直接调用 API:这会将 exr_live_... 暴露给任何打开开发者工具的人,浏览器也会因 CORS 拦截请求。应通过你自己的后端代理转发调用,将密钥保留在服务端,让浏览器请求你的接口。

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();

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

这是预期行为,响应本身会告诉你原因。16 种货币实时刷新(交易日约每 60 秒更新一次);其余为来自 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;该接口采用键集分页,请跟随游标翻页,不要一次请求过大的时间范围。

从 Frankfurter 迁移时遇到报错?

请求参数与 Frankfurter 兼容,因此大多数迁移只需更换基础 URL,无需重写代码。响应格式的差异在于,本 API 会新增字段(sourcemarket_sessionnotice)而非删除字段。从 Frankfurter 迁移指南 提供了详细的字段映射。

最简单的可用调用

无需密钥,无需依赖:

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

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

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

Keep reading

GuideReddit 上的汇率 API:开发者常见问题解答Read Comparison免费汇率 API 横向比较Read Guide从 Frankfurter 迁移,无需重写代码Read