メインコンテンツへスキップ
有効または保留中のサブスクリプションをキャンセルします。動作は現在のサブスクリプションステータスによって異なります。
POST /v1/actions/subscription-order/cancel-order
認証: API Key(merchant、owner ロール)
このエンドポイントには customer 側の session-token フローもあります:サブスクリプションのキャンセル(Customer) を参照。

キャンセル動作

現在のステータスアクション結果ステータス
pending即時キャンセルcanceled
active期間終了時にキャンセル(PSP 経由)canceling -> 期間終了時に canceled
  • pending: 直接キャンセルされ、ステータスは canceled になります
  • active: PSP キャンセルがトリガーされます(請求期間の終了時に有効)。ローカルステータスは canceling になり、期間終了時に Webhook 経由で canceled に更新されます

リクエストボディ

フィールド必須説明
orderIdstringYesサブスクリプション注文 ID(Short ID フォーマット ORD_xxx

リクエスト例

import { WaffoPancake } from "@waffo/pancake-ts";

const client = new WaffoPancake({
  merchantId: process.env.WAFFO_MERCHANT_ID!,
  privateKey: process.env.WAFFO_PRIVATE_KEY!,
});

const result = await client.orders.cancelSubscription({
  orderId: "ORD_2aUyqjCzEIiEcYMKj7TZtw",
});

console.log(result.orderId); // "ORD_2aUyqjCzEIiEcYMKj7TZtw"
console.log(result.status);  // "canceling" or "canceled"
// Assumes callApi() is defined as shown in the Authentication guide
const result = await callApi("POST", "/v1/actions/subscription-order/cancel-order", {
  orderId: "ORD_2aUyqjCzEIiEcYMKj7TZtw",
});
// Assumes callApi() is defined as shown in the Authentication guide
String result = callApi("POST", "/v1/actions/subscription-order/cancel-order",
    "{\"orderId\":\"ORD_2aUyqjCzEIiEcYMKj7TZtw\"}");
# Assumes call_api() is defined as shown in the Authentication guide
result = call_api("POST", "/v1/actions/subscription-order/cancel-order", {
    "orderId": "ORD_2aUyqjCzEIiEcYMKj7TZtw",
})
// Assumes callAPI() is defined as shown in the Authentication guide
result, err := callAPI("POST", "/v1/actions/subscription-order/cancel-order",
    `{"orderId":"ORD_2aUyqjCzEIiEcYMKj7TZtw"}`)
// Assumes call_api() is defined as shown in the Authentication guide
let result = call_api("POST", "/v1/actions/subscription-order/cancel-order",
    r#"{"orderId":"ORD_2aUyqjCzEIiEcYMKj7TZtw"}"#
).await?;
// Assumes call_api() is defined as shown in the Authentication guide
call_api("/v1/actions/subscription-order/cancel-order",
    "{\"orderId\":\"ORD_2aUyqjCzEIiEcYMKj7TZtw\"}");
// Assumes call_api() is defined as shown in the Authentication guide
auto result = call_api("/v1/actions/subscription-order/cancel-order",
    R"({"orderId":"ORD_2aUyqjCzEIiEcYMKj7TZtw"})");
MERCHANT_ID="MER_2aUyqjCzEIiEcYMKj7TZtw"
TIMESTAMP=$(date +%s)
BODY='{"orderId":"ORD_2aUyqjCzEIiEcYMKj7TZtw"}'
BODY_HASH=$(echo -n "$BODY" | openssl dgst -sha256 -binary | base64 -w 0)
CANONICAL="POST
/v1/actions/subscription-order/cancel-order
$TIMESTAMP
$BODY_HASH"

SIGNATURE=$(echo -n "$CANONICAL" | openssl dgst -sha256 -sign private_key.pem | base64 -w 0)

curl -X POST "https://api.waffo.ai/v1/actions/subscription-order/cancel-order" \
  -H "Content-Type: application/json" \
  -H "X-Merchant-Id: $MERCHANT_ID" \
  -H "X-Timestamp: $TIMESTAMP" \
  -H "X-Signature: $SIGNATURE" \
  -d "$BODY"
MERCHANT_ID="MER_2aUyqjCzEIiEcYMKj7TZtw"
TIMESTAMP=$(date +%s)
BODY='{"orderId":"ORD_2aUyqjCzEIiEcYMKj7TZtw"}'
BODY_HASH=$(echo -n "$BODY" | openssl dgst -sha256 -binary | base64 -w 0)
CANONICAL="POST
/v1/actions/subscription-order/cancel-order
$TIMESTAMP
$BODY_HASH"

SIGNATURE=$(echo -n "$CANONICAL" | openssl dgst -sha256 -sign private_key.pem | base64 -w 0)

wget -qO- --post-data="$BODY" \
  --header="Content-Type: application/json" \
  --header="X-Merchant-Id: $MERCHANT_ID" \
  --header="X-Timestamp: $TIMESTAMP" \
  --header="X-Signature: $SIGNATURE" \
  "https://api.waffo.ai/v1/actions/subscription-order/cancel-order"

成功レスポンス (200) — 有効なサブスクリプション

{
  "data": {
    "orderId": "ORD_2aUyqjCzEIiEcYMKj7TZtw",
    "status": "canceling"
  }
}

成功レスポンス (200) — 保留中のサブスクリプション

{
  "data": {
    "orderId": "ORD_2aUyqjCzEIiEcYMKj7TZtw",
    "status": "canceled"
  }
}

レスポンスフィールド

フィールド説明
orderIdstring注文 ID(Short ID)
statusstring新しい注文ステータス(canceling または canceled

エラー

リトライポリシー:4xx は一切リトライしない — リクエストを修正してから再送信。5xx は指数バックオフでリトライ(5s 開始、最大 3 回)。
ステータスerrors[0].message意味推奨処理
400Missing X-Context-Merchant-Id headerAPI Key 認証下で merchant コンテキストが欠落認証パイプラインを確認
400Missing required field: orderIdリクエストボディに orderId が含まれていないリクエストボディを修正してから再送信
400Expected format: ORD_xxx, got "..."orderId Short ID のデコード失敗orderId のフォーマットを修正してから再送信
400Subscription cannot be canceled, current status: X注文ステータスが pending または active ではない(canceledcancelingexpired など)サブスクリプションはキャンセル不可
401Authentication failedAPI Key 署名が無効認証ヘッダーを確認
403Order does not belong to user所有権チェック失敗呼び出し元が注文を所有しているか確認
404Order not found注文が存在しないorder ID を確認
500Internal server errorサーバ側の予期しない障害指数バックオフでリトライ(5s 開始、最大 3 回)
502Failed to cancel subscriptionローカル更新または PSP キャンセル失敗指数バックオフでリトライ(5s 開始、最大 3 回)