APIFuseAPIFuseDocs

Getting started

  • 개요
  • 빠른 시작

Authentication

  • Managed key
  • Scope

Errors

  • 에러 모델
  • 재시도

Webhooks

  • 개요
  • 서명 검증

API reference

  • 아마존 재팬
  • 배달의민족 프로바이더
  • 빗썸
  • Buyee
  • 캐치테이블 음식점 검색 및 예약
  • 차란 커머스
  • 당근 공개 매물
  • 다이소 상품 및 매장 데이터
  • 다나와 가격 비교
  • Demaecan
  • 에키탄
  • 여기어때 국내 숙소
  • Google Flights
  • 한강 수위
  • 핫페퍼 구루메(Hot Pepper Gourmet) 프로바이더
  • 현대카드
  • 인천공항 여객편 운항현황
  • Jalan
  • 일본 국회 회의록
  • 일본 재난 알림
  • 일본 EDINET 공시 서류
  • 일본 e-Gov 법령
  • 일본 e-Stat
  • 일본 gBizINFO (경제산업성 법인정보)
  • 일본 GSI 지오코딩
  • 일본 e-Gov 오픈데이터
  • Japan Post ZIP
  • 일본 공휴일
  • JMA Weather
  • 카카오맵 장소 검색과 길찾기
  • 카카오 T 택시 호출
  • 카카오톡 네이티브 메시징
  • 한국 주소 검색
  • AirKorea 실시간 대기오염 정보
  • 전국 동물병원
  • 한국 아파트 전월세 실거래가
  • 한국 아파트 매매 실거래가
  • 나라장터 입찰공고
  • 한국 박스오피스
  • 건축물대장 (Korea Building Register)
  • 전국 버스 도착정보
  • Korea Business Verify
  • 대한민국 캠핑장
  • 한국 DART 기업 재무정보
  • DART 기업 정보
  • 한국 문화행사(한눈에 보는 문화정보)
  • 한국 재난 알림
  • 한국 응급의료기관
  • 한국 ETF
  • 한국 전기차 충전소
  • 한국 환율 (한국수출입은행)
  • 한국 고속도로 교통
  • 금융상품 비교공시 (금융감독원 금융상품한눈에)
  • 한국 주유소 유가
  • 국가유산 정보 (국가유산청)
  • Korea Holiday
  • Korea Hospital Info
  • 전국 고속·시외버스 시간표
  • 한국 토지 매매 실거래가
  • 식약처 의약품 안전정보
  • 식약처 식품 안전 정보
  • 생활쓰레기 배출정보
  • 국가법령정보 검색·조회
  • NEIS 학교 급식 식단
  • 배송사 목록 및 택배 배송 조회
  • 전국 주차장
  • 공연예술 정보 (KOPIS)
  • Korea Pharmacy
  • 한국 인구 통계
  • 한국 주식시장지수
  • 한국 주식 시세
  • 전국 상가업소 정보
  • 한국 유기동물 (국가동물보호정보시스템)
  • 한국 관광정보 (한국관광공사)
  • 한국 열차 시간표
  • 한국 기상청 예보 데이터
  • Korea Weather Forecast
  • 대한민국 복지서비스
  • K-Startup
  • LH 청약 공고
  • 마켓컬리 상품 데이터
  • Mercari
  • 모두의주차장
  • 네이버 블로그 검색
  • 네이버 항공권 API
  • 네이버 지역 검색
  • 네이버 지도
  • 네이버 뉴스 검색
  • NHK 편성표
  • NOL 숙소
  • 오늘의집 스토어 및 콘텐츠
  • 라쿠텐 북스
  • 라쿠텐 이치바
  • 라쿠텐 레시피
  • 라쿠텐 트래블
  • SEC EDGAR Filings
  • 서울 따릉이
  • 서울 실시간 혼잡도
  • 서울 지하철 실시간 도착
  • 신한은행
  • 신한카드
  • Skiplagged
  • Steam 스토어
  • SUUMO
  • 스윙 택시
  • Tabelog
  • TableCheck
  • 업비트
  • Visit Japan Web (일본 입국 수속 서비스)
  • Weverse 프로바이더
  • 야후! 쇼핑 (일본)
  • Yogiyo
  • ZOZOTOWN

Guides

  • APIFuse 문서
  • 시작하기
  • 인증과 connection
  • 플레이그라운드
  • OpenAPI와 스키마 아티팩트
  • MCP 엔드포인트
  • 개발자 MCP 가이드
  • 스키마 번들과 변환 경고
  • Next.js App Router 연동
  • FastAPI 연동
  • 에러 처리
  • 자주 묻는 질문
  • 추가 리소스

Changelog

  • 체인지로그
APIFuseAPIFuse
문서서비스플레이그라운드상태
로그인회원가입

Webhooks

개요

예약 확정, 배달 상태 변경 같은 이벤트를 webhook으로 수신합니다.

예약이 생성 시점에 항상 확정되는 것은 아닙니다. Create reservation은 매장이 즉시 승인하면 confirmed, 매장 승인이 필요하면 pending 상태로 응답하고, 그 이후의 확정이나 취소는 매장 사정에 따라 몇 분에서 몇 시간 뒤에 일어납니다. 이 변화를 Get reservation 폴링으로 쫓아가면 호출 수만 늘고 반영은 늦어집니다. webhook은 방향을 뒤집습니다. 상태가 바뀌는 순간 APIFuse이 등록된 endpoint로 이벤트를 전송합니다.

