웹훅
자체 시스템을 Flash 이벤트에 구독하세요. 관심 있는 이벤트에 대한 HTTPS 엔드포인트를 등록하면 Flash에서 각 이벤트가 발생하는 즉시 서명된 간소화된 페이로드를 전달합니다. 폴링이나 야간 내보내기가 필요 없습니다. 서명은 표준 웹훅 사양을 따르며, 전달 시 백오프를 사용하여 재시도하고 모든 시도가 로그에 기록됩니다.
엔드포인트 등록
웹훅 엔드포인트를 생성합니다. Bearer fl_live_ 열쇠를 쥐고 있는 webhooks:manage 범위. HTTPS를 게시합니다. url 그리고 목록 eventTypes 그곳으로 배송받고 싶은 물건입니다. 응답 내용에 해당하며 다시는 사용하지 마십시오. 안전하게 보관하십시오. 모든 배송을 확인하는 데 필요합니다.
curl -X POST https://flash.socialhub.ai/api/v2/webhooks \
-H "Authorization: Bearer fl_live_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://hooks.your-app.com/flash",
"description": "prod ingest",
"eventTypes": ["member.created", "loyalty.tier_upgraded"]
}'
# 201 Created
# {
# "data": {
# "id": "whe_...",
# "url": "https://hooks.your-app.com/flash",
# "eventTypes": ["member.created", "loyalty.tier_upgraded"],
# "status": "active",
# "secret": "whsec_..." <-- shown ONCE, store it now
# }
# }GET /api/v2/webhooks(목록, 비밀 키 없음), PATCH /api/v2/webhooks/{id}(URL/이벤트/상태 변경 또는 { "action": "rotate_secret" }를 전송하여 비밀 키 롤아웃), DELETE /api/v2/webhooks/{id}를 사용하여 나중에 엔드포인트를 관리할 수 있습니다. 또한 설정 → 웹훅에서 전송을 등록, 테스트 핑 및 재생할 수 있습니다.
이벤트 카탈로그
API에 구독할 수 있는 이벤트를 문의하세요. 이 카탈로그는 실시간 자동화 트리거 소스에서 파생되었으므로 오늘 실제로 발생한 이벤트만 나열합니다. 이러한 이벤트는 라이프사이클 단계(획득, 참여, 충성도, 유지, 상거래, 추천)별로 그룹화되며, 각 이벤트에는 이벤트 키, 설명 및 예시 페이로드가 포함됩니다. 응답에는 공유 페이로드 봉투와 서명 헤더도 기록됩니다.
curl https://flash.socialhub.ai/api/v2/events/catalog \
-H "Authorization: Bearer fl_live_..."
# { "data": { "events": [
# { "event": "member.created", "label": "Member created",
# "stage": "acquisition", "examplePayload": { ... } },
# { "event": "loyalty.tier_upgraded", "label": "Tier upgraded",
# "stage": "loyalty", "examplePayload": { ... } },
# ...
# ],
# "payload": { "schema": { ... }, "headers": { ... } }
# } }구독 시 이벤트의 event 키를 eventTypes array에 바로 넣으세요. webhooks:manage 스코프가 필요합니다.
개인 식별 정보가 포함되지 않은 간편한 페이로드
모든 배송에는 동일한 작은 봉투가 들어 있습니다. id그 행사 type, a created_at timestamp그리고 컴팩트한 data 블록. 페이로드 개인 정보는 절대 포함하지 않습니다. — 이메일, 이름, 전화번호, 주소는 필요하지 않습니다. 회원 정보가 필요할 때는 인증을 통해 다시 가져오세요. API 사용 member_ref이렇게 하면 회원 기록에는 개인 식별 정보(PII)가 유지되고 웹훅 로그에는 기록되지 않습니다.
POST https://hooks.your-app.com/flash
webhook-id: evt_a1b2c3... # stable across retries — dedupe on this
webhook-timestamp: 1767225600 # unix seconds
webhook-signature: v1,K5x0mF...== # base64 HMAC-SHA256 (may be space-separated during rotation)
Content-Type: application/json
{
"id": "evt_a1b2c3...",
"type": "loyalty.tier_upgraded",
"created_at": "2026-01-01T00:00:00.000Z",
"data": {
"resource_id": "mbr_...",
"member_ref": "mbr_...", // opaque member id — fetch PII via the API
"tier": "Gold", // present on loyalty / tier events
"amount_band": "100-500" // coarse band on commerce events — never the exact amount
}
}모든 서명을 검증하세요
Flash는 표준 웹훅(HMAC-SHA256)을 사용하여 엔드포인트의 whsec_ 비밀 키로 각 전송에 서명합니다. {webhook-id}.{webhook-timestamp}.{body}에 대한 서명을 다시 계산하고 상수 시간 내에 webhook-signature 헤더와 비교합니다. 일치하지 않는 모든 항목을 거부하고, 재전송 공격에 대응하기에는 너무 오래된 webhook-timestamp도 거부합니다. 서명 키는 사양에 따라 whsec_ 접두사 뒤에 오는 비밀 키의 base64 디코딩된 바이트입니다. 비밀 키 순환 시 헤더에는 공백으로 구분된 여러 개의 v1,… 값이 포함됩니다. any가 일치하면 전달을 수락하세요.
import crypto from "node:crypto";
// req.body must be the RAW, unparsed request body string.
function verifyFlashWebhook(headers, rawBody, whsec) {
const id = headers["webhook-id"];
const ts = headers["webhook-timestamp"];
const sigHeader = headers["webhook-signature"]; // "v1,<b64> v1,<b64> ..."
// reject stale deliveries (5 min tolerance)
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const key = Buffer.from(whsec.replace(/^whsec_/, ""), "base64");
const expected = crypto
.createHmac("sha256", key)
.update(`${id}.${ts}.${rawBody}`)
.digest("base64");
return sigHeader
.split(" ")
.map((p) => p.split(",")[1])
.some((sig) =>
sig &&
sig.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected)),
);
}재시도, 멱등성 및 전달 로그
2xx를 빠르게 반환하세요
2xx로 승인하고 비동기적으로 작업을 수행합니다. 429, 5xx, 타임아웃 또는 연결 오류는 재시도 가능한 것으로 처리됩니다.
백오프 기능이 있는 자동 재시도
재시도 가능한 오류는 지수 함수 기반의 전체 지터 백오프 방식으로 재시도됩니다. 3xx 또는 429가 아닌 4xx 오류는 영구적인 오류로 간주되어 재시도되지 않습니다.
webhook-id에 의한 중복 제거
id은 재시도 시마다 동일하므로 최소 한 번 전달이 안전합니다. 반복되는 webhook-id은 이미 처리된 것으로 간주합니다.
배송 기록 및 재생
모든 시도는 기록됩니다. 재시도 횟수가 모두 소진되면 배송은 실패로 표시됩니다. 설정 → 웹훅에서 배송 내역을 확인하고 다시 재생할 수 있습니다.