Walaora API 레퍼런스
POS, 온라인 스토어 또는 내부 시스템을 연결하세요. HTTPS 기반 JSON, 연동마다 API 키 하나를 사용합니다.
인증
대시보드 → API 및 Webhooks에서 키를 생성하세요(비즈니스 또는 엔터프라이즈 요금제). 모든 요청에 키를 함께 보내세요. 키는 한 번만 표시되며, 노출된 경우 폐기하세요. 제한: 키당 분당 120회 요청.
Authorization: Bearer wl_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx엔드포인트
Base URL: https://walaora.com/api/v1
| GET | /programs멤버십 프로그램 목록을 조회합니다. |
| GET | /customers?phone=0551234567&tag=vip고객을 검색합니다(페이지당 50명, ?page=2…). ?tag=vip는 해당 태그가 있는 고객을 나열하며, 각 고객에 태그가 포함됩니다. |
| POST | /customers고객을 프로그램에 가입시킵니다. 본문: { programId, name, phone, email?, marketingConsent?, locale? }. 새로 생성되면 201, 이미 가입되어 있으면 200을 반환합니다. |
| GET | /cards/{serial}고객 카드 / QR에 있는 코드로 카드를 조회합니다. |
| POST | /cards/{serial}/earn스탬프 프로그램: { stamps?: 1–10 }. 포인트 프로그램: 워크스페이스 통화 기준 { amount }. 선택 사항 { branchId }. 멀티 스탬프 카드: 카드 세트 중 하나의 setId를 보내세요. |
| POST | /cards/{serial}/redeem사용 가능한 리워드 하나를 사용하거나, {"rewardId"}를 보내 스탬프/포인트로 가격이 매겨진 카탈로그 리워드를 사용합니다. |
| POST | /cards/{serial}/sell선불 패키지: 패키지를 판매하고 횟수를 카드에 추가해요(결제는 매장 카운터에서). Webhook: package.sold. |
| POST | /cards/{serial}/use선불 패키지: 1회를 차감해요(남은 횟수가 없거나 만료되면 거부). 직원 카드: 하루 한도 안에서 혜택을 기록해요. Webhooks: package.used, perk.used. |
| GET | /coupons/{code}쿠폰을 사용하지 않고 확인해요: 오퍼, 사용 가능 여부, 사용할 수 없다면 그 이유(사용됨, 만료, 일시 중지). |
| POST | /coupons/{code}/redeem쿠폰을 한 번 사용해요. 선택 사항으로 { amount }(판매 금액, 워크스페이스 통화)와 { branchId }. 이미 사용되었거나 오퍼가 종료되면 409. Webhook: coupon.redeemed. |
| GET | /coupon-offers쿠폰 오퍼 목록: 값, 종료일, 지금 코드를 만들 수 있는지(usable). |
| POST | /coupon-offers/{id}/coupons오퍼의 코드를 만듭니다. { customerId }는 해당 고객에게 코드 1개를 줍니다(고객의 카드 페이지에 표시). 또는 { count: 1–500 }으로 인쇄하거나 공유할 고객 미지정 코드를 만듭니다. 코드와 함께 201, 오퍼가 일시 중지되었거나 종료되면 409. |
curl -X POST https://walaora.com/api/v1/cards/ABCDE23456/earn \
-H "Authorization: Bearer wl_live_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: receipt-10045" \
-d '{"stamps": 1}'재시도 및 멱등성
POST 요청에는 Idempotency-Key 헤더(영수증 번호 등 고유한 문자열)를 보내세요. 24시간 이내에 같은 키로 재시도하면 스탬프가 두 번 적립되지 않고 원래 응답이 반환됩니다.
오류
오류는 HTTP 상태 코드와 함께 JSON 본문 { error: { code, message } }을 반환합니다: 401 잘못된 키 · 403 plan_required · 404 찾을 수 없음 · 409 cooldown / no_reward / program_inactive · 422 유효성 검사 실패 · 429 요청 한도 초과.
Webhooks
대시보드에서 HTTPS 엔드포인트를 추가하고 이벤트를 선택하세요. 각 전송은 JSON { id, type, createdAt, data }을 담은 POST 요청이며 Walaora-Event, Walaora-Delivery, Walaora-Signature 헤더가 포함됩니다. 10초 이내에 2xx로 응답하세요. 실패한 전송은 1분, 5분, 30분, 2시간, 12시간 후에 재시도됩니다.
이벤트
customer.enrolledcard.earnedreward.unlockedreward.redeemedcard.adjustedcustomer.deletedfeedback.receivedpackage.soldpackage.usedperk.usedcoupon.redeemed
서명 검증(Node.js)
import crypto from "node:crypto";
// rawBody: the exact request body string; header: req.headers["walaora-signature"]
export function verifyWalaora(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const t = Number(parts.t);
if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false; // replay window
const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1 ?? ""));
}