Walaora API リファレンス
POS、EC ストア、社内システムと連携できます。HTTPS 上の JSON で、連携ごとに API キーを 1 つ使用します。
認証
ダッシュボード →「API と Webhooks」でキーを作成します(ビジネスまたはエンタープライズプラン)。すべてのリクエストでキーを送信してください。キーは一度だけ表示されます。漏えいした場合は無効化してください。上限:キーごとに毎分 120 リクエストです。
Authorization: Bearer wl_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxエンドポイント
Base URL: https://walaora.com/api/v1
| GET | /programsポイントプログラムの一覧を取得します。 |
| GET | /customers?phone=0551234567&tag=vip顧客を検索します(1 ページ 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利用可能な特典を 1 つ交換します。または {"rewardId"} を送信して、スタンプ / ポイントで価格設定されたカタログ特典を交換します。 |
| POST | /cards/{serial}/sell回数券:回数券を販売し、回数をカードに追加します(支払いはお店のレジで)。Webhook:package.sold |
| POST | /cards/{serial}/use回数券:1回分を使います(残りがない・期限切れの場合は拒否)。スタッフカード:1日の上限内で特典を記録します。Webhook:package.used、perk.used |
| GET | /coupons/{code}クーポンを使わずに確認します:オファー内容、使用できるかどうか、使用できない場合はその理由(使用済み・期限切れ・一時停止中)。 |
| POST | /coupons/{code}/redeemクーポンを1回使用します。任意で { 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 時間以内に同じキーで再試行すると、スタンプを二重に付与せず、元のレスポンスを返します。
エラー
エラー時は JSON 本文 { error: { code, message } } と HTTP ステータスを返します: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 ?? ""));
}