같은 원리가 카탈로그 전체에 적용됩니다. 배달 주문은 조리와 배차 상태를 거치고, 결제는 비동기로 승인되며, 차량 위치는 이동 중에 계속 바뀝니다. 이 모든 변화가 하나의 envelope 형식으로, 같은 방식으로 서명되어 푸시됩니다.

Endpoint 등록

APIFuse 콘솔에서 HTTPS endpoint 하나를 등록하고 구독할 이벤트 타입을 선택합니다. 계정의 모든 구독 이벤트가 이 endpoint 하나로 들어오므로, 서비스마다 URL을 나누는 대신 body의 type 필드로 분기합니다. 등록이 완료되면 콘솔이 endpoint secret을 한 번만 표시합니다. whsec_ 접두사로 시작하는 이 값은 서명 검증에 쓰이므로, managed key와 같은 secret 저장소에 보관합니다.

endpoint secret은 등록 직후 한 번만 표시되고 다시 조회할 수 없습니다. 잃어버렸다면 콘솔에서 새 secret을 발급하고 검증 코드를 갱신합니다.

이벤트 envelope

모든 전달은 JSON body를 가진 POST 요청이며, body는 항상 같은 모양입니다.

reservation.confirmed 이벤트
{
  "id": "evt_01J8QH5R7T",
  "type": "reservation.confirmed",
  "created_at": "2026-09-01T10:15:27Z",
  "data": {
    "object": {
      "id": "rsv_01J8QDGT2K",
      "status": "confirmed",
      "restaurant_id": "res_01J8Q9W3TE",
      "starts_at": "2026-09-02T19:00:00+09:00",
      "party_size": 2
    }
  }
}

data.object는 API가 반환하는 리소스와 정확히 같은 모양입니다. reservation.confirmed의 object는 Get reservation이 반환하는 예약 객체와 필드 단위로 동일하며, 스키마는 Catch Table 레퍼런스에 문서화되어 있습니다. 이벤트를 받은 뒤 리소스를 다시 조회할 필요가 없습니다.

이벤트 이름

이벤트 타입은 <domain>.<event> 규칙을 따릅니다. domain은 서비스가 아니라 리소스를 가리키므로, Catch Table의 reservation.confirmed와 Tabelog의 reservation.confirmed는 같은 envelope 구조를 공유합니다. 대표 이벤트는 다음과 같습니다.

이벤트발생 시점관련 서비스
reservation.confirmed매장이 예약을 확정했을 때, tabelog
reservation.cancelled매장 또는 호출자가 예약을 취소했을 때, tabelog
waitlist.called대기열의 일행이 입장 호출을 받았을 때
order.updated배달 주문 상태가 바뀌었을 때baemin
payment.approved결제가 승인되었을 때toss-pay
ride.updated호출한 차량의 상태가 바뀌었을 때kakao-t

전달 보장, 재시도, 중복 제거

  • at-least-once: 같은 이벤트가 두 번 이상 도착할 수 있습니다. 재전송 시에도 값이 유지되는 Frism-Event-Id 헤더로 중복을 걸러냅니다.
  • 재시도: 2xx가 아닌 응답과 타임아웃은 backoff와 함께 24시간 동안 재시도됩니다. 과 같은 원리를 APIFuse이 반대 방향으로 수행하는 셈입니다.
  • 빠른 응답: 실제 처리를 시작하기 전에 2xx부터 반환합니다. 핸들러가 느리면 타임아웃으로 간주되어 같은 이벤트가 다시 전달됩니다.
빠르게 응답하고 나중에 처리하는 핸들러
const seenEventIds = new Set<string>();
const queue: unknown[] = [];

export async function handleFrismEvent(request: Request): Promise<Response> {
  const rawBody = await request.text();
  // 1. 서명 검증이 항상 먼저입니다. 검증 코드는 서명 검증 가이드에 있습니다.

  // 2. Frism-Event-Id로 중복을 걸러냅니다. 전달은 at-least-once입니다.
  const eventId = request.headers.get("Frism-Event-Id");
  if (eventId === null) return new Response(null, { status: 400 });
  if (seenEventIds.has(eventId)) return new Response(null, { status: 200 });
  seenEventIds.add(eventId);

  // 3. 큐에 적재만 하고 바로 2xx를 반환합니다. 무거운 처리는 워커가 맡습니다.
  queue.push(JSON.parse(rawBody));
  return new Response(null, { status: 200 });
}
예시의 Set은 프로세스 메모리라서 재시작하면 사라집니다. 운영 환경에서는 Frism-Event-Id를 영속 저장소에 기록해 중복을 걸러냅니다.

위 envelope 예시를 파일로 저장하면 핸들러를 로컬에서 미리 연습해 볼 수 있습니다.

로컬 endpoint로 전달 시뮬레이션
# 서명 값을 실제로 계산하는 방법은 서명 검증 가이드의 로컬 테스트 예시를 참고합니다.
curl -X POST http://localhost:3000/webhooks/frism \
  -H "Content-Type: application/json" \
  -H "Frism-Event-Id: evt_01J8QH5R7T" \
  -H "Frism-Signature: t=1788257727,v2=d7e16839f487db479fa277fb11c2d6139225ea837c672df8a68e0452fd7ea772" \
  --data @reservation-confirmed.json

다음 단계: 서명 검증

지금까지의 내용은 요청이 정말 APIFuse에서 왔다는 전제 위에 서 있습니다. 그 전제는 모든 payload의 할 때만 성립하므로, endpoint를 배포하기 전에 서명 검증 가이드를 먼저 읽습니다. 첫 이벤트를 만들어 볼 호출이 필요하다면 의 예약 생성 흐름이 적당합니다.

catch-table
catch-table
catch-table
클라이언트 재시도 규칙
서명을 검증
빠른 시작