V-REC受け取る。使う。つながる。
APIリファレンス · 技術仕様

V-REC API v1 / Online Learning & Token Pool / Merchant eKYC Preload / KYC R5.1 / Tenant Funding / Existing User Link / Crypto Wallet & Sales / Cards & Wallet Transactions v2.6.14

実装コードとOpenAPIを基準に、各APIのIN / OUT、型、必須条件、制約、成功レスポンス、エラー、セキュリティ境界を1エンドポイント単位で確認できる技術仕様書です。カードのPIN設定・発行会社側の取引履歴も含み、本人Session APIとMerchant HMAC APIを明確に区別しています。

MERCHANT SERVER API · ONLINE LEARNING / CUSTOM ERC-20

オンライン授業・Googleカレンダー・加盟店トークンプール

これは外部加盟店サーバー向けのAPIです。ブラウザにMerchant HMAC秘密鍵を置かず、利用者ログインを検証した自社バックエンドから呼び出してください。V-RECとSAKURAの双方で対象Merchantと会員所属を検証します。

本番前提条件: 専用の加盟店⇄SAKURA接続、権限の明示承認、SAKURA Connected Appsの再認可が必要です。共有接続で加盟店分離が保証できない場合は409で遮断されます。

MethodEndpointHMAC scope説明
GET/api/merchant/v1/learning/programslearning.read自社の公開講座を最大100件取得
GET/api/merchant/v1/learning/programs/{id}learning.read講義詳細・申込条件(秘密URLや正答は除外)
POST/api/merchant/v1/learning/programs/{id}/enrollmentslearning.enroll.write同意済み会員を無料講座に登録、有料講座は不可
GET/api/merchant/v1/learning/programs/{id}/sessionslearning.read講座の授業日程・受講条件を取得
GET/api/merchant/v1/learning/users/{id}/schedulelearning.read加盟店所属会員の受講予定
GET/api/merchant/v1/learning/users/{id}/progresslearning.read外部サイト向け受講進捗・カレンダー登録リンク
GET/api/merchant/v1/learning/rewardslearning.read学習報酬の直近履歴
POST/api/merchant/v1/learning/sessions/{id}/completelearning.rewards.write外部講義終了後の出席実績登録
POST/api/merchant/v1/learning/sessions/{id}/rewardslearning.rewards.write受講完了済み授業の設定済み報酬を再処理
POST/api/merchant/v1/learning/users/{id}/calendar-synclearning.calendar.write同意済みGoogleカレンダーへの講義予定同期
GET/api/merchant/v1/token-poollearning.token_pool.read加盟店専用トークンプール残高と全期間統計
GET/api/merchant/v1/token-pool/transferslearning.token_pool.read送金台帳の履歴・全期間統計・ページ送り
GET/api/merchant/v1/token-pool/transfers/{id}learning.token_pool.read送金リクエストの状態照合
POST/api/merchant/v1/token-pool/transferslearning.token_pool.write加盟店プールから会員ウォレットへのガスレス送金要求

全14エンドポイントのパス・パラメータ・エラーは下の「加盟店オンライン授業・カスタムトークン API」の折りたたみ詳細に掲載しています。 IN / OUT reference

無料講座の外部受講登録

POST /api/merchant/v1/learning/programs/331/enrollments
Content-Type: application/json
{"user_id":"usr_member_1234","learner_consent":true,"consent_reference":"consent-record-20261031-01"}

SAKURAとV-RECの双方で加盟店所属を確認。受講登録は明示権限が必要です。有料講座は422を返し、本人が会員用購入画面で申し込みます。

外部講義の受講完了通知

POST /api/merchant/v1/learning/sessions/371/complete
Content-Type: application/json
{"user_id":"usr_member_1234","idempotency_key":"course-371-user-1234","evidence_ref":"provider-attendance-371-1234","duration_seconds":3600}

授業の終了時刻を経過し、既存の出席・テスト・アンケート条件を満たした場合のみ完了になります。202は非同期・保留を含み、報酬やブロック確定を意味しません。報酬の任意金額指定はできません。

Googleカレンダー

GET progressのgoogle_calendar_add_urlは、会員がクリックして保存するGoogleカレンダー登録画面です。自動同期は会員が事前承認したGoogle OAuthでのみ行えます。未承認時は409、一部失敗は207を返します。

GET  /api/merchant/v1/learning/users/usr_member_1234/progress
POST /api/merchant/v1/learning/users/usr_member_1234/calendar-sync
{"program_id":331}

加盟店プールからのガスレス送金

POST /api/merchant/v1/token-pool/transfers
{"merchant_code":"mrc_your_merchant_code","user_id":"usr_member_1234","request_id":"merchant-token-20261031-00001","amount":"10.500000"}
GET /api/merchant/v1/token-pool/transfers/merchant-token-20261031-00001

送金実行にはACTIVE/FULL会員・Merchant紐付け・有効な受取ERCウォレット・別勘定のトークン原資・承認済みリレイヤーが必要です。USDT担保プールや授業報酬とは混同しません。submittedは送信受付でありconfirmedではありません。reconcile_requiredは手動照合の対象で自動再送しません。未検証のリレイヤー設定では送金機能は無効です。

外部サイト連携フロー · OpenAPI定義(YAML) · 加盟店履歴画面(ログイン後)

MERCHANT API / EXTERNAL eKYC ONBOARDING

外部サイトから登録してeKYCリンクだけを本人へ送る

本フローにはCredentialへの明示権限 kyc.preload と kyc.link.issue が必要です。Merchant Portal → Merchant API で、同意取得の責任についての確認チェックを入れて加盟店自身が付与します(旧形式の全権限キーには含まれません)。通常のMerchant APIの users.write / kyc.read だけでは利用できません。本人が最終確認を完了しても、SAKURA/MatchMoveの審査結果がAPPROVEDになるまでは承認完了ではありません。

GET  /api/merchant/v1/profile-options
POST /api/merchant/v1/users             {"onboarding_mode":"ekyc_only", ...}
GET  /api/merchant/v1/users/{id}/kyc/schema
POST /api/merchant/v1/users/{id}/kyc/preload
     Idempotency-Key: unique-draft-request-id
     JSON: {"fields": {...}, "documents": {...}, "consent": {...}}
GET  /api/merchant/v1/users/{id}/kyc/preload-status
POST /api/merchant/v1/users/{id}/kyc/preload-reconcile  # only authorized correction
POST /api/merchant/v1/users/{id}/kyc/onboarding-link
     → ekyc_url (secure delivery by merchant to verified user)
GET  /api/merchant/v1/users/{id}/kyc  → APPROVED / REVIEW / PENDING / ...
Webhook: user.kyc.updated (optional)

2026-10-27:preloadではbirthday/title/gender/nationalityを毎回明示し、18歳未満は422です。emailまたはphoneの重複は409です。外部eKYC完了だけではAPPROVEDにならず、SAKURAが未承認ならfinal_reviewです。リンク発行後は本人情報を変更できません。

全てのリクエストに既存のHMACヘッダーが必要です。画像はJSON内Base64として署名し、SAKURAへmultipart転送します。eKYCリンクを加盟店サーバーのログや第三者分析へ保存しないでください。

Flow guide · OpenAPI定義(YAML)

MERCHANT HMAC · CARD PRODUCT CATALOG

カード種別の一覧を取得する(15分キャッシュ)

これは発行済みカード一覧ではありません。SAKURAに登録されたMatchMoveカード種別(物理・バーチャル)の商品コード、画像、通貨、CVVメタ情報、発行上限設定等を参照します。加盟店HMACで署名し、cards.read権限とSAKURA Connected Appsのcards権限が必要です。

GET /api/merchant/v1/card-types
GET /api/merchant/v1/card-types?form_factor=physical
GET /api/merchant/v1/card-types?form_factor=virtual&code=seguammccard
検索引数条件
form_factorphysical / virtual (optional)
code完全一致。英数字、_、-、100文字以内

成功時はdata[](id、code、name、description、form_factor、personalised_order、token、currency、image、details、created_at、updated_at)、total、filters、metaを返します。detailsは発行元の値によってobjectまたは空配列[]です。

{"data":[{"id":1,"code":"seguammcpcard","name":"Sakura Exchange, Guam Inc. Physical Card","description":"Sakura Exchange, Guam Inc. Physical Card","form_factor":"physical","personalised_order":false,"token":{"type":"CVV","generation":"static"},"currency":["USD"],"image":{"large":"https://assets.mmvpay.com/global/products/seguammcpcard/card-large.png"},"details":{},"created_at":"2025-04-27 03:45:57","updated_at":"2026-10-29 02:30:15"}],"total":1,"filters":{"form_factor":"physical","code":null},"meta":{"source":"vrec_cache","stale":false,"refreshed_at":"2026-11-05T04:00:00+00:00","next_refresh_at":"2026-11-05T04:15:00+00:00","cache_ttl_seconds":900}}

JSONは説明用サンプルです。SAKURAはMatchMove GET /users/wallets/cards/typesを900秒単位で同期し、mm_card_typesを更新します。V-RECはSAKURAの次回更新期限に合わせてローカルファイルキャッシュを更新するため、15分+15分にはなりません。通信失敗時はmeta.stale=trueで最終データを返し、保持データもなければ503です。最新データでも発行許可を保証しません。

HTTP: 200, 401, 403, 422, 429, 503. Cache-Control: private, no-store.

下の詳細IN/OUT仕様へ · OpenAPI定義(YAML)

MERCHANT HMAC · ATTACHED USER CARD INVENTORY

アタッチ済みユーザーの既存SAKURAカードを取得

既定でV-RECに登録済みのカードだけでなく、本人のSAKURAに以前から存在する個人名義のMastercardも返します。SAKURA Connected Appsのcards権限、cards.read、ACTIVE/FULL所属およびcan_view_balance=1が必要です。別V-RECプログラム発行カードと法人加盟店カードは除外します。

GET /api/merchant/v1/users/usr_example/cards
GET /api/merchant/v1/users/usr_example/cards?include_existing=false
GET /api/merchant/v1/users/usr_example/cards/skc_0123456789abcdef0123456789abcdef/transactions?from=2026-10-10&to=2026-11-09

レスポンスdata[]のsourceはVREC_LOCAL / VREC_AND_SAKURA / SAKURA_ONLY、originはVREC_LOCAL / VREC_ISSUED / SAKURA_EXISTINGです。SAKURA_ONLYカードのidは閲覧用 skc_... であり、カード停止・PIN・機密カード表示・発行会社ステータスのAPIには使用できません。card_...は従来のV-REC公開IDです。

残高は返しません。状態はSAKURA保存記録でありMatchMoveリアルタイム照会ではありません。SAKURA側の最大100件取得で切り詰められた場合はmeta.sakura_truncated=trueです。SAKURA障害時は503を返し、空配列に置き換えません。include_existing=falseを付けると旧V-RECローカル一覧のみを返します。

個人の保有カード情報を加盟店へ開示するため、契約・個人情報の利用目的・閲覧権限が適切であることを確認してください。アタッチ操作だけで別サービスの金融情報閲覧への法的同意が当然に得られるわけではありません。

OpenAPI定義(YAML) · 下の詳細IN/OUT仕様

MERCHANT HMAC · ATTACHED USER CARD INVENTORY

アタッチ済みユーザーの既存SAKURAカードを取得

既定でV-RECに登録済みのカードだけでなく、本人のSAKURAに以前から存在する個人名義のMastercardも返します。SAKURA Connected Appsのcards権限、cards.read、ACTIVE/FULL所属およびcan_view_balance=1が必要です。別V-RECプログラム発行カードと法人加盟店カードは除外します。

GET /api/merchant/v1/users/usr_example/cards
GET /api/merchant/v1/users/usr_example/cards?include_existing=false
GET /api/merchant/v1/users/usr_example/cards/skc_0123456789abcdef0123456789abcdef/transactions?from=2026-10-10&to=2026-11-09

レスポンスdata[]のsourceはVREC_LOCAL / VREC_AND_SAKURA / SAKURA_ONLY、originはVREC_LOCAL / VREC_ISSUED / SAKURA_EXISTINGです。SAKURA_ONLYカードのidは閲覧用 skc_... であり、カード停止・PIN・機密カード表示・発行会社ステータスのAPIには使用できません。card_...は従来のV-REC公開IDです。

残高は返しません。状態はSAKURA保存記録でありMatchMoveリアルタイム照会ではありません。SAKURA側の最大100件取得で切り詰められた場合はmeta.sakura_truncated=trueです。SAKURA障害時は503を返し、空配列に置き換えません。include_existing=falseを付けると旧V-RECローカル一覧のみを返します。

個人の保有カード情報を加盟店へ開示するため、契約・個人情報の利用目的・閲覧権限が適切であることを確認してください。アタッチ操作だけで別サービスの金融情報閲覧への法的同意が当然に得られるわけではありません。

OpenAPI定義(YAML) · 下の詳細IN/OUT仕様

MERCHANT HMAC · ATTACHED USER CARD INVENTORY

アタッチ済みユーザーの既存SAKURAカードを取得

既定でV-RECに登録済みのカードだけでなく、本人のSAKURAに以前から存在する個人名義のMastercardも返します。SAKURA Connected Appsのcards権限、cards.read、ACTIVE/FULL所属およびcan_view_balance=1が必要です。別V-RECプログラム発行カードと法人加盟店カードは除外します。

GET /api/merchant/v1/users/usr_example/cards
GET /api/merchant/v1/users/usr_example/cards?include_existing=false
GET /api/merchant/v1/users/usr_example/cards/skc_0123456789abcdef0123456789abcdef/transactions?from=2026-10-10&to=2026-11-09

レスポンスdata[]のsourceはVREC_LOCAL / VREC_AND_SAKURA / SAKURA_ONLY、originはVREC_LOCAL / VREC_ISSUED / SAKURA_EXISTINGです。SAKURA_ONLYカードのidは閲覧用 skc_... であり、カード停止・PIN・機密カード表示・発行会社ステータスのAPIには使用できません。card_...は従来のV-REC公開IDです。

残高は返しません。状態はSAKURA保存記録でありMatchMoveリアルタイム照会ではありません。SAKURA側の最大100件取得で切り詰められた場合はmeta.sakura_truncated=trueです。SAKURA障害時は503を返し、空配列に置き換えません。include_existing=falseを付けると旧V-RECローカル一覧のみを返します。

個人の保有カード情報を加盟店へ開示するため、契約・個人情報の利用目的・閲覧権限が適切であることを確認してください。アタッチ操作だけで別サービスの金融情報閲覧への法的同意が当然に得られるわけではありません。

OpenAPI定義(YAML) · 下の詳細IN/OUT仕様

MERCHANT HMAC · TRANSACTION SOURCES

ウォレット履歴・カード別履歴・加盟店台帳の使い分け

3つの取引履歴はデータ元も対象範囲も違います。カード発行が成功していても、カード決済がなければカード別履歴は空になる場合があります。ウォレット取引をカード別履歴に合算したり、加盟店残高台帳として扱わないでください。

対象Merchant HMAC GET取得内容
MatchMove ウォレット/api/merchant/v1/users/{id}/matchmove-wallet-transactionsウォレット全体の入出金・資金移動・関連イベント。カード別フィルタなし。
MatchMove カード/api/merchant/v1/users/{id}/cards/{cardId}/transactions指定カードの発行会社取引履歴。from/toは最大90日。
V-REC 加盟店台帳/api/merchant/v1/users/{id}/transactions加盟店帰属残高の増減。カードまたはMatchMoveウォレットの全履歴ではない。

認証と権限: すべてMerchant HMAC署名+transactions.readが必要です。MatchMoveのライブ照会はACTIVE/FULLの加盟店所属かつcan_view_balance=1が必要です。さらにウォレット履歴はSAKURA Connected Appsのbalances、カード別履歴はcards権限が必要です。

GET /api/merchant/v1/users/usr_example/matchmove-wallet-transactions?page=1&limit=20
GET /api/merchant/v1/users/usr_example/cards/card_example/transactions?from=2026-10-05&to=2026-11-04&page=1&limit=20

ウォレット取引の絞り込み検索

検索条件を指定するとカーソル方式へ切り替わります。pageを増やすのではなく、next_cursorを次回のcursorとして渡し、全ての検索条件とlimitを同じまま送信します。検索条件なしは従来のpage/limitのままです。

検索条件用途
from / to取引日(含む)。2日の差は最大90日。
category / type分類(purchase/topup/transfer/atm/fee/authorization/card_issuance/adjustment/other)またはMatchMove種別の完全一致。
indicatordebit / credit
q / transaction_id取引説明・加盟店名等の部分一致、またはMatchMove取引IDの完全一致。
min_amount / max_amountウォレット取引金額(USD等)を含む範囲。元のJPY金額や手数料とは別。
transaction_mode / mccカード決済のECOM/POS/ATMまたは加盟店カテゴリコード。
original_currency / currency / status元通貨・取引通貨・プロバイダー状態。
include_zero_amountfalseならカード認証等の0円イベントを除外。
GET /api/merchant/v1/users/usr_example/matchmove-wallet-transactions?category=purchase&indicator=debit&from=2026-11-01&to=2026-11-04&limit=20

// next_cursorが返った場合(同じフィルターを繰り返す)
GET /api/merchant/v1/users/usr_example/matchmove-wallet-transactions?category=purchase&indicator=debit&from=2026-11-01&to=2026-11-04&limit=20&cursor=NEXT_CURSOR
検索時はtotal_records=nullです。search_complete=falseかつnext_cursorが存在する場合、itemsが空でも検索途中です。MatchMoveから取得可能な履歴期間には上流側の制限があります。
空の履歴と障害の違い: HTTP 200 items:[] は正常な空ページの場合があります。上流取得失敗は HTTP 503 であり、空ページへ変換しません。カード発行イベント(GET CARD等)がウォレット履歴にあってもカード決済とは限りません。
データ閲覧範囲: ウォレット全体の履歴には、同一SAKURA本人が複数加盟店に紐づく場合、他の加盟店に関係するイベントも含まれる可能性があります。本人同意と用途に応じたアクセス制限を確認してください。SAKURA画面下段は同期済み履歴、新APIはライブ照会なので表示差があり得ます。

OpenAPI定義(YAML) · 以下の加盟店API仕様で詳細を見る

FINANCIAL REPORTING · OPERATIONAL GUIDE

Payout・Tenant Funding・Transactionsを正しく区別する

V-RECは1つの財布ではありません。資金の出所ごとに正本とイベントが違うため、一覧やAPIの結果は合算せず、参照IDで突き合わせます。

01 / USD SOURCE

Corporate Payout

PartnerのPayout依頼。CREDITEDは資金確認が完了した結果。直接Allocationと別テーブルです。

GET /api/v1/me/payouts
02 / USD SOURCE

テナント資金管理

テナントから個人への直接割当。COMPLETED後にledger_lotsとCREDITが作られます。組戻しは独立した取引です。

GET /api/v1/me/tenant-allocations
03 / SOURCE ACTIVITY

取引履歴

V-REC台帳・内部カード記録・MatchMove明細・SAKURA暗号資産履歴は異なるものです。

GET /api/v1/me/ledger-entries
実測例: ユーザー16 / インスタンス3には10.00000000 USDのTenant Allocation(COMPLETED)と、同額のLedger CREDITが存在しますが、Payoutは0件です。これは二重入金ではなく、割当とその台帳記録の2種類の表現です。
何を確認するか正しいAPI注意
直接資金割当を受けたかGET /api/v1/me/tenant-allocationsCOMPLETED / remaining_amount · USD
テナントへ組戻したかGET /api/v1/me/tenant-returnsCOMPLETED / PENDING · USD
割当後の台帳増減GET /api/v1/me/ledger-entriesCREDIT / DEBIT / TENANT_RETURN
企業PayoutGET /api/v1/me/payoutsCREDITED ≠ direct Allocation
V-REC内部カードイベントGET /api/v1/me/transactions発行会社の全明細ではない
実カード利用・ATMGET /api/v1/me/cards/{id}/issuer-transactionsSAKURA経由でMatchMoveから取得
USDTウォレット送金GET /api/v1/me/wallet/transfersUSDT / tx_hash
USDT・独自トークンでの売買契約GET /api/v1/me/wallet/purchases支払資産と商品を別表示

通貨とトークンの表示例

操作支払/移動するもの受け取るもの帳票
直接AllocationTenant Fund · USD 10.00V-REC lot · USD 10.00Tenant Allocation + Ledger CREDIT
USDT Transfer12.345678 USDT送金先ブロックチェーンアドレスSAKURA wallet transfers
USDTでSGP-USDを購入10 USDTSGP-USD (契約により数量決定)SAKURA sale contract + separate SGP-USD lot
加盟店独自トークンでポイント購入125 独自トークン単位加盟店ポイント(契約条件による)SAKURA sale contract / Merchant point ledger
上の暗号資産数量は表示形式を示す例で、実際の価格・交換比率ではありません。USDT、独自トークン、ETH、SGP-USD、USDは別単位です。payment.amountとpayment.symbol、product_quantityとproduct_nameを組み合わせ、金額の桁数を丸めたり合算しないでください。

連携例:直接資金割当を帳票に表示する

Merchant HMAC: POST /api/merchant/v1/tenant-funding/allocations
  → status = COMPLETED, allocation.public_id = vta_...
Authenticated V-REC user: GET /api/v1/me/tenant-allocations
  → data[...].public_id = vta_..., amount = "10.00000000", currency = "USD"
Authenticated V-REC user: GET /api/v1/me/ledger-entries
  → entry_type = CREDIT, reference_type = SAKURA_TENANT_ALLOCATION
User payouts API: GET /api/v1/me/payouts
  → { "data": [] } (VALID: no corporate payout took place)
