개발자 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일 동안 실패가 이어지면 엔드포인트를 일시 중지하고 이메일로 알려 드리며, 놓친 이벤트는 다시 받을 수 있습니다
내 엔드포인트
웹훅이 곧 출시됩니다웹훅이 열리면 여기에서 엔드포인트를 추가할 수 있습니다. Pro 이상 요금제에 포함됩니다.
출시 예정