开发者 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 及以上套餐提供。
即将推出