개발자 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 이상 요금제에 포함됩니다.
출시 예정