开发者 API

无需轮询,我们主动通知你

注册一个 URL 并选择事件。每次变化后几秒内,我们会发送一个签名的 POST 请求,失败时会在 24 小时内持续重试。

事件

rate.updated任意银行的某个汇率发生变化
rate.best_changed最低卖出价或最高买入价发生变化
rate.threshold_crossed汇率越过了你设定的界限
cbe.rate_changed央行汇率发生变化
gold.updated黄金价格发生变化
silver.updated白银价格发生变化
transfer.quotes_updated汇款服务商的价格发生变化
certificate.created有银行推出了新存单
certificate.rate_changed某个存单的收益发生变化
tbill.auction_result国库券拍卖结果
fund.price_updated某只基金的单位净值已更新
status.incident服务故障开始或结束

我们发送的内容

POST https://example.com/geneh
Geneh-Event: rate.best_changed
Geneh-Signature: t=1792118220,v1=5f2b9c1e7a

{
  "id": "evt_01JB7Q2K",
  "type": "rate.best_changed",
  "created_at": "2026-10-16T00:37:00Z",
  "data": {
    "currency": "USD",
    "side": "sell",
    "previous": { "bank": "nbe", "rate": 53.52 },
    "current": { "bank": "credit_agricole", "rate": 53.47 }
  }
}

验证签名

每个请求都使用你的接收地址密钥通过 HMAC SHA-256 签名。请拒绝超过 5 分钟的请求。

import crypto from "node:crypto";

function verify(rawBody, header, secret) {
  const [t, v1] = header.split(",").map(p => p.split("=")[1]);
  const mac = crypto.createHmac("sha256", secret)
    .update(t + "." + rawBody).digest("hex");
  const fresh = Math.abs(Date.now() / 1000 - t) < 300;
  return fresh && crypto.timingSafeEqual(Buffer.from(mac), Buffer.from(v1));
}

投递与重试

超时
请在 10 秒内返回 2xx
重试
24 小时内重试 8 次,间隔逐次拉长
重复事件
同一事件可能送达两次,请用其 id 跳过重复
顺序
顺序不作保证,请比较 created_at
暂停
接收地址连续失败 3 天后我们会将其暂停并发邮件通知你,你可以重新发送错过的事件

你的接收地址

Webhook 即将上线Webhook 开放后,你可以在这里添加接收地址。Pro 及以上套餐提供。
即将推出