メインコンテンツへスキップ
商品バージョン、価格、通貨を固定するチェックアウトセッションを作成します。これは単発商品とサブスクリプション商品の両方のチェックアウトフローの最初のステップです。 一般的なフローは以下の通りです。
  1. マーチャントがチェックアウトセッションを作成(サーバーサイド)
  2. フロントエンドに checkoutUrl を返す
  3. 消費者がリンクをクリックしてホスティングされたチェックアウトページに移動
  4. 消費者が請求情報を入力し、税額をプレビューし、注文を完了
POST /v1/actions/checkout/create-session
認証: API Key または Store Slug

リクエストボディ(API Key)

フィールド必須説明
productIdstringYes商品 ID(Short ID フォーマット PROD_xxx
currencystringYesISO 4217 通貨コード(例:USDEURJPY
priceSnapshotobjectNoセッション作成時に価格を上書き(API Key のみ、以下参照)
withTrialbooleanNoトライアル期間を有効にする(サブスクリプション商品のみ)
buyerEmailstringNoチェックアウトページで消費者のメールを事前入力
billingDetailobjectNo請求情報を事前入力(以下参照)
successUrlstringNo決済成功後のリダイレクト URL を上書き
expiresInSecondsnumberNoセッション TTL(秒単位、デフォルト:2700 = 45 分、API Key のみ)
darkModebooleanNoチェックアウトページのダークモードを有効にする
metadataobjectNoセッションに添付するカスタムキー値ペア
orderMerchantExternalIdstringNoマーチャント業務側の注文識別子(最大 128 文字)

リクエストボディ(Store Slug)

フィールド必須説明
productIdstringYes商品 ID(Short ID フォーマット PROD_xxx
currencystringYesISO 4217 通貨コード
buyerEmailstringNo消費者のメールを事前入力
billingDetailobjectNo請求情報を事前入力(以下参照)
successUrlstringNo決済成功後のリダイレクト URL を上書き
darkModebooleanNoチェックアウトページのダークモードを有効にする
Store Slug 認証では、クライアントサイドからの価格改ざんやセッション操作を防止するため、priceSnapshotexpiresInSecondsmetadataorderMerchantExternalIdwithTrial はサポートされません(黙って無視されます)。
ID 命名規約:同じフラット双キー名(checkout 側の orderMerchantExternalId、返金チケット側の refundTicketMerchantExternalId)が、リクエストボディ、webhook ペイロード、そしてその値を保持する全ての GraphQL 型を通じて使用されます — checkout 作成時に書き込んだ値は OrderPaymentRefund、webhook ペイロードのいずれからも同じフィールド名で読み戻せます。

Price Snapshot オブジェクト

フィールド必須説明
amountstringYes表示フォーマット文字列としての価格(例:"29.00" = $29.00)
taxIncludedbooleanYes金額に税が含まれているかどうか
taxCategorystringYes税計算用のカテゴリ(例:saasdigital_goods

Billing Detail オブジェクト

フィールド必須説明
countrystringYesISO 3166-1 alpha-2 国コード(例:USJPDE
isBusinessbooleanYes法人購入かどうか
postcodestringNo郵便番号
statestring条件付きUSCA で必須(例:CANYON
businessNamestring条件付きisBusinesstrue の場合に必須
taxIdstring条件付きEU 諸国で isBusinesstrue の場合に必須(VAT 番号)

セッションロック

チェックアウトセッション作成時に以下の値がロックされ、セッションの有効期間中は変更できません。 productVersionIdproductNamepriceInfostoreNamebillingPeriodwithTrialthemebuyerEmailbillingDetail メールアドレスの正規化:すべてのメールフィールド(email / buyerEmail / contactEmail)はサーバー側で trim().toLowerCase() により正規化されてから保存・キャッシュ・下流呼び出しに使用されます。Foo@Bar.COMfoo@bar.com は同一アカウントとして扱われます。

リクエスト例

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

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

const session = await client.checkout.createSession({
  storeId: "STO_2D5F8G3H1K4M6N9P",
  productId: "PROD_7J3K5L8M2N4P6Q9R",
  productType: CheckoutSessionProductType.Onetime,
  currency: "USD",
  buyerEmail: "customer@example.com",
  successUrl: "https://example.com/thank-you",
});

console.log(session.sessionId);   // "cs_550e8400-e29b-41d4-a716-446655440000"
console.log(session.checkoutUrl); // "https://checkout.waffo.ai/..."
console.log(session.expiresAt);   // "2026-01-22T10:30:00.000Z"

成功レスポンス (200)

{
  "data": {
    "sessionId": "cs_550e8400-e29b-41d4-a716-446655440000",
    "checkoutUrl": "https://checkout.waffo.ai/my-store-abc123/checkout/cs_550e8400-e29b-41d4-a716-446655440000",
    "expiresAt": "2026-01-22T10:30:00.000Z"
  }
}

レスポンスフィールド

フィールド説明
sessionIdstringCheckout Session ID(cs_ + UUID フォーマット、Short ID ではない)
checkoutUrlstring消費者をホスティングされたチェックアウトページにリダイレクトするための完全な URL
expiresAtstringセッションが期限切れになる ISO 8601 タイムスタンプ

エラー

リトライポリシー:4xx は一切リトライしない — リクエストを修正してから再送信。5xx は指数バックオフでリトライ(5s 開始、最大 3 回)。
ステータスerrors[0].message意味推奨処理
400Missing or invalid header: x-context-environmentenvironment ヘッダーが欠落、または test / prod 以外ヘッダーを修正して再送信
400Invalid JSON bodyリクエストボディが有効な JSON ではないボディを修正して再送信
400Missing required fields: productId, currencyproductId または currency が欠落ボディを修正して再送信
400Invalid currency format: "X". Must be 3 uppercase letters (e.g., "USD", "EUR", "JPY")通貨コードが 3 文字の大文字ではない(ISO 4217)有効な ISO 4217 コードを使用して再送信
400Invalid billingDetail請求情報のバリデーションに失敗(例:US で state が欠落)billingDetail を修正して再送信
400Expected format: PROD_xxx, got "..."productId Short ID のデコード失敗productId のフォーマットを修正して再送信
400orderMerchantExternalId must not be empty指定後 trim で空になるフィールドを省略するか、空でない値を指定
400orderMerchantExternalId must be at most 128 characters値が 128 文字を超過128 文字以内に短縮
400Currency X is not supported for this product商品が要求された通貨の price snapshot を持たない商品がサポートする通貨を使用
401UnauthorizedAPI Key 署名が無効、または Store Slug が認識されない認証ヘッダーを確認
403Store is not activeストアステータスが active でない先にストアを有効化
403Store is not approved for production paymentsストアが prod 環境承認を得ていないtest 環境を使用するか、ストア承認を取得
403Product does not belong to this store商品が訪問中のストアに属していない商品/ストアの組み合わせを確認
404Store not foundスラッグに一致するストアがないスラッグと environment を確認
404Product not found商品が存在しないproductId を確認
404Product not found or not active for this environment該当 environment で商品の active バージョンがないこの environment 用に商品バージョンを有効化
500Internal server errorサーバ側の予期しない障害指数バックオフでリトライ(5s 開始、最大 3 回)
デフォルトのセッション TTL は 45 分(2700 秒)です。API Key 認証を使用する場合、expiresInSeconds でカスタマイズできます。セッションは作成時に商品バージョンと価格をロックするため、価格変更は既存のセッションに影響しません。