開発者向け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回、毎回間隔を広げて再試行します
重複
同じイベントが2回届くことがあるので、idを使って重複を除いてください
順序
順序は保証されないため、created_atで比較してください
一時停止
3日間失敗が続くとエンドポイントを一時停止してメールでお知らせします。届かなかった分は再送できます

あなたのエンドポイント

Webhookはまもなく登場Webhookの公開後、ここでエンドポイントを追加できます。Pro以上のプランで利用できます。
近日公開