取得対象と権限:本人用 /api/v1/me/* はV-RECログインセッション、Merchant APIはHMAC権限を使います。カード発行会社明細にはSAKURA cardsスコープ、暗号資産履歴にはcrypto_walletスコープが必要です。MatchMoveウォレット履歴はMerchant APIからライブ参照できますが、SAKURAのSGP-USD内部台帳の全履歴は含みません。
実装照合済み Spec 2.6.14 JSON / multipart / session

読み方

下のAPI行をタップすると、そのAPIだけの入力仕様・出力仕様・期待レスポンス・エラー一覧が展開されます。Required欄の conditional / dynamic は、前段APIの状態やSAKURA KYCFORMの定義によって必須性が変わる項目です。

加盟店HMAC認証

各requestはMerchant Credentialで署名。Timestamp ±300秒、Nonce 8〜128文字かつ一意。Credentialは自身のMerchant境界だけにアクセス可能。

ヘッダー

X-VREC-Merchant-Key: <value>
X-VREC-Timestamp: <value>
X-VREC-Nonce: <value>
X-VREC-Signature: <value>

署名文字列

METHOD + "\n" + PATH + "\n" + CANONICAL_QUERY + "\n" + TIMESTAMP + "\n" + NONCE + "\n" + SHA256(raw_body)

V-REC本人Session

V-RECへログイン済み本人のsame-origin session。未認証時はJSON 401ではなく /v/{instance}/login へHTTP 302。POSTはフォームの_csrf必須で、不一致はHTTP 419の非JSON bodyです。

Merchant署名の注意: CANONICAL_QUERY はquery keyをsortし、RFC3986でencodeします。SHA256は送信するraw body bytesそのものに対して計算してください。
v2.5.0Ethereum · USDT (ERC-20)本人操作のみ

アンホステッドウォレット・ローテーション・ガスレス送金

ウォレットはSAKURAのアンホステッドERCウォレットです。BIP-39シードフレーズ(12語)は作成/入れ替え直後に1回だけ返され、秘密鍵は本人のウォレットパスワードで暗号化されます。V-RECはシードフレーズ・秘密鍵・ウォレットパスワードを保存しません。ガスレス送金ではSAKURAのリレイヤーがガス代(ETH)を負担します。

V-REC user (session)
  POST /api/v1/me/wallet            current_password step-up + wallet_password
        ↓ 201 + mnemonic (once)  → write down 12 words
  GET  /api/v1/me/wallet            address + USDT/ETH balances + gasless eligibility
  POST /api/v1/me/wallet/address-check   (address poisoning check)
  POST /api/v1/me/wallet/gasless-transfer  Idempotency-Key + wallet_password
        ↓ 201 SUBMITTED + tx_hash   |  202 transfer_status_unknown → GET /api/v1/me/wallet/requests/{key}
  POST /api/v1/me/wallet/rotate     step-up + new_wallet_password + reason → new mnemonic (once)

V-REC server → SAKURA Connected Apps (scopes crypto_wallet / crypto_wallet_manage)
  /api/integrations/vrec/users/{ref}/wallet*   Bearer + X-VRec-Proof, idempotency_key per write
権限: SAKURA Connected Appsで crypto_wallet(参照)と crypto_wallet_manage(作成・入れ替え・送金)を加盟店が許可した場合のみ有効です。既存接続は管理画面から再認可してください。Merchant APIは wallets.read による参照のみで、ウォレットを操作することはできません。
ガスレスの条件: SAKURAの月額利用者(加盟店管理ユーザー・物理カード免除を含む)が対象で、1日5回(失敗も1回)までです。運営の送金停止、ウォレットパスワードの連続失敗ロック、宛先の安全チェックはSAKURA本体と同じ判定が適用されます。
v2.6.0売買契約(両替ではない)当社1%+加盟店ロイヤリティ

加盟店経由の暗号資産による購入

利用者はUSDTまたは加盟店の独自トークンを代金として、SGP-USDまたは加盟店が定めたポイントを購入します。SAKURA EXCHANGEのライセンスに基づく販売で、両替ではありません。1件ごとに契約番号・売主・価格・手数料を確定し、本人の同意とウォレットパスワードで代金を支払います。

商品代金売主代金の行き先加盟店の収益
SGP-USDUSDTSAKURA EXCHANGE当社USDT販売口座ロイヤリティ(当社から精算)
加盟店ポイントUSDT加盟店当社USDT販売口座売上純額+ロイヤリティ(当社から精算)
SGP-USD / ポイント独自トークン加盟店(加盟店の責任のみ)加盟店アドレス(当社は保有しない)ロイヤリティを留保。商品の裏付けは加盟店USDT担保プール
GET  /api/v1/me/wallet/purchase-catalog
POST /api/v1/me/wallet/purchase-quotes          Idempotency-Key  → contract_no (QUOTED, 10 min)
POST /api/v1/me/wallet/purchases/{contract}/confirm  accept_terms + wallet_password → PAYMENT_SUBMITTED
     … 12 confirmations → COMPLETED (SGP-USD as merchant-route lot / points)
GET  /api/merchant/v1/crypto-sales               (Merchant HMAC, crypto_sales.read)
通常のUSDルートとの違い: 当社手数料は1%(通常2%)。購入したSGP-USDはSAKURAで「加盟店由来ロット」として通常購入分と区別して付与され、V-RECの加盟店帰属残高(Tenant Funding)には記帳されません。
ベースURL

加盟店サーバーAPI

https://api.v-rec.xyz
GET /api/merchant/v1/card-types カード種別一覧(MatchMove・15分キャッシュ) cards.read
認証 加盟店HMAC認証 権限範囲 cards.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

クエリパラメータ

項目型必須制約 / 意味
form_factorstring任意physicalまたはvirtualphysical|virtual
codestring任意カード種別コードの完全一致^[A-Za-z0-9_-]+$, maxLength=100

OUT · 出力仕様

項目型有無制約 / 意味
data[]array<object>必須登録されたカード種別(全項目)no card issuance authorization implied
data[].id / code / name / descriptioninteger / string必須カード種別ID・コード・名称・説明code is the exact MatchMove product identifier
data[].form_factor / personalised_orderstring / boolean必須physical/virtual と個別製作フラグform_factor=physical|virtual
data[].token / currency / image / detailsobject / array / object / object|array必須CVV設定・USD等の通貨・画像URL・発行上限メタデータJSON decoded, not serialized strings; details can be []
data[].created_at / updated_atstring|null必須DB登録日時・更新日時YYYY-MM-DD HH:mm:ss の場合 present
meta.source / meta.stale / meta.refreshed_at / meta.next_refresh_at / meta.cache_ttl_secondsstring / boolean / datetime|null / datetime / integer必須取得元・古いデータか・MatchMove最終取得日時・次回更新期限・キャッシュ秒数900 seconds on SAKURA; stale=true means last-known data
total / filtersinteger / object必須絞込後の件数と適用した検索条件filters.form_factor and filters.code are null可

HTTP 200 · 期待レスポンス例

{
    "data": [
        {
            "id": 1,
            "code": "seguammcpcard",
            "name": "Sakura Exchange, Guam Inc. Physical Card",
            "description": "Sakura Exchange, Guam Inc. Physical Card",
            "form_factor": "physical",
            "personalised_order": false,
            "token": {
                "type": "CVV",
                "generation": "static"
            },
            "currency": [
                "USD"
            ],
            "image": {
                "large": "https://assets.mmvpay.com/global/products/seguammcpcard/card-large.png"
            },
            "details": {
                "active_limits": {
                    "allowed": 1,
                    "pre_kyc": 0,
                    "post_kyc": 5
                }
            },
            "created_at": "2025-04-27 03:45:57",
            "updated_at": "2026-10-29 02:30:15"
        }
    ],
    "total": 1,
    "filters": {
        "form_factor": "physical",
        "code": null
    },
    "meta": {
        "source": "vrec_cache",
        "stale": false,
        "refreshed_at": "2026-11-05T04:00:00+00:00",
        "next_refresh_at": "2026-11-05T04:15:00+00:00",
        "cache_ttl_seconds": 900
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_signature_invalid形式: JSON

認証エラー

HTTP 403merchant_scope_denied / sakura_cards_scope_required形式: JSON

cards.read または SAKURA cards 権限なし

HTTP 422invalid_form_factor / invalid_code形式: JSON

不正な検索条件

HTTP 503card_types_unavailable / card_types_upstream_unavailable形式: JSON

DBまたは連携先が利用不可

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • SAKURAを通じてMatchMoveから15分ごとに更新します。V-RECはSAKURAと更新期限を共有し、障害時はmeta.stale=trueで最終データを返します。V-RECローカルDBは最終フォールバックのみ。カード発行権限とは別です。
GET /api/merchant/v1/context 認証中MerchantのContext取得 users.read
認証 加盟店HMAC認証 権限範囲 users.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

OUT · 出力仕様

項目型有無制約 / 意味
merchant.idstring必須Merchant公開IDmrc_...
merchant.namestring必須Merchant表示名
merchant.program_idstring必須V-REC Program公開ID

HTTP 200 · 期待レスポンス例

{
    "merchant": {
        "id": "mrc_demo",
        "name": "Example Merchant",
        "program_id": "vrec_demo"
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

HMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

GET /api/merchant/v1/profile-options ユーザー作成前のSAKURA国・電話コード候補取得 users.read
認証 加盟店HMAC認証 権限範囲 users.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

OUT · 出力仕様

項目型有無制約 / 意味
countries[]array<object>必須SAKURAが許可する国候補
countries[].codestring必須送信に使用する国コード^[A-Z]{2}$
countries[].provider_codestring必須互換メタデータ。SAKURA current endpointが未提供なら空文字codeの代わりに送信しないこと
countries[].labelstring必須表示ラベル
dial_codes[]array<object>必須SAKURAが許可する国際電話コード候補
dial_codes[].codestring必須送信に使用する+付き国際電話コード+digits
dial_codes[].provider_codestring必須互換メタデータ。SAKURA current endpointが未提供なら空文字
dial_codes[].labelstring必須表示ラベル
generated_atstring|null必須SAKURA候補カタログ生成時刻nullでない場合ISO 8601形式

HTTP 200 · 期待レスポンス例

{
    "countries": [
        {
            "code": "JP",
            "provider_code": "",
            "label": "Japan"
        }
    ],
    "dial_codes": [
        {
            "code": "+81",
            "provider_code": "",
            "label": "Japan (+81)"
        }
    ],
    "generated_at": "2026-10-05T01:00:00Z"
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

HMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

HTTP 503profile_options_unavailable形式: JSON

SAKURA候補カタログを取得できない

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 候補取得失敗時にfree-textへfallbackしないでください。
GET /api/merchant/v1/users 当該Merchant所属ユーザー一覧 users.read
認証 加盟店HMAC認証 権限範囲 users.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

クエリパラメータ

項目型必須制約 / 意味
limitinteger任意取得件数PHP (int) 型変換 その後 clamp 1..100; 省略時=>50; e.g. abc/0/negative=>1, >100=>100
offsetinteger任意開始offsetPHP (int) 型変換 その後 max(0,...); 省略時=>0; abc/negative=>0

OUT · 出力仕様

項目型有無制約 / 意味
data[]array<merchant_user>必須Merchant所属ユーザー配列
data[].idstring必須V-RECユーザー公開IDusers.public_id; usr_...
data[].beneficiary_idstring必須受取人IDusers.beneficiary_id
data[].emailstring必須SAKURA現在値。remoteが無い場合はV-REC保存値email
data[].namestring必須SAKURA現在値。remote nameが無ければ空文字
data[].profileobject必須SAKURAプロフィールの現在値
data[].profile.first_namestring条件付きSAKURA正規データの名前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
data[].profile.last_namestring条件付きSAKURA正規データの姓前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
data[].profile.country_codestring条件付きSAKURA正規データの国コード現在の正式なデータ投影; 通常ISO alpha-2; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
data[].profile.dial_codestring条件付きSAKURA正規データの電話国番号+で始まる数字列に正規化; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
data[].profile.phonestring条件付きSAKURA正規データの電話番号前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
data[].profile.postal_codestring条件付きSAKURA正規データの郵便番号前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
data[].profile.address_line1string条件付きSAKURA正規データの住所1行目前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
data[].profile.address_line2string条件付きSAKURA正規データの住所2行目前後空白を除去した文字列; キーは常に存在; 空文字の場合あり; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
data[].profile.citystring条件付きSAKURA正規データの市区町村前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
data[].profile.statestring条件付きSAKURA正規データの都道府県・州前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
data[].countrystring|null必須profile.country_code。無ければnullnullでない場合ISO alpha-2
data[].kyc_statusstring必須SAKURA現在値、無ければV-REC保存値NOT_STARTED|PENDING|APPROVED|REJECTED|REVIEW|CORRECTION_REQUIRED
data[].statusstring必須対象Merchant membership状態通常 ACTIVE|SUSPENDED; INACTIVE rows are excluded
data[].global_statusstring必須V-REC users.status
data[].sakura_user_refstring|null必須接続中SAKURAユーザー参照キーは常に存在; 値はnullの場合あり
data[].created_atstring必須V-REC作成時刻DB日時形式
data[].updated_atstring必須V-REC更新時刻DB日時形式
limitinteger必須実際に適用されたlimit1..100 after PHP integer-型変換 + clamp
offsetinteger必須実際に適用されたoffset>=0 after PHP integer-型変換 + clamp

HTTP 200 · 期待レスポンス例

{
    "data": [
        {
            "id": "usr_demo",
            "beneficiary_id": "VREC-DEMO",
            "email": "[email protected]",
            "name": "Taro Yamada",
            "profile": {
                "country_code": "JP"
            },
            "country": "JP",
            "kyc_status": "APPROVED",
            "status": "ACTIVE",
            "global_status": "ACTIVE",
            "sakura_user_ref": "USR_DEMO",
            "created_at": "2026-10-01 00:00:00",
            "updated_at": "2026-10-05 00:00:00"
        }
    ],
    "limit": 50,
    "offset": 0
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

HMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

HTTP 503sakura_profile_unavailable形式: JSON

SAKURA profile一括取得失敗

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

POST /api/merchant/v1/users V-REC/SAKURAユーザー作成または既存IDの安全な紐付け users.write
認証 加盟店HMAC認証 権限範囲 users.write Content-Type application/json 成功 HTTP 201

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

ヘッダー

項目型必須制約 / 意味
Idempotency-Keystring必須作成冪等性キー1〜190文字

リクエスト本文

項目型必須制約 / 意味
emailstring必須本人メール有効なメールアドレス; SAKURA上限190文字
first_namestring必須名前後空白除去後に空でないこと; SAKURA上限120文字
last_namestring必須姓前後空白除去後に空でないこと; SAKURA上限120文字
country_codestring条件付き推奨国コード。profile-optionsのcountries[].codeのみ旧形式のcountryを使用しない限り必須; if キーが空文字で存在する, 旧形式のcountryは使用されない; SAKURA側で2文字
countrystring条件付きcountry_code未指定/null時だけ読まれるlegacy alias許可候補一覧は以下と同じ: country_code; 両方同時に送信しないこと
dial_codestring必須国際電話コード。profile-options候補のみnormalized to +digits; SAKURA上限12文字
phonestring必須電話番号前後空白除去後に空でないこと; SAKURA上限40文字
postal_codestring必須郵便番号前後空白除去後に空でないこと; SAKURA上限40文字
statestring必須都道府県/州前後空白除去後に空でないこと; SAKURA上限120文字
citystring必須市区町村前後空白除去後に空でないこと; SAKURA上限120文字
address_line1string必須住所1前後空白除去後に空でないこと; SAKURA上限190文字
address_line2string必須住所2前後空白除去後に空でないこと in current V-REC flow; SAKURA上限190文字
notificationsobject任意オンボーディングメール制御省略時/null => 両フラグtrue; オブジェクト以外 => notifications_invalid; 未知のキーは無視
notifications.send_vrec_activation_emailboolean任意V-REC activation mail送信既定でtrue; 指定時はboolean以外を拒否 => notification_flag_invalid
notifications.send_sakura_password_setup_emailboolean任意SAKURA setup mail送信既定でtrue; 指定時はboolean以外を拒否 => notification_flag_invalid
onboarding_modestring任意パスワード通知なしのeKYC専用登録ekyc_only only; no password returned

OUT · 出力仕様

項目型有無制約 / 意味
user.public_idstring必須V-RECユーザー公開IDusr_...
user.beneficiary_idstring必須受取人ID
user.emailstring必須登録メールemail
user.namestring必須氏名
user.countrystring|null必須SAKURA identity.profile.country_code。mock等ではnull可nullでない場合ISO alpha-2
user.kyc_statusstring必須KYC状態
user.statusstring必須Merchant membership状態
user.global_statusstring必須V-RECユーザー状態
user.sakura_user_refstring|null必須SAKURAユーザー参照キーは常に存在
user.sakura_customer_uuidstring必須SAKURAの固定顧客UUID空の場合リクエスト失敗
user.created_atstring必須作成時刻
user.activation_urlstring条件付き新規ローカルV-REC login作成時だけ返すactivation URL既に連携済みのユーザーでは省略; SAKURAのpassword_setup_urlは返却しない
user.activation_expires_ininteger条件付きactivation_url有効秒数activation_urlがある場合に存在; 86400
user.notifications.vrec_activation_emailstring必須V-REC activation email送信結果sent|disabled|not_applicable|failed
user.notifications.sakura_password_setup_emailstring必須SAKURA password setup email送信結果sent|disabled|not_applicable|failed

HTTP 201 · 期待レスポンス例

{
    "user": {
        "public_id": "usr_demo",
        "beneficiary_id": "VREC-DEMO",
        "email": "[email protected]",
        "name": "Taro Yamada",
        "country": "JP",
        "kyc_status": "NOT_STARTED",
        "status": "ACTIVE",
        "global_status": "ACTIVE",
        "sakura_user_ref": "USR_DEMO",
        "sakura_customer_uuid": "cust_demo",
        "created_at": "2026-10-05 01:00:00",
        "activation_url": "https://v-rec.xyz/activate/token",
        "activation_expires_in": 86400,
        "notifications": {
            "vrec_activation_email": "sent",
            "sakura_password_setup_email": "sent"
        }
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

HMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

HTTP 400invalid_json形式: JSON

JSON body不正

HTTP 409idempotency_key_reused_with_different_request / request_in_progress / email_identity_mismatch / merchant_context_required / user_link_not_authorized / email_already_registered形式: JSON

冪等性またはidentity conflict

HTTP 422idempotency_key_required / invalid_email / name_required / country_required / dial_code_required / phone_required / postal_code_required / state_required / city_required / address_line1_required / address_line2_required / invalid_country_code / invalid_dial_code / notifications_invalid / notification_flag_invalid / sakura_customer_uuid_missing / sakura_link_incomplete形式: JSON

入力validation失敗

HTTP 503upstream_or_internal_error / <SAKURA errorCode or sakura_unavailable>形式: JSON

SAKURA/上流一時障害

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 同じIdempotency-Key + 同じraw bodyは保存済みresponseを返し、メールを再送しません。
  • SAKURA password_setup_urlはone-time bearer linkのためMerchant responseには絶対に返しません。
  • SAKURA側の文字数/MatchMove preflight違反はConnected Appsのエラーとして返り、現V-REC createUser controllerではSAKURA HTTP 409以外をHTTP 503へ変換します。
  • country は互換aliasです。country_codeが存在しnull以外ならcountryより優先され、空文字でもcountryへfallbackしません。
  • 仕様上はapplication/jsonです。現行ControllerはContent-Type自体を検査せずraw bodyをjson_decodeしますが、HMAC body hashはraw bytesそのものが対象です。
  • ekyc_onlyではV-REC・SAKURAの初回メールを送らず、V-REC activation_urlも返しません。
POST /api/merchant/v1/user-links 既存SAKURAユーザー本人同意リンクを作成 users.write
認証 加盟店HMAC認証 権限範囲 users.write Content-Type application/json 成功 HTTP 201

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

ヘッダー

項目型必須制約 / 意味
Idempotency-Keystring必須同一リンク要求の再送キー1〜190文字; reuse 同一のexternal_customer_refに限る

リクエスト本文

項目型必須制約 / 意味
external_customer_refstring|null任意Merchant側顧客参照。SAKURA User選択には使用しないmax 190

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 201 · 期待レスポンス例

{
    "link_request": {
        "id": "ulr_demo",
        "status": "PENDING",
        "authorization_url": "https://payment.sakura-guam.com/vrec/user-link/vul_demo",
        "external_customer_ref": "customer-123",
        "expires_at": "2026-10-05T12:15:00Z",
        "linked_user_id": null,
        "activation_email_status": null
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

Merchant HMAC認証失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

HTTP 409idempotency_key_required / idempotency_key_reused_with_different_request / sakura_not_connected / sakura_target_merchant_mismatch / sakura_link_request_mismatch形式: JSON

Idempotency競合またはSAKURA接続未完了

HTTP 503link_request_unavailable / sakura_link_unavailable形式: JSON

SAKURA一時障害

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • MerchantはemailやSAKURA User IDを指定できません。authorization_urlを本人へ渡し、本人がSAKURAへログインして同意したidentityだけがリンクされます。
  • callbackのstate、SAKURA link_request_id、Connected App target Merchant、対象V-REC Merchantをすべて照合します。別link requestや別Merchantのcodeを混在させた場合はmembershipを作成しません。
GET /api/merchant/v1/user-links/{id} 既存ユーザーリンク要求の状態確認 users.read
認証 加盟店HMAC認証 権限範囲 users.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須link request公開IDulr_...

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "link_request": {
        "id": "ulr_demo",
        "status": "COMPLETED",
        "authorization_url": "https://payment.sakura-guam.com/vrec/user-link/vul_demo",
        "linked_user_id": "usr_demo",
        "activation_email_status": "sent",
        "completed_at": "2026-10-05T12:03:00Z",
        "membership": {
            "status": "ACTIVE",
            "access_mode": "READONLY",
            "source_merchant_id": "MRC_00000001",
            "can_receive_tenant_funds": false,
            "can_spend": false
        }
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

Merchant HMAC認証失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

HTTP 404link_request_not_found形式: JSON

このMerchantに属する要求がない

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • statusはPENDING / COMPLETED / DENIED / EXPIRED等。COMPLETED後はlinked_user_idで通常のUser APIを利用できます。
GET /api/merchant/v1/users/{id} ユーザー詳細取得 users.read
認証 加盟店HMAC認証 権限範囲 users.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...

OUT · 出力仕様

項目型有無制約 / 意味
idstring必須V-RECユーザー公開IDusers.public_id; usr_...
beneficiary_idstring必須受取人IDusers.beneficiary_id
emailstring必須SAKURA現在値。remoteが無い場合はV-REC保存値email
namestring必須SAKURA現在値。remote nameが無ければ空文字
profileobject必須SAKURAプロフィールの現在値
profile.first_namestring条件付きSAKURA正規データの名前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.last_namestring条件付きSAKURA正規データの姓前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.country_codestring条件付きSAKURA正規データの国コード現在の正式なデータ投影; 通常ISO alpha-2; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.dial_codestring条件付きSAKURA正規データの電話国番号+で始まる数字列に正規化; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.phonestring条件付きSAKURA正規データの電話番号前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.postal_codestring条件付きSAKURA正規データの郵便番号前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.address_line1string条件付きSAKURA正規データの住所1行目前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.address_line2string条件付きSAKURA正規データの住所2行目前後空白を除去した文字列; キーは常に存在; 空文字の場合あり; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.citystring条件付きSAKURA正規データの市区町村前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.statestring条件付きSAKURA正規データの都道府県・州前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
countrystring|null必須profile.country_code。無ければnullnullでない場合ISO alpha-2
kyc_statusstring必須SAKURA現在値、無ければV-REC保存値NOT_STARTED|PENDING|APPROVED|REJECTED|REVIEW|CORRECTION_REQUIRED
statusstring必須対象Merchant membership状態通常 ACTIVE|SUSPENDED; INACTIVE rows are excluded
global_statusstring必須V-REC users.status
sakura_user_refstring|null必須接続中SAKURAユーザー参照キーは常に存在; 値はnullの場合あり
created_atstring必須V-REC作成時刻DB日時形式
updated_atstring必須V-REC更新時刻DB日時形式

HTTP 200 · 期待レスポンス例

{
    "id": "usr_demo",
    "beneficiary_id": "VREC-DEMO",
    "email": "[email protected]",
    "name": "Taro Yamada",
    "profile": {
        "country_code": "JP"
    },
    "country": "JP",
    "kyc_status": "APPROVED",
    "status": "ACTIVE",
    "global_status": "ACTIVE",
    "sakura_user_ref": "USR_DEMO",
    "created_at": "2026-10-01 00:00:00",
    "updated_at": "2026-10-05 00:00:00"
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

HMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

HTTP 404not_found形式: JSON

当該Merchant境界外または存在しないuser

HTTP 503sakura_profile_unavailable形式: JSON

SAKURA profile取得失敗

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

POST /api/merchant/v1/users/{id}/status Merchant membershipをACTIVE/SUSPENDEDへ変更 users.write
認証 加盟店HMAC認証 権限範囲 users.write Content-Type application/json 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...

リクエスト本文

項目型必須制約 / 意味
statusstring必須membership状態ACTIVE|SUSPENDED; trim + strtoupper => 入力は大文字小文字を区別しない

OUT · 出力仕様

項目型有無制約 / 意味
idstring必須V-RECユーザー公開IDusers.public_id; usr_...
beneficiary_idstring必須受取人IDusers.beneficiary_id
emailstring必須SAKURA現在値。remoteが無い場合はV-REC保存値email
namestring必須SAKURA現在値。remote nameが無ければ空文字
profileobject必須SAKURAプロフィールの現在値
profile.first_namestring条件付きSAKURA正規データの名前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.last_namestring条件付きSAKURA正規データの姓前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.country_codestring条件付きSAKURA正規データの国コード現在の正式なデータ投影; 通常ISO alpha-2; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.dial_codestring条件付きSAKURA正規データの電話国番号+で始まる数字列に正規化; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.phonestring条件付きSAKURA正規データの電話番号前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.postal_codestring条件付きSAKURA正規データの郵便番号前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.address_line1string条件付きSAKURA正規データの住所1行目前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.address_line2string条件付きSAKURA正規データの住所2行目前後空白を除去した文字列; キーは常に存在; 空文字の場合あり; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.citystring条件付きSAKURA正規データの市区町村前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
profile.statestring条件付きSAKURA正規データの都道府県・州前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある
countrystring|null必須profile.country_code。無ければnullnullでない場合ISO alpha-2
kyc_statusstring必須SAKURA現在値、無ければV-REC保存値NOT_STARTED|PENDING|APPROVED|REJECTED|REVIEW|CORRECTION_REQUIRED
statusstring必須対象Merchant membership状態通常 ACTIVE|SUSPENDED; INACTIVE rows are excluded
global_statusstring必須V-REC users.status
sakura_user_refstring|null必須接続中SAKURAユーザー参照キーは常に存在; 値はnullの場合あり
created_atstring必須V-REC作成時刻DB日時形式
updated_atstring必須V-REC更新時刻DB日時形式

HTTP 200 · 期待レスポンス例

{
    "id": "usr_demo",
    "beneficiary_id": "VREC-DEMO",
    "email": "[email protected]",
    "name": "Taro Yamada",
    "profile": {
        "country_code": "JP"
    },
    "country": "JP",
    "kyc_status": "APPROVED",
    "status": "SUSPENDED",
    "global_status": "ACTIVE",
    "sakura_user_ref": "USR_00000001",
    "created_at": "2026-10-01 00:00:00",
    "updated_at": "2026-10-05 00:00:00"
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

HMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

HTTP 400invalid_json形式: JSON

JSON不正

HTTP 404not_found形式: JSON

user境界外

HTTP 422invalid_status形式: JSON

ACTIVE/SUSPENDED以外

HTTP 503sakura_profile_unavailable形式: JSON

更新後profile取得失敗

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 仕様上はapplication/jsonです。現行ControllerはContent-Type自体を検査せずraw bodyをjson_decodeしますが、HMAC body hashはraw bytesそのものが対象です。
GET /api/merchant/v1/users/{id}/kyc KYC状態をSAKURAから同期して取得 kyc.read
認証 加盟店HMAC認証 権限範囲 kyc.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須V-RECユーザー公開IDusr_...
kyc_statusstring必須SAKURA再取得後にV-RECへ保存したKYC状態NOT_STARTED|PENDING|APPROVED|REJECTED|REVIEW|CORRECTION_REQUIRED
checked_atstring必須syncで更新された最終同期時刻DBのUTC日時

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "kyc_status": "APPROVED",
    "checked_at": "2026-10-05 01:00:00"
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

HMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

HTTP 404not_found形式: JSON

user境界外

HTTP 503kyc_sync_unavailable形式: JSON

KYC同期不可

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • SAKURAのkyc_caseを返します。外部確認完了でも最終承認前はfinal_review / PENDINGです。
GET /api/merchant/v1/users/{id}/kyc/preload-status KYC受領証跡と担当者の確認 kyc.preload
認証 加盟店HMAC認証 権限範囲 kyc.preload 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須加盟店所有ユーザーID

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_example",
    "stage": "final_review",
    "kyc_status": "PENDING",
    "next_action": {
        "type": "final_review"
    },
    "responsibility": {
        "owner": "SAKURA_REVIEWER"
    }
}

想定エラー / HTTPレスポンス

HTTP 422validation_error

フィールド未入力・18歳未満

HTTP 409previous_preload_unresolved

前回のKYC処理状態が不確定

HTTP 503sakura_unavailable

SAKURA接続が不安定

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • GETは遠隔状態を変更しない。APPROVEDはSAKURA最終承認時だけ。final_reviewはSAKURA_REVIEWERが担当。
POST /api/merchant/v1/users/{id}/kyc/preload-reconcile 安全条件に基づく訂正復旧 kyc.preload
認証 加盟店HMAC認証 権限範囲 kyc.preload Content-Type application/json 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須加盟店所有ユーザーID

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_example",
    "stage": "final_review",
    "kyc_status": "PENDING",
    "next_action": {
        "type": "final_review"
    },
    "responsibility": {
        "owner": "SAKURA_REVIEWER"
    }
}

想定エラー / HTTPレスポンス

HTTP 422validation_error

フィールド未入力・18歳未満

HTTP 409previous_preload_unresolved

前回のKYC処理状態が不確定

HTTP 503sakura_unavailable

SAKURA接続が不安定

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • GETと異なり条件を満たす場合に限りSAKURA訂正状態を変更する。セキュリティ保留は解除できない。
POST /api/merchant/v1/users/{id}/kyc/start 本人ログインKYCフローへの誘導情報取得 kyc.start
認証 加盟店HMAC認証 権限範囲 kyc.start 成功 HTTP 202

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須V-RECユーザー公開ID
kyc_statusstring必須現在KYC状態
actionstring必須Merchant側が取るべきアクションUSER_LOGIN_REQUIRED
user_urlstring必須本人がログインするV-REC URLhttps URL
messagestring必須実装上の説明

HTTP 202 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "kyc_status": "NOT_STARTED",
    "action": "USER_LOGIN_REQUIRED",
    "user_url": "https://v-rec.xyz/v/program/login",
    "message": "The user must authenticate to V-REC before KYC can be started. No SAKURA impersonation URL is returned to merchant servers."
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

HMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

HTTP 404not_found形式: JSON

user境界外

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • eKYC short URLは返しません。本人sessionのKYC APIだけがredirect URLを受け取れます。
  • このendpointはrequest bodyを解析せず、kyc_statusは同期を行わないV-REC保存値です。
  • 仕様上はapplication/jsonです。現行ControllerはContent-Type自体を検査せずraw bodyをjson_decodeしますが、HMAC body hashはraw bytesそのものが対象です。
GET /api/merchant/v1/users/{id}/cards アタッチ済みユーザーのSAKURA既存カード+V-RECカード一覧 cards.read
認証 加盟店HMAC認証 権限範囲 cards.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...

クエリパラメータ

項目型必須制約 / 意味
include_existingboolean任意既存SAKURAカードを含む既定でtrue; false/0 is V-REC local-only legacy mode; true/1 accepted

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須V-RECユーザー公開IDusers.public_id; 現行で生成するIDは usr_...
data[]array<card_list_item>必須mask済みカード一覧PAN/CVV/PINは含まれません
data[].idstring必須V-REC公開card_... またはSAKURA既存カード専用skc_...card_... is local; skc_... is scoped to user/program and 参照専用
data[].card_typestring必須カード種別VIRTUAL|PHYSICAL
data[].brandstring必須カードブランドMASTERCARD
data[].masked_panstring|null必須マスク済みPANカード番号全桁(PAN)は返さない; null可
data[].last4string|null必須PAN末尾4桁null可
data[].currencystring|null必須カード通貨SAKURA or local currency (3 letters), unknown null
data[].statusstring必須カード状態ACTIVE|FROZEN|CLOSED (保存値/プロバイダー正規化値)
data[].atm_enabledboolean|null必須既知のATM利用可否、不明ならnullunknown for SAKURA_ONLY; no false inference
data[].created_atstring|null必須カード登録時刻null for card absent から V-REC local DB
metaobject任意SAKURA取得メタ情報only include_existing=true; includes truncation status
data[].sourcestring必須参照元VREC_LOCAL | VREC_AND_SAKURA | SAKURA_ONLY
data[].originstring必須カード発行起点VREC_LOCAL | VREC_ISSUED | SAKURA_EXISTING
data[].read_onlyboolean必須読み取り専用IDtrue for SAKURA_ONLY; no mutation permissions are ever inferred
data[].status_sourcestring必須状態情報の元VREC_LOCAL_RECORD | SAKURA_CARD_RECORDS; NOT MatchMove live
meta.sakura_truncatedboolean任意SAKURA側100件制限による切り詰めtrue means incomplete list
meta.inventory_completeboolean任意SAKURA一覧の切り詰めなしfalse の場合 sakura_truncated=true
meta.sakura_is_liveboolean任意MatchMoveライブ状態ではないalways false

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "data": [
        {
            "id": "card_demo",
            "card_type": "VIRTUAL",
            "brand": "MASTERCARD",
            "masked_pan": "**** **** **** 1234",
            "last4": "1234",
            "currency": "USD",
            "status": "ACTIVE",
            "atm_enabled": false,
            "created_at": "2026-10-01 00:00:00",
            "source": "VREC_AND_SAKURA",
            "origin": "VREC_ISSUED",
            "read_only": false,
            "status_source": "SAKURA_CARD_RECORDS"
        },
        {
            "id": "skc_0123456789abcdef0123456789abcdef",
            "card_type": "PHYSICAL",
            "brand": "MASTERCARD",
            "masked_pan": "**** **** **** 5678",
            "last4": "5678",
            "currency": "USD",
            "status": "ACTIVE",
            "atm_enabled": null,
            "created_at": null,
            "source": "SAKURA_ONLY",
            "origin": "SAKURA_EXISTING",
            "read_only": true,
            "status_source": "SAKURA_CARD_RECORDS"
        }
    ],
    "meta": {
        "includes_existing": true,
        "sakura_source": "SAKURA_CARD_RECORDS",
        "sakura_is_live": false,
        "sakura_truncated": false,
        "inventory_complete": true,
        "total_returned": 2
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON

署名・認証情報・タイムスタンプ等の検証に失敗

HTTP 403merchant_scope_denied形式: JSON

cards.read権限なし

HTTP 404not_found形式: JSON

Merchantの参照範囲にユーザーが存在しない

HTTP 409cards_overview_requires_connected_apps / sakura_cards_scope_required / sakura_user_not_linked形式: JSON

SAKURA連携・同一ユーザー紐づけ未完了

HTTP 422invalid_include_existing形式: JSON

include_existing不正

HTTP 429too_many_attempts形式: JSON

カード一覧照会レート制限

HTTP 503sakura_card_inventory_unavailable / membership_capabilities_unavailable形式: JSON

上流障害または権限テーブル未準備。0件ではない

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • brandはカード商品名ではなく国際ブランドのMASTERCARDを返します。PHYSICAL/VIRTUALのいずれも同じ値です。
  • PAN/CVV/PINは返りません。
  • 既定include_existing=true。SAKURA保存済みMMcardレコードを読み、V-RECローカルDBと照合・重複排除。これはMatchMoveのライブステータスではありません。
  • SAKURA_ONLYのskc_...はこの一覧とカード取引履歴GETだけで使用可。停止・PIN・機密カード情報・発行会社ステータスの操作には使えません。
  • SAKURA上流障害は503。カード0件を意味しません。最大100件で切り詰められたらmeta.sakura_truncated=trueです。
  • ACTIVE/FULL会員、can_view_balance=1、cards.readとSAKURA Connected Apps cards権限が必要です。
POST /api/merchant/v1/users/{id}/cards VIRTUALカードをAPI発行 cards.issue
認証 加盟店HMAC認証 権限範囲 cards.issue Content-Type application/json 成功 HTTP 201

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

ヘッダー

項目型必須制約 / 意味
Idempotency-Keystring必須冪等キー8-190 chars; mandatory

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...

リクエスト本文

項目型必須制約 / 意味
card_typestring必須カード種別VIRTUAL only

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須V-REC利用者IDusr_...
cardobject必須mask済みカードno PAN/CVV
idempotent_replayboolean必須冪等再試行の場合のみtrue on replay

HTTP 201 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "card": {
        "id": "card_demo",
        "card_type": "VIRTUAL",
        "masked_pan": "**** **** **** 1234"
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON

署名・認証情報・タイムスタンプ等の検証に失敗

HTTP 403merchant_scope_denied / full_membership_required / merchant_membership_capability_denied / user_not_active形式: JSON

発行権限なし、所属またはユーザー状態が不適切

HTTP 404not_found形式: JSON

ユーザーがMerchantの範囲外

HTTP 409idempotency_key_reused_with_different_request / card_issue_reconciliation_required / card_issue_in_progress形式: JSON

冪等キー競合、結果不明の発行を照合中、または操作取得競合

HTTP 422idempotency_key_required / only_virtual_card_type_supported / card_issue_in_progress / kyc_not_approved / card_issue_pre_submission_rejected / card_issue_confirmed_not_issued形式: JSON

入力不正または発行会社へ未送信と確認できた失敗。card_issue_in_progressは送信前の同時実行ガードで422になる場合あり

HTTP 413request_too_large形式: JSON

リクエスト本文が大きすぎる

HTTP 503card_issue_reconciliation_required / card_issue_operation_unavailable形式: JSON

送信結果不明・操作レコードの照合が必要

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • cards.issueは運営者からの明示grant必須。成功後の再送は同じカードを返す。結果不明のリクエストを再発行しない。
  • card_issue_in_progressは実装上、ロック待ちの送信前ガードでは422、操作レコードの原子的取得競合では409になり得ます。
GET /api/merchant/v1/users/{id}/cards/issuance/{key} バーチャルカード発行結果の照会(再発行なし) cards.read
認証 加盟店HMAC認証 権限範囲 cards.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...
keystring必須発行時のIdempotency-Key8–190 chars; A-Z a-z 0-9 . _ : -

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "status": "COMPLETED",
    "card_id": "card_demo",
    "reconciliation_required": false,
    "automatic_resubmission_allowed": false,
    "updated_at": "2026-10-23 00:00:00"
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON

署名・認証情報・タイムスタンプ等の検証に失敗

HTTP 403merchant_scope_denied / full_membership_required / merchant_membership_capability_denied / user_not_active形式: JSON

cards.readまたは有効なFULL所属がない

HTTP 404not_found形式: JSON

対象Merchant・ユーザーに対応する発行記録がない

HTTP 422invalid_operation_key形式: JSON

キー形式が不正

HTTP 503membership_capabilities_unavailable形式: JSON

所属権限テーブルの準備ができていない

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 発行会社への再送は一切行いません。RECONCILE_REQUIREDは運営者の独立した証跡による照合が必要です。
  • 返却status: PENDING / COMPLETED / RECONCILE_REQUIRED / REJECTED_PRE_SUBMISSION / NOT_ISSUED_CONFIRMED。
GET /api/merchant/v1/users/{id}/cards/{cardId}/transactions V-RECまたは既存SAKURAカードのMatchMove取引履歴 transactions.read
認証 加盟店HMAC認証 権限範囲 transactions.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...
cardIdstring必須カード一覧から得たcard_...またはskc_...card_... V-REC local; skc_... SAKURA_ONLY 参照専用

クエリパラメータ

項目型必須制約 / 意味
fromdate任意検索開始日YYYY-MM-DD; default 30 days ago; maximum date span 90 days
todate任意検索終了日YYYY-MM-DD; default today; no later than UTC tomorrow
pageinteger任意ページdefault 1; 1-100
limitinteger任意取得件数default 20; 1-50

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須V-RECユーザー公開IDusr_...
card_idstring必須V-RECカード公開IDcard_...
sourcestring必須MatchMove発行会社明細matchmove
pageinteger必須ページ番号1-100
limitinteger必須要求件数1-50
fromdate必須開始日YYYY-MM-DD
todate必須終了日YYYY-MM-DD; max span 90 days
totalinteger|null必須上流総件数(未提供時null)null可
records_per_pageinteger必須実際の上流ページ件数used for next-page calculation
has_moreboolean必須次ページの有無best effort
itemsarray<object>必須カード単位の利用明細[] for valid no-transaction result
items[].idstring条件付き取引IDprovider value may be blank
items[].typestring条件付きカード取引種別provider value
items[].amountdecimal string|null条件付き取引額null可
items[].currencystring条件付き取引通貨provider value
items[].descriptionstring条件付き取引摘要provider value
items[].merchantstring条件付き加盟店名provider value
items[].statusstring条件付き処理状況provider value
items[].datestring条件付き日時provider string
items[].indicatorstring|null条件付き入出金区分null可

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "card_id": "card_demo",
    "items": [
        {
            "id": "EXAMPLE_CARD_TX",
            "type": "PURCHASE",
            "amount": "12.50",
            "currency": "USD",
            "description": "Example Store",
            "merchant": "Example Store",
            "status": "APPROVED",
            "date": "2026-11-04T01:00:00Z",
            "indicator": "debit"
        }
    ],
    "page": 1,
    "limit": 20,
    "from": "2026-10-05",
    "to": "2026-11-04",
    "total": 1,
    "records_per_page": 20,
    "has_more": false,
    "source": "matchmove"
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON

署名・認証情報・タイムスタンプ等の検証に失敗

HTTP 403merchant_scope_denied形式: JSON

権限なし

HTTP 404card_not_found形式: JSON

カードなし

HTTP 422invalid_filters形式: JSON

検索条件不正

HTTP 429too_many_attempts形式: JSON

レート制限

HTTP 503issuer_transactions_unavailable形式: JSON

決済履歴取得失敗

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 通常のMerchant台帳transactionとは異なり、SAKURA経由でMatchMove明細を毎回取得。
  • V-RECカード公開ID card_... を指定します。MatchMove生カードIDを直接指定しません。SAKURA Connected Appsのcards権限、ACTIVE/FULL所属、残高閲覧権限が必要です。
  • 日付範囲は最大90日。応答のitems[].date / merchant / indicatorはMatchMoveから正規化されたものです。
  • HTTP 200 items:[]は有効なゼロ件の候補ですが、カード発行の直後に必ず決済履歴が存在することを意味しません。上流障害は503です。
  • カード取引とMatchMoveウォレット取引は別の照会先です。ウォレット入出金は /matchmove-wallet-transactions を使用してください。
  • skc_...を指定する場合、SAKURAのプログラム・ユーザー紐づけを再検証し、読み取り専用で照会。MatchMoveの生IDは指定しません。
GET /api/merchant/v1/users/{id}/matchmove-wallet-transactions MatchMoveウォレット全体の取引履歴(カード別明細ではない) transactions.read
認証 加盟店HMAC認証 権限範囲 transactions.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...

クエリパラメータ

項目型必須制約 / 意味
pageinteger任意通常ページ番号。フィルター利用時は省略か1のみ1-100; default 1; filtered search only page=1
limitinteger任意ページ件数1-50; default 20
cursorstring任意前ページのnext_cursor。フィルターをすべて同じ値で再送max 512; search mode only
fromdate任意検索開始日(含む)。発行会社取引日のYYYY-MM-DDYYYY-MM-DD; から/to span <= 90d
todate任意検索終了日(含む)YYYY-MM-DD; から/to span <= 90d
categorystring任意検索用の正規化取引分類purchase|topup|transfer|atm|fee|authorization|card_issuance|adjustment|other
typestring任意MatchMoveの取引種別を完全一致検索(大文字小文字無視)free string max 80; e.g. Purchase
indicatorstring任意ウォレットの入金/出金credit|debit
qstring任意加盟店名・説明・種別・取引IDの部分一致最大120文字
min_amountdecimal string任意ウォレット取引金額の下限(含む)max 8 decimals
max_amountdecimal string任意ウォレット取引金額の上限(含む)max 8 decimals
currencystring任意取引通貨ISO 4217 / USD
original_currencystring任意元決済通貨ISO 4217 / JPY
statusstring任意上流取引ステータス完全一致e.g. Success
transaction_modestring任意ECOM/POS/ATMecom|pos|atm
mccstring任意加盟店カテゴリコードfour digits
transaction_idstring任意MatchMove取引IDの完全一致max 190
include_zero_amountboolean任意falseなら0円取引を除外true|false; 既定でtrue

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須V-REC利用者公開IDusr_...
sourcestring必須MatchMoveウォレットのライブ取得元MATCHMOVE_WALLET_LIVE
observed_atISO 8601 string必須SAKURAで取得した時刻UTC
pageinteger必須ページ番号1-100
limitinteger必須1ページの要求件数1-50
total_recordsinteger|null必須MatchMoveが返す総件数(不明ならnull)null可
has_moreboolean必須次ページ候補の有無best-effort if upstream count unknown
itemsarray<object>必須MatchMoveウォレット取引一覧。ページに取引なしなら空配列no card ID filter
items[].idstring|null条件付きMatchMove取引識別子null可
items[].transaction_datestring|null条件付き取引日時null可; provider string
items[].typestring|null条件付き取引タイプ(例:GET CARD)provider-specific
items[].descriptionstring|null条件付き加盟店名または内容null可
items[].indicatorstring|null条件付き入出金区分debit / credit / null
items[].amountdecimal string|null条件付き取引金額null可; do not float-round
items[].currencystring|null条件付き通貨コードnull可; do not assume USD
items[].statusstring|null条件付きMatchMove取引ステータスprovider-specific
pagination_modestring条件付き検索時に追加されるカーソル情報条件付き
next_cursorstring|null条件付き検索時に追加されるカーソル情報null可 in filter mode
search_completeboolean条件付き検索時に追加されるカーソル情報条件付き
scanned_recordsinteger条件付き検索時に追加されるカーソル情報条件付き
filtersobject条件付き検索時に追加されるカーソル情報null可 in filter mode
items[].categorystring条件付きMatchMoveの安全な追加参照項目(未提供時null)条件付き
items[].balancestring|null条件付きMatchMoveの安全な追加参照項目(未提供時null)条件付き
items[].merchant_namestring|null条件付きMatchMoveの安全な追加参照項目(未提供時null)条件付き
items[].merchant_category_codestring|null条件付きMatchMoveの安全な追加参照項目(未提供時null)条件付き
items[].merchant_countrystring|null条件付きMatchMoveの安全な追加参照項目(未提供時null)条件付き
items[].transaction_modestring|null条件付きMatchMoveの安全な追加参照項目(未提供時null)条件付き
items[].original_amountstring|null条件付きMatchMoveの安全な追加参照項目(未提供時null)条件付き
items[].original_currencystring|null条件付きMatchMoveの安全な追加参照項目(未提供時null)条件付き
items[].fee_amountstring|null条件付きMatchMoveの安全な追加参照項目(未提供時null)条件付き
items[].fee_currencystring|null条件付きMatchMoveの安全な追加参照項目(未提供時null)条件付き

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "source": "MATCHMOVE_WALLET_LIVE",
    "observed_at": "2026-11-04T08:00:00Z",
    "page": 1,
    "limit": 20,
    "total_records": 1,
    "has_more": false,
    "items": [
        {
            "id": "EXAMPLE_TRANSACTION_ID",
            "transaction_date": "2026-11-04T01:00:00Z",
            "type": "GET CARD",
            "description": "PP Consumer",
            "indicator": "debit",
            "amount": "0.00",
            "currency": "USD",
            "status": "SUCCESS",
            "category": "card_issuance",
            "balance": "0.00",
            "merchant_name": null
        }
    ]
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON

署名/認証が不正

HTTP 403merchant_scope_denied / user_not_active / full_membership_required / merchant_membership_capability_denied形式: JSON

transactions.read権限がない、またはACTIVE/FULL・残高閲覧権限条件に不一致

HTTP 404not_found形式: JSON

対象ユーザーが加盟店に紐づいていない

HTTP 409matchmove_wallet_not_linked / matchmove_wallet_identity_conflict / sakura_balances_scope_required形式: JSON

MatchMoveウォレット未連携/本人IDの不整合/SAKURA balances権限なし

HTTP 422invalid_filters形式: JSON

クエリの値、日付範囲、検索カーソル、ページング方式が不正

HTTP 429too_many_attempts形式: JSON

30件/分の照会制限

HTTP 503wallet_transactions_unavailable / membership_capabilities_unavailable形式: JSON

SAKURA/MatchMove照会不能。ゼロ件には置き換えない

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • SAKURA Connected Appsのbalances権限が必要です。対象ユーザーは当該MerchantでACTIVE/FULL、can_view_balance=1である必要があります。
  • MatchMoveのウォレット全体の取引です。SAKURAダッシュボード下段のMatchMove Transactionsに相当しますが、画面はローカル同期履歴、新APIはライブ照会であり件数・時刻差があり得ます。
  • カード別明細と混同しないでください。GET CARDなどのゼロ円イベントが返ってもカード利用を意味しません。
  • 同じSAKURAユーザーが複数加盟店に接続されている場合は他加盟店のアクティビティも含む可能性があります。利用者同意・閲覧範囲を事前に確認してください。
  • レスポンス例は架空の値で、実際の取引発生を示しません。
  • 検索条件を指定すると署名付きcursor方式になり、1リクエストでMatchMove最大100件を走査します。検索完了までnext_cursorを続けてください。検索途中のitems:[]は全件ゼロの意味ではありません。
  • 検索時total_records=nullです。cursor付き次回リクエストにも同じ検索条件とlimitを渡し、page=2以降は使用しないでください。
  • 期間検索はMatchMoveが実際に返すデータの範囲内です。公式ガイドでは約90日までを案内しています。DBに保存済みの古い取引をライブ取得できるとは限りません。
POST /api/merchant/v1/users/{id}/cards/{cardId}/status カードのフリーズ・サスペンド・解除(Merchant) cards.manage
認証 加盟店HMAC認証 権限範囲 cards.manage Content-Type application/json 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...
cardIdstring必須V-RECカード公開IDcard_...

リクエスト本文

項目型必須制約 / 意味
statusstring必須FREEZE/SUSPENDでFROZEN、UNFREEZEでACTIVEACTIVE|ACTIVATE|UNFREEZE|FROZEN|FREEZE|SUSPEND|SUSPENDED

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須対象V-RECユーザーusr_...
card.idstring必須対象カード公開IDcard_...
card.statusstring必須反映確認できたカードの状態ACTIVE or FROZEN
effective_statusstring必須発行会社に要求した実効状態ACTIVE or FROZEN

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_example",
    "card": {
        "id": "card_example",
        "status": "FROZEN"
    },
    "effective_status": "FROZEN"
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON

署名・認証情報・タイムスタンプ等の検証に失敗

HTTP 403merchant_scope_denied形式: JSON

権限なし

HTTP 404card_not_found形式: JSON

カードなし

HTTP 409closed_card_cannot_reactivate / card_status_update_rejected / active_merchant_membership_required形式: JSON

ローカルで閉鎖状態を検出した場合等の確定的な操作拒否(上位結果不明は503)

HTTP 422unsupported_card_status形式: JSON

指定状態非対応

HTTP 429too_many_attempts形式: JSON

レート制限

HTTP 503card_status_result_unconfirmed形式: JSON

発行会社の結果不明

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • カード操作はFULL所属・can_spend・明示cards.manageが必要。SUSPENDは発行会社のFROZENと同義であり、閉鎖はできません。PAN/CVV・PIN・パスワードはMerchantから参照不可。
POST /api/merchant/v1/users/{id}/cards/{cardId}/sensitive-link 本人パスワード認証用カード表示リンク cards.sensitive.link
認証 加盟店HMAC認証 権限範囲 cards.sensitive.link Content-Type application/json 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...
cardIdstring必須V-RECカード公開IDcard_...

OUT · 出力仕様

項目型有無制約 / 意味
urlstring必須V-REC本人確認URLHTTPS; one-time; expires in 300s
password_requiredboolean必須V-RECパスワード必須true
expires_in_secondsinteger必須リンク有効秒数300
displaystring必須表示形式HOSTED_VREC_ONLY

HTTP 200 · 期待レスポンス例

{
    "url": "https://v-rec.example/card-reveal#one-time-token",
    "expires_in_seconds": 300,
    "password_required": true,
    "display": "HOSTED_VREC_ONLY"
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON

署名・認証情報・タイムスタンプ等の検証に失敗

HTTP 403merchant_scope_denied / full_membership_required / merchant_membership_capability_denied / user_not_active形式: JSON

明示scope不足、所属またはユーザーが無効

HTTP 404not_found / card_not_found形式: JSON

対象ユーザーまたはカードが見つからない

HTTP 409card_not_active形式: JSON

カード状態がACTIVEではない

HTTP 422empty_body_required形式: JSON

空の本文または{}以外の本文は拒否

HTTP 429too_many_attempts形式: JSON

ユーザーごとの発行数制限を超過

HTTP 503membership_capabilities_unavailable / secure_public_url_not_configured形式: JSON

所属情報未準備または安全なHTTPS URL未設定

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • MerchantはPAN/CVVを取得不可。5分・1回限り。本人がV-RECドメインへパスワードを入力。運営者grantとV-RECパスワード設定が必要。
  • パスワード再認証:ユーザーごとのリンク発行は3件/24時間、パスワード試行は8回/24時間(全Merchant横断)。
GET /api/merchant/v1/users/{id}/matchmove-balance MatchMoveの利用可能残高を実照会 balances.read
認証 加盟店HMAC認証 権限範囲 balances.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須利用者ID
sourcestring必須データ取得元MATCHMOVE_LIVE
currencystring必須通貨ISO 4217
availabledecimal string必須カード利用可能額MatchMove direct
observed_atISO 8601必須取得時刻UTC
is_liveboolean必須MatchMove接続で実取得true

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "source": "MATCHMOVE_LIVE",
    "currency": "USD",
    "available": "123.45",
    "observed_at": "2026-10-22T12:00:00Z",
    "is_live": true
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON

署名・認証情報・タイムスタンプ等の検証に失敗

HTTP 403merchant_scope_denied形式: JSON

権限なし

HTTP 503matchmove_balance_unavailable形式: JSON

MatchMove直接照会不可

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 既存のbalanceとは異なりSAKURA経由でMatchMoveへHTTP照会。取得不能時は503、台帳残高を代返しない。
  • SAKURA内部ID(user_ref)はMerchantへ返さない。
POST /api/merchant/v1/users/{id}/cards/physical/link 既存Physical CardをProxy/Association IDで紐付け cards.write
認証 加盟店HMAC認証 権限範囲 cards.write Content-Type application/json 成功 HTTP 201

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

ヘッダー

項目型必須制約 / 意味
Idempotency-Keystring必須紐付け冪等性キー前後空白除去後に空でないこと, <=190; 欠落または >190 both return idempotency_key_required

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...

リクエスト本文

項目型必須制約 / 意味
assoc_numberstring必須物理カードのProxy/Association IDtrim -> remove ALL whitespace -> 大文字; その後 ^(?:PY)?\d{6,32}$; provider value normalized to PY + digits. Therefore raw input containing spaces may still be accepted.

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須V-RECユーザー公開IDusers.public_id; 現行で生成するIDは usr_...
card.idstring必須V-RECカード公開IDcards.public_id; card_...
card.card_typestring必須カード種別VIRTUAL|PHYSICAL
card.brandstring|null必須カードブランドcards.brandはnull可
card.masked_panstring|null必須マスク済みPANカード番号全桁(PAN)は返さない; null可
card.last4string|null必須PAN末尾4桁null可
card.currencystring必須カード通貨cards.currency
card.statusstring必須カード状態ACTIVE|FROZEN|CLOSED (保存値/プロバイダー正規化値)
card.atm_enabledboolean必須ATM利用可否。mutationレスポンスではboolにcastレスポンスのcardShape()が明示的に(bool)型変換; キーは常に存在
card.created_atstring必須カード登録時刻cards.created_at NULL不可のDB日時; キーは常に存在

HTTP 201 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "card": {
        "id": "card_demo",
        "card_type": "PHYSICAL",
        "brand": "MASTERCARD",
        "masked_pan": "**** **** **** 1234",
        "last4": "1234",
        "currency": "USD",
        "status": "ACTIVE",
        "atm_enabled": true,
        "created_at": "2026-10-05 01:00:00"
    }
}

想定エラー / HTTPレスポンス

HTTP 400invalid_json形式: JSON

JSON不正

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

HMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

HTTP 404not_found形式: JSON

{id}がこのMerchantに所属しない/INACTIVE

HTTP 422idempotency_key_required / assoc_number_required / invalid_assoc_number / kyc_not_approved / physical_link_requires_sakura_driver / sakura_cards_scope_required / idempotency_key_too_long / active_merchant_membership_required / vrec_instance_required / sakura_user_not_linked形式: JSON

入力/Provider validation

HTTP 503physical_card_link_unavailable形式: JSON

上流card link障害

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 仕様上はapplication/jsonです。現行ControllerはContent-Type自体を検査せずraw bodyをjson_decodeしますが、HMAC body hashはraw bytesそのものが対象です。
GET /api/merchant/v1/users/balances 自Merchantのユーザー残高(ウォレット情報)を一括取得 balances.read
認証 加盟店HMAC認証 権限範囲 balances.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

クエリパラメータ

項目型必須制約 / 意味
currencystring任意残高通貨3-letter code; default BASE_CURRENCY (USD); invalid => 422 invalid_currency
limitinteger任意1回の件数1–200, default 100
cursorstring任意前回レスポンスの next_cursorinvalid => 422 invalid_cursor

OUT · 出力仕様

項目型有無制約 / 意味
merchant_idstring必須Merchant公開ID
currencystring必須残高通貨
data[]array<object>必須ユーザーごとの残高。user id の昇順
data[].user_idstring必須V-RECユーザー公開IDusr_...
data[].beneficiary_idstring必須受取人ID
data[].membership_statusstring必須Membership状態ACTIVE etc. (INACTIVE is excluded)
data[].balance_view_allowedboolean必須残高を参照できるか(can_view_balance)。false の場合は金額を返さない
data[].balance_scopestring任意TENANT_MERCHANT / SOURCE_MERCHANT
data[].raw_balance / display_balance / held_balance / expired_locked / availabledecimal string任意GET /users/{id}/balance と同じ値(TENANT_MERCHANT の場合のみ)
data[].read_only / allocatable / spendable / withdrawableboolean任意GET /users/{id}/balance と同じ
data[].reference_balance_viastring任意READONLY(他Merchant由来の参照残高)の場合、金額は一括では返さず、このURLで1件ずつ取得する
next_cursorstring|null必須続きを取得するカーソル(has_more=false のとき null)
has_moreboolean必須続きがあるか

HTTP 200 · 期待レスポンス例

{
    "merchant_id": "mrc_demo",
    "currency": "USD",
    "data": [
        {
            "user_id": "usr_demo",
            "beneficiary_id": "VREC-ABC123",
            "membership_status": "ACTIVE",
            "currency": "USD",
            "balance_view_allowed": true,
            "balance_scope": "TENANT_MERCHANT",
            "source_merchant_id": "MRC_DEMO",
            "read_only": false,
            "allocatable": true,
            "spendable": true,
            "withdrawable": true,
            "raw_balance": "1500.00000000",
            "display_balance": "1500.00000000",
            "held_balance": "100.00000000",
            "expired_locked": "0.00000000",
            "available": "1400.00000000"
        },
        {
            "user_id": "usr_ref",
            "beneficiary_id": "VREC-DEF456",
            "membership_status": "ACTIVE",
            "currency": "USD",
            "balance_view_allowed": true,
            "balance_scope": "SOURCE_MERCHANT",
            "source_merchant_id": "MRC_OTHER",
            "read_only": true,
            "allocatable": false,
            "spendable": false,
            "withdrawable": false,
            "reference_balance_via": "/api/merchant/v1/users/usr_ref/balance"
        },
        {
            "user_id": "usr_hidden",
            "beneficiary_id": "VREC-GHI789",
            "membership_status": "ACTIVE",
            "currency": "USD",
            "balance_view_allowed": false
        }
    ],
    "next_cursor": "MTIz",
    "has_more": true
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

Merchant HMAC認証に失敗

HTTP 403merchant_scope_denied形式: JSON

balances.read scopeがCredentialにない

HTTP 422invalid_currency / invalid_cursor形式: JSON

クエリの形式が正しくない

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • INACTIVE以外の自Merchantのユーザーを user id の昇順に最大200件ずつ返します。has_more が true の間は next_cursor を cursor に渡して続きを取得してください。
  • 各行の金額・フラグは GET /users/{id}/balance と同じ値です(TENANT_MERCHANT)。
  • READONLY(他Merchant由来の参照残高)はSAKURAへの照会が1件ずつ必要なため、一括では金額を返しません。reference_balance_via のURLで個別に取得してください。can_view_balance=false のユーザーは金額を返しません。
GET /api/merchant/v1/users/{id}/balance Merchant単位のユーザー残高取得 balances.read
認証 加盟店HMAC認証 権限範囲 balances.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...

クエリパラメータ

項目型必須制約 / 意味
currencystring任意残高通貨省略時=>BASE_CURRENCY; クエリキーが存在する場合, trim+strtoupperのみを実施. An 明示的な空文字 currency 空文字のままとなる; no ISO validation in 現行コントローラー.

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須V-RECユーザー公開ID
merchant_idstring必須Merchant公開ID
currencystring必須残高通貨
balance_scopestring必須残高の種類TENANT_MERCHANT (this Merchant) / SOURCE_MERCHANT (READONLY reference)
source_merchant_idstring|null必須ユーザーの登録元SAKURA Merchant
read_onlyboolean必須参照専用(READONLY)か
allocatableboolean必須テナント資金を割り当てられるか
spendableboolean必須利用できるか
withdrawableboolean必須ATM出金できるか
raw_balancedecimal-string必須会計上の生残高。負数になり得る
display_balancedecimal-string必須画面表示残高。負数は0へclamp
held_balancedecimal-string必須Authorization hold合計
expired_lockeddecimal-string必須失効等で利用不可のロック残高
availabledecimal-string必須利用可能残高max(display-held-expired, 0)

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "merchant_id": "mrc_demo",
    "currency": "USD",
    "balance_scope": "TENANT_MERCHANT",
    "source_merchant_id": "MRC_DEMO",
    "read_only": false,
    "allocatable": true,
    "spendable": true,
    "withdrawable": true,
    "raw_balance": "1500.00000000",
    "display_balance": "1500.00000000",
    "held_balance": "100.00000000",
    "expired_locked": "0.00000000",
    "available": "1400.00000000"
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

HMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

HTTP 404not_found形式: JSON

user境界外

HTTP 403balance_view_not_allowed形式: JSON

Membershipの can_view_balance が false

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

GET /api/merchant/v1/users/{id}/transactions Merchant balance ledger entry一覧 transactions.read
認証 加盟店HMAC認証 権限範囲 transactions.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECユーザー公開IDusr_...

クエリパラメータ

項目型必須制約 / 意味
limitinteger任意取得件数PHP (int) 型変換 その後 clamp 1..200; 省略時=>50; abc/0/negative=>1; >200=>200

OUT · 出力仕様

項目型有無制約 / 意味
data[].public_idstring必須加盟店残高の取引IDvbe_...
data[].amountdecimal-string必須増減額
data[].currencystring必須通貨
data[].entry_typestring必須仕訳種別
data[].reference_typestring必須参照種別DBカラムはNULL不可; キーは常に存在
data[].reference_idstring必須参照IDDBカラムはNULL不可; キーは常に存在
data[].metadata_jsonstring|null必須メタデータJSON文字列キーは常に存在; DB value null可 JSON text
data[].created_atstring必須作成時刻

HTTP 200 · 期待レスポンス例

{
    "data": [
        {
            "public_id": "vbe_demo",
            "amount": "100.00",
            "currency": "USD",
            "entry_type": "CREDIT",
            "reference_type": "PAYOUT",
            "reference_id": "po_demo",
            "metadata_json": "{}",
            "created_at": "2026-10-05 01:00:00"
        }
    ]
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

HMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

HTTP 404not_found形式: JSON

user境界外

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

GET /api/merchant/v1/payouts 当該MerchantのPayout一覧 payouts.read
認証 加盟店HMAC認証 権限範囲 payouts.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

OUT · 出力仕様

項目型有無制約 / 意味
data[].public_idstring必須Payout公開IDpo_...
data[].beneficiary_idstring必須受取人ID
data[].amountdecimal-string必須送金額
data[].currencystring必須通貨
data[].external_referencestring|null必須外部参照DBカラムはnull可; キーは常に存在
data[].purposestring必須用途
data[].statusstring必須Payout状態
data[].created_atstring必須作成時刻
data[].credited_atstring|null必須V-REC入金時刻キーは常に存在; null until credited
data[].user_idstring必須V-RECユーザー公開ID
data[].emailstring必須ユーザーメール

HTTP 200 · 期待レスポンス例

{
    "data": [
        {
            "public_id": "po_demo",
            "beneficiary_id": "VREC-DEMO",
            "amount": "100.00",
            "currency": "USD",
            "external_reference": "INV-1001",
            "purpose": "corporate_payout",
            "status": "CREDITED",
            "created_at": "2026-10-05 01:00:00",
            "credited_at": "2026-10-05 01:01:00",
            "user_id": "usr_demo",
            "email": "[email protected]"
        }
    ]
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

HMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 現在は最大200件を新しい順に返します。
GET /api/merchant/v1/report Merchant集計値取得 reports.read
認証 加盟店HMAC認証 権限範囲 reports.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

クエリパラメータ

項目型必須制約 / 意味
currencystring任意集計通貨省略時=>BASE_CURRENCY; trim+strtoupperのみを実施; 明示的な空文字 空文字のままとなる; 現行コードはISOの長さ・値を検証しない.

OUT · 出力仕様

項目型有無制約 / 意味
merchant_idstring必須Merchant公開ID
currencystring必須集計通貨
raw_balancedecimal-string必須Merchant全ユーザー会計残高合計
display_balancedecimal-string必須負数を0へclampした表示用合計
active_usersinteger必須ACTIVE membership数
payoutsinteger必須Payout総件数

HTTP 200 · 期待レスポンス例

{
    "merchant_id": "mrc_demo",
    "currency": "USD",
    "raw_balance": "15000.00",
    "display_balance": "15000.00",
    "active_users": 125,
    "payouts": 310
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

HMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗

HTTP 403merchant_scope_denied形式: JSON

必要scope不足

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

GET /api/merchant/v1/users/{id}/wallet ユーザーのウォレット残高を参照(読み取り専用) wallets.read
認証 加盟店HMAC認証 権限範囲 wallets.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-REC User IDusr_...

クエリパラメータ

項目型必須制約 / 意味
skip_balancesany任意指定時はオンチェーン残高を取得しない

OUT · 出力仕様

項目型有無制約 / 意味
user_id / merchant_idstring必須V-REC User / Merchant ID
read_onlyboolean必須常にtrue。MerchantはウォレットをAPIで操作できません
has_walletboolean必須ウォレットの有無
walletobject|null必須address, version, network, chain_id, created_at
balancesobject|null必須wallet_summary.balances と同形
gaslessobject必須allowed, reason, daily_limit, daily_remaining
transfer_blockedboolean必須運営による送金停止

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_...",
    "merchant_id": "mrc_demo",
    "read_only": true,
    "has_wallet": true,
    "wallet": {
        "address": "0x3f5c...",
        "version": 1,
        "network": "ethereum",
        "chain_id": 1,
        "created_at": "2026-10-16T01:00:00+00:00"
    },
    "balances": {
        "usdt": {
            "symbol": "USDT",
            "contract": "0xdac17f958d2ee523a2206206994597c13d831ec7",
            "decimals": 6,
            "balance": "120.500000",
            "pending_incoming": "0.000000",
            "available": "120.500000"
        },
        "eth": {
            "symbol": "ETH",
            "balance": "0.000000000000000000"
        },
        "complete": true,
        "fetched_at": "2026-10-16T01:02:03+00:00"
    },
    "gasless": {
        "allowed": true,
        "reason": "merchant_managed",
        "daily_limit": 5,
        "daily_remaining": 4
    },
    "transfer_blocked": false
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_signature_invalid / ...形式: JSON

HMAC認証失敗

HTTP 403merchant_scope_denied / balance_view_not_allowed形式: JSON

wallets.read 不足 / membershipの残高参照不可

HTTP 404not_found / wallet_user_not_found形式: JSON

Merchant配下にいない / SAKURA側未連携

HTTP 409wallet_not_available / wallet_reference_unavailable形式: JSON

SAKURA crypto_wallet 権限なし / READONLY会員の参照元なし

HTTP 503wallet_service_unavailable形式: JSON

一時障害

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • MerchantはAPIでウォレットの作成・入れ替え・送金はできません。シードフレーズ・鍵・ウォレットパスワードは一切返しません。
GET /api/merchant/v1/crypto-sales 暗号資産売買の実績・手数料・ロイヤリティ crypto_sales.read
認証 加盟店HMAC認証 権限範囲 crypto_sales.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

クエリパラメータ

項目型必須制約 / 意味
from / todate任意完了日の範囲YYYY-MM-DD
limitinteger任意件数1..500

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "merchant_id": "mrc_demo",
    "totals": {
        "sales_count": 2,
        "gross_usd": "110.000000",
        "company_fee_usd": "1.100000",
        "merchant_royalty_usd": "0.550000"
    },
    "totals_basis": "returned_rows",
    "data": [
        {
            "contract_no": "VCS-20261016-AB12CD34EF",
            "contract_type": "SALE",
            "status": "COMPLETED",
            "product": "SGP_USD",
            "product_name": "SGP-USD",
            "product_quantity": "98.500000",
            "seller": "SAKURA_EXCHANGE",
            "payment": {
                "asset": "USDT",
                "symbol": "USDT",
                "amount": "100.000000",
                "unit_price_usd": "1.00000000",
                "pay_to_address": "0x...",
                "tx_hash": null
            },
            "pricing": {
                "gross_usd": "100.000000",
                "company_fee_rate": "0.01000000",
                "company_fee_usd": "1.000000",
                "merchant_royalty_rate": "0.00500000",
                "merchant_royalty_usd": "0.500000",
                "net_usd": "98.500000",
                "points_per_usd": null
            },
            "merchant_responsibility": false,
            "quote_expires_at": "2026-10-16T01:10:00+00:00",
            "terms": {
                "version": "2026-10-16",
                "seller_name": "SAKURA EXCHANGE GUAM INC.",
                "ja": [
                    "本契約は、購入者が暗号資産(USDT)を代金として、売主から「SGP-USD」を購入する売買契約です。通貨の両替ではありません。"
                ],
                "en": [
                    "This is a sale contract …"
                ]
            },
            "replayed": false,
            "user_id": "usr_demo"
        }
    ]
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / ...形式: JSON

HMAC認証失敗

HTTP 403merchant_scope_denied形式: JSON

crypto_sales.read 不足

HTTP 409wallet_not_available形式: JSON

SAKURA crypto_wallet 権限なし

HTTP 503crypto_sales_unavailable形式: JSON

一時障害

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • この Merchant に所属する利用者の完了済み売買のみ。参照専用で、Merchantが購入を代行することはできません。
GET /api/merchant/v1/crypto-sales/funding-status SGPUSD売買のAML/prefund承認状態(加盟店別、READONLY) crypto_funding.read
認証 加盟店HMAC認証 権限範囲 crypto_funding.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

クエリパラメータ

項目型必須制約 / 意味
contract_nostring任意VCS契約番号^VCS-[A-Za-z0-9-]{1,36}$
user_idstring任意加盟店に属するV-RECユーザー公開IDusr_...; cannot combine with user_ref
user_refstring任意SAKURA側USR参照^USR_[0-9]{1,16}$; cannot combine with user_id
aml_statusenum任意AML審査状態PENDING|APPROVED|REJECTED
prefund_statusenum任意prefund審査状態PENDING|VERIFIED|REJECTED
card_funding_allowedenum任意カード充当可否フラグ0|1
cursorstring任意次ページ用opaque cursormax 256; Merchant-bound, expires in 1h; do not use after_id
limitinteger任意取得上限1-100; default server limit

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "merchant_id": "mrc_demo",
    "data": [
        {
            "contract_no": "VCS-DEMO",
            "user_id": "usr_demo",
            "aml_status": "APPROVED",
            "prefund_status": "VERIFIED",
            "card_funding_allowed": true
        }
    ],
    "has_more": false,
    "next_cursor": null,
    "funding_check_type": "MIXED_BY_ROW",
    "note": "Prefund status is an operator review record, not proof of a MatchMove balance."
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_failed形式: JSON

HMAC credential認証失敗

HTTP 403merchant_scope_denied / balance_view_not_allowed形式: JSON

crypto_funding.read権限不足、または残高可視権限なし

HTTP 404not_found形式: JSON

指定したuser_idは加盟店に所属しない

HTTP 409funding_status_not_enabled / funding_status_unavailable / user_sakura_link_unavailable形式: JSON

SAKURA連携スコープ・状態が利用不可

HTTP 422invalid_cursor / ambiguous_user_filter / invalid_...形式: JSON

フィルター値・カーソルの形式が不正

HTTP 503funding_capabilities_unavailable / funding_status_unavailable形式: JSON

会員権限スキーマ・連携APIが利用不可

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • APIは読取専用です。AML承認・prefund確認そのものを実行するAPIではありません。承認操作はSAKURA管理者専用です。
  • 加盟店のACTIVE/FULL会員でcan_view_balance=1の利用者のみ返します。V-RECの公開ユーザーIDだけを返し、SAKURAの内部user_refや審査理由、審査者IDは除外します。
  • card_funding_allowedはカード利用可能額そのものではありません。手動prefundは運営上の確認であり、MatchMoveへの実残高入金の証明ではありません。
GET /api/merchant/v1/users/{id}/kyc/schema SAKURA最新のKYC入力項目を取得 kyc.preload
認証 加盟店HMAC認証 権限範囲 kyc.preload 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-REC公開ユーザーIDusr_...

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "form": {
        "fields": []
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_signature_invalid形式: JSON

HMAC認証失敗

HTTP 403merchant_scope_denied形式: JSON

明示scope不足

HTTP 503sakura_unavailable形式: JSON

SAKURA上流失敗

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 入力書式と書類キーは固定せずSAKURAの現在値を使用。
POST /api/merchant/v1/users/{id}/kyc/preload KYC情報と証憑を事前保存 kyc.preload
認証 加盟店HMAC認証 権限範囲 kyc.preload Content-Type application/json 成功 HTTP 201

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

ヘッダー

項目型必須制約 / 意味
Idempotency-Keystring必須KYC提出冪等性キー8..190 chars; raw JSON same on retry

パスパラメータ

項目型必須制約 / 意味
idstring必須V-REC公開ユーザーIDusr_...

リクエスト本文

項目型必須制約 / 意味
fieldsobject必須SAKURA KYCFORMのスカラー値max 100
documents.<field>.data_base64string必須最大6枚のBase64画像JPEG/PNG, <=5MiB each, <=10MiB total
consent.confirmedboolean必須本人の明示同意true
consent.obtained_atdate-time必須同意日時past 30d
consent.evidence_refstring必須原記録参照ID8..190 chars
consent.terms_versionstring必須同意文書版

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須V-REC公開ID
draft_savedboolean必須事前登録完了。falseならリンク発行不可
kyc_statusstring必須KYC状態(APPROVEDとは限らない)
next_actionstring|object|null任意次の処理

HTTP 201 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "draft_saved": true,
    "kyc_status": "PENDING",
    "next_action": {
        "type": "ready_for_ekyc"
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_signature_invalid形式: JSON

HMAC認証失敗

HTTP 403merchant_scope_denied形式: JSON

明示scope不足

HTTP 503sakura_unavailable形式: JSON

SAKURA上流失敗

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 通信失敗・500応答では副作用不明。reconciliation_requiredなら再送せず運営照合。
  • 入力項目名はGET kyc/schemaで確認。
POST /api/merchant/v1/users/{id}/kyc/onboarding-link 本人に配送するSAKURA eKYCリンクを取得 kyc.link.issue
認証 加盟店HMAC認証 権限範囲 kyc.link.issue Content-Type application/json 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-REC公開ユーザーIDusr_...

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須V-REC公開ID
ekyc_urlstring|null条件付き本人宛のみ配送する短縮URL
kyc_statusstring必須本人確認状態
next_actionstring|object|null任意次の処理

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "ekyc_url": "https://sakura.example/kyc/EXAMPLE",
    "kyc_status": "PENDING",
    "next_action": "send_link_to_user"
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_signature_invalid形式: JSON

HMAC認証失敗

HTTP 403merchant_scope_denied形式: JSON

明示scope不足

HTTP 503sakura_unavailable形式: JSON

SAKURA上流失敗

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 202ではまだURLがありません。409はdraft未完了・審査保留・照合要求。
  • URLは本人だけに安全送付しログへ残さない。
GET /api/merchant/v1/users/{id}/cards/{cardId}/issuer-status MatchMoveの最新カード状態照会 cards.read
認証 加盟店HMAC認証 権限範囲 cards.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須ユーザー公開IDusr_...
cardIdstring必須カード公開IDcard_...

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須ユーザー公開IDusr_...
card_idstring必須カード公開IDcard_...
issuer_statusstring必須MatchMove現在状態ACTIVE|FROZEN|CLOSED
sourcestring必須データ取得元MATCHMOVE_LIVE
observed_atISO 8601必須照会時刻UTC

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "card_id": "card_demo",
    "issuer_status": "FROZEN",
    "source": "MATCHMOVE_LIVE",
    "observed_at": "2026-10-23T00:00:00Z"
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON

署名・認証情報・タイムスタンプ等の検証に失敗

HTTP 403merchant_scope_denied形式: JSON

権限なし

HTTP 404card_not_found形式: JSON

カードなし

HTTP 503issuer_card_status_unavailable形式: JSON

発行会社へ確認できず

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • SAKURA DBに保存したカード状態ではなく、MatchMoveにHTTP GETで照会する。
ベースURL

テナント資金管理の加盟店API

https://api.v-rec.xyz
GET /api/merchant/v1/tenant-funding/balance SAKURA正本のTenant資金残高・失効ポリシー取得 tenant_funding.read
認証 加盟店HMAC認証 権限範囲 tenant_funding.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

OUT · 出力仕様

項目型有無制約 / 意味
merchant_idstring必須認証Credentialに紐づくV-REC Merchant公開IDmrc_...
tenant_funding.tenant_refstring必須SAKURA Tenant Account参照VTA_...
tenant_funding.currencystring必須Tenant Funding通貨USD
tenant_funding.source_assetstring必須SAKURA側の原資Asset現行実装: SGP-USD
tenant_funding.commitmentdecimal string必須テナント会計上の引当額SAKURA側を正とする
tenant_funding.reserveddecimal string必須処理中Operation等で予約済みの会計額SAKURA側を正とする
tenant_funding.availabledecimal string必須新規配賦の会計上の利用可能額SAKURA側を正とする; 実行時に再検証する
tenant_funding.fundeddecimal string必須累計funded principalSAKURA側を正とする
tenant_funding.returneddecimal string必須累計returned principalSAKURA側を正とする
tenant_funding.feesdecimal string必須累計Tenant Funding feeSAKURA側を正とする
tenant_funding.funding_fee_fixeddecimal string必須1回の割当ごとにかかる固定手数料。割当には「金額+この手数料」が available 以内である必要があるSAKURA側を正とする; 0 の場合 no fee is configured
tenant_funding.expiry_policystring必須現在有効な資金失効ポリシー例:EXPIRABLE_180 / NO_EXPIRY
tenant_funding.expiry_daysinteger|null必須有効期限日数。失効なしの場合nullになり得る通常180日 の場合 EXPIRABLE_180
tenant_funding.statusstring必須SAKURA Tenant状態新規資金割当ではACTIVEを想定
tenant_funding.modestring必須SAKURAテナント資金管理モード新規資金割当にはENFORCEDが必須
tenant_funding.reconciliation_statusstring必須SAKURA reconciliation状態SUSPENDED_RECONCILIATIONでは新規資金移動不可
tenant_funding.last_reconciled_atstring|null必須最終reconciliation時刻SAKURAから取得したUTC/ISO形式の値

HTTP 200 · 期待レスポンス例

{
    "merchant_id": "mrc_demo",
    "tenant_funding": {
        "tenant_ref": "VTA_12345678",
        "currency": "USD",
        "source_asset": "SGP-USD",
        "commitment": "15000.00000000",
        "reserved": "0.00000000",
        "available": "12497.50000000",
        "funded": "2500.00000000",
        "returned": "0.00000000",
        "fees": "2.50000000",
        "funding_fee_fixed": "2.50000000",
        "expiry_policy": "EXPIRABLE_180",
        "expiry_days": 180,
        "status": "ACTIVE",
        "mode": "ENFORCED",
        "reconciliation_status": "MATCHED",
        "last_reconciled_at": "2026-10-05T06:00:00Z"
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

Merchant HMAC認証に失敗

HTTP 403merchant_scope_denied形式: JSON

必要なtenant_funding scopeがCredentialにない

HTTP 422tenant_binding_not_found形式: JSON

認証MerchantにTenant Funding bindingがない

HTTP 503sakura_not_connected / tenant_not_found / tenant_funding_scope_not_granted / <upstream error>形式: JSON

SAKURA Connected AppまたはTenant Funding正本へ到達できない

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • V-RECはTenant availableを独自正本として保存しません。表示値はSAKURA正本です。
  • availableは予約ではありません。実際のallocate時にSAKURA/MatchMove側で再検証されます。
  • funding_fee_fixed は1回の割当ごとの固定手数料です。割当には「金額+funding_fee_fixed」が available 以内である必要があります。
  • available を超える金額で POST /tenant-funding/allocations を呼ぶと、資金は動かず HTTP 409(status=REJECTED, error=insufficient_tenant_available)になります。
GET /api/merchant/v1/tenant-funding/diagnostics Tenant Funding運用状態を資金移動なしで診断 tenant_funding.read
認証 加盟店HMAC認証 権限範囲 tenant_funding.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

クエリパラメータ

項目型必須制約 / 意味
user_idstring任意Membership/割当可否まで確認するV-REC User公開ID認証済み加盟店に所属する必要がある; 省略時 => Tenant-wide diagnostics only

OUT · 出力仕様

項目型有無制約 / 意味
merchant_idstring必須認証Merchant公開IDmrc_...
diagnostics.schema.tenant_fundingboolean必須Tenant Funding schema適用済み参照のみの確認
diagnostics.schema.membership_capabilitiesboolean必須FULL/READONLY capability schema適用済み参照のみの確認
diagnostics.schema.direct_allocationboolean必須v2.4.2直接Allocation schema適用済み参照のみの確認
diagnostics.bindingobject|null必須現在MerchantのTenant bindingtenant_ref/local_mode/tenant_lots_withdrawable
diagnostics.sakura.reachableboolean必須SAKURA Tenant Funding正本へ到達できたか資金移動なし
diagnostics.sakura.statusobject|null必須SAKURAのTenant管理/status結果参照専用
diagnostics.sakura.balanceobject|null必須SAKURA正本のTenant balance参照専用
diagnostics.operationsobject必須balance/capacity/allocate/reverse/returnの現在の実行可能性診断用フラグのみ
diagnostics.userobject|null必須user_id指定時のMembership/Source-Target Merchant/KYC/SAKURA link/capacity情報認証済み加盟店に属するユーザーのみ返却

HTTP 200 · 期待レスポンス例

{
    "merchant_id": "mrc_demo",
    "diagnostics": {
        "schema": {
            "tenant_funding": true,
            "membership_capabilities": true,
            "direct_allocation": true
        },
        "binding": {
            "tenant_ref": "VTA_12345678",
            "local_mode": "ENFORCED",
            "tenant_lots_withdrawable": true
        },
        "sakura": {
            "reachable": true,
            "status": {
                "management_enabled": true,
                "api_execute_enabled": true
            },
            "balance": {
                "available": "12497.50",
                "expiry_policy": "EXPIRABLE_180"
            },
            "error": null
        },
        "user": {
            "public_id": "usr_demo",
            "found": true,
            "kyc_status": "APPROVED",
            "membership_status": "ACTIVE",
            "access_mode": "FULL",
            "source_sakura_merchant_ref": "MRC_A",
            "target_sakura_merchant_ref": "MRC_A",
            "sakura_user_link_present": true,
            "can_receive_tenant_funds": true,
            "capacity": {
                "allocatable_amount": "12497.50"
            }
        },
        "operations": {
            "balance_read": true,
            "capacity_check": true,
            "allocate": true,
            "allocation_status_read": true,
            "allocation_reverse": true,
            "user_return": false
        }
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_signature_invalid / ...形式: JSON

Merchant HMAC認証に失敗

HTTP 403merchant_scope_denied形式: JSON

tenant_funding.read scope不足

HTTP 503tenant_funding_diagnostics_failed形式: JSON

診断生成自体に一時障害

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • このAPIはfund/return/reverseを実行しません。実資金を動かす前の確認専用です。
  • READONLYユーザーはカード閲覧可でもoperations.allocate=falseとなり、Source Merchant≠Target Merchantを視覚的に確認できます。
GET /api/merchant/v1/tenant-funding/users/{id}/capacity ユーザーへのTenant資金割当可否・割当可能額(上限の目安)確認 tenant_funding.read
認証 加盟店HMAC認証 権限範囲 tenant_funding.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idpath string必須V-RECユーザー公開IDusr_...; 会員所属は認証済み加盟店のものであること

クエリパラメータ

項目型必須制約 / 意味
currencystring任意判定通貨既定はUSD; 現行実装 USDのみ受け付ける

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須対象V-RECユーザー公開IDusr_...
merchant_idstring必須認証Merchant公開IDmrc_...
eligibleboolean必須このMembershipへTenant資金を配賦可能か成功時の応答はtrue
currencystring必須判定通貨USD
allocatable_amountdecimal string必須今このユーザーへ割り当てられる上限額の目安(テナント利用可能額−割当手数料、セント未満切り捨て)non-reserving preflight; 実行時に再検証する SAKURA and the Merchant MatchMove wallet
tenant_availabledecimal string必須テナントの利用可能額(SAKURA正本)balance.availableと同じ参照元
funding_feedecimal string必須1回の割当ごとの固定手数料0 の場合 no fee is configured
user_tenant_origin_remainingdecimal string必須当該Tenant由来lotのユーザー未使用残額V-REC資金源台帳
tenant_refstring必須対象Tenant参照VTA_...
access_modestring必須会員所属のアクセスモードキャパシティ照会成功時はFULL
expiry_policystring|null必須新規配賦に適用される現在の失効ポリシー実行時にSAKURAが最終状態のスナップショットを返却
expiry_daysinteger|null必須現在の失効日数一般に180日 for EXPIRABLE_180
reconciliation_statusstring|null必須Tenant reconciliation状態新規の資金移動には正常な状態が必要

HTTP 200 · 期待レスポンス例

{
    "user_id": "usr_demo",
    "merchant_id": "mrc_demo",
    "eligible": true,
    "currency": "USD",
    "allocatable_amount": "12495.00",
    "tenant_available": "12497.50000000",
    "funding_fee": "2.50000000",
    "user_tenant_origin_remaining": "500.00000000",
    "tenant_ref": "VTA_12345678",
    "access_mode": "FULL",
    "expiry_policy": "EXPIRABLE_180",
    "expiry_days": 180,
    "reconciliation_status": "MATCHED"
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

Merchant HMAC認証に失敗

HTTP 403merchant_scope_denied形式: JSON

必要なtenant_funding scopeがCredentialにない

HTTP 404not_found形式: JSON

ユーザーがこのMerchantのMembershipとして存在しない

HTTP 403tenant_funding_not_allowed_for_membership / cross_merchant_tenant_funding_not_allowed形式: JSON

READONLY、can_receive_tenant_funds=false、またはSource Merchant≠Tenant Merchant

HTTP 422tenant_funding_usd_only / tenant_membership_not_active形式: JSON

USD以外、またはMembershipがACTIVEではない

HTTP 503membership_capabilities_not_installed / tenant_funding_not_enabled_in_sakura / <upstream error>形式: JSON

必要migration未適用、SAKURA Tenant Funding停止、または正本照会不能

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • READONLYでもカード情報閲覧は別権限(cards.read)で可能ですが、このcapacity APIは403になり資金割当には使えません。
  • allocatable_amount = テナント利用可能額(tenant_available)− 割当手数料(funding_fee)をセント未満切り捨てた値です。TopUp(allocate)前の上限チェックに使えます。
  • 非予約の事前確認値です。実行時にSAKURAが残高と加盟店のMatchMoveウォレット残高を再確認し、不足していれば409・REJECTEDになります。
  • eligible=false 相当の条件(READONLY、can_receive_tenant_funds=false、別Merchant由来)は403で返ります。KYC未承認のユーザーはallocate時に422(kyc_not_approved)です。
POST /api/merchant/v1/tenant-funding/allocations Tenant資金をV-REC Userへ直接割当 tenant_funding.write
認証 加盟店HMAC認証 権限範囲 tenant_funding.write Content-Type application/json 成功 HTTP 201 / 202

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

ヘッダー

項目型必須制約 / 意味
Idempotency-Keyヘッダー文字列必須同一論理Allocationの冪等性キー前後空白除去後に空でないこと; 最大190文字; reuse with different user/amount => 409

リクエスト本文

項目型必須制約 / 意味
user_idstring必須対象V-RECユーザー公開IDusr_...。同一資金元加盟店にACTIVE/FULLで所属すること
amountdecimal string必須配賦principalUSDの正の金額(セント単位で厳密に指定)

OUT · 出力仕様

項目型有無制約 / 意味
allocation.idstring必須V-RECテナント資金割当操作IDvta_...
allocation.user_idstring必須配賦対象V-RECユーザー公開IDusr_...
allocation.amountdecimal string必須要求principalセント単位で指定する正のUSD金額
allocation.currencystring必須通貨USD
allocation.statusstring必須Allocation状態。COMPLETED=反映済み、REJECTED=実行されず資金は動いていない(確定)、FAILED/MISMATCH=要確認(確定)、SUBMITTING/UNKNOWN/RECONCILE_REQUIRED=未確定(同じIdempotency-Keyで再送して確定)SUBMITTING / UNKNOWN / RECONCILE_REQUIRED / COMPLETED / REJECTED / FAILED / MISMATCH
allocation.error_codestring|null必須機械判定用のエラーコード(REJECTED等の理由)。例: insufficient_tenant_available, insufficient_merchant_physicalnull の場合 not applicable
allocation.sakura_request_uuidstring|null必須SAKURA側Funding Request UUID上流システムの応答後に設定
allocation.errorstring|null必須非正常状態の診断コード/要約シークレットは公開しない
allocation.created_atstring|null必須Operation作成時刻DBに保存されたUTC時刻
allocation.completed_atstring|null必須COMPLETED確定時刻完了までnull

HTTP 201 / 202 · 期待レスポンス例

{
    "allocation": {
        "id": "vta_demo",
        "user_id": "usr_demo",
        "amount": "100.00000000",
        "currency": "USD",
        "status": "COMPLETED",
        "error_code": null,
        "sakura_request_uuid": "01J...",
        "error": null,
        "created_at": "2026-10-05 07:00:00",
        "completed_at": "2026-10-05 07:00:01"
    }
}

HTTP 409 · 実行されなかった場合(REJECTED)の例

{
    "error": "insufficient_tenant_available",
    "allocation": {
        "id": "vta_demo2",
        "user_id": "usr_demo",
        "amount": "50000.00000000",
        "currency": "USD",
        "status": "REJECTED",
        "error_code": "insufficient_tenant_available",
        "sakura_request_uuid": null,
        "error": "insufficient_tenant_available: Tenant available is insufficient. available=12497.50, required=50002.50",
        "created_at": "2026-10-05 07:00:00",
        "completed_at": null
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

Merchant HMAC認証に失敗

HTTP 403merchant_scope_denied形式: JSON

必要なtenant_funding scopeがCredentialにない

HTTP 400invalid_json形式: JSON

request bodyがJSON objectではない

HTTP 404not_found形式: JSON

対象ユーザーがこのMerchantに存在しない

HTTP 422idempotency_key_required / user_id_and_amount_required / invalid_amount / kyc_not_approved / tenant_membership_not_active / sakura_user_link_missing / tenant_funding_not_installed形式: JSON

必須値、金額、KYC、Membership、SAKURA link、migration前提のいずれかを満たさない

HTTP 403tenant_funding_not_allowed_for_membership / cross_merchant_tenant_funding_not_allowed形式: JSON

READONLYまたはクロスマーチャントMembershipへの新規資金移転

HTTP 409insufficient_tenant_available / insufficient_merchant_physical / tenant_funding_not_enabled / user_mm_missing / merchant_mm_missing / user_not_in_tenant_program / idempotency_key_reused / operation_in_progress / unresolved_request_exists / tenant_allocation_rejected形式: JSON

資金を動かさずに拒否された(確定)。主な理由:金額+手数料がテナント利用可能額を超える、加盟店のMatchMoveウォレット残高不足、Tenant Funding停止、同一Idempotency-Keyを別内容で再利用、同じユーザーへの別の資金操作が処理中(operation_in_progress / unresolved_request_exists)。REJECTEDは資金が動いていないため、原因を解消して新しいIdempotency-Keyで作り直してください。レスポンスには error と allocation(status=REJECTED, error_code)が入ります

HTTP 503membership_capabilities_not_installed / tenant_allocation_api_not_installed / tenant_funding_not_enabled_in_sakura / tenant_funding_internal_error / <upstream error>形式: JSON

Tenant Funding停止、SAKURA/MatchMove不明状態、または内部一時障害

HTTP 202(allocation.status = SUBMITTING / UNKNOWN / RECONCILE_REQUIRED)形式: JSON

一時的な競合・通信障害などで結果が未確定。資金が動いた可能性があるため、新しいキーで再実行せず、同じIdempotency-Keyで再送するか一覧/個別取得で確定を確認

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 201 = COMPLETED(反映済み)。409 = REJECTED(実行されず資金は動いていない・確定)。202 = 未確定(同じIdempotency-Keyで再送して確定させる)。
  • REJECTED は同じIdempotency-Keyで再送しても同じ結果が返ります。条件(金額・残高)を見直し、新しいIdempotency-Keyで実行してください。
  • V-REC ledger lotはSAKURAが要求principalをCOMPLETEDと確認した後だけ作成されます。
  • SAKURAが返したexpiry_policy/is_expirable/granted_at/expires_atをlotへsnapshotし、180日制限対象ならその期限を維持します。
GET /api/merchant/v1/tenant-funding/allocations 指定日時以降に更新されたTenant Allocation(TopUp)結果の一覧 tenant_funding.read
認証 加盟店HMAC認証 権限範囲 tenant_funding.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

クエリパラメータ

項目型必須制約 / 意味
updated_sinceISO-8601 string任意この日時以降に更新されたものだけ返す(以上)e.g. 2026-10-15T00:00:00+09:00; without offset = UTC; invalid => 422 invalid_updated_since
statusstring任意状態で絞り込み(カンマ区切りで複数可)SUBMITTING / UNKNOWN / RECONCILE_REQUIRED / COMPLETED / REJECTED / FAILED / MISMATCH; other => 422 invalid_status
user_idstring任意対象ユーザーで絞り込みusr_...; not in this Merchant => 404
limitinteger任意1回の件数1–200, default 100
cursorstring任意前回レスポンスの next_cursorinvalid => 422 invalid_cursor

OUT · 出力仕様

項目型有無制約 / 意味
data[]array<object>必須Allocation一覧。各要素は allocation と同じ項目+updated_at
data[].idstring必須資金割当IDvta_...
data[].user_idstring必須対象V-RECユーザー公開IDusr_...
data[].amountdecimal string必須要求principal
data[].currencystring必須通貨USD
data[].statusstring必須Allocation状態see allocation.status
data[].error_codestring|null必須理由コード
data[].sakura_request_uuidstring|null必須SAKURA Funding Request UUID
data[].errorstring|null必須診断メッセージ
data[].created_atstring必須作成時刻UTC 'YYYY-MM-DD HH:MM:SS'
data[].completed_atstring|null必須COMPLETED確定時刻
data[].updated_atstring必須最終更新時刻。結果が変わると更新されるUTC 'YYYY-MM-DD HH:MM:SS'
next_cursorstring|null必須続きを取得するためのカーソルpass as cursor; null の場合 there is no item
has_moreboolean必須続きがあるか

HTTP 200 · 期待レスポンス例

{
    "data": [
        {
            "id": "vta_demo2",
            "user_id": "usr_demo",
            "amount": "50000.00000000",
            "currency": "USD",
            "status": "REJECTED",
            "error_code": "insufficient_tenant_available",
            "sakura_request_uuid": null,
            "error": "insufficient_tenant_available: Tenant available is insufficient. available=12497.50, required=50002.50",
            "created_at": "2026-10-15 01:00:00",
            "completed_at": null,
            "updated_at": "2026-10-15 01:00:01"
        },
        {
            "id": "vta_demo",
            "user_id": "usr_demo",
            "amount": "100.00000000",
            "currency": "USD",
            "status": "COMPLETED",
            "error_code": null,
            "sakura_request_uuid": "TF_01J...",
            "error": null,
            "created_at": "2026-10-15 01:05:00",
            "completed_at": "2026-10-15 01:05:01",
            "updated_at": "2026-10-15 01:05:01"
        }
    ],
    "next_cursor": "MjAyNi0xMC0xNSAwMTowNTowMXw0Mg",
    "has_more": false
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

Merchant HMAC認証に失敗

HTTP 403merchant_scope_denied形式: JSON

tenant_funding.read scopeがCredentialにない

HTTP 404not_found形式: JSON

user_id のユーザーがこのMerchantに存在しない

HTTP 422invalid_updated_since / invalid_status / invalid_cursor形式: JSON

クエリの形式が正しくない

HTTP 503tenant_allocation_api_not_installed形式: JSON

v2.4.2 allocation migration未適用

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 並び順は更新日時(updated_at)の古い順です。has_more が true の間は next_cursor を cursor に渡して続きを取得してください。
  • Cronでは、前回処理した最後の updated_at を updated_since に指定してください。結果が変わったAllocationは updated_at が更新されるため再度返ることがあります(id で重複を除いてください)。
  • COMPLETED / REJECTED / FAILED / MISMATCH は確定状態です。SUBMITTING / UNKNOWN / RECONCILE_REQUIRED は未確定です(同じIdempotency-Keyで再送して確定させてください)。
  • 結果が変わるたびに Webhook tenant.funding.allocation.updated も送られます。
GET /api/merchant/v1/tenant-funding/allocations/{id} Tenant Allocation Operation取得 tenant_funding.read
認証 加盟店HMAC認証 権限範囲 tenant_funding.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idpath string必須資金割当IDvta_...; 認証済み加盟店に所属する必要がある

OUT · 出力仕様

項目型有無制約 / 意味
allocation.idstring必須V-RECテナント資金割当操作IDvta_...
allocation.user_idstring必須配賦対象V-RECユーザー公開IDusr_...
allocation.amountdecimal string必須要求principalセント単位で指定する正のUSD金額
allocation.currencystring必須通貨USD
allocation.statusstring必須Allocation状態。COMPLETED=反映済み、REJECTED=実行されず資金は動いていない(確定)、FAILED/MISMATCH=要確認(確定)、SUBMITTING/UNKNOWN/RECONCILE_REQUIRED=未確定(同じIdempotency-Keyで再送して確定)SUBMITTING / UNKNOWN / RECONCILE_REQUIRED / COMPLETED / REJECTED / FAILED / MISMATCH
allocation.error_codestring|null必須機械判定用のエラーコード(REJECTED等の理由)。例: insufficient_tenant_available, insufficient_merchant_physicalnull の場合 not applicable
allocation.sakura_request_uuidstring|null必須SAKURA側Funding Request UUID上流システムの応答後に設定
allocation.errorstring|null必須非正常状態の診断コード/要約シークレットは公開しない
allocation.created_atstring|null必須Operation作成時刻DBに保存されたUTC時刻
allocation.completed_atstring|null必須COMPLETED確定時刻完了までnull

HTTP 200 · 期待レスポンス例

{
    "allocation": {
        "id": "vta_demo",
        "user_id": "usr_demo",
        "amount": "100.00000000",
        "currency": "USD",
        "status": "COMPLETED",
        "error_code": null,
        "sakura_request_uuid": "01J...",
        "error": null,
        "created_at": "2026-10-05 07:00:00",
        "completed_at": "2026-10-05 07:00:01"
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

Merchant HMAC認証に失敗

HTTP 403merchant_scope_denied形式: JSON

必要なtenant_funding scopeがCredentialにない

HTTP 404tenant_allocation_not_found形式: JSON

Allocationが存在しない、または他MerchantのOperation

HTTP 503tenant_allocation_api_not_installed形式: JSON

v2.4.2 allocation migration未適用

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

POST /api/merchant/v1/tenant-funding/allocations/{id}/reverse 特定Allocationの未使用額だけをTenantへ組み戻し tenant_funding.write
認証 加盟店HMAC認証 権限範囲 tenant_funding.write Content-Type application/json 成功 HTTP 200 / 202

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

ヘッダー

項目型必須制約 / 意味
Idempotency-Keyヘッダー文字列必須同一reverseの冪等性キー前後空白除去後に空でないこと; 最大190文字

パスパラメータ

項目型必須制約 / 意味
idpath string必須組み戻すAllocation IDvta_...。COMPLETEDである必要あり

リクエスト本文

項目型必須制約 / 意味
amountdecimal string必須組み戻し額USDの正の金額(セント単位)。該当資金割当の残存元本を超えてはなりません

OUT · 出力仕様

項目型有無制約 / 意味
return.idstring必須V-RECテナント資金組戻し操作IDvtr_...
return.amountdecimal string必須Tenantへ戻すprincipalセント単位で指定する正のUSD金額
return.currencystring必須通貨USD
return.statusstring必須Return状態RESERVED / SUBMITTED / RECONCILE_REQUIRED / FAILED / COMPLETED
return.sakura_request_uuidstring|null必須SAKURA側Return/Funding Request UUID応答前はnullの場合あり
return.errorstring|null必須非正常状態の診断コード/要約
return.created_atstring|null必須Operation作成時刻DBに保存されたUTC時刻
return.updated_atstring|null必須最終更新時刻DBに保存されたUTC時刻

HTTP 200 / 202 · 期待レスポンス例

{
    "return": {
        "id": "vtr_demo",
        "amount": "25.00000000",
        "currency": "USD",
        "status": "COMPLETED",
        "sakura_request_uuid": "01J...",
        "error": null,
        "created_at": "2026-10-05 07:10:00",
        "updated_at": "2026-10-05 07:10:01"
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

Merchant HMAC認証に失敗

HTTP 403merchant_scope_denied形式: JSON

必要なtenant_funding scopeがCredentialにない

HTTP 400invalid_json形式: JSON

request bodyがJSON objectではない

HTTP 404tenant_allocation_not_found形式: JSON

Allocationが存在しない、または他Merchant

HTTP 422idempotency_key_required / amount_required / invalid_amount / tenant_allocation_not_reversible形式: JSON

必須値不備、金額不正、またはCOMPLETEDでないAllocation

HTTP 409reverse_amount_exceeds_remaining / tenant_return_in_progress / idempotency_key_reused / insufficient_tenant_origin_funds形式: JSON

当該Allocation未使用残高超過、Return競合、または冪等性競合

HTTP 503<upstream error>形式: JSON

SAKURA側結果が一時的に確定できない

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • このAPIは指定Allocationのsakura_request_uuidを持つlotだけを使用し、別Allocationを消費しません。
  • 使用済みprincipalはreverseできません。
POST /api/merchant/v1/tenant-funding/users/{id}/return ユーザーが保持する当該Tenant由来資金をTenantへ返却 tenant_funding.write
認証 加盟店HMAC認証 権限範囲 tenant_funding.write Content-Type application/json 成功 HTTP 200 / 202

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

ヘッダー

項目型必須制約 / 意味
Idempotency-Keyヘッダー文字列必須同一Returnの冪等性キー前後空白除去後に空でないこと; 最大190文字

パスパラメータ

項目型必須制約 / 意味
idpath string必須対象V-RECユーザー公開IDusr_...; 会員所属は認証済み加盟店のものであること

リクエスト本文

項目型必須制約 / 意味
amountdecimal string必須返却額USDの正の金額(セント単位)。このテナント由来ロットの残高以内

OUT · 出力仕様

項目型有無制約 / 意味
return.idstring必須V-RECテナント資金組戻し操作IDvtr_...
return.amountdecimal string必須Tenantへ戻すprincipalセント単位で指定する正のUSD金額
return.currencystring必須通貨USD
return.statusstring必須Return状態RESERVED / SUBMITTED / RECONCILE_REQUIRED / FAILED / COMPLETED
return.sakura_request_uuidstring|null必須SAKURA側Return/Funding Request UUID応答前はnullの場合あり
return.errorstring|null必須非正常状態の診断コード/要約
return.created_atstring|null必須Operation作成時刻DBに保存されたUTC時刻
return.updated_atstring|null必須最終更新時刻DBに保存されたUTC時刻

HTTP 200 / 202 · 期待レスポンス例

{
    "return": {
        "id": "vtr_demo",
        "amount": "25.00000000",
        "currency": "USD",
        "status": "COMPLETED",
        "sakura_request_uuid": "01J...",
        "error": null,
        "created_at": "2026-10-05 07:10:00",
        "updated_at": "2026-10-05 07:10:01"
    }
}

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSON

Merchant HMAC認証に失敗

HTTP 403merchant_scope_denied形式: JSON

必要なtenant_funding scopeがCredentialにない

HTTP 400invalid_json形式: JSON

request bodyがJSON objectではない

HTTP 404not_found形式: JSON

対象ユーザーがこのMerchantに存在しない

HTTP 422idempotency_key_required / amount_required / invalid_amount / sakura_user_link_missing形式: JSON

必須値、金額、binding/link前提を満たさない

HTTP 409insufficient_tenant_origin_funds / tenant_return_in_progress / idempotency_key_reused形式: JSON

当該Tenant由来の未使用資金不足、Return実行中、または冪等性競合

HTTP 503tenant_funding_not_enforced / <upstream error>形式: JSON

SAKURA側結果が一時的に確定できない

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 返却対象は認証Merchant + Tenant ref + VREC_TENANT provenanceに一致するlotだけです。異Merchantの参照残高は返却対象になりません。
  • 過去に正しく当該Tenantへ帰属した資金の清算経路であり、新規クロスマーチャント配賦を許可するものではありません。
ベースURL

認証済み利用者セッションAPI

https://v-rec.xyz
GET /api/v1/me 本人プロフィール要約取得
認証 V-REC本人Session 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

OUT · 出力仕様

項目型有無制約 / 意味
idstring必須V-RECユーザー公開IDusr_...
beneficiary_idstring必須受取人ID
emailstring必須SAKURA現在値、無ければV-REC保存値email
namestring必須SAKURA現在値、無ければ空文字
countrystring|null必須SAKURA profile.country_codeキーは常に存在; null可
kyc_statusstring必須SAKURA現在値、無ければV-REC保存値

HTTP 200 · 期待レスポンス例

{
    "id": "usr_demo",
    "beneficiary_id": "VREC-DEMO",
    "email": "[email protected]",
    "name": "Taro Yamada",
    "country": "JP",
    "kyc_status": "APPROVED"
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 503sakura_profile_unavailable形式: JSON

SAKURA profile取得不可

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

GET /api/v1/me/kyc 本人KYC状態同期
認証 V-REC本人Session 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

OUT · 出力仕様

項目型有無制約 / 意味
statusstring必須V-REC normalized KYC状態NOT_STARTED|PENDING|APPROVED|REJECTED|REVIEW|CORRECTION_REQUIRED
checked_atstring必須このsyncで更新された最終同期時刻DBのUTC日時

HTTP 200 · 期待レスポンス例

{
    "status": "APPROVED",
    "checked_at": "2026-10-05 01:00:00"
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 409kyc_service_unavailable形式: JSON

上流が409を返した場合に安全化して返却

HTTP 422kyc_service_unavailable形式: JSON

上流が422を返した場合

HTTP 429kyc_service_unavailable形式: JSON

上流rate limit

HTTP 503kyc_service_unavailable形式: JSON

KYC service障害。correlation_id付与

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

GET /api/v1/me/kyc/form SAKURA KYCFORMを動的取得
認証 V-REC本人Session 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

OUT · 出力仕様

項目型有無制約 / 意味
user_refstring条件付きConnected Apps driver時にSAKURA bridgeが付加するuser ref現行connected_apps経路では存在; モックテストドライバーでは省略
kyc_statusstring必須SAKURA KYC状態現行SAKURAアダプター: NOT_STARTED|PENDING|APPROVED|CORRECTION_REQUIRED
editableboolean必須現在編集可能か
fields[]array<object>必須SAKURA KYCFORM + 未定義のprofile prerequisites
fields[].namestring必須submit時に使用するfield名
fields[].labelstring必須表示ラベル
fields[].typeinteger必須SAKURAフィールドの型2=ファイル、3=テキストエリア、4=日付として扱い、その他は設定に従って文字列/選択項目として処理します
fields[].requiredboolean必須必須フラグ
fields[].controlstring必須推奨UI controlfile|select|textarea|date|text
fields[].valuemixed|null必須現在値。file fieldは常にnullキーは常に存在
fields[].has_fileboolean必須保存済みfile有無
fields[].optionsarray<object>必須候補。非selectでは空配列になり得る
fields[].options[].codestring必須submitする候補値
fields[].options[].labelstring必須候補表示名
fields[].sectionstring必須定義元sectionkyc_form|profile
ekycobject条件付きConnected Apps driver時のeKYC public stateモックテストドライバーでは省略
ekyc.statestring必須SAKURA eKYCの状態verified|link_ready|link_refresh_required|provider_processing|link_missing_recovery|issue_failed_editable|rejected|issue_required|not_started
ekyc.verifiedboolean必須本人確認完了フラグ
ekyc.has_historyboolean必須eKYC履歴有無
ekyc.has_linkboolean必須eKYC linkレコード有無
ekyc.has_active_linkboolean必須has_link互換alias
ekyc.provider_session_freshboolean必須provider sessionがfreshか
ekyc.action_urlstring|null必須SAKURA stable short URL。本人sessionだけで扱う取り扱いに注意が必要なベアラー形式URL; null可
ekyc.expires_atstring|null必須eKYC link有効期限ISO 8601形式またはnull
ekyc.editableboolean必須現在KYC編集可能か
ekyc.can_issueboolean必須eKYC issue/reissue可能か
ekyc.can_openboolean必須既存linkをopen可能か
next_action.typestring必須クライアントが次に取るactionredirect|completed|wait|correct|retry
next_action.urlstring条件付きtype=redirect時のみSAKURA short URLその他の場合は省略
next_action.retry_after_secondsinteger条件付きtype=wait時のみ現状5

HTTP 200 · 期待レスポンス例

{
    "user_ref": "USR_00000001",
    "kyc_status": "NOT_STARTED",
    "editable": true,
    "fields": [
        {
            "name": "mobile_country_code",
            "label": "Country code",
            "type": 1,
            "required": true,
            "control": "select",
            "value": "+81",
            "has_file": false,
            "options": [
                {
                    "code": "+81",
                    "label": "JPN (+81)"
                }
            ],
            "section": "kyc_form"
        }
    ],
    "ekyc": {
        "state": "not_started",
        "verified": false,
        "has_history": false,
        "has_link": false,
        "has_active_link": false,
        "provider_session_fresh": false,
        "action_url": null,
        "expires_at": null,
        "editable": true,
        "can_issue": false,
        "can_open": false
    },
    "next_action": {
        "type": "correct"
    }
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 409kyc_service_unavailable形式: JSON

上流conflict

HTTP 422kyc_service_unavailable形式: JSON

上流validation state

HTTP 429kyc_service_unavailable形式: JSON

上流rate limit

HTTP 503kyc_service_unavailable形式: JSON

一時障害

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • fields[]はSAKURA KYCFORMが正本です。KYCFORMに無いprofile prerequisite(既定 birthday/title/gender)はsection=profileとして追加されます。
  • 各fields[]のJSONキーは name,label,type,required,control,value,has_file,options,section。source/prefill/prefill_sourceはcurrent codeでは返しません。
  • next_action.url / ekyc.action_url は機密bearer-style short URLです。Merchant backendへ転送・保存しないでください。
POST /api/v1/me/kyc/submit 動的KYCFORMを本人sessionで送信
認証 V-REC本人Session Content-Type multipart/form-data (required for file fields) OR application/x-www-form-urlencoded (text-only submission) 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

リクエスト本文

項目型必須制約 / 意味
_csrfstring必須V-REC sessionのCSRF token$_POSTに含まれるフォーム/multipart項目であること; JSON本文ではSecurity::requireCsrf()の要件を満たさない
<fields[].name>string|file動的GET /api/v1/me/kyc/formで返ったnameだけ送信可能未知のフィールドの場合は422 validation_error
<select field>string動的control=selectはoptions[].codeのみ候補にない値は422 validation_error。厳密な候補一覧が取得できない場合は安全側に拒否
<file field>file動的type=2のファイル項目画像(png/jpg/jpeg)、最大5120 KB。required=trueかつ既存ファイルなしの場合のみ必須
<textarea field>string動的type=3のテキスト項目max 5000 の場合 no option catalog
<date field>string動的type=4の日付項目KYCFORMでは有効な日付、前提プロフィールではY-m-d形式。誕生日は本日より前
<other string field>string動的その他文字列max 255 の場合 no option catalog

OUT · 出力仕様

項目型有無制約 / 意味
user_refstring条件付きConnected Apps driver時にSAKURA bridgeが付加モックテストドライバーでは省略
successboolean必須eKYC issue結果
kyc_statusstring必須submit後KYC状態
editableboolean必須submit後編集可否
errorstring条件付きsuccess=false時のみekyc_issue_failed
reason_codestring条件付きsuccess=false時の公開可能なreason codeidentity_mobile_already_registered|identity_email_already_registered|identity_already_registered|provider_session_unavailable
reason_fieldstring|null条件付きsuccess=false時の関連field。null可
ekycobject条件付きConnected Apps driver時のeKYC public stateモックテストドライバーでは省略
ekyc.statestring必須SAKURA eKYCの状態verified|link_ready|link_refresh_required|provider_processing|link_missing_recovery|issue_failed_editable|rejected|issue_required|not_started
ekyc.verifiedboolean必須本人確認完了フラグ
ekyc.has_historyboolean必須eKYC履歴有無
ekyc.has_linkboolean必須eKYC linkレコード有無
ekyc.has_active_linkboolean必須has_link互換alias
ekyc.provider_session_freshboolean必須provider sessionがfreshか
ekyc.action_urlstring|null必須SAKURA stable short URL。本人sessionだけで扱う取り扱いに注意が必要なベアラー形式URL; null可
ekyc.expires_atstring|null必須eKYC link有効期限ISO 8601形式またはnull
ekyc.editableboolean必須現在KYC編集可能か
ekyc.can_issueboolean必須eKYC issue/reissue可能か
ekyc.can_openboolean必須既存linkをopen可能か
next_action.typestring必須クライアントが次に取るactionredirect|completed|wait|correct|retry
next_action.urlstring条件付きtype=redirect時のみSAKURA short URLその他の場合は省略
next_action.retry_after_secondsinteger条件付きtype=wait時のみ現状5

HTTP 200 · 期待レスポンス例

{
    "user_ref": "USR_00000001",
    "success": true,
    "kyc_status": "PENDING",
    "editable": false,
    "ekyc": {
        "state": "link_ready",
        "verified": false,
        "has_history": true,
        "has_link": true,
        "has_active_link": true,
        "provider_session_fresh": true,
        "action_url": "https://sakura.example/ekyc/short-token",
        "expires_at": "2026-10-05T01:15:00+00:00",
        "editable": false,
        "can_issue": false,
        "can_open": true
    },
    "next_action": {
        "type": "redirect",
        "url": "https://sakura.example/ekyc/short-token"
    }
}

想定エラー / HTTPレスポンス

HTTP 419CSRF validation failed形式: non-JSON

_csrf欠落/不一致。Security::requireCsrf()がAuth::requireUser()より先に実行されます。

CSRF validation failed
HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 422validation_error形式: JSON

fields別validation errors。errors mapとcorrelation_idを返す

HTTP 409kyc_service_unavailable形式: JSON

同時処理等のconflict

HTTP 429kyc_service_unavailable形式: JSON

上流rate limit

HTTP 503kyc_service_unavailable形式: JSON

一時障害

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • HTTP 200でもsuccess=falseになり得ます。その場合 error=ekyc_issue_failed と reason_code/reason_field を確認してください。
  • 同一userのKYC submitはSAKURA側lockで直列化され、並行submitは422 validation_errorになります。
  • 現行コードはJSON bodyではなく $_POST(KYCは加えて $_FILES)を読みます。
GET /api/v1/me/balance 本人V-REC残高・Merchant別残高取得
認証 V-REC本人Session 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

OUT · 出力仕様

項目型有無制約 / 意味
scope_instance_idinteger必須現在のV-REC instance内部IDauその後ticated Auth::user requires a positive active instance id
vrec_rawdecimal-string必須V-REC生残高
vrec_availabledecimal-string必須利用可能残高
vrec_withdrawabledecimal-string必須出金可能残高
authorization_holdsdecimal-string必須Authorization hold合計
expired_lockeddecimal-string必須期限切れlocked残高認証済み経路では存在
merchant_balances[]array<object>必須Merchant別残高
merchant_balances[].merchant_idinteger必須内部Merchant ID
merchant_balances[].merchant_public_idstring必須Merchant公開ID
merchant_balances[].display_namestring必須Merchant名
merchant_balances[].raw_balancedecimal-string必須生残高
merchant_balances[].display_balancedecimal-string必須表示残高
merchant_balances[].expired_lockeddecimal-string条件付き期限切れlocked
merchant_balances[].availabledecimal-string必須利用可能残高。membership/merchant停止時は0
merchant_balances[].membership_statusstring必須membership状態
merchant_balances[].merchant_statusstring必須Merchant状態

HTTP 200 · 期待レスポンス例

{
    "scope_instance_id": 1,
    "vrec_raw": "1500.00",
    "vrec_available": "1400.00",
    "vrec_withdrawable": "1300.00",
    "authorization_holds": "100.00",
    "expired_locked": "0.00",
    "merchant_balances": [
        {
            "merchant_id": 10,
            "merchant_public_id": "mrc_demo",
            "display_name": "Example Merchant",
            "raw_balance": "1500.00",
            "membership_status": "ACTIVE",
            "merchant_status": "ACTIVE",
            "display_balance": "1500.00",
            "expired_locked": "0.00",
            "available": "1500.00"
        }
    ]
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • currency queryは受け付けません。Config BASE_CURRENCYを使用します。
GET /api/v1/me/payouts 本人Payout履歴取得
認証 V-REC本人Session 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

OUT · 出力仕様

項目型有無制約 / 意味
data[].idstring必須Payout ID
data[].amountdecimal-string必須金額
data[].currencystring必須通貨
data[].external_referencestring|null必須外部参照DBカラムはnull可; キーは常に存在
data[].purposestring必須用途
data[].statusstring必須状態
data[].created_atstring必須作成時刻
data[].credited_atstring|null必須入金時刻キーは常に存在; null until credited
data[].companystring必須送金企業名

HTTP 200 · 期待レスポンス例

{
    "data": [
        {
            "id": "po_demo",
            "amount": "100.00",
            "currency": "USD",
            "external_reference": "INV-1001",
            "purpose": "corporate_payout",
            "status": "CREDITED",
            "created_at": "2026-10-05 01:00:00",
            "credited_at": "2026-10-05 01:01:00",
            "company": "Example Corp"
        }
    ]
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 現在は最大100件を新しい順に返します。
  • vrec_tenant_allocations はここに含みません。直接割当は /api/v1/me/tenant-allocations です。
GET /api/v1/me/transactions 本人カード取引履歴取得
認証 V-REC本人Session 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

OUT · 出力仕様

項目型有無制約 / 意味
data[].idstring必須カード取引ID
data[].transaction_typestring必須取引種別
data[].amountdecimal-string必須金額
data[].currencystring必須通貨
data[].mccstring|null必須加盟店カテゴリコード(MCC)キーは常に存在; 値はnullの場合あり
data[].statusstring必須状態
data[].occurred_atstring必須発生時刻
data[].card_idstring必須V-RECカードID
data[].masked_panstring|null必須マスクPANキーは常に存在; 値はnullの場合あり

HTTP 200 · 期待レスポンス例

{
    "data": [
        {
            "id": "txn_demo",
            "transaction_type": "PURCHASE",
            "amount": "25.00",
            "currency": "USD",
            "mcc": "5812",
            "status": "APPROVED",
            "occurred_at": "2026-10-05 00:30:00",
            "card_id": "card_demo",
            "masked_pan": "**** **** **** 1234"
        }
    ]
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 現在は最大100件を新しい順に返します。
  • V-RECローカルのcard_transactionsのみ。MatchMove側の全カード明細は /api/v1/me/cards/{id}/issuer-transactions を使用。
GET /api/v1/me/cards 本人カード一覧取得
認証 V-REC本人Session 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

OUT · 出力仕様

項目型有無制約 / 意味
data[]array<card_list_item>必須本人のmask済みカード一覧
data[].idstring必須V-RECカード公開IDcards.public_id; card_...
data[].card_typestring必須カード種別VIRTUAL|PHYSICAL
data[].brandstring|null必須カードブランドcards.brandはnull可
data[].masked_panstring|null必須マスク済みPANカード番号全桁(PAN)は返さない; null可
data[].last4string|null必須PAN末尾4桁null可
data[].currencystring必須カード通貨cards.currency
data[].statusstring必須カード状態ACTIVE|FROZEN|CLOSED (保存値/プロバイダー正規化値)
data[].atm_enabledinteger必須ATM利用可否のDB値。カード一覧は0/1の数値で返すPDO SELECTから取得したcards.atm_enabledの生値; JSON数値0または1 (ATTR_STRINGIFY_FETCHES=false); 真偽値への変換なし
data[].created_atstring必須カード登録時刻cards.created_at NULL不可のDB日時; キーは常に存在

HTTP 200 · 期待レスポンス例

{
    "data": [
        {
            "id": "card_demo",
            "card_type": "VIRTUAL",
            "brand": "MASTERCARD",
            "masked_pan": "**** **** **** 1234",
            "last4": "1234",
            "currency": "USD",
            "status": "ACTIVE",
            "atm_enabled": false,
            "created_at": "2026-10-01 00:00:00"
        }
    ]
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

POST /api/v1/me/cards/{type} 仮想カード新規発行(物理カード新規発行は終了)
認証 V-REC本人Session Content-Type application/x-www-form-urlencoded OR multipart/form-data 成功 HTTP 201

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

パスパラメータ

項目型必須制約 / 意味
typestring必須発行種別VIRTUAL allowed; PHYSICAL 返却する 410 physical_card_issuance_retired (no issuer call)

リクエスト本文

項目型必須制約 / 意味
_csrfstring必須V-REC sessionのCSRF token$_POSTに含まれるフォーム/multipart項目であること; JSON本文ではSecurity::requireCsrf()の要件を満たさない

OUT · 出力仕様

項目型有無制約 / 意味
idstring必須V-RECカード公開IDcards.public_id; card_...
card_typestring必須カード種別VIRTUAL|PHYSICAL
brandstring|null必須カードブランドcards.brandはnull可
masked_panstring|null必須マスク済みPANカード番号全桁(PAN)は返さない; null可
last4string|null必須PAN末尾4桁null可
currencystring必須カード通貨cards.currency
statusstring必須カード状態ACTIVE|FROZEN|CLOSED (保存値/プロバイダー正規化値)
atm_enabledboolean必須ATM利用可否。mutationレスポンスではboolにcastレスポンスのcardShape()が明示的に(bool)型変換; キーは常に存在

HTTP 201 · 期待レスポンス例

{
    "id": "card_demo",
    "card_type": "VIRTUAL",
    "brand": "MASTERCARD",
    "masked_pan": "**** **** **** 1234",
    "last4": "1234",
    "currency": "USD",
    "status": "ACTIVE",
    "atm_enabled": false
}

想定エラー / HTTPレスポンス

HTTP 410physical_card_issuance_retired形式: JSON

PHYSICALの新規発行は廃止。既存カード登録APIを利用。

HTTP 419CSRF validation failed形式: non-JSON

_csrf欠落/不一致。Security::requireCsrf()がAuth::requireUser()より先に実行されます。

CSRF validation failed
HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 422invalid_card_type / kyc_not_approved / active_merchant_membership_required / sakura_cards_scope_required / vrec_instance_required / sakura_user_not_linked形式: JSON

KYC/住所/card発行条件未達

HTTP 503card_issue_unavailable形式: JSON

card provider一時障害

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 現行コードはJSON bodyではなく $_POST(KYCは加えて $_FILES)を読みます。
POST /api/v1/me/cards/physical/link 既存Physical Cardを本人step-upで紐付け
認証 V-REC本人Session Content-Type application/x-www-form-urlencoded OR multipart/form-data 成功 HTTP 201

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

ヘッダー

項目型必須制約 / 意味
Idempotency-Keystring推奨Provider冪等性キーoptional; trim; blank/省略時 => normalized association number is used; non-empty >190 => idempotency_key_too_long

リクエスト本文

項目型必須制約 / 意味
_csrfstring必須V-REC sessionのCSRF token$_POSTに含まれるフォーム/multipart項目であること; JSON本文ではSecurity::requireCsrf()の要件を満たさない
current_passwordstring必須現在のV-RECパスワード追加認証
assoc_numberstring必須Proxy/Association IDtrim -> remove ALL whitespace -> 大文字; その後 ^(?:PY)?\d{6,32}$; provider value normalized to PY + digits. Therefore raw form input containing spaces may still be accepted.

OUT · 出力仕様

項目型有無制約 / 意味
idstring必須V-RECカード公開IDcards.public_id; card_...
card_typestring必須カード種別VIRTUAL|PHYSICAL
brandstring|null必須カードブランドcards.brandはnull可
masked_panstring|null必須マスク済みPANカード番号全桁(PAN)は返さない; null可
last4string|null必須PAN末尾4桁null可
currencystring必須カード通貨cards.currency
statusstring必須カード状態ACTIVE|FROZEN|CLOSED (保存値/プロバイダー正規化値)
atm_enabledboolean必須ATM利用可否。mutationレスポンスではboolにcastレスポンスのcardShape()が明示的に(bool)型変換; キーは常に存在

HTTP 201 · 期待レスポンス例

{
    "id": "card_demo",
    "card_type": "PHYSICAL",
    "brand": "MASTERCARD",
    "masked_pan": "**** **** **** 1234",
    "last4": "1234",
    "currency": "USD",
    "status": "ACTIVE",
    "atm_enabled": true
}

想定エラー / HTTPレスポンス

HTTP 419CSRF validation failed形式: non-JSON

_csrf欠落/不一致。Security::requireCsrf()がAuth::requireUser()より先に実行されます。

CSRF validation failed
HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 422current_password_invalid / invalid_assoc_number / kyc_not_approved / physical_link_requires_sakura_driver / sakura_cards_scope_required / idempotency_key_too_long / active_merchant_membership_required / vrec_instance_required / sakura_user_not_linked形式: JSON

step-upまたはcard link validation失敗

HTTP 429too_many_attempts形式: JSON

10分で8回超

HTTP 503physical_card_link_unavailable形式: JSON

provider一時障害

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • R4: SAKURAの422が503になる現行処理は維持。同じ紐付け番号の再試行が前回の冪等性結果を返す場合は運営照合が必要。
  • 現行コードはJSON bodyではなく $_POST(KYCは加えて $_FILES)を読みます。
POST /api/v1/me/cards/{id}/{action} カード状態変更
認証 V-REC本人Session Content-Type application/x-www-form-urlencoded OR multipart/form-data 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECカードIDcard_...
actionstring必須カード操作大文字小文字を区別しません。activate|unfreeze=>ACTIVE、freeze=>FROZEN、close=>CLOSED

リクエスト本文

項目型必須制約 / 意味
_csrfstring必須V-REC sessionのCSRF token$_POSTに含まれるフォーム/multipart項目であること; JSON本文ではSecurity::requireCsrf()の要件を満たさない

OUT · 出力仕様

項目型有無制約 / 意味
idstring必須V-RECカード公開IDcards.public_id; card_...
card_typestring必須カード種別VIRTUAL|PHYSICAL
brandstring|null必須カードブランドcards.brandはnull可
masked_panstring|null必須マスク済みPANカード番号全桁(PAN)は返さない; null可
last4string|null必須PAN末尾4桁null可
currencystring必須カード通貨cards.currency
statusstring必須カード状態ACTIVE|FROZEN|CLOSED (保存値/プロバイダー正規化値)
atm_enabledboolean必須ATM利用可否。mutationレスポンスではboolにcastレスポンスのcardShape()が明示的に(bool)型変換; キーは常に存在

HTTP 200 · 期待レスポンス例

{
    "id": "card_demo",
    "card_type": "VIRTUAL",
    "brand": "MASTERCARD",
    "masked_pan": "**** **** **** 1234",
    "last4": "1234",
    "currency": "USD",
    "status": "FROZEN",
    "atm_enabled": false
}

想定エラー / HTTPレスポンス

HTTP 419CSRF validation failed形式: non-JSON

_csrf欠落/不一致。Security::requireCsrf()がAuth::requireUser()より先に実行されます。

CSRF validation failed
HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 422unsupported_action / card_not_found / card_close_not_supported_by_connected_app / vrec_instance_required / sakura_user_not_linked / sakura_cards_scope_required / invalid_card_status形式: JSON

未対応actionまたはprovider validation

HTTP 503card_status_unavailable形式: JSON

provider一時障害

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • current VREC_CARD_DRIVER=sakura pathではSAKURA Connected AppのcardStatusがACTIVE/FROZENだけを許可するため、action=closeはcontrollerで認識されても card_close_not_supported_by_connected_app のHTTP 422になります。
  • 現行コードはJSON bodyではなく $_POST(KYCは加えて $_FILES)を読みます。
POST /api/v1/me/cards/{id}/sensitive PAN/Expiry/CVVを本人step-up後に一時取得
認証 V-REC本人Session Content-Type application/x-www-form-urlencoded OR multipart/form-data 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECカードIDcard_...

リクエスト本文

項目型必須制約 / 意味
_csrfstring必須V-REC sessionのCSRF token$_POSTに含まれるフォーム/multipart項目であること; JSON本文ではSecurity::requireCsrf()の要件を満たさない
current_passwordstring必須現在のV-RECパスワード追加認証

OUT · 出力仕様

項目型有無制約 / 意味
card_numberstring必須Full PAN。表示時だけ使用し保存禁止
expirystring必須有効期限
cvvstring必須CVV。保存禁止

HTTP 200 · 期待レスポンス例

{
    "card_number": "5555555555551234",
    "expiry": "12/29",
    "cvv": "123"
}

想定エラー / HTTPレスポンス

HTTP 419CSRF validation failed形式: non-JSON

_csrf欠落/不一致。Security::requireCsrf()がAuth::requireUser()より先に実行されます。

CSRF validation failed
HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 403sakura_card_sensitive_scope_required形式: JSON

SAKURA Connected App scope不足

HTTP 404card_not_found形式: JSON

カードなし/本人所有外

HTTP 422current_password_invalid / card_sensitive_requires_sakura_driver / vrec_instance_required / sakura_user_not_linked形式: JSON

step-upまたはvalidation失敗

HTTP 429too_many_attempts形式: JSON

5分で6回超

HTTP 503card_sensitive_unavailable形式: JSON

provider一時障害

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • Cache-Control: no-store。PAN/CVVをV-REC DB/ログ/analyticsへ保存しないでください。
  • 現行コードはJSON bodyではなく $_POST(KYCは加えて $_FILES)を読みます。
POST /api/v1/me/cards/{id}/pin 物理カードの4桁PIN設定・変更
認証 V-REC本人Session Content-Type application/x-www-form-urlencoded OR multipart/form-data 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECカードIDcard_...

リクエスト本文

項目型必須制約 / 意味
_csrfstring必須V-REC sessionのCSRF token$_POSTに含まれるフォーム/multipart項目であること; JSON本文ではSecurity::requireCsrf()の要件を満たさない
current_passwordstring必須現在のV-RECパスワード追加認証
pinstring必須新しい4桁PIN^[0-9]{4}$; must match pin_confirmation
pin_confirmationstring必須PINの確認入力exactly equals pin

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "success": true
}

想定エラー / HTTPレスポンス

HTTP 419CSRF validation failed形式: non-JSON

CSRFフィールド欠落・不一致

CSRF validation failed
HTTP 302Location: /v/{instance}/login形式: redirect

V-RECログインセッションなし

empty body + Location header
HTTP 404card_not_found形式: JSON

カードなし・本人のカードではない

HTTP 422current_password_invalid / invalid_card_pin / physical_card_required / active_card_required / card_pin_requires_sakura_driver / sakura_card_sensitive_scope_required / matchmove_mobile_unavailable形式: JSON

再認証失敗、PIN形式不正、物理カード以外、停止中、SAKURA接続要件不足、登録携帯番号不備

HTTP 429too_many_attempts形式: JSON

15分で4回超

HTTP 503card_pin_unavailable形式: JSON

SAKURAまたはMatchMoveのPIN設定処理が未確認・失敗

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • R3: 404=不存在、409=競合、422=業務条件不備、503=一時障害。再試行可否はエラー種別で判定。
  • 本人のV-RECログインCookieとcurrent_passwordが必要です。SAKURAのパスワードは使用しません。JSON bodyではなく$_POSTを読むためフォーム送信してください。
  • SAKURA Connected Appのcard_sensitiveスコープが必要。物理・ACTIVEカードのみ。PIN値はレスポンスしない/保存しない。no-store。
  • HMAC Merchant APIからは呼べません。PIN設定がタイムアウトしたときは状態不明として同じPINを連打しないでください。
GET /api/v1/me/cards/{id}/issuer-transactions MatchMoveのカード別決済明細(読み取り専用)
認証 V-REC本人Session 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

パスパラメータ

項目型必須制約 / 意味
idstring必須V-RECカードIDcard_...

クエリパラメータ

項目型必須制約 / 意味
fromdate任意開始日(省略時30日前)YYYY-MM-DD, UTC
todate任意終了日(省略時当日)YYYY-MM-DD; から <= to; max range 92 days; no later than UTC tomorrow
pageinteger任意ページ番号1-100; default 1

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "items": [
        {
            "id": "txn_demo",
            "type": "purchase",
            "amount": "12.34",
            "currency": "USD",
            "description": "Demo merchant",
            "merchant": "Demo merchant",
            "status": "settled",
            "date": "2026-10-17"
        }
    ],
    "page": 1,
    "limit": 20,
    "from": "2026-09-17",
    "to": "2026-10-17",
    "total": 1,
    "has_more": false,
    "source": "matchmove"
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

V-RECログインセッションがない

empty body + Location header
HTTP 404card_not_found形式: JSON

対象カードなし・本人所有外

HTTP 422invalid_page / invalid_date_range / sakura_cards_scope_required形式: JSON

ページ/日付条件不正、Connected Appのcardsスコープがない場合

HTTP 429too_many_attempts形式: JSON

1分間に30回超

HTTP 502card_transactions_unavailable形式: JSON

SAKURA/MatchMoveの取得失敗・不正な応答

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • R6: V-RECでカードなし/所有外=404。SAKURAのISSUED発行記録未照合=502。運営照合が必要。
  • これはMatchMove発行会社側のカード明細です。V-RECローカルのGET /api/v1/me/transactionsやSGPUSD資金割当履歴とは異なります。
  • SAKURA Connected App cardsスコープが必要。本人カードのみ。limitは20固定。no-store。Merchant HMAC API経由では呼べません。
GET /api/v1/me/tenant-allocations 本人向け直接テナント割当履歴
認証 V-REC本人Session 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

OUT · 出力仕様

項目型有無制約 / 意味
data[]array必須User-scoped tenant allocations (up to 100)
data[].public_idstring必須Direct allocation reference
data[].merchant_namestring必須Funding merchant label
data[].amountdecimal string必須Amount in currency (not USDT)
data[].currencystring必須USD
data[].statusstring必須COMPLETED or pending/failed state
data[].remaining_amountdecimal string|null必須Remaining source lot; null before completion

HTTP 200 · 期待レスポンス例

{
    "data": [
        {
            "public_id": "vta_example",
            "merchant_name": "Example Tenant",
            "amount": "10.00000000",
            "currency": "USD",
            "status": "COMPLETED",
            "remaining_amount": "10.00000000",
            "created_at": "2026-10-17 02:29:51"
        }
    ]
}

想定エラー / HTTPレスポンス

HTTP 302Location: /login形式: redirect

V-REC本人ログインが必要

Redirect to login

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • Corporate Payoutと別の資金起点です。最大100件、最新順。
GET /api/v1/me/tenant-returns 本人向けテナント組戻し履歴
認証 V-REC本人Session 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

OUT · 出力仕様

項目型有無制約 / 意味
data[]array必須User-scoped tenant returns (up to 100)
data[].public_idstring必須返還 reference
data[].amountdecimal string必須Amount in currency
data[].currencystring必須USD
data[].statusstring必須COMPLETED or in-progress status

HTTP 200 · 期待レスポンス例

{
    "data": []
}

想定エラー / HTTPレスポンス

HTTP 302Location: /login形式: redirect

V-REC本人ログインが必要

Redirect to login

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 完了と未確定の組戻しを区別してください。最大100件、最新順。
GET /api/v1/me/ledger-entries 本人向け資金原資台帳履歴
認証 V-REC本人Session 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

OUT · 出力仕様

項目型有無制約 / 意味
data[]array必須Attributed V-REC funding ledger, max 100
data[].public_idstring必須Ledger entry id
data[].entry_typestring必須CREDIT, DEBIT, TENANT_RETURN, ...
data[].amountdecimal string必須Signed source ledger amount
data[].currencystring必須USD; never treated as token units
data[].reference_typestring必須Source classification
data[].reference_idstring必須Underlying event identifier

HTTP 200 · 期待レスポンス例

{
    "data": [
        {
            "public_id": "le_example",
            "entry_type": "CREDIT",
            "amount": "10.00000000",
            "currency": "USD",
            "reference_type": "SAKURA_TENANT_ALLOCATION",
            "reference_id": "sakura_request_example"
        }
    ]
}

想定エラー / HTTPレスポンス

HTTP 302Location: /login形式: redirect

V-REC本人ログインが必要

Redirect to login

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 割当とこの台帳CREDITを二重の入金として計上しないでください。最大100件、最新順。
ベースURL

Crypto Wallet(本人Session)

https://v-rec.xyz
GET /api/v1/me/wallet ウォレット概要・USDT/ETH残高・ガスレス可否 SAKURA crypto_wallet
認証 V-REC本人Session 権限範囲 SAKURA crypto_wallet 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

クエリパラメータ

項目型必須制約 / 意味
skip_balancesany任意指定時はブロックチェーン残高を取得しない(高速)

OUT · 出力仕様

項目型有無制約 / 意味
enabledboolean必須SAKURA側でV-RECウォレット機能が有効か
access.allowedboolean必須この利用者が作成・送金できるか(SAKURAの表示モード/個別有効化)
access.reasonstring|null必須不可理由not_enabled_for_user | disabled_by_operator | service_disabled
features.wallet_creation / wallet_rotation / gasless_transferboolean必須SAKURA機能フラグ
has_walletboolean必須アクティブなウォレットの有無
wallet.addressstring条件付き受取アドレス(Ethereum / ERC-20)^0x[0-9a-f]{40}$
wallet.versioninteger条件付き入れ替えごとに+1
wallet.key_schemestring条件付き鍵方式bip39_bip44 | legacy_random
wallet.derivation_pathstring|null条件付きMetaMask互換の導出パスm/44'/60'/0'/0/0
balances.usdt.balancedecimal-string|null条件付きオンチェーンUSDT残高(6桁)。RPC失敗時null
balances.usdt.pending_incomingdecimal-string条件付き未確定のUSDT入金
balances.usdt.availabledecimal-string|null条件付き送金可能額 = balance − pending_incoming(0未満は0)
balances.eth.balancedecimal-string|null条件付きETH残高(18桁)。ガスレス送金では不要
balances.completeboolean条件付き全残高を取得できたか
gasless.allowedboolean必須ガスレス送金を今利用できるか
gasless.reasonstring|null必須判定理由merchant_managed | physical_card_exempt | not_subscriber | card_suspended | past_due | overdue | transfer_blocked ...
gasless.messagestring|null必須利用者向け説明(ja/en)
gasless.daily_limit / daily_remaininginteger必須1日の回数上限と残り(失敗も1回)
transfer_blockedboolean必須運営による送金停止
previous_wallets[]array<object>必須入れ替え済みウォレット(address, version, deactivated_at, deactivate_reason)

HTTP 200 · 期待レスポンス例

{
    "enabled": true,
    "access": {
        "allowed": true,
        "reason": null
    },
    "features": {
        "wallet_creation": true,
        "wallet_rotation": true,
        "gasless_transfer": true
    },
    "has_wallet": true,
    "wallet": {
        "address": "0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be",
        "version": 1,
        "key_scheme": "bip39_bip44",
        "derivation_path": "m/44'/60'/0'/0/0",
        "seed_phrase_wallet": true,
        "network": "ethereum",
        "chain_id": 1,
        "created_at": "2026-10-16T01:00:00+00:00"
    },
    "balances": {
        "usdt": {
            "symbol": "USDT",
            "contract": "0xdac17f958d2ee523a2206206994597c13d831ec7",
            "decimals": 6,
            "balance": "120.500000",
            "pending_incoming": "0.000000",
            "available": "120.500000"
        },
        "eth": {
            "symbol": "ETH",
            "balance": "0.000000000000000000"
        },
        "complete": true,
        "fetched_at": "2026-10-16T01:02:03+00:00"
    },
    "gasless": {
        "allowed": true,
        "reason": "merchant_managed",
        "message": null,
        "past_due_months": [],
        "exempt_until": null,
        "asset": "USDT",
        "network": "ethereum",
        "daily_limit": 5,
        "daily_remaining": 4
    },
    "transfer_blocked": false,
    "previous_wallets": []
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 403wallet_not_available形式: JSON

SAKURA連携に crypto_wallet(書込みは crypto_wallet_manage)権限がない

HTTP 503wallet_service_unavailable形式: JSON

SAKURA/ブロックチェーンRPCの一時障害。correlation_id付き

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • Cache-Control: no-store。
  • 残高はSAKURAがEthereumノードから都度取得します。表示値はUSDTの6桁小数文字列です。
GET /api/v1/me/wallet/transfers 送金履歴と処理中リクエスト SAKURA crypto_wallet
認証 V-REC本人Session 権限範囲 SAKURA crypto_wallet 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

クエリパラメータ

項目型必須制約 / 意味
limitinteger任意件数1..100, default 20

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "data": [
        {
            "transfer_id": 41,
            "status": "SUBMITTED",
            "fee_mode": "gasless",
            "symbol": "USDT",
            "amount": "10.000000",
            "from_address": "0x3f5c...",
            "to_address": "0x9b2e...",
            "tx_hash": "0xabc...",
            "explorer_url": "https://etherscan.io/tx/0xabc...",
            "created_at": "2026-10-16T01:10:00+00:00"
        }
    ],
    "requests": [
        {
            "public_id": "wrq_...",
            "operation": "gasless_transfer",
            "idempotency_key": "vwt_...",
            "status": "SUCCEEDED",
            "to_address": "0x9b2e...",
            "amount": "10",
            "tx_hash": "0xabc..."
        }
    ]
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 403wallet_not_available形式: JSON

SAKURA連携に crypto_wallet(書込みは crypto_wallet_manage)権限がない

HTTP 503wallet_service_unavailable形式: JSON

SAKURA/ブロックチェーンRPCの一時障害。correlation_id付き

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

POST /api/v1/me/wallet/address-check 送金前の宛先安全チェック(アドレスポイズニング対策) SAKURA crypto_wallet
認証 V-REC本人Session 権限範囲 SAKURA crypto_wallet Content-Type application/x-www-form-urlencoded 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

リクエスト本文

項目型必須制約 / 意味
_csrfstring必須V-REC sessionのCSRF tokenform field ($_POST); JSON本文ではSecurity::requireCsrf()の要件を満たさない
addressstring必須宛先アドレスmax 64

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "address": "0x9b2e...",
    "verdict": "danger",
    "risk_score": 85,
    "checksum_valid": true,
    "lookalike": "0x9b2e...1f",
    "findings": [
        {
            "severity": "danger",
            "message": "過去の送金先と先頭・末尾が一致する別アドレスです。"
        }
    ],
    "requires_acknowledgement": true
}

想定エラー / HTTPレスポンス

HTTP 419CSRF validation failed形式: non-JSON

_csrf欠落/不一致

CSRF validation failed
HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 403wallet_not_available形式: JSON

SAKURA連携に crypto_wallet(書込みは crypto_wallet_manage)権限がない

HTTP 422invalid_address形式: JSON

address未指定/長すぎ

HTTP 429too_many_attempts形式: JSON

10分60回超

HTTP 503wallet_service_unavailable形式: JSON

SAKURA/ブロックチェーンRPCの一時障害。correlation_id付き

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • verdict=danger の宛先へ送るには、送金時に risk_acknowledged=1 が必要です(SAKURA設定で上書き禁止の場合は送金不可)。
POST /api/v1/me/wallet ウォレット作成(シードフレーズを1回だけ返す) SAKURA crypto_wallet_manage
認証 V-REC本人Session 権限範囲 SAKURA crypto_wallet_manage Content-Type application/x-www-form-urlencoded 成功 HTTP 201

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

ヘッダー

項目型必須制約 / 意味
Idempotency-Keyヘッダー文字列任意再送時の二重作成防止^[A-Za-z0-9._:-]{1,120}$

リクエスト本文

項目型必須制約 / 意味
_csrfstring必須V-REC sessionのCSRF tokenform field ($_POST); JSON本文ではSecurity::requireCsrf()の要件を満たさない
current_passwordstring必須V-RECログインパスワード(step-up)
wallet_passwordstring必須新しいウォレットパスワード(送金時に必要)10..512 chars; should differ から the V-REC password
wallet_password_confirmationstring必須確認must equal wallet_password

OUT · 出力仕様

項目型有無制約 / 意味
operation_idstring必須SAKURA操作IDvwo_...
operationstring必須操作種別create | rotate
replayedboolean必須同じ冪等キーの再送で保存済み結果を返した場合true
statusstring必須結果CREATED | ROTATED
walletobject必須新しいウォレット(wallet_summary.wallet と同形)
previous_addressstringrotate only入れ替え前のアドレス
mnemonicstring|null必須BIP-39シードフレーズ12語。この応答で1回だけ。replayed=trueではnullNEVER log, store, cache or send to analytics
mnemonic_availableboolean必須mnemonicを含むか

HTTP 201 · 期待レスポンス例

{
    "operation_id": "vwo_...",
    "idempotency_key": "vwc_...",
    "operation": "create",
    "replayed": false,
    "status": "CREATED",
    "wallet": {
        "address": "0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be",
        "version": 1,
        "key_scheme": "bip39_bip44",
        "derivation_path": "m/44'/60'/0'/0/0",
        "seed_phrase_wallet": true,
        "network": "ethereum",
        "chain_id": 1,
        "created_at": "2026-10-16T01:00:00+00:00"
    },
    "mnemonic": "word1 word2 ... word12",
    "mnemonic_words": 12,
    "mnemonic_shown_once": true,
    "mnemonic_available": true
}

想定エラー / HTTPレスポンス

HTTP 419CSRF validation failed形式: non-JSON

_csrf欠落/不一致

CSRF validation failed
HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 403wallet_not_available形式: JSON

SAKURA連携に crypto_wallet(書込みは crypto_wallet_manage)権限がない

HTTP 403wallet_access_denied / wallet_creation_disabled形式: JSON

この利用者/機能が無効

HTTP 409wallet_already_exists形式: JSON

既にアクティブなウォレットあり(入れ替えを使用)

HTTP 422current_password_invalid / wallet_password_invalid_format形式: JSON

step-up失敗/パスワード要件不足

HTTP 429too_many_attempts形式: JSON

step-up 10分8回超

HTTP 503wallet_creation_unavailable / wallet_service_unavailable形式: JSON

SAKURAの復旧鍵未設定など

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • Cache-Control: no-store。
  • mnemonicはV-RECのDB・ログ・解析ツールへ保存しないでください。V-REC Web画面ではAPP_KEYで暗号化したsessionに5分間だけ保持し、表示後すぐ破棄します。
POST /api/v1/me/wallet/rotate ウォレット入れ替え(ローテーション) SAKURA crypto_wallet_manage
認証 V-REC本人Session 権限範囲 SAKURA crypto_wallet_manage Content-Type application/x-www-form-urlencoded 成功 HTTP 201

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

ヘッダー

項目型必須制約 / 意味
Idempotency-Keyヘッダー文字列任意再送時の二重入れ替え防止^[A-Za-z0-9._:-]{1,120}$

リクエスト本文

項目型必須制約 / 意味
_csrfstring必須V-REC sessionのCSRF tokenform field ($_POST); JSON本文ではSecurity::requireCsrf()の要件を満たさない
current_passwordstring必須V-RECログインパスワード(step-up)
new_wallet_passwordstring必須新ウォレットのパスワード10..512 chars
new_wallet_password_confirmationstring必須確認
reasonstring必須入れ替え理由compromised | precaution | other

OUT · 出力仕様

項目型有無制約 / 意味
operation_idstring必須SAKURA操作IDvwo_...
operationstring必須操作種別create | rotate
replayedboolean必須同じ冪等キーの再送で保存済み結果を返した場合true
statusstring必須結果CREATED | ROTATED
walletobject必須新しいウォレット(wallet_summary.wallet と同形)
previous_addressstringrotate only入れ替え前のアドレス
mnemonicstring|null必須BIP-39シードフレーズ12語。この応答で1回だけ。replayed=trueではnullNEVER log, store, cache or send to analytics
mnemonic_availableboolean必須mnemonicを含むか

HTTP 201 · 期待レスポンス例

{
    "operation_id": "vwo_...",
    "operation": "rotate",
    "replayed": false,
    "status": "ROTATED",
    "reason": "compromised",
    "wallet": {
        "address": "0x51e1...",
        "version": 2,
        "key_scheme": "bip39_bip44",
        "derivation_path": "m/44'/60'/0'/0/0",
        "seed_phrase_wallet": true,
        "network": "ethereum",
        "chain_id": 1,
        "created_at": "2026-10-16T01:00:00+00:00"
    },
    "previous_address": "0x3f5c...",
    "mnemonic": "word1 ... word12",
    "mnemonic_available": true
}

想定エラー / HTTPレスポンス

HTTP 419CSRF validation failed形式: non-JSON

_csrf欠落/不一致

CSRF validation failed
HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 403wallet_not_available形式: JSON

SAKURA連携に crypto_wallet(書込みは crypto_wallet_manage)権限がない

HTTP 404wallet_not_found形式: JSON

入れ替え対象なし(先に作成)

HTTP 422invalid_reason / current_password_invalid / wallet_password_invalid_format形式: JSON

入力エラー

HTTP 429too_many_attempts形式: JSON

step-up超過

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • Cache-Control: no-store。
  • 旧ウォレットは同一トランザクションで無効化されます。旧アドレスの残高は自動移動しません。旧シードフレーズで外部ウォレットから移してください。
POST /api/v1/me/wallet/gasless-transfer USDTガスレス送金(ガス代はSAKURA負担) SAKURA crypto_wallet_manage
認証 V-REC本人Session 権限範囲 SAKURA crypto_wallet_manage Content-Type application/x-www-form-urlencoded 成功 HTTP 201

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

ヘッダー

項目型必須制約 / 意味
Idempotency-Keyヘッダー文字列必須送金ごとに一意。同じ送金の再試行時のみ再利用^[A-Za-z0-9._:-]{1,120}$

リクエスト本文

項目型必須制約 / 意味
_csrfstring必須V-REC sessionのCSRF tokenform field ($_POST); JSON本文ではSecurity::requireCsrf()の要件を満たさない
to_addressstring必須宛先^0x[0-9a-fA-F]{40}$
amountdecimal-string必須USDT金額^\d{1,15}(\.\d{1,6})?$, > 0
wallet_passwordstring必須ウォレットパスワード(SAKURAで鍵を復号し署名)
risk_acknowledgedboolean-string任意危険判定の宛先を承諾1 | true

OUT · 出力仕様

項目型有無制約 / 意味
operation_idstring必須SAKURA操作IDvwo_...
statusstring必須ブロードキャスト済みSUBMITTED
transfer_idinteger必須SAKURA送金ログID
fee_modestring必須ガス負担gasless
symbol / amountstring / decimal-string必須通貨と金額(6桁)USDT
from_address / to_addressstring必須送金元・宛先^0x[0-9a-f]{40}$
tx_hash / explorer_urlstring必須トランザクションとEtherscan URL
daily_remaininginteger必須本日の残り回数
request_keystring必須状況確認用キー(/api/v1/me/wallet/requests/{key})

HTTP 201 · 期待レスポンス例

{
    "operation_id": "vwo_...",
    "idempotency_key": "vwt_...",
    "operation": "gasless_transfer",
    "replayed": false,
    "status": "SUBMITTED",
    "transfer_id": 41,
    "fee_mode": "gasless",
    "symbol": "USDT",
    "amount": "10.000000",
    "from_address": "0x3f5c...",
    "to_address": "0x9b2e...",
    "tx_hash": "0xabc...",
    "explorer_url": "https://etherscan.io/tx/0xabc...",
    "daily_remaining": 3,
    "request_key": "vwt_..."
}

想定エラー / HTTPレスポンス

HTTP 419CSRF validation failed形式: non-JSON

_csrf欠落/不一致

CSRF validation failed
HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 403wallet_not_available形式: JSON

SAKURA連携に crypto_wallet(書込みは crypto_wallet_manage)権限がない

HTTP 202transfer_status_unknown形式: JSON

SAKURAへのHTTPがタイムアウト。送金は処理中の可能性。再送せず status_url で確認

HTTP 403gasless_not_allowed / transfer_blocked / wallet_access_denied形式: JSON

月額利用者でない・未払い・運営停止など(reason付き)

HTTP 404wallet_not_found形式: JSON

ウォレット未作成

HTTP 409destination_risk / operation_in_progress / idempotency_key_reused形式: JSON

危険な宛先(risk_acknowledged必要)/同キー処理中/同キーで内容が違う

HTTP 422wallet_password_invalid / insufficient_balance / invalid_amount / invalid_destination / idempotency_key_required形式: JSON

入力・残高エラー

HTTP 429wallet_password_locked / daily_limit_reached / too_many_attempts形式: JSON

パスワード連続失敗ロック(30分)/1日上限/V-REC側レート制限

HTTP 502wallet_operation_failed形式: JSON

ブロックチェーン処理失敗。correlation_id付き。履歴確認後に新しいキーで再試行

HTTP 503wallet_service_unavailable形式: JSON

SAKURA/ブロックチェーンRPCの一時障害。correlation_id付き

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • Cache-Control: no-store。
  • SAKURAのリレイヤーがガス代(ETH)を立て替え、approve → transferFrom で送金します。利用者のETH残高は不要です。
  • オンチェーン確認待ちのため最大150秒かかることがあります。タイムアウト時も二重送金は起きません(SAKURA側で同一キーを冪等処理)。
GET /api/v1/me/wallet/requests/{key} 送金リクエストの状況確認 SAKURA crypto_wallet
認証 V-REC本人Session 権限範囲 SAKURA crypto_wallet 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

パスパラメータ

項目型必須制約 / 意味
keystring必須request_key(送金応答またはtransfer_status_unknown応答のもの)^[A-Za-z0-9._:-]{1,190}$

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "operation_id": "vwo_...",
    "idempotency_key": "vwt_...",
    "operation": "gasless_transfer",
    "status": "SUCCEEDED",
    "error": null,
    "created_at": "2026-10-16T01:10:00+00:00",
    "updated_at": "2026-10-16T01:11:30+00:00",
    "result": {
        "status": "SUBMITTED",
        "tx_hash": "0xabc..."
    }
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

有効なV-REC本人sessionがない場合。JSON bodyではありません。

empty body + Location header
HTTP 404operation_not_found形式: JSON

SAKURAが受け付けていない(安全に新しいキーで再送可)

HTTP 503wallet_service_unavailable形式: JSON

SAKURA/ブロックチェーンRPCの一時障害。correlation_id付き

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • status: PROCESSING | SUCCEEDED | FAILED。PROCESSINGが長引く場合、transfer にSAKURA送金ログの状態が入ります。
ベースURL

暗号資産による購入(売買契約・本人Session)

https://v-rec.xyz
GET /api/v1/me/wallet/purchase-catalog 取扱商品・支払方法・売主・手数料 SAKURA crypto_wallet
認証 V-REC本人Session 権限範囲 SAKURA crypto_wallet 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "enabled": true,
    "products": [
        {
            "code": "SGP_USD"
        },
        {
            "code": "POINT",
            "name": "ショップpt",
            "points_per_usd": "100"
        }
    ],
    "payment_assets": [
        {
            "code": "USDT",
            "seller": {
                "SGP_USD": "SAKURA_EXCHANGE",
                "POINT": "MERCHANT"
            }
        },
        {
            "code": "CUSTOM_TOKEN",
            "symbol": "SHOP",
            "unit_price_usd": "0.5",
            "merchant_responsibility": true
        }
    ],
    "fees": {
        "company_fee_rate": "0.01",
        "merchant_royalty_rate": "0.005",
        "total_rate": "0.015",
        "standard_route_rate": "0.02"
    }
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

本人session無し

redirect
HTTP 403wallet_not_available形式: JSON

SAKURA連携に crypto_wallet / crypto_wallet_manage 権限が無い

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 加盟店がSAKURA加盟店管理画面でV-REC販売を有効にしている場合だけ enabled=true。
POST /api/v1/me/wallet/purchase-quotes 見積(売買契約の条件を確定) SAKURA crypto_wallet_manage
認証 V-REC本人Session 権限範囲 SAKURA crypto_wallet_manage Content-Type application/x-www-form-urlencoded 成功 HTTP 201

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

ヘッダー

項目型必須制約 / 意味
Idempotency-Keyヘッダー文字列必須同じ見積の再送で同じ契約番号^[A-Za-z0-9._:-]{1,120}$

リクエスト本文

項目型必須制約 / 意味
_csrfstring必須V-REC sessionのCSRF tokenform field
productstring必須商品SGP_USD | POINT
payment_assetstring必須代金の暗号資産USDT | CUSTOM_TOKEN
payment_amountdecimal-string必須代金の数量> 0

OUT · 出力仕様

項目型有無制約 / 意味
contract_nostring必須売買契約番号VCS-...
contract_typestring必須常に SALE(両替ではない)
statusstring必須契約状態QUOTED | PAYMENT_PROCESSING | PAYMENT_SUBMITTED | COMPLETED | FAILED | EXPIRED | MANUAL_REVIEW
product / product_name / product_quantitystring必須商品(SGP_USD または POINT)と引渡数量
sellerstring必須売主。USDT払いのSGP-USDのみ SAKURA_EXCHANGE、それ以外は MERCHANTSAKURA_EXCHANGE | MERCHANT
payment.asset / symbol / amount / unit_price_usdstring必須代金(暗号資産)と単価
payment.pay_to_addressstring必須代金の支払先。USDT=当社販売口座、独自トークン=加盟店アドレス
pricing.gross_usddecimal-string必須代金のUSD相当額(6桁切捨て)
pricing.company_fee_rate / company_fee_usddecimal-string必須当社手数料(1%。通常ルートは2%)
pricing.merchant_royalty_rate / merchant_royalty_usddecimal-string必須加盟店ロイヤリティ(加盟店が設定・上乗せ)
pricing.net_usddecimal-string必須商品の価額 = gross − 手数料 − ロイヤリティ
merchant_responsibilityboolean必須独自トークン払い(加盟店の責任においてのみ受付)
termsobjectdetail only契約時点の条件スナップショット(ja/en)

HTTP 201 · 期待レスポンス例

{
    "contract_no": "VCS-20261016-AB12CD34EF",
    "contract_type": "SALE",
    "status": "QUOTED",
    "product": "SGP_USD",
    "product_name": "SGP-USD",
    "product_quantity": "98.500000",
    "seller": "SAKURA_EXCHANGE",
    "payment": {
        "asset": "USDT",
        "symbol": "USDT",
        "amount": "100.000000",
        "unit_price_usd": "1.00000000",
        "pay_to_address": "0x...",
        "tx_hash": null
    },
    "pricing": {
        "gross_usd": "100.000000",
        "company_fee_rate": "0.01000000",
        "company_fee_usd": "1.000000",
        "merchant_royalty_rate": "0.00500000",
        "merchant_royalty_usd": "0.500000",
        "net_usd": "98.500000",
        "points_per_usd": null
    },
    "merchant_responsibility": false,
    "quote_expires_at": "2026-10-16T01:10:00+00:00",
    "terms": {
        "version": "2026-10-16",
        "seller_name": "SAKURA EXCHANGE GUAM INC.",
        "ja": [
            "本契約は、購入者が暗号資産(USDT)を代金として、売主から「SGP-USD」を購入する売買契約です。通貨の両替ではありません。"
        ],
        "en": [
            "This is a sale contract …"
        ]
    },
    "replayed": false
}

想定エラー / HTTPレスポンス

HTTP 419CSRF validation failed形式: non-JSON

_csrf不一致

CSRF validation failed
HTTP 302Location: /v/{instance}/login形式: redirect

本人session無し

redirect
HTTP 403wallet_not_available形式: JSON

SAKURA連携に crypto_wallet / crypto_wallet_manage 権限が無い

HTTP 403product_not_offered / payment_asset_not_accepted / merchant_sales_not_enabled形式: JSON

取扱なし

HTTP 409merchant_pool_insufficient / idempotency_key_reused形式: JSON

加盟店担保不足など

HTTP 422invalid_amount / amount_out_of_range / amount_too_small / idempotency_key_required形式: JSON

入力エラー

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 見積の有効期限は既定10分。
POST /api/v1/me/wallet/purchases/{contract}/confirm 契約条件に同意して代金を支払う SAKURA crypto_wallet_manage
認証 V-REC本人Session 権限範囲 SAKURA crypto_wallet_manage Content-Type application/x-www-form-urlencoded 成功 HTTP 201

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

パスパラメータ

項目型必須制約 / 意味
contractstring必須契約番号VCS-...

リクエスト本文

項目型必須制約 / 意味
_csrfstring必須V-REC sessionのCSRF tokenform field
accept_termsboolean-string必須契約条件への同意1 | true
wallet_passwordstring必須ウォレットパスワード

OUT · 出力仕様

項目型有無制約 / 意味
contract_nostring必須売買契約番号VCS-...
contract_typestring必須常に SALE(両替ではない)
statusstring必須契約状態QUOTED | PAYMENT_PROCESSING | PAYMENT_SUBMITTED | COMPLETED | FAILED | EXPIRED | MANUAL_REVIEW
product / product_name / product_quantitystring必須商品(SGP_USD または POINT)と引渡数量
sellerstring必須売主。USDT払いのSGP-USDのみ SAKURA_EXCHANGE、それ以外は MERCHANTSAKURA_EXCHANGE | MERCHANT
payment.asset / symbol / amount / unit_price_usdstring必須代金(暗号資産)と単価
payment.pay_to_addressstring必須代金の支払先。USDT=当社販売口座、独自トークン=加盟店アドレス
pricing.gross_usddecimal-string必須代金のUSD相当額(6桁切捨て)
pricing.company_fee_rate / company_fee_usddecimal-string必須当社手数料(1%。通常ルートは2%)
pricing.merchant_royalty_rate / merchant_royalty_usddecimal-string必須加盟店ロイヤリティ(加盟店が設定・上乗せ)
pricing.net_usddecimal-string必須商品の価額 = gross − 手数料 − ロイヤリティ
merchant_responsibilityboolean必須独自トークン払い(加盟店の責任においてのみ受付)
termsobjectdetail only契約時点の条件スナップショット(ja/en)

HTTP 201 · 期待レスポンス例

{
    "contract_no": "VCS-...",
    "status": "PAYMENT_SUBMITTED",
    "payment": {
        "tx_hash": "0xabc..."
    },
    "replayed": false
}

想定エラー / HTTPレスポンス

HTTP 419CSRF validation failed形式: non-JSON

_csrf不一致

CSRF validation failed
HTTP 302Location: /v/{instance}/login形式: redirect

本人session無し

redirect
HTTP 202payment_status_unknown形式: JSON

SAKURAへのHTTPタイムアウト。再送せず status_url で確認

HTTP 409quote_expired / wallet_changed / merchant_collateral_shortfall形式: JSON

期限切れ等

HTTP 422terms_not_accepted / wallet_password_invalid / insufficient_balance形式: JSON

同意なし・パスワード誤り等(見積は再試行可能)

HTTP 429wallet_password_locked / too_many_attempts形式: JSON

ロック等

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 代金はガスレス(ガス代は当社負担)で送付。月額利用者でなくても購入できます。二重送信しても代金は一度だけ。商品は代金が12承認に達した後に引き渡され COMPLETED になります。
GET /api/v1/me/wallet/purchases 売買契約の一覧 SAKURA crypto_wallet
認証 V-REC本人Session 権限範囲 SAKURA crypto_wallet 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

クエリパラメータ

項目型必須制約 / 意味
limitinteger任意件数1..100

OUT · 出力仕様

bodyなし、またはendpoint固有schemaなし。

HTTP 200 · 期待レスポンス例

{
    "data": [
        {
            "contract_no": "VCS-...",
            "status": "COMPLETED"
        }
    ]
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

本人session無し

redirect
HTTP 403wallet_not_available形式: JSON

SAKURA連携に crypto_wallet / crypto_wallet_manage 権限が無い

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

GET /api/v1/me/wallet/purchases/{contract} 売買契約の詳細・状況 SAKURA crypto_wallet
認証 V-REC本人Session 権限範囲 SAKURA crypto_wallet 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
V-REC session cookiecookie必須SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能

パスパラメータ

項目型必須制約 / 意味
contractstring必須契約番号VCS-...

OUT · 出力仕様

項目型有無制約 / 意味
contract_nostring必須売買契約番号VCS-...
contract_typestring必須常に SALE(両替ではない)
statusstring必須契約状態QUOTED | PAYMENT_PROCESSING | PAYMENT_SUBMITTED | COMPLETED | FAILED | EXPIRED | MANUAL_REVIEW
product / product_name / product_quantitystring必須商品(SGP_USD または POINT)と引渡数量
sellerstring必須売主。USDT払いのSGP-USDのみ SAKURA_EXCHANGE、それ以外は MERCHANTSAKURA_EXCHANGE | MERCHANT
payment.asset / symbol / amount / unit_price_usdstring必須代金(暗号資産)と単価
payment.pay_to_addressstring必須代金の支払先。USDT=当社販売口座、独自トークン=加盟店アドレス
pricing.gross_usddecimal-string必須代金のUSD相当額(6桁切捨て)
pricing.company_fee_rate / company_fee_usddecimal-string必須当社手数料(1%。通常ルートは2%)
pricing.merchant_royalty_rate / merchant_royalty_usddecimal-string必須加盟店ロイヤリティ(加盟店が設定・上乗せ)
pricing.net_usddecimal-string必須商品の価額 = gross − 手数料 − ロイヤリティ
merchant_responsibilityboolean必須独自トークン払い(加盟店の責任においてのみ受付)
termsobjectdetail only契約時点の条件スナップショット(ja/en)

HTTP 200 · 期待レスポンス例

{
    "contract_no": "VCS-20261016-AB12CD34EF",
    "contract_type": "SALE",
    "status": "COMPLETED",
    "product": "SGP_USD",
    "product_name": "SGP-USD",
    "product_quantity": "98.500000",
    "seller": "SAKURA_EXCHANGE",
    "payment": {
        "asset": "USDT",
        "symbol": "USDT",
        "amount": "100.000000",
        "unit_price_usd": "1.00000000",
        "pay_to_address": "0x...",
        "tx_hash": null
    },
    "pricing": {
        "gross_usd": "100.000000",
        "company_fee_rate": "0.01000000",
        "company_fee_usd": "1.000000",
        "merchant_royalty_rate": "0.00500000",
        "merchant_royalty_usd": "0.500000",
        "net_usd": "98.500000",
        "points_per_usd": null
    },
    "merchant_responsibility": false,
    "quote_expires_at": "2026-10-16T01:10:00+00:00",
    "terms": {
        "version": "2026-10-16",
        "seller_name": "SAKURA EXCHANGE GUAM INC.",
        "ja": [
            "本契約は、購入者が暗号資産(USDT)を代金として、売主から「SGP-USD」を購入する売買契約です。通貨の両替ではありません。"
        ],
        "en": [
            "This is a sale contract …"
        ]
    },
    "replayed": false
}

想定エラー / HTTPレスポンス

HTTP 302Location: /v/{instance}/login形式: redirect

本人session無し

redirect
HTTP 404sale_not_found形式: JSON

契約なし

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

ベースURL

加盟店オンライン授業・カスタムトークン API

/api/merchant/v1
GET /api/merchant/v1/learning/programs 自社の公開講座を最大100件取得 learning.read
認証 加盟店HMAC認証 権限範囲 learning.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

OUT · 出力仕様

項目型有無制約 / 意味
dataarray必須公開済み講座(最大100件) / Merchant-published programs公開済み講座(最大100件) / Merchant-published programs

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 講座の公開ステータスと加盟店はSAKURAが検証します。
  • V-REC HMAC = learning.read / SAKURA Connected Apps = learning_read
GET /api/merchant/v1/learning/programs/{id} 自社講座の詳細と無料/有料の申込条件 learning.read
認証 加盟店HMAC認証 権限範囲 learning.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idinteger必須講座ID>0

OUT · 出力仕様

項目型有無制約 / 意味
dataarray必須公開済み講座(最大100件) / Merchant-published programs公開済み講座(最大100件) / Merchant-published programs

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • Meetリンク・録画URL・小テスト正答は非公開
POST /api/merchant/v1/learning/programs/{id}/enrollments 本人同意済み会員の無料講座への登録 learning.enroll.write
認証 加盟店HMAC認証 権限範囲 learning.enroll.write Content-Type application/json 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idinteger必須講座ID>0

リクエスト本文

項目型必須制約 / 意味
user_idstring必須V-REC会員IDusr_...
learner_consentboolean必須会員の同意true
consent_referencestring必須加盟店の同意記録ID8..100 characters

OUT · 出力仕様

項目型有無制約 / 意味
dataarray必須公開済み講座(最大100件) / Merchant-published programs公開済み講座(最大100件) / Merchant-published programs

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • SAKURA learning_enroll権限、所属一致が必要。有料は422
GET /api/merchant/v1/learning/programs/{id}/sessions 講座の授業日程・受講条件を取得 learning.read
認証 加盟店HMAC認証 権限範囲 learning.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idinteger必須SAKURA program ID (positive integer)SAKURA program ID (positive integer)

OUT · 出力仕様

項目型有無制約 / 意味
programobject必須対象講座 / Course対象講座 / Course
sessionsarray必須キャンセル除外の授業 / Non-cancelled lessonsキャンセル除外の授業 / Non-cancelled lessons

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 認証済み加盟店以外の講座は404です。
  • V-REC HMAC = learning.read / SAKURA Connected Apps = learning_read
GET /api/merchant/v1/learning/users/{id}/schedule 加盟店所属会員の受講予定 learning.read
認証 加盟店HMAC認証 権限範囲 learning.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-REC usr_... ID (ACTIVE/FULL)V-REC usr_... ID (ACTIVE/FULL)

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須V-REC公開会員ID (usr_...)V-REC usr_...
dataarray必須加入済み講座・授業 / Enrolled courses and sessions加入済み講座・授業 / Enrolled courses and sessions

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 他の加盟店の会員IDを指定しても参照できません。
  • V-REC HMAC = learning.read / SAKURA Connected Apps = learning_read
GET /api/merchant/v1/learning/users/{id}/progress 外部サイト向け受講進捗・カレンダー登録リンク learning.read
認証 加盟店HMAC認証 権限範囲 learning.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-REC usr_... ID (ACTIVE/FULL)V-REC usr_... ID (ACTIVE/FULL)

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須V-REC usr_... member IDV-REC usr_... member ID
google_calendar_connectedboolean必須Google連携設定 / Google authorization statusGoogle連携設定 / Google authorization status
dataarray必須授業毎のcompleted_at, completion_status, duration_seconds, calendar_sync_status, google_calendar_add_url授業毎のcompleted_at, completion_status, duration_seconds, calendar_sync_status, google_calendar_add_url

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • Google CalendarのURLはクリックによる保存画面であり自動登録ではありません。
  • V-REC HMAC = learning.read / SAKURA Connected Apps = learning_read
GET /api/merchant/v1/learning/rewards 学習報酬の直近履歴 learning.read
認証 加盟店HMAC認証 権限範囲 learning.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

クエリパラメータ

項目型必須制約 / 意味
session_idinteger任意optional positive IDoptional positive ID
program_idinteger任意optional positive IDoptional positive ID
limitinteger任意1–100; default 501–100; default 50

OUT · 出力仕様

項目型有無制約 / 意味
dataarray必須最大100件。各項目のuser_idはV-REC usr_...。SAKURA内部user_refは返却しません。カスタムトークン付与履歴(最大100件) / Last up to 100 reward rows

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 加盟店配下の受講報酬を返します。履歴取得は最大100件で全期間集計ではありません。
  • V-REC HMAC = learning.read / SAKURA Connected Apps = learning_read
POST /api/merchant/v1/learning/sessions/{id}/complete 外部講義終了後の出席実績登録 learning.rewards.write
認証 加盟店HMAC認証 権限範囲 learning.rewards.write Content-Type application/json 成功 HTTP 202

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idinteger必須SAKURA session IDSAKURA session ID

リクエスト本文

項目型必須制約 / 意味
user_idstring必須V-REC usr_... IDV-REC usr_... ID
idempotency_keystring必須8–120 chars [A-Za-z0-9._:-]8–120 chars [A-Za-z0-9._:-]
evidence_refstring必須8–190 chars; auditable provider evidence8–190 chars; auditable provider evidence
duration_secondsinteger必須1–864001–86400

OUT · 出力仕様

項目型有無制約 / 意味
session_idinteger必須授業ID / Lesson ID授業ID / Lesson ID
attendance_statusstring必須再判定後の出席ステータス / Assessed attendance再判定後の出席ステータス / Assessed attendance
rewardobject|null条件付き付与台帳の状態。nullの場合もある / May be null付与台帳の状態。nullの場合もある / May be null

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

HTTP 422validation_error形式: JSON

入力値・受講状態・残高・ウォレット条件不適合

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 授業終了後のみ受付。出席時間・小テスト・アンケート等の既存条件で受講完了を判定し、202は報酬確定を保証しません。
  • V-REC HMAC = learning.rewards.write / SAKURA Connected Apps = learning_rewards
POST /api/merchant/v1/learning/sessions/{id}/rewards 受講完了済み授業の設定済み報酬を再処理 learning.rewards.write
認証 加盟店HMAC認証 権限範囲 learning.rewards.write Content-Type application/json 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idinteger必須SAKURA session IDSAKURA session ID

リクエスト本文

項目型必須制約 / 意味
user_idstring必須V-REC usr_... IDV-REC usr_... ID
idempotency_keystring必須8–120 chars [A-Za-z0-9._:-]8–120 chars [A-Za-z0-9._:-]

OUT · 出力仕様

項目型有無制約 / 意味
rewardobject必須既存設定のトークン付与結果 / Existing configured grant record既存設定のトークン付与結果 / Existing configured grant record

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

HTTP 422validation_error形式: JSON

入力値・受講状態・残高・ウォレット条件不適合

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 受講完了を確認後、既存台帳を利用。任意額・トークン指定は不可。
  • V-REC HMAC = learning.rewards.write / SAKURA Connected Apps = learning_rewards
POST /api/merchant/v1/learning/users/{id}/calendar-sync 同意済みGoogleカレンダーへの講義予定同期 learning.calendar.write
認証 加盟店HMAC認証 権限範囲 learning.calendar.write Content-Type application/json 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須V-REC usr_... IDV-REC usr_... ID

リクエスト本文

項目型必須制約 / 意味
program_idinteger必須positive integer, enrolled programpositive integer, enrolled program

OUT · 出力仕様

項目型有無制約 / 意味
user_idstring必須V-REC member IDV-REC member ID
syncobject必須同期件数・失敗数 / Sync and failure counts同期件数・失敗数 / Sync and failure counts

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

HTTP 422validation_error形式: JSON

入力値・受講状態・残高・ウォレット条件不適合

HTTP 207partial_calendar_sync形式: JSON

同期が一部失敗

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • Google OAuth同意済み会員のみ。未承認は409、部分失敗207、1講座20授業まで。
  • V-REC HMAC = learning.calendar.write / SAKURA Connected Apps = learning_calendar
GET /api/merchant/v1/token-pool 加盟店専用トークンプール残高と全期間統計 learning.token_pool.read
認証 加盟店HMAC認証 権限範囲 learning.token_pool.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

OUT · 出力仕様

項目型有無制約 / 意味
contractstring必須ERC-20 contractERC-20 contract
symbolstring必須Token symbolToken symbol
onchain_balancestring|null条件付きオンチェーン残高取得結果 / Chain balance when availableオンチェーン残高取得結果 / Chain balance の場合 available
reserved_amountstring必須予約済み数量 / Reserved amount予約済み数量 / Reserved amount
available_estimatestring|null条件付き参考利用可能量(確定残高ではない) / Estimated available参考利用可能量(確定残高ではない) / Estimated available
statisticsobject必須全期間集計 / All-time totals全期間集計 / All-time totals

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • USDT担保残高とは別です。プール設定無効時は422。
  • V-REC HMAC = learning.token_pool.read / SAKURA Connected Apps = learning_token_payout
GET /api/merchant/v1/token-pool/transfers 送金台帳の履歴・全期間統計・ページ送り learning.token_pool.read
認証 加盟店HMAC認証 権限範囲 learning.token_pool.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

クエリパラメータ

項目型必須制約 / 意味
limitinteger任意1–100, default 501–100, default 50
before_idinteger任意positive cursor IDpositive cursor ID
statusstring任意reserved|dispatching|submitted|confirmed|reconcile_required|failedreserved|dispatching|submitted|confirmed|reconcile_required|failed

OUT · 出力仕様

項目型有無制約 / 意味
dataarray必須送金台帳の一ページ / One ledger page送金台帳の一ページ / One ledger page
statisticsobject必須全期間集計(total_count, requested_amount, submitted_count, confirmed_count, reconcile_required_count 等)全期間集計(total_count, requested_amount, submitted_count, confirmed_count, reconcile_required_count 等)
paginationobject必須limit, has_more, next_before_idlimit, has_more, next_before_id

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 件数・数量の全期間集計はstatistics。画面1ページの合計ではありません。
  • V-REC HMAC = learning.token_pool.read / SAKURA Connected Apps = learning_token_payout
GET /api/merchant/v1/token-pool/transfers/{id} 送金リクエストの状態照合 learning.token_pool.read
認証 加盟店HMAC認証 権限範囲 learning.token_pool.read 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

パスパラメータ

項目型必須制約 / 意味
idstring必須request_id 8–120 [A-Za-z0-9._:-]request_id 8–120 [A-Za-z0-9._:-]

OUT · 出力仕様

項目型有無制約 / 意味
request_idstring必須加盟店送金リクエストID / Merchant idempotency identifier加盟店送金リクエストID / Merchant idempotency identifier
statusstring必須reserved|dispatching|submitted|confirmed|reconcile_required|failedreserved|dispatching|submitted|confirmed|reconcile_required|failed
tx_hashstring|null条件付き送信受付時に存在することがある / Optional hash送信受付時に存在することがある / Optional hash
amountstring必須数量 / Exact decimal string数量 / Exact decimal string

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 送信受付とオンチェーン確定は異なります。
  • V-REC HMAC = learning.token_pool.read / SAKURA Connected Apps = learning_token_payout
POST /api/merchant/v1/token-pool/transfers 加盟店プールから会員ウォレットへのガスレス送金要求 learning.token_pool.write
認証 加盟店HMAC認証 権限範囲 learning.token_pool.write Content-Type application/json 成功 HTTP 200

IN · 入力仕様

Authentication / 共通認証

項目型必須制約 / 意味
X-VREC-Merchant-Keyヘッダー文字列必須加盟店API認証情報のキーID有効な認証キー
X-VREC-Timestampヘッダー整数文字列必須Unix秒。サーバ時刻±300秒以内(int) 型変換; ±300秒を超過 => merchant_timestamp_invalid
X-VREC-Nonceヘッダー文字列必須リプレイ防止Nonce。同一credentialで再利用不可^[A-Za-z0-9._:-]{8,128}$; 10分間保存
X-VREC-Signatureヘッダー文字列必須canonical stringのHMAC-SHA256小文字hexhash_hmac(sha256); 比較 ヘッダー値の英字を小文字化した後

リクエスト本文

項目型必須制約 / 意味
merchant_codestring必須V-REC mrc_... matches HMAC merchantV-REC mrc_... matches HMAC merchant
user_idstring必須V-REC usr_... ACTIVE/FULL memberV-REC usr_... ACTIVE/FULL member
request_idstring必須unique 8–120 [A-Za-z0-9._:-]unique 8–120 [A-Za-z0-9._:-]
amountstring必須decimal string >0, <=18 decimal digits before token precision validationdecimal string >0, <=18 decimal digits before token precision validation

OUT · 出力仕様

項目型有無制約 / 意味
request_idstring必須加盟店送金リクエストID / Merchant idempotency identifier加盟店送金リクエストID / Merchant idempotency identifier
statusstring必須reserved|dispatching|submitted|confirmed|reconcile_required|failedreserved|dispatching|submitted|confirmed|reconcile_required|failed
tx_hashstring|null条件付き送信受付時に存在することがある / Optional hash送信受付時に存在することがある / Optional hash
amountstring必須数量 / Exact decimal string数量 / Exact decimal string

想定エラー / HTTPレスポンス

HTTP 401merchant_auth_required形式: JSON

HMAC認証に失敗 / HMAC authentication failed

HTTP 403merchant_scope_denied形式: JSON

HMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch

HTTP 409merchant_learning_shared_instance_not_isolated形式: JSON

共有インスタンスは加盟店分離未保証 / shared instance is not isolated

HTTP 503learning_upstream_unavailable形式: JSON

SAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement

HTTP 422validation_error形式: JSON

入力値・受講状態・残高・ウォレット条件不適合

原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。

実装注意

  • 運営設定済み原資・署名リレイヤー・受取ウォレット必須。202やtx_hashはブロック確定ではありません。再送は同じrequest_idを使用し、要照合時の再送金は禁止。
  • V-REC HMAC = learning.token_pool.write / SAKURA Connected Apps = learning_token_payout

Webhook詳細仕様:送信タイミング・状態・会員登録・テナント資金・3DS →

Webhook通知

加盟店Webhook · user.kyc.updated

V-REC → Merchant
POSTMerchant configured HTTPS URLuser.kyc.updated⌄

IN · Merchantが受信するHeaders

Content-Type: application/json
X-VREC-Event: user.kyc.updated
X-VREC-Delivery: mwd_...
X-VREC-Timestamp: <unix seconds>
X-VREC-Signature: <lowercase hex hmac sha256>

署名検証文字列

TIMESTAMP + "\n" + DELIVERY + "\n" + EVENT + "\n" + SHA256(raw_body)

OUT · Merchantが返す値

任意の2xxで成功。失敗は最大8 attempts。retry delayは60, 300, 1800, 7200, 21600, 43200, 86400秒。HTTP重複排除はX-VREC-Delivery、業務イベント重複排除はpayload id。

期待する応答: HTTP 200–299

通知データの項目型必須意味
idstring必須業務イベントID。retryでも同一kyc_ + sha256(membership_id|status|source_event_id)。再試行でも同じ値です
typestring必須イベント種別user.kyc.updated
occurred_atstring必須発生時刻ISO 8601
data.user_idstring必須V-RECユーザーID
data.beneficiary_idstring必須受取人ID
data.external_user_refstring|null必須Merchant外部ユーザー参照JSONキーは常に存在; 値はnullの場合あり
data.kyc_statusstring必須SAKURAから再取得した最新KYC状態
data.ekyc_statusstring|null必須eKYC補助状態JSONキーは常に存在; 値はnullの場合あり

Payload例

{
    "id": "kyc_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
    "type": "user.kyc.updated",
    "occurred_at": "2026-10-05T01:00:00Z",
    "data": {
        "user_id": "usr_demo",
        "beneficiary_id": "VREC-DEMO",
        "external_user_ref": null,
        "kyc_status": "APPROVED",
        "ekyc_status": "COMPLETED"
    }
}

公開APIのセキュリティ境界

Merchant APIに返さない値: SAKURA password_setup_url, authenticated-user session tokens, full PAN, CVV, PIN. (Exception: kyc.link.issue returns only a SAKURA short URL.)

Full PAN / Expiry / CVVは、本人V-REC session + current_password step-up + CSRFを通った sensitive endpointだけで一時返却し、no-storeとして扱います。eKYC redirect URLも本人sessionだけに限定します。

内部API(/api/internal/v1/*)およびSAKURA Connected App bridgeはこの公開仕様の対象外です。