Corporate Payout
PartnerのPayout依頼。CREDITEDは資金確認が完了した結果。直接Allocationと別テーブルです。
GET /api/v1/me/payouts実装コードとOpenAPIを基準に、各APIのIN / OUT、型、必須条件、制約、成功レスポンス、エラー、セキュリティ境界を1エンドポイント単位で確認できる技術仕様書です。カードのPIN設定・発行会社側の取引履歴も含み、本人Session APIとMerchant HMAC APIを明確に区別しています。
これは外部加盟店サーバー向けのAPIです。ブラウザにMerchant HMAC秘密鍵を置かず、利用者ログインを検証した自社バックエンドから呼び出してください。V-RECとSAKURAの双方で対象Merchantと会員所属を検証します。
本番前提条件: 専用の加盟店⇄SAKURA接続、権限の明示承認、SAKURA Connected Appsの再認可が必要です。共有接続で加盟店分離が保証できない場合は409で遮断されます。
| Method | Endpoint | HMAC scope | 説明 |
|---|---|---|---|
GET | /api/merchant/v1/learning/programs | learning.read | 自社の公開講座を最大100件取得 |
GET | /api/merchant/v1/learning/programs/{id} | learning.read | 講義詳細・申込条件(秘密URLや正答は除外) |
POST | /api/merchant/v1/learning/programs/{id}/enrollments | learning.enroll.write | 同意済み会員を無料講座に登録、有料講座は不可 |
GET | /api/merchant/v1/learning/programs/{id}/sessions | learning.read | 講座の授業日程・受講条件を取得 |
GET | /api/merchant/v1/learning/users/{id}/schedule | learning.read | 加盟店所属会員の受講予定 |
GET | /api/merchant/v1/learning/users/{id}/progress | learning.read | 外部サイト向け受講進捗・カレンダー登録リンク |
GET | /api/merchant/v1/learning/rewards | learning.read | 学習報酬の直近履歴 |
POST | /api/merchant/v1/learning/sessions/{id}/complete | learning.rewards.write | 外部講義終了後の出席実績登録 |
POST | /api/merchant/v1/learning/sessions/{id}/rewards | learning.rewards.write | 受講完了済み授業の設定済み報酬を再処理 |
POST | /api/merchant/v1/learning/users/{id}/calendar-sync | learning.calendar.write | 同意済みGoogleカレンダーへの講義予定同期 |
GET | /api/merchant/v1/token-pool | learning.token_pool.read | 加盟店専用トークンプール残高と全期間統計 |
GET | /api/merchant/v1/token-pool/transfers | learning.token_pool.read | 送金台帳の履歴・全期間統計・ページ送り |
GET | /api/merchant/v1/token-pool/transfers/{id} | learning.token_pool.read | 送金リクエストの状態照合 |
POST | /api/merchant/v1/token-pool/transfers | learning.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は非同期・保留を含み、報酬やブロック確定を意味しません。報酬の任意金額指定はできません。
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は手動照合の対象で自動再送しません。未検証のリレイヤー設定では送金機能は無効です。
本フローには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リンクを加盟店サーバーのログや第三者分析へ保存しないでください。
これは発行済みカード一覧ではありません。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_factor | physical / 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.
既定で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ローカル一覧のみを返します。
個人の保有カード情報を加盟店へ開示するため、契約・個人情報の利用目的・閲覧権限が適切であることを確認してください。アタッチ操作だけで別サービスの金融情報閲覧への法的同意が当然に得られるわけではありません。
既定で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ローカル一覧のみを返します。
個人の保有カード情報を加盟店へ開示するため、契約・個人情報の利用目的・閲覧権限が適切であることを確認してください。アタッチ操作だけで別サービスの金融情報閲覧への法的同意が当然に得られるわけではありません。
既定で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ローカル一覧のみを返します。
個人の保有カード情報を加盟店へ開示するため、契約・個人情報の利用目的・閲覧権限が適切であることを確認してください。アタッチ操作だけで別サービスの金融情報閲覧への法的同意が当然に得られるわけではありません。
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種別の完全一致。 |
indicator | debit / credit |
q / transaction_id | 取引説明・加盟店名等の部分一致、またはMatchMove取引IDの完全一致。 |
min_amount / max_amount | ウォレット取引金額(USD等)を含む範囲。元のJPY金額や手数料とは別。 |
transaction_mode / mcc | カード決済のECOM/POS/ATMまたは加盟店カテゴリコード。 |
original_currency / currency / status | 元通貨・取引通貨・プロバイダー状態。 |
include_zero_amount | falseならカード認証等の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
V-RECは1つの財布ではありません。資金の出所ごとに正本とイベントが違うため、一覧やAPIの結果は合算せず、参照IDで突き合わせます。
PartnerのPayout依頼。CREDITEDは資金確認が完了した結果。直接Allocationと別テーブルです。
GET /api/v1/me/payoutsテナントから個人への直接割当。COMPLETED後にledger_lotsとCREDITが作られます。組戻しは独立した取引です。
GET /api/v1/me/tenant-allocationsV-REC台帳・内部カード記録・MatchMove明細・SAKURA暗号資産履歴は異なるものです。
GET /api/v1/me/ledger-entries| 何を確認するか | 正しいAPI | 注意 |
|---|---|---|
| 直接資金割当を受けたか | GET /api/v1/me/tenant-allocations | COMPLETED / remaining_amount · USD |
| テナントへ組戻したか | GET /api/v1/me/tenant-returns | COMPLETED / PENDING · USD |
| 割当後の台帳増減 | GET /api/v1/me/ledger-entries | CREDIT / DEBIT / TENANT_RETURN |
| 企業Payout | GET /api/v1/me/payouts | CREDITED ≠ direct Allocation |
| V-REC内部カードイベント | GET /api/v1/me/transactions | 発行会社の全明細ではない |
| 実カード利用・ATM | GET /api/v1/me/cards/{id}/issuer-transactions | SAKURA経由でMatchMoveから取得 |
| USDTウォレット送金 | GET /api/v1/me/wallet/transfers | USDT / tx_hash |
| USDT・独自トークンでの売買契約 | GET /api/v1/me/wallet/purchases | 支払資産と商品を別表示 |
| 操作 | 支払/移動するもの | 受け取るもの | 帳票 |
|---|---|---|---|
| 直接Allocation | Tenant Fund · USD 10.00 | V-REC lot · USD 10.00 | Tenant Allocation + Ledger CREDIT |
| USDT Transfer | 12.345678 USDT | 送金先ブロックチェーンアドレス | SAKURA wallet transfers |
| USDTでSGP-USDを購入 | 10 USDT | SGP-USD (契約により数量決定) | SAKURA sale contract + separate SGP-USD lot |
| 加盟店独自トークンでポイント購入 | 125 独自トークン単位 | 加盟店ポイント(契約条件による) | SAKURA sale contract / Merchant point ledger |
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行をタップすると、そのAPIだけの入力仕様・出力仕様・期待レスポンス・エラー一覧が展開されます。Required欄の conditional / dynamic は、前段APIの状態やSAKURA KYCFORMの定義によって必須性が変わる項目です。
各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へログイン済み本人のsame-origin session。未認証時はJSON 401ではなく /v/{instance}/login へHTTP 302。POSTはフォームの_csrf必須で、不一致はHTTP 419の非JSON bodyです。
既存SAKURA identityはPOST /api/merchant/v1/usersで再作成しません。MerchantはUserのemailやSAKURA User IDを指定せず、本人同意用Link Requestを作成し、返されたauthorization_urlを本人へ渡します。本人がSAKURAへログインして承認したidentityだけがV-RECへ接続されます。
Merchant backend
POST /api/merchant/v1/user-links + Idempotency-Key
↓ authorization_url
User opens SAKURA consent page
↓ sign in + approve
SAKURA → V-REC callback (one-time code + state)
↓ code exchange / stable SAKURA user UUID
V-REC creates or reuses Global User + Tenant membership
↓
Merchant polls GET /api/merchant/v1/user-links/{id}
↓
COMPLETED + linked_user_id + membership(FULL or READONLY)
ウォレットは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
利用者はUSDTまたは加盟店の独自トークンを代金として、SGP-USDまたは加盟店が定めたポイントを購入します。SAKURA EXCHANGEのライセンスに基づく販売で、両替ではありません。1件ごとに契約番号・売主・価格・手数料を確定し、本人の同意とウォレットパスワードで代金を支払います。
| 商品 | 代金 | 売主 | 代金の行き先 | 加盟店の収益 |
|---|---|---|---|---|
| SGP-USD | USDT | SAKURA 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)
https://api.v-rec.xyz
/api/merchant/v1/card-types
カード種別一覧(MatchMove・15分キャッシュ)
cards.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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_factor | string | 任意 | physicalまたはvirtualphysical|virtual |
code | string | 任意 | カード種別コードの完全一致^[A-Za-z0-9_-]+$, maxLength=100 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data[] | array<object> | 必須 | 登録されたカード種別(全項目)no card issuance authorization implied |
data[].id / code / name / description | integer / string | 必須 | カード種別ID・コード・名称・説明code is the exact MatchMove product identifier |
data[].form_factor / personalised_order | string / boolean | 必須 | physical/virtual と個別製作フラグform_factor=physical|virtual |
data[].token / currency / image / details | object / array / object / object|array | 必須 | CVV設定・USD等の通貨・画像URL・発行上限メタデータJSON decoded, not serialized strings; details can be [] |
data[].created_at / updated_at | string|null | 必須 | DB登録日時・更新日時YYYY-MM-DD HH:mm:ss の場合 present |
meta.source / meta.stale / meta.refreshed_at / meta.next_refresh_at / meta.cache_ttl_seconds | string / boolean / datetime|null / datetime / integer | 必須 | 取得元・古いデータか・MatchMove最終取得日時・次回更新期限・キャッシュ秒数900 seconds on SAKURA; stale=true means last-known data |
total / filters | integer / object | 必須 | 絞込後の件数と適用した検索条件filters.form_factor and filters.code are null可 |
{
"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
}
}
merchant_auth_required / merchant_signature_invalid形式: JSON認証エラー
merchant_scope_denied / sakura_cards_scope_required形式: JSONcards.read または SAKURA cards 権限なし
invalid_form_factor / invalid_code形式: JSON不正な検索条件
card_types_unavailable / card_types_upstream_unavailable形式: JSONDBまたは連携先が利用不可
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/context
認証中MerchantのContext取得
users.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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.id | string | 必須 | Merchant公開IDmrc_... |
merchant.name | string | 必須 | Merchant表示名 |
merchant.program_id | string | 必須 | V-REC Program公開ID |
{
"merchant": {
"id": "mrc_demo",
"name": "Example Merchant",
"program_id": "vrec_demo"
}
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONHMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗
merchant_scope_denied形式: JSON必要scope不足
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/profile-options
ユーザー作成前のSAKURA国・電話コード候補取得
users.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
countries[] | array<object> | 必須 | SAKURAが許可する国候補 |
countries[].code | string | 必須 | 送信に使用する国コード^[A-Z]{2}$ |
countries[].provider_code | string | 必須 | 互換メタデータ。SAKURA current endpointが未提供なら空文字codeの代わりに送信しないこと |
countries[].label | string | 必須 | 表示ラベル |
dial_codes[] | array<object> | 必須 | SAKURAが許可する国際電話コード候補 |
dial_codes[].code | string | 必須 | 送信に使用する+付き国際電話コード+digits |
dial_codes[].provider_code | string | 必須 | 互換メタデータ。SAKURA current endpointが未提供なら空文字 |
dial_codes[].label | string | 必須 | 表示ラベル |
generated_at | string|null | 必須 | SAKURA候補カタログ生成時刻nullでない場合ISO 8601形式 |
{
"countries": [
{
"code": "JP",
"provider_code": "",
"label": "Japan"
}
],
"dial_codes": [
{
"code": "+81",
"provider_code": "",
"label": "Japan (+81)"
}
],
"generated_at": "2026-10-05T01:00:00Z"
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONHMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗
merchant_scope_denied形式: JSON必要scope不足
profile_options_unavailable形式: JSONSAKURA候補カタログを取得できない
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users
当該Merchant所属ユーザー一覧
users.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
limit | integer | 任意 | 取得件数PHP (int) 型変換 その後 clamp 1..100; 省略時=>50; e.g. abc/0/negative=>1, >100=>100 |
offset | integer | 任意 | 開始offsetPHP (int) 型変換 その後 max(0,...); 省略時=>0; abc/negative=>0 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data[] | array<merchant_user> | 必須 | Merchant所属ユーザー配列 |
data[].id | string | 必須 | V-RECユーザー公開IDusers.public_id; usr_... |
data[].beneficiary_id | string | 必須 | 受取人IDusers.beneficiary_id |
data[].email | string | 必須 | SAKURA現在値。remoteが無い場合はV-REC保存値email |
data[].name | string | 必須 | SAKURA現在値。remote nameが無ければ空文字 |
data[].profile | object | 必須 | SAKURAプロフィールの現在値 |
data[].profile.first_name | string | 条件付き | SAKURA正規データの名前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
data[].profile.last_name | string | 条件付き | SAKURA正規データの姓前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
data[].profile.country_code | string | 条件付き | SAKURA正規データの国コード現在の正式なデータ投影; 通常ISO alpha-2; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
data[].profile.dial_code | string | 条件付き | SAKURA正規データの電話国番号+で始まる数字列に正規化; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
data[].profile.phone | string | 条件付き | SAKURA正規データの電話番号前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
data[].profile.postal_code | string | 条件付き | SAKURA正規データの郵便番号前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
data[].profile.address_line1 | string | 条件付き | SAKURA正規データの住所1行目前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
data[].profile.address_line2 | string | 条件付き | SAKURA正規データの住所2行目前後空白を除去した文字列; キーは常に存在; 空文字の場合あり; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
data[].profile.city | string | 条件付き | SAKURA正規データの市区町村前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
data[].profile.state | string | 条件付き | SAKURA正規データの都道府県・州前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
data[].country | string|null | 必須 | profile.country_code。無ければnullnullでない場合ISO alpha-2 |
data[].kyc_status | string | 必須 | SAKURA現在値、無ければV-REC保存値NOT_STARTED|PENDING|APPROVED|REJECTED|REVIEW|CORRECTION_REQUIRED |
data[].status | string | 必須 | 対象Merchant membership状態通常 ACTIVE|SUSPENDED; INACTIVE rows are excluded |
data[].global_status | string | 必須 | V-REC users.status |
data[].sakura_user_ref | string|null | 必須 | 接続中SAKURAユーザー参照キーは常に存在; 値はnullの場合あり |
data[].created_at | string | 必須 | V-REC作成時刻DB日時形式 |
data[].updated_at | string | 必須 | V-REC更新時刻DB日時形式 |
limit | integer | 必須 | 実際に適用されたlimit1..100 after PHP integer-型変換 + clamp |
offset | integer | 必須 | 実際に適用されたoffset>=0 after PHP integer-型変換 + clamp |
{
"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
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONHMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗
merchant_scope_denied形式: JSON必要scope不足
sakura_profile_unavailable形式: JSONSAKURA profile一括取得失敗
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users
V-REC/SAKURAユーザー作成または既存IDの安全な紐付け
users.write
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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 | string | 必須 | 作成冪等性キー1〜190文字 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
email | string | 必須 | 本人メール有効なメールアドレス; SAKURA上限190文字 |
first_name | string | 必須 | 名前後空白除去後に空でないこと; SAKURA上限120文字 |
last_name | string | 必須 | 姓前後空白除去後に空でないこと; SAKURA上限120文字 |
country_code | string | 条件付き | 推奨国コード。profile-optionsのcountries[].codeのみ旧形式のcountryを使用しない限り必須; if キーが空文字で存在する, 旧形式のcountryは使用されない; SAKURA側で2文字 |
country | string | 条件付き | country_code未指定/null時だけ読まれるlegacy alias許可候補一覧は以下と同じ: country_code; 両方同時に送信しないこと |
dial_code | string | 必須 | 国際電話コード。profile-options候補のみnormalized to +digits; SAKURA上限12文字 |
phone | string | 必須 | 電話番号前後空白除去後に空でないこと; SAKURA上限40文字 |
postal_code | string | 必須 | 郵便番号前後空白除去後に空でないこと; SAKURA上限40文字 |
state | string | 必須 | 都道府県/州前後空白除去後に空でないこと; SAKURA上限120文字 |
city | string | 必須 | 市区町村前後空白除去後に空でないこと; SAKURA上限120文字 |
address_line1 | string | 必須 | 住所1前後空白除去後に空でないこと; SAKURA上限190文字 |
address_line2 | string | 必須 | 住所2前後空白除去後に空でないこと in current V-REC flow; SAKURA上限190文字 |
notifications | object | 任意 | オンボーディングメール制御省略時/null => 両フラグtrue; オブジェクト以外 => notifications_invalid; 未知のキーは無視 |
notifications.send_vrec_activation_email | boolean | 任意 | V-REC activation mail送信既定でtrue; 指定時はboolean以外を拒否 => notification_flag_invalid |
notifications.send_sakura_password_setup_email | boolean | 任意 | SAKURA setup mail送信既定でtrue; 指定時はboolean以外を拒否 => notification_flag_invalid |
onboarding_mode | string | 任意 | パスワード通知なしのeKYC専用登録ekyc_only only; no password returned |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user.public_id | string | 必須 | V-RECユーザー公開IDusr_... |
user.beneficiary_id | string | 必須 | 受取人ID |
user.email | string | 必須 | 登録メールemail |
user.name | string | 必須 | 氏名 |
user.country | string|null | 必須 | SAKURA identity.profile.country_code。mock等ではnull可nullでない場合ISO alpha-2 |
user.kyc_status | string | 必須 | KYC状態 |
user.status | string | 必須 | Merchant membership状態 |
user.global_status | string | 必須 | V-RECユーザー状態 |
user.sakura_user_ref | string|null | 必須 | SAKURAユーザー参照キーは常に存在 |
user.sakura_customer_uuid | string | 必須 | SAKURAの固定顧客UUID空の場合リクエスト失敗 |
user.created_at | string | 必須 | 作成時刻 |
user.activation_url | string | 条件付き | 新規ローカルV-REC login作成時だけ返すactivation URL既に連携済みのユーザーでは省略; SAKURAのpassword_setup_urlは返却しない |
user.activation_expires_in | integer | 条件付き | activation_url有効秒数activation_urlがある場合に存在; 86400 |
user.notifications.vrec_activation_email | string | 必須 | V-REC activation email送信結果sent|disabled|not_applicable|failed |
user.notifications.sakura_password_setup_email | string | 必須 | SAKURA password setup email送信結果sent|disabled|not_applicable|failed |
{
"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"
}
}
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONHMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗
merchant_scope_denied形式: JSON必要scope不足
invalid_json形式: JSONJSON body不正
idempotency_key_reused_with_different_request / request_in_progress / email_identity_mismatch / merchant_context_required / user_link_not_authorized / email_already_registered形式: JSON冪等性またはidentity conflict
idempotency_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失敗
upstream_or_internal_error / <SAKURA errorCode or sakura_unavailable>形式: JSONSAKURA/上流一時障害
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/user-links
既存SAKURAユーザー本人同意リンクを作成
users.write
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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 | string | 必須 | 同一リンク要求の再送キー1〜190文字; reuse 同一のexternal_customer_refに限る |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
external_customer_ref | string|null | 任意 | Merchant側顧客参照。SAKURA User選択には使用しないmax 190 |
bodyなし、またはendpoint固有schemaなし。
{
"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
}
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONMerchant HMAC認証失敗
merchant_scope_denied形式: JSON必要scope不足
idempotency_key_required / idempotency_key_reused_with_different_request / sakura_not_connected / sakura_target_merchant_mismatch / sakura_link_request_mismatch形式: JSONIdempotency競合またはSAKURA接続未完了
link_request_unavailable / sakura_link_unavailable形式: JSONSAKURA一時障害
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/user-links/{id}
既存ユーザーリンク要求の状態確認
users.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | link request公開IDulr_... |
bodyなし、またはendpoint固有schemaなし。
{
"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
}
}
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONMerchant HMAC認証失敗
merchant_scope_denied形式: JSON必要scope不足
link_request_not_found形式: JSONこのMerchantに属する要求がない
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}
ユーザー詳細取得
users.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusers.public_id; usr_... |
beneficiary_id | string | 必須 | 受取人IDusers.beneficiary_id |
email | string | 必須 | SAKURA現在値。remoteが無い場合はV-REC保存値email |
name | string | 必須 | SAKURA現在値。remote nameが無ければ空文字 |
profile | object | 必須 | SAKURAプロフィールの現在値 |
profile.first_name | string | 条件付き | SAKURA正規データの名前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.last_name | string | 条件付き | SAKURA正規データの姓前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.country_code | string | 条件付き | SAKURA正規データの国コード現在の正式なデータ投影; 通常ISO alpha-2; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.dial_code | string | 条件付き | SAKURA正規データの電話国番号+で始まる数字列に正規化; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.phone | string | 条件付き | SAKURA正規データの電話番号前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.postal_code | string | 条件付き | SAKURA正規データの郵便番号前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.address_line1 | string | 条件付き | SAKURA正規データの住所1行目前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.address_line2 | string | 条件付き | SAKURA正規データの住所2行目前後空白を除去した文字列; キーは常に存在; 空文字の場合あり; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.city | string | 条件付き | SAKURA正規データの市区町村前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.state | string | 条件付き | SAKURA正規データの都道府県・州前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
country | string|null | 必須 | profile.country_code。無ければnullnullでない場合ISO alpha-2 |
kyc_status | string | 必須 | SAKURA現在値、無ければV-REC保存値NOT_STARTED|PENDING|APPROVED|REJECTED|REVIEW|CORRECTION_REQUIRED |
status | string | 必須 | 対象Merchant membership状態通常 ACTIVE|SUSPENDED; INACTIVE rows are excluded |
global_status | string | 必須 | V-REC users.status |
sakura_user_ref | string|null | 必須 | 接続中SAKURAユーザー参照キーは常に存在; 値はnullの場合あり |
created_at | string | 必須 | V-REC作成時刻DB日時形式 |
updated_at | string | 必須 | V-REC更新時刻DB日時形式 |
{
"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"
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONHMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗
merchant_scope_denied形式: JSON必要scope不足
not_found形式: JSON当該Merchant境界外または存在しないuser
sakura_profile_unavailable形式: JSONSAKURA profile取得失敗
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/status
Merchant membershipをACTIVE/SUSPENDEDへ変更
users.write
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
status | string | 必須 | membership状態ACTIVE|SUSPENDED; trim + strtoupper => 入力は大文字小文字を区別しない |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusers.public_id; usr_... |
beneficiary_id | string | 必須 | 受取人IDusers.beneficiary_id |
email | string | 必須 | SAKURA現在値。remoteが無い場合はV-REC保存値email |
name | string | 必須 | SAKURA現在値。remote nameが無ければ空文字 |
profile | object | 必須 | SAKURAプロフィールの現在値 |
profile.first_name | string | 条件付き | SAKURA正規データの名前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.last_name | string | 条件付き | SAKURA正規データの姓前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.country_code | string | 条件付き | SAKURA正規データの国コード現在の正式なデータ投影; 通常ISO alpha-2; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.dial_code | string | 条件付き | SAKURA正規データの電話国番号+で始まる数字列に正規化; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.phone | string | 条件付き | SAKURA正規データの電話番号前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.postal_code | string | 条件付き | SAKURA正規データの郵便番号前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.address_line1 | string | 条件付き | SAKURA正規データの住所1行目前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.address_line2 | string | 条件付き | SAKURA正規データの住所2行目前後空白を除去した文字列; キーは常に存在; 空文字の場合あり; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.city | string | 条件付き | SAKURA正規データの市区町村前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
profile.state | string | 条件付き | SAKURA正規データの都道府県・州前後空白を除去した文字列; キーは常に存在; 次の場合に存在: SAKURAのプロファイル応答に該当項目が含まれる; リモートのプロファイルがない場合、MerchantApiControllerはprofile={}を返すことがある |
country | string|null | 必須 | profile.country_code。無ければnullnullでない場合ISO alpha-2 |
kyc_status | string | 必須 | SAKURA現在値、無ければV-REC保存値NOT_STARTED|PENDING|APPROVED|REJECTED|REVIEW|CORRECTION_REQUIRED |
status | string | 必須 | 対象Merchant membership状態通常 ACTIVE|SUSPENDED; INACTIVE rows are excluded |
global_status | string | 必須 | V-REC users.status |
sakura_user_ref | string|null | 必須 | 接続中SAKURAユーザー参照キーは常に存在; 値はnullの場合あり |
created_at | string | 必須 | V-REC作成時刻DB日時形式 |
updated_at | string | 必須 | V-REC更新時刻DB日時形式 |
{
"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"
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONHMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗
merchant_scope_denied形式: JSON必要scope不足
invalid_json形式: JSONJSON不正
not_found形式: JSONuser境界外
invalid_status形式: JSONACTIVE/SUSPENDED以外
sakura_profile_unavailable形式: JSON更新後profile取得失敗
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/kyc
KYC状態をSAKURAから同期して取得
kyc.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-RECユーザー公開IDusr_... |
kyc_status | string | 必須 | SAKURA再取得後にV-RECへ保存したKYC状態NOT_STARTED|PENDING|APPROVED|REJECTED|REVIEW|CORRECTION_REQUIRED |
checked_at | string | 必須 | syncで更新された最終同期時刻DBのUTC日時 |
{
"user_id": "usr_demo",
"kyc_status": "APPROVED",
"checked_at": "2026-10-05 01:00:00"
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONHMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗
merchant_scope_denied形式: JSON必要scope不足
not_found形式: JSONuser境界外
kyc_sync_unavailable形式: JSONKYC同期不可
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/kyc/preload-status
KYC受領証跡と担当者の確認
kyc.preload
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | 加盟店所有ユーザーID |
bodyなし、またはendpoint固有schemaなし。
{
"user_id": "usr_example",
"stage": "final_review",
"kyc_status": "PENDING",
"next_action": {
"type": "final_review"
},
"responsibility": {
"owner": "SAKURA_REVIEWER"
}
}
validation_errorフィールド未入力・18歳未満
previous_preload_unresolved前回のKYC処理状態が不確定
sakura_unavailableSAKURA接続が不安定
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/kyc/preload-reconcile
安全条件に基づく訂正復旧
kyc.preload
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | 加盟店所有ユーザーID |
bodyなし、またはendpoint固有schemaなし。
{
"user_id": "usr_example",
"stage": "final_review",
"kyc_status": "PENDING",
"next_action": {
"type": "final_review"
},
"responsibility": {
"owner": "SAKURA_REVIEWER"
}
}
validation_errorフィールド未入力・18歳未満
previous_preload_unresolved前回のKYC処理状態が不確定
sakura_unavailableSAKURA接続が不安定
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/kyc/start
本人ログインKYCフローへの誘導情報取得
kyc.start
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-RECユーザー公開ID |
kyc_status | string | 必須 | 現在KYC状態 |
action | string | 必須 | Merchant側が取るべきアクションUSER_LOGIN_REQUIRED |
user_url | string | 必須 | 本人がログインするV-REC URLhttps URL |
message | string | 必須 | 実装上の説明 |
{
"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."
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONHMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗
merchant_scope_denied形式: JSON必要scope不足
not_found形式: JSONuser境界外
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/cards
アタッチ済みユーザーのSAKURA既存カード+V-RECカード一覧
cards.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
include_existing | boolean | 任意 | 既存SAKURAカードを含む既定でtrue; false/0 is V-REC local-only legacy mode; true/1 accepted |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-RECユーザー公開IDusers.public_id; 現行で生成するIDは usr_... |
data[] | array<card_list_item> | 必須 | mask済みカード一覧PAN/CVV/PINは含まれません |
data[].id | string | 必須 | V-REC公開card_... またはSAKURA既存カード専用skc_...card_... is local; skc_... is scoped to user/program and 参照専用 |
data[].card_type | string | 必須 | カード種別VIRTUAL|PHYSICAL |
data[].brand | string | 必須 | カードブランドMASTERCARD |
data[].masked_pan | string|null | 必須 | マスク済みPANカード番号全桁(PAN)は返さない; null可 |
data[].last4 | string|null | 必須 | PAN末尾4桁null可 |
data[].currency | string|null | 必須 | カード通貨SAKURA or local currency (3 letters), unknown null |
data[].status | string | 必須 | カード状態ACTIVE|FROZEN|CLOSED (保存値/プロバイダー正規化値) |
data[].atm_enabled | boolean|null | 必須 | 既知のATM利用可否、不明ならnullunknown for SAKURA_ONLY; no false inference |
data[].created_at | string|null | 必須 | カード登録時刻null for card absent から V-REC local DB |
meta | object | 任意 | SAKURA取得メタ情報only include_existing=true; includes truncation status |
data[].source | string | 必須 | 参照元VREC_LOCAL | VREC_AND_SAKURA | SAKURA_ONLY |
data[].origin | string | 必須 | カード発行起点VREC_LOCAL | VREC_ISSUED | SAKURA_EXISTING |
data[].read_only | boolean | 必須 | 読み取り専用IDtrue for SAKURA_ONLY; no mutation permissions are ever inferred |
data[].status_source | string | 必須 | 状態情報の元VREC_LOCAL_RECORD | SAKURA_CARD_RECORDS; NOT MatchMove live |
meta.sakura_truncated | boolean | 任意 | SAKURA側100件制限による切り詰めtrue means incomplete list |
meta.inventory_complete | boolean | 任意 | SAKURA一覧の切り詰めなしfalse の場合 sakura_truncated=true |
meta.sakura_is_live | boolean | 任意 | MatchMoveライブ状態ではないalways false |
{
"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
}
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON署名・認証情報・タイムスタンプ等の検証に失敗
merchant_scope_denied形式: JSONcards.read権限なし
not_found形式: JSONMerchantの参照範囲にユーザーが存在しない
cards_overview_requires_connected_apps / sakura_cards_scope_required / sakura_user_not_linked形式: JSONSAKURA連携・同一ユーザー紐づけ未完了
invalid_include_existing形式: JSONinclude_existing不正
too_many_attempts形式: JSONカード一覧照会レート制限
sakura_card_inventory_unavailable / membership_capabilities_unavailable形式: JSON上流障害または権限テーブル未準備。0件ではない
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/cards
VIRTUALカードをAPI発行
cards.issue
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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 | string | 必須 | 冪等キー8-190 chars; mandatory |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
card_type | string | 必須 | カード種別VIRTUAL only |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-REC利用者IDusr_... |
card | object | 必須 | mask済みカードno PAN/CVV |
idempotent_replay | boolean | 必須 | 冪等再試行の場合のみtrue on replay |
{
"user_id": "usr_demo",
"card": {
"id": "card_demo",
"card_type": "VIRTUAL",
"masked_pan": "**** **** **** 1234"
}
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON署名・認証情報・タイムスタンプ等の検証に失敗
merchant_scope_denied / full_membership_required / merchant_membership_capability_denied / user_not_active形式: JSON発行権限なし、所属またはユーザー状態が不適切
not_found形式: JSONユーザーがMerchantの範囲外
idempotency_key_reused_with_different_request / card_issue_reconciliation_required / card_issue_in_progress形式: JSON冪等キー競合、結果不明の発行を照合中、または操作取得競合
idempotency_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になる場合あり
request_too_large形式: JSONリクエスト本文が大きすぎる
card_issue_reconciliation_required / card_issue_operation_unavailable形式: JSON送信結果不明・操作レコードの照合が必要
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/cards/issuance/{key}
バーチャルカード発行結果の照会(再発行なし)
cards.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
key | string | 必須 | 発行時のIdempotency-Key8–190 chars; A-Z a-z 0-9 . _ : - |
bodyなし、またはendpoint固有schemaなし。
{
"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"
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON署名・認証情報・タイムスタンプ等の検証に失敗
merchant_scope_denied / full_membership_required / merchant_membership_capability_denied / user_not_active形式: JSONcards.readまたは有効なFULL所属がない
not_found形式: JSON対象Merchant・ユーザーに対応する発行記録がない
invalid_operation_key形式: JSONキー形式が不正
membership_capabilities_unavailable形式: JSON所属権限テーブルの準備ができていない
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/cards/{cardId}/transactions
V-RECまたは既存SAKURAカードのMatchMove取引履歴
transactions.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
cardId | string | 必須 | カード一覧から得たcard_...またはskc_...card_... V-REC local; skc_... SAKURA_ONLY 参照専用 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
from | date | 任意 | 検索開始日YYYY-MM-DD; default 30 days ago; maximum date span 90 days |
to | date | 任意 | 検索終了日YYYY-MM-DD; default today; no later than UTC tomorrow |
page | integer | 任意 | ページdefault 1; 1-100 |
limit | integer | 任意 | 取得件数default 20; 1-50 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-RECユーザー公開IDusr_... |
card_id | string | 必須 | V-RECカード公開IDcard_... |
source | string | 必須 | MatchMove発行会社明細matchmove |
page | integer | 必須 | ページ番号1-100 |
limit | integer | 必須 | 要求件数1-50 |
from | date | 必須 | 開始日YYYY-MM-DD |
to | date | 必須 | 終了日YYYY-MM-DD; max span 90 days |
total | integer|null | 必須 | 上流総件数(未提供時null)null可 |
records_per_page | integer | 必須 | 実際の上流ページ件数used for next-page calculation |
has_more | boolean | 必須 | 次ページの有無best effort |
items | array<object> | 必須 | カード単位の利用明細[] for valid no-transaction result |
items[].id | string | 条件付き | 取引IDprovider value may be blank |
items[].type | string | 条件付き | カード取引種別provider value |
items[].amount | decimal string|null | 条件付き | 取引額null可 |
items[].currency | string | 条件付き | 取引通貨provider value |
items[].description | string | 条件付き | 取引摘要provider value |
items[].merchant | string | 条件付き | 加盟店名provider value |
items[].status | string | 条件付き | 処理状況provider value |
items[].date | string | 条件付き | 日時provider string |
items[].indicator | string|null | 条件付き | 入出金区分null可 |
{
"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"
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON署名・認証情報・タイムスタンプ等の検証に失敗
merchant_scope_denied形式: JSON権限なし
card_not_found形式: JSONカードなし
invalid_filters形式: JSON検索条件不正
too_many_attempts形式: JSONレート制限
issuer_transactions_unavailable形式: JSON決済履歴取得失敗
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/matchmove-wallet-transactions
MatchMoveウォレット全体の取引履歴(カード別明細ではない)
transactions.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
page | integer | 任意 | 通常ページ番号。フィルター利用時は省略か1のみ1-100; default 1; filtered search only page=1 |
limit | integer | 任意 | ページ件数1-50; default 20 |
cursor | string | 任意 | 前ページのnext_cursor。フィルターをすべて同じ値で再送max 512; search mode only |
from | date | 任意 | 検索開始日(含む)。発行会社取引日のYYYY-MM-DDYYYY-MM-DD; から/to span <= 90d |
to | date | 任意 | 検索終了日(含む)YYYY-MM-DD; から/to span <= 90d |
category | string | 任意 | 検索用の正規化取引分類purchase|topup|transfer|atm|fee|authorization|card_issuance|adjustment|other |
type | string | 任意 | MatchMoveの取引種別を完全一致検索(大文字小文字無視)free string max 80; e.g. Purchase |
indicator | string | 任意 | ウォレットの入金/出金credit|debit |
q | string | 任意 | 加盟店名・説明・種別・取引IDの部分一致最大120文字 |
min_amount | decimal string | 任意 | ウォレット取引金額の下限(含む)max 8 decimals |
max_amount | decimal string | 任意 | ウォレット取引金額の上限(含む)max 8 decimals |
currency | string | 任意 | 取引通貨ISO 4217 / USD |
original_currency | string | 任意 | 元決済通貨ISO 4217 / JPY |
status | string | 任意 | 上流取引ステータス完全一致e.g. Success |
transaction_mode | string | 任意 | ECOM/POS/ATMecom|pos|atm |
mcc | string | 任意 | 加盟店カテゴリコードfour digits |
transaction_id | string | 任意 | MatchMove取引IDの完全一致max 190 |
include_zero_amount | boolean | 任意 | falseなら0円取引を除外true|false; 既定でtrue |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-REC利用者公開IDusr_... |
source | string | 必須 | MatchMoveウォレットのライブ取得元MATCHMOVE_WALLET_LIVE |
observed_at | ISO 8601 string | 必須 | SAKURAで取得した時刻UTC |
page | integer | 必須 | ページ番号1-100 |
limit | integer | 必須 | 1ページの要求件数1-50 |
total_records | integer|null | 必須 | MatchMoveが返す総件数(不明ならnull)null可 |
has_more | boolean | 必須 | 次ページ候補の有無best-effort if upstream count unknown |
items | array<object> | 必須 | MatchMoveウォレット取引一覧。ページに取引なしなら空配列no card ID filter |
items[].id | string|null | 条件付き | MatchMove取引識別子null可 |
items[].transaction_date | string|null | 条件付き | 取引日時null可; provider string |
items[].type | string|null | 条件付き | 取引タイプ(例:GET CARD)provider-specific |
items[].description | string|null | 条件付き | 加盟店名または内容null可 |
items[].indicator | string|null | 条件付き | 入出金区分debit / credit / null |
items[].amount | decimal string|null | 条件付き | 取引金額null可; do not float-round |
items[].currency | string|null | 条件付き | 通貨コードnull可; do not assume USD |
items[].status | string|null | 条件付き | MatchMove取引ステータスprovider-specific |
pagination_mode | string | 条件付き | 検索時に追加されるカーソル情報条件付き |
next_cursor | string|null | 条件付き | 検索時に追加されるカーソル情報null可 in filter mode |
search_complete | boolean | 条件付き | 検索時に追加されるカーソル情報条件付き |
scanned_records | integer | 条件付き | 検索時に追加されるカーソル情報条件付き |
filters | object | 条件付き | 検索時に追加されるカーソル情報null可 in filter mode |
items[].category | string | 条件付き | MatchMoveの安全な追加参照項目(未提供時null)条件付き |
items[].balance | string|null | 条件付き | MatchMoveの安全な追加参照項目(未提供時null)条件付き |
items[].merchant_name | string|null | 条件付き | MatchMoveの安全な追加参照項目(未提供時null)条件付き |
items[].merchant_category_code | string|null | 条件付き | MatchMoveの安全な追加参照項目(未提供時null)条件付き |
items[].merchant_country | string|null | 条件付き | MatchMoveの安全な追加参照項目(未提供時null)条件付き |
items[].transaction_mode | string|null | 条件付き | MatchMoveの安全な追加参照項目(未提供時null)条件付き |
items[].original_amount | string|null | 条件付き | MatchMoveの安全な追加参照項目(未提供時null)条件付き |
items[].original_currency | string|null | 条件付き | MatchMoveの安全な追加参照項目(未提供時null)条件付き |
items[].fee_amount | string|null | 条件付き | MatchMoveの安全な追加参照項目(未提供時null)条件付き |
items[].fee_currency | string|null | 条件付き | MatchMoveの安全な追加参照項目(未提供時null)条件付き |
{
"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
}
]
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON署名/認証が不正
merchant_scope_denied / user_not_active / full_membership_required / merchant_membership_capability_denied形式: JSONtransactions.read権限がない、またはACTIVE/FULL・残高閲覧権限条件に不一致
not_found形式: JSON対象ユーザーが加盟店に紐づいていない
matchmove_wallet_not_linked / matchmove_wallet_identity_conflict / sakura_balances_scope_required形式: JSONMatchMoveウォレット未連携/本人IDの不整合/SAKURA balances権限なし
invalid_filters形式: JSONクエリの値、日付範囲、検索カーソル、ページング方式が不正
too_many_attempts形式: JSON30件/分の照会制限
wallet_transactions_unavailable / membership_capabilities_unavailable形式: JSONSAKURA/MatchMove照会不能。ゼロ件には置き換えない
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/cards/{cardId}/status
カードのフリーズ・サスペンド・解除(Merchant)
cards.manage
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
cardId | string | 必須 | V-RECカード公開IDcard_... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
status | string | 必須 | FREEZE/SUSPENDでFROZEN、UNFREEZEでACTIVEACTIVE|ACTIVATE|UNFREEZE|FROZEN|FREEZE|SUSPEND|SUSPENDED |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | 対象V-RECユーザーusr_... |
card.id | string | 必須 | 対象カード公開IDcard_... |
card.status | string | 必須 | 反映確認できたカードの状態ACTIVE or FROZEN |
effective_status | string | 必須 | 発行会社に要求した実効状態ACTIVE or FROZEN |
{
"user_id": "usr_example",
"card": {
"id": "card_example",
"status": "FROZEN"
},
"effective_status": "FROZEN"
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON署名・認証情報・タイムスタンプ等の検証に失敗
merchant_scope_denied形式: JSON権限なし
card_not_found形式: JSONカードなし
closed_card_cannot_reactivate / card_status_update_rejected / active_merchant_membership_required形式: JSONローカルで閉鎖状態を検出した場合等の確定的な操作拒否(上位結果不明は503)
unsupported_card_status形式: JSON指定状態非対応
too_many_attempts形式: JSONレート制限
card_status_result_unconfirmed形式: JSON発行会社の結果不明
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/cards/{cardId}/sensitive-link
本人パスワード認証用カード表示リンク
cards.sensitive.link
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
cardId | string | 必須 | V-RECカード公開IDcard_... |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
url | string | 必須 | V-REC本人確認URLHTTPS; one-time; expires in 300s |
password_required | boolean | 必須 | V-RECパスワード必須true |
expires_in_seconds | integer | 必須 | リンク有効秒数300 |
display | string | 必須 | 表示形式HOSTED_VREC_ONLY |
{
"url": "https://v-rec.example/card-reveal#one-time-token",
"expires_in_seconds": 300,
"password_required": true,
"display": "HOSTED_VREC_ONLY"
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON署名・認証情報・タイムスタンプ等の検証に失敗
merchant_scope_denied / full_membership_required / merchant_membership_capability_denied / user_not_active形式: JSON明示scope不足、所属またはユーザーが無効
not_found / card_not_found形式: JSON対象ユーザーまたはカードが見つからない
card_not_active形式: JSONカード状態がACTIVEではない
empty_body_required形式: JSON空の本文または{}以外の本文は拒否
too_many_attempts形式: JSONユーザーごとの発行数制限を超過
membership_capabilities_unavailable / secure_public_url_not_configured形式: JSON所属情報未準備または安全なHTTPS URL未設定
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/matchmove-balance
MatchMoveの利用可能残高を実照会
balances.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | 利用者ID |
source | string | 必須 | データ取得元MATCHMOVE_LIVE |
currency | string | 必須 | 通貨ISO 4217 |
available | decimal string | 必須 | カード利用可能額MatchMove direct |
observed_at | ISO 8601 | 必須 | 取得時刻UTC |
is_live | boolean | 必須 | MatchMove接続で実取得true |
{
"user_id": "usr_demo",
"source": "MATCHMOVE_LIVE",
"currency": "USD",
"available": "123.45",
"observed_at": "2026-10-22T12:00:00Z",
"is_live": true
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON署名・認証情報・タイムスタンプ等の検証に失敗
merchant_scope_denied形式: JSON権限なし
matchmove_balance_unavailable形式: JSONMatchMove直接照会不可
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/cards/physical/link
既存Physical CardをProxy/Association IDで紐付け
cards.write
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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 | string | 必須 | 紐付け冪等性キー前後空白除去後に空でないこと, <=190; 欠落または >190 both return idempotency_key_required |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
assoc_number | string | 必須 | 物理カードの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. |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-RECユーザー公開IDusers.public_id; 現行で生成するIDは usr_... |
card.id | string | 必須 | V-RECカード公開IDcards.public_id; card_... |
card.card_type | string | 必須 | カード種別VIRTUAL|PHYSICAL |
card.brand | string|null | 必須 | カードブランドcards.brandはnull可 |
card.masked_pan | string|null | 必須 | マスク済みPANカード番号全桁(PAN)は返さない; null可 |
card.last4 | string|null | 必須 | PAN末尾4桁null可 |
card.currency | string | 必須 | カード通貨cards.currency |
card.status | string | 必須 | カード状態ACTIVE|FROZEN|CLOSED (保存値/プロバイダー正規化値) |
card.atm_enabled | boolean | 必須 | ATM利用可否。mutationレスポンスではboolにcastレスポンスのcardShape()が明示的に(bool)型変換; キーは常に存在 |
card.created_at | string | 必須 | カード登録時刻cards.created_at NULL不可のDB日時; キーは常に存在 |
{
"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"
}
}
invalid_json形式: JSONJSON不正
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONHMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗
merchant_scope_denied形式: JSON必要scope不足
not_found形式: JSON{id}がこのMerchantに所属しない/INACTIVE
idempotency_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
physical_card_link_unavailable形式: JSON上流card link障害
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/balances
自Merchantのユーザー残高(ウォレット情報)を一括取得
balances.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
currency | string | 任意 | 残高通貨3-letter code; default BASE_CURRENCY (USD); invalid => 422 invalid_currency |
limit | integer | 任意 | 1回の件数1–200, default 100 |
cursor | string | 任意 | 前回レスポンスの next_cursorinvalid => 422 invalid_cursor |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
merchant_id | string | 必須 | Merchant公開ID |
currency | string | 必須 | 残高通貨 |
data[] | array<object> | 必須 | ユーザーごとの残高。user id の昇順 |
data[].user_id | string | 必須 | V-RECユーザー公開IDusr_... |
data[].beneficiary_id | string | 必須 | 受取人ID |
data[].membership_status | string | 必須 | Membership状態ACTIVE etc. (INACTIVE is excluded) |
data[].balance_view_allowed | boolean | 必須 | 残高を参照できるか(can_view_balance)。false の場合は金額を返さない |
data[].balance_scope | string | 任意 | TENANT_MERCHANT / SOURCE_MERCHANT |
data[].raw_balance / display_balance / held_balance / expired_locked / available | decimal string | 任意 | GET /users/{id}/balance と同じ値(TENANT_MERCHANT の場合のみ) |
data[].read_only / allocatable / spendable / withdrawable | boolean | 任意 | GET /users/{id}/balance と同じ |
data[].reference_balance_via | string | 任意 | READONLY(他Merchant由来の参照残高)の場合、金額は一括では返さず、このURLで1件ずつ取得する |
next_cursor | string|null | 必須 | 続きを取得するカーソル(has_more=false のとき null) |
has_more | boolean | 必須 | 続きがあるか |
{
"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
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONMerchant HMAC認証に失敗
merchant_scope_denied形式: JSONbalances.read scopeがCredentialにない
invalid_currency / invalid_cursor形式: JSONクエリの形式が正しくない
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/balance
Merchant単位のユーザー残高取得
balances.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
currency | string | 任意 | 残高通貨省略時=>BASE_CURRENCY; クエリキーが存在する場合, trim+strtoupperのみを実施. An 明示的な空文字 currency 空文字のままとなる; no ISO validation in 現行コントローラー. |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-RECユーザー公開ID |
merchant_id | string | 必須 | Merchant公開ID |
currency | string | 必須 | 残高通貨 |
balance_scope | string | 必須 | 残高の種類TENANT_MERCHANT (this Merchant) / SOURCE_MERCHANT (READONLY reference) |
source_merchant_id | string|null | 必須 | ユーザーの登録元SAKURA Merchant |
read_only | boolean | 必須 | 参照専用(READONLY)か |
allocatable | boolean | 必須 | テナント資金を割り当てられるか |
spendable | boolean | 必須 | 利用できるか |
withdrawable | boolean | 必須 | ATM出金できるか |
raw_balance | decimal-string | 必須 | 会計上の生残高。負数になり得る |
display_balance | decimal-string | 必須 | 画面表示残高。負数は0へclamp |
held_balance | decimal-string | 必須 | Authorization hold合計 |
expired_locked | decimal-string | 必須 | 失効等で利用不可のロック残高 |
available | decimal-string | 必須 | 利用可能残高max(display-held-expired, 0) |
{
"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"
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONHMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗
merchant_scope_denied形式: JSON必要scope不足
not_found形式: JSONuser境界外
balance_view_not_allowed形式: JSONMembershipの can_view_balance が false
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/transactions
Merchant balance ledger entry一覧
transactions.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
limit | integer | 任意 | 取得件数PHP (int) 型変換 その後 clamp 1..200; 省略時=>50; abc/0/negative=>1; >200=>200 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data[].public_id | string | 必須 | 加盟店残高の取引IDvbe_... |
data[].amount | decimal-string | 必須 | 増減額 |
data[].currency | string | 必須 | 通貨 |
data[].entry_type | string | 必須 | 仕訳種別 |
data[].reference_type | string | 必須 | 参照種別DBカラムはNULL不可; キーは常に存在 |
data[].reference_id | string | 必須 | 参照IDDBカラムはNULL不可; キーは常に存在 |
data[].metadata_json | string|null | 必須 | メタデータJSON文字列キーは常に存在; DB value null可 JSON text |
data[].created_at | string | 必須 | 作成時刻 |
{
"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"
}
]
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONHMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗
merchant_scope_denied形式: JSON必要scope不足
not_found形式: JSONuser境界外
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/payouts
当該MerchantのPayout一覧
payouts.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data[].public_id | string | 必須 | Payout公開IDpo_... |
data[].beneficiary_id | string | 必須 | 受取人ID |
data[].amount | decimal-string | 必須 | 送金額 |
data[].currency | string | 必須 | 通貨 |
data[].external_reference | string|null | 必須 | 外部参照DBカラムはnull可; キーは常に存在 |
data[].purpose | string | 必須 | 用途 |
data[].status | string | 必須 | Payout状態 |
data[].created_at | string | 必須 | 作成時刻 |
data[].credited_at | string|null | 必須 | V-REC入金時刻キーは常に存在; null until credited |
data[].user_id | string | 必須 | V-RECユーザー公開ID |
data[].email | string | 必須 | ユーザーメール |
{
"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]"
}
]
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONHMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗
merchant_scope_denied形式: JSON必要scope不足
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/report
Merchant集計値取得
reports.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
currency | string | 任意 | 集計通貨省略時=>BASE_CURRENCY; trim+strtoupperのみを実施; 明示的な空文字 空文字のままとなる; 現行コードはISOの長さ・値を検証しない. |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
merchant_id | string | 必須 | Merchant公開ID |
currency | string | 必須 | 集計通貨 |
raw_balance | decimal-string | 必須 | Merchant全ユーザー会計残高合計 |
display_balance | decimal-string | 必須 | 負数を0へclampした表示用合計 |
active_users | integer | 必須 | ACTIVE membership数 |
payouts | integer | 必須 | Payout総件数 |
{
"merchant_id": "mrc_demo",
"currency": "USD",
"raw_balance": "15000.00",
"display_balance": "15000.00",
"active_users": 125,
"payouts": 310
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONHMAC認証、時刻、Nonce、Credential、署名、replay、rate/IP制御に失敗
merchant_scope_denied形式: JSON必要scope不足
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/wallet
ユーザーのウォレット残高を参照(読み取り専用)
wallets.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-REC User IDusr_... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
skip_balances | any | 任意 | 指定時はオンチェーン残高を取得しない |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id / merchant_id | string | 必須 | V-REC User / Merchant ID |
read_only | boolean | 必須 | 常にtrue。MerchantはウォレットをAPIで操作できません |
has_wallet | boolean | 必須 | ウォレットの有無 |
wallet | object|null | 必須 | address, version, network, chain_id, created_at |
balances | object|null | 必須 | wallet_summary.balances と同形 |
gasless | object | 必須 | allowed, reason, daily_limit, daily_remaining |
transfer_blocked | boolean | 必須 | 運営による送金停止 |
{
"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
}
merchant_auth_required / merchant_signature_invalid / ...形式: JSONHMAC認証失敗
merchant_scope_denied / balance_view_not_allowed形式: JSONwallets.read 不足 / membershipの残高参照不可
not_found / wallet_user_not_found形式: JSONMerchant配下にいない / SAKURA側未連携
wallet_not_available / wallet_reference_unavailable形式: JSONSAKURA crypto_wallet 権限なし / READONLY会員の参照元なし
wallet_service_unavailable形式: JSON一時障害
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/crypto-sales
暗号資産売買の実績・手数料・ロイヤリティ
crypto_sales.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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 / to | date | 任意 | 完了日の範囲YYYY-MM-DD |
limit | integer | 任意 | 件数1..500 |
bodyなし、またはendpoint固有schemaなし。
{
"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"
}
]
}
merchant_auth_required / ...形式: JSONHMAC認証失敗
merchant_scope_denied形式: JSONcrypto_sales.read 不足
wallet_not_available形式: JSONSAKURA crypto_wallet 権限なし
crypto_sales_unavailable形式: JSON一時障害
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/crypto-sales/funding-status
SGPUSD売買のAML/prefund承認状態(加盟店別、READONLY)
crypto_funding.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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_no | string | 任意 | VCS契約番号^VCS-[A-Za-z0-9-]{1,36}$ |
user_id | string | 任意 | 加盟店に属するV-RECユーザー公開IDusr_...; cannot combine with user_ref |
user_ref | string | 任意 | SAKURA側USR参照^USR_[0-9]{1,16}$; cannot combine with user_id |
aml_status | enum | 任意 | AML審査状態PENDING|APPROVED|REJECTED |
prefund_status | enum | 任意 | prefund審査状態PENDING|VERIFIED|REJECTED |
card_funding_allowed | enum | 任意 | カード充当可否フラグ0|1 |
cursor | string | 任意 | 次ページ用opaque cursormax 256; Merchant-bound, expires in 1h; do not use after_id |
limit | integer | 任意 | 取得上限1-100; default server limit |
bodyなし、またはendpoint固有schemaなし。
{
"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."
}
merchant_auth_failed形式: JSONHMAC credential認証失敗
merchant_scope_denied / balance_view_not_allowed形式: JSONcrypto_funding.read権限不足、または残高可視権限なし
not_found形式: JSON指定したuser_idは加盟店に所属しない
funding_status_not_enabled / funding_status_unavailable / user_sakura_link_unavailable形式: JSONSAKURA連携スコープ・状態が利用不可
invalid_cursor / ambiguous_user_filter / invalid_...形式: JSONフィルター値・カーソルの形式が不正
funding_capabilities_unavailable / funding_status_unavailable形式: JSON会員権限スキーマ・連携APIが利用不可
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/kyc/schema
SAKURA最新のKYC入力項目を取得
kyc.preload
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-REC公開ユーザーIDusr_... |
bodyなし、またはendpoint固有schemaなし。
{
"user_id": "usr_demo",
"form": {
"fields": []
}
}
merchant_auth_required / merchant_signature_invalid形式: JSONHMAC認証失敗
merchant_scope_denied形式: JSON明示scope不足
sakura_unavailable形式: JSONSAKURA上流失敗
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/kyc/preload
KYC情報と証憑を事前保存
kyc.preload
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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 | string | 必須 | KYC提出冪等性キー8..190 chars; raw JSON same on retry |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-REC公開ユーザーIDusr_... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
fields | object | 必須 | SAKURA KYCFORMのスカラー値max 100 |
documents.<field>.data_base64 | string | 必須 | 最大6枚のBase64画像JPEG/PNG, <=5MiB each, <=10MiB total |
consent.confirmed | boolean | 必須 | 本人の明示同意true |
consent.obtained_at | date-time | 必須 | 同意日時past 30d |
consent.evidence_ref | string | 必須 | 原記録参照ID8..190 chars |
consent.terms_version | string | 必須 | 同意文書版 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-REC公開ID |
draft_saved | boolean | 必須 | 事前登録完了。falseならリンク発行不可 |
kyc_status | string | 必須 | KYC状態(APPROVEDとは限らない) |
next_action | string|object|null | 任意 | 次の処理 |
{
"user_id": "usr_demo",
"draft_saved": true,
"kyc_status": "PENDING",
"next_action": {
"type": "ready_for_ekyc"
}
}
merchant_auth_required / merchant_signature_invalid形式: JSONHMAC認証失敗
merchant_scope_denied形式: JSON明示scope不足
sakura_unavailable形式: JSONSAKURA上流失敗
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/kyc/onboarding-link
本人に配送するSAKURA eKYCリンクを取得
kyc.link.issue
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-REC公開ユーザーIDusr_... |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-REC公開ID |
ekyc_url | string|null | 条件付き | 本人宛のみ配送する短縮URL |
kyc_status | string | 必須 | 本人確認状態 |
next_action | string|object|null | 任意 | 次の処理 |
{
"user_id": "usr_demo",
"ekyc_url": "https://sakura.example/kyc/EXAMPLE",
"kyc_status": "PENDING",
"next_action": "send_link_to_user"
}
merchant_auth_required / merchant_signature_invalid形式: JSONHMAC認証失敗
merchant_scope_denied形式: JSON明示scope不足
sakura_unavailable形式: JSONSAKURA上流失敗
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/users/{id}/cards/{cardId}/issuer-status
MatchMoveの最新カード状態照会
cards.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | ユーザー公開IDusr_... |
cardId | string | 必須 | カード公開IDcard_... |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | ユーザー公開IDusr_... |
card_id | string | 必須 | カード公開IDcard_... |
issuer_status | string | 必須 | MatchMove現在状態ACTIVE|FROZEN|CLOSED |
source | string | 必須 | データ取得元MATCHMOVE_LIVE |
observed_at | ISO 8601 | 必須 | 照会時刻UTC |
{
"user_id": "usr_demo",
"card_id": "card_demo",
"issuer_status": "FROZEN",
"source": "MATCHMOVE_LIVE",
"observed_at": "2026-10-23T00:00:00Z"
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_ip_not_allowed形式: JSON署名・認証情報・タイムスタンプ等の検証に失敗
merchant_scope_denied形式: JSON権限なし
card_not_found形式: JSONカードなし
issuer_card_status_unavailable形式: JSON発行会社へ確認できず
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
https://api.v-rec.xyz
/api/merchant/v1/tenant-funding/balance
SAKURA正本のTenant資金残高・失効ポリシー取得
tenant_funding.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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_id | string | 必須 | 認証Credentialに紐づくV-REC Merchant公開IDmrc_... |
tenant_funding.tenant_ref | string | 必須 | SAKURA Tenant Account参照VTA_... |
tenant_funding.currency | string | 必須 | Tenant Funding通貨USD |
tenant_funding.source_asset | string | 必須 | SAKURA側の原資Asset現行実装: SGP-USD |
tenant_funding.commitment | decimal string | 必須 | テナント会計上の引当額SAKURA側を正とする |
tenant_funding.reserved | decimal string | 必須 | 処理中Operation等で予約済みの会計額SAKURA側を正とする |
tenant_funding.available | decimal string | 必須 | 新規配賦の会計上の利用可能額SAKURA側を正とする; 実行時に再検証する |
tenant_funding.funded | decimal string | 必須 | 累計funded principalSAKURA側を正とする |
tenant_funding.returned | decimal string | 必須 | 累計returned principalSAKURA側を正とする |
tenant_funding.fees | decimal string | 必須 | 累計Tenant Funding feeSAKURA側を正とする |
tenant_funding.funding_fee_fixed | decimal string | 必須 | 1回の割当ごとにかかる固定手数料。割当には「金額+この手数料」が available 以内である必要があるSAKURA側を正とする; 0 の場合 no fee is configured |
tenant_funding.expiry_policy | string | 必須 | 現在有効な資金失効ポリシー例:EXPIRABLE_180 / NO_EXPIRY |
tenant_funding.expiry_days | integer|null | 必須 | 有効期限日数。失効なしの場合nullになり得る通常180日 の場合 EXPIRABLE_180 |
tenant_funding.status | string | 必須 | SAKURA Tenant状態新規資金割当ではACTIVEを想定 |
tenant_funding.mode | string | 必須 | SAKURAテナント資金管理モード新規資金割当にはENFORCEDが必須 |
tenant_funding.reconciliation_status | string | 必須 | SAKURA reconciliation状態SUSPENDED_RECONCILIATIONでは新規資金移動不可 |
tenant_funding.last_reconciled_at | string|null | 必須 | 最終reconciliation時刻SAKURAから取得したUTC/ISO形式の値 |
{
"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"
}
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONMerchant HMAC認証に失敗
merchant_scope_denied形式: JSON必要なtenant_funding scopeがCredentialにない
tenant_binding_not_found形式: JSON認証MerchantにTenant Funding bindingがない
sakura_not_connected / tenant_not_found / tenant_funding_scope_not_granted / <upstream error>形式: JSONSAKURA Connected AppまたはTenant Funding正本へ到達できない
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/tenant-funding/diagnostics
Tenant Funding運用状態を資金移動なしで診断
tenant_funding.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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_id | string | 任意 | Membership/割当可否まで確認するV-REC User公開ID認証済み加盟店に所属する必要がある; 省略時 => Tenant-wide diagnostics only |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
merchant_id | string | 必須 | 認証Merchant公開IDmrc_... |
diagnostics.schema.tenant_funding | boolean | 必須 | Tenant Funding schema適用済み参照のみの確認 |
diagnostics.schema.membership_capabilities | boolean | 必須 | FULL/READONLY capability schema適用済み参照のみの確認 |
diagnostics.schema.direct_allocation | boolean | 必須 | v2.4.2直接Allocation schema適用済み参照のみの確認 |
diagnostics.binding | object|null | 必須 | 現在MerchantのTenant bindingtenant_ref/local_mode/tenant_lots_withdrawable |
diagnostics.sakura.reachable | boolean | 必須 | SAKURA Tenant Funding正本へ到達できたか資金移動なし |
diagnostics.sakura.status | object|null | 必須 | SAKURAのTenant管理/status結果参照専用 |
diagnostics.sakura.balance | object|null | 必須 | SAKURA正本のTenant balance参照専用 |
diagnostics.operations | object | 必須 | balance/capacity/allocate/reverse/returnの現在の実行可能性診断用フラグのみ |
diagnostics.user | object|null | 必須 | user_id指定時のMembership/Source-Target Merchant/KYC/SAKURA link/capacity情報認証済み加盟店に属するユーザーのみ返却 |
{
"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
}
}
}
merchant_auth_required / merchant_signature_invalid / ...形式: JSONMerchant HMAC認証に失敗
merchant_scope_denied形式: JSONtenant_funding.read scope不足
tenant_funding_diagnostics_failed形式: JSON診断生成自体に一時障害
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/tenant-funding/users/{id}/capacity
ユーザーへのTenant資金割当可否・割当可能額(上限の目安)確認
tenant_funding.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | path string | 必須 | V-RECユーザー公開IDusr_...; 会員所属は認証済み加盟店のものであること |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
currency | string | 任意 | 判定通貨既定はUSD; 現行実装 USDのみ受け付ける |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | 対象V-RECユーザー公開IDusr_... |
merchant_id | string | 必須 | 認証Merchant公開IDmrc_... |
eligible | boolean | 必須 | このMembershipへTenant資金を配賦可能か成功時の応答はtrue |
currency | string | 必須 | 判定通貨USD |
allocatable_amount | decimal string | 必須 | 今このユーザーへ割り当てられる上限額の目安(テナント利用可能額−割当手数料、セント未満切り捨て)non-reserving preflight; 実行時に再検証する SAKURA and the Merchant MatchMove wallet |
tenant_available | decimal string | 必須 | テナントの利用可能額(SAKURA正本)balance.availableと同じ参照元 |
funding_fee | decimal string | 必須 | 1回の割当ごとの固定手数料0 の場合 no fee is configured |
user_tenant_origin_remaining | decimal string | 必須 | 当該Tenant由来lotのユーザー未使用残額V-REC資金源台帳 |
tenant_ref | string | 必須 | 対象Tenant参照VTA_... |
access_mode | string | 必須 | 会員所属のアクセスモードキャパシティ照会成功時はFULL |
expiry_policy | string|null | 必須 | 新規配賦に適用される現在の失効ポリシー実行時にSAKURAが最終状態のスナップショットを返却 |
expiry_days | integer|null | 必須 | 現在の失効日数一般に180日 for EXPIRABLE_180 |
reconciliation_status | string|null | 必須 | Tenant reconciliation状態新規の資金移動には正常な状態が必要 |
{
"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"
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONMerchant HMAC認証に失敗
merchant_scope_denied形式: JSON必要なtenant_funding scopeがCredentialにない
not_found形式: JSONユーザーがこのMerchantのMembershipとして存在しない
tenant_funding_not_allowed_for_membership / cross_merchant_tenant_funding_not_allowed形式: JSONREADONLY、can_receive_tenant_funds=false、またはSource Merchant≠Tenant Merchant
tenant_funding_usd_only / tenant_membership_not_active形式: JSONUSD以外、またはMembershipがACTIVEではない
membership_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など)は例外です。
/api/merchant/v1/tenant-funding/allocations
Tenant資金をV-REC Userへ直接割当
tenant_funding.write
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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_id | string | 必須 | 対象V-RECユーザー公開IDusr_...。同一資金元加盟店にACTIVE/FULLで所属すること |
amount | decimal string | 必須 | 配賦principalUSDの正の金額(セント単位で厳密に指定) |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
allocation.id | string | 必須 | V-RECテナント資金割当操作IDvta_... |
allocation.user_id | string | 必須 | 配賦対象V-RECユーザー公開IDusr_... |
allocation.amount | decimal string | 必須 | 要求principalセント単位で指定する正のUSD金額 |
allocation.currency | string | 必須 | 通貨USD |
allocation.status | string | 必須 | Allocation状態。COMPLETED=反映済み、REJECTED=実行されず資金は動いていない(確定)、FAILED/MISMATCH=要確認(確定)、SUBMITTING/UNKNOWN/RECONCILE_REQUIRED=未確定(同じIdempotency-Keyで再送して確定)SUBMITTING / UNKNOWN / RECONCILE_REQUIRED / COMPLETED / REJECTED / FAILED / MISMATCH |
allocation.error_code | string|null | 必須 | 機械判定用のエラーコード(REJECTED等の理由)。例: insufficient_tenant_available, insufficient_merchant_physicalnull の場合 not applicable |
allocation.sakura_request_uuid | string|null | 必須 | SAKURA側Funding Request UUID上流システムの応答後に設定 |
allocation.error | string|null | 必須 | 非正常状態の診断コード/要約シークレットは公開しない |
allocation.created_at | string|null | 必須 | Operation作成時刻DBに保存されたUTC時刻 |
allocation.completed_at | string|null | 必須 | COMPLETED確定時刻完了までnull |
{
"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"
}
}
{
"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
}
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONMerchant HMAC認証に失敗
merchant_scope_denied形式: JSON必要なtenant_funding scopeがCredentialにない
invalid_json形式: JSONrequest bodyがJSON objectではない
not_found形式: JSON対象ユーザーがこのMerchantに存在しない
idempotency_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前提のいずれかを満たさない
tenant_funding_not_allowed_for_membership / cross_merchant_tenant_funding_not_allowed形式: JSONREADONLYまたはクロスマーチャントMembershipへの新規資金移転
insufficient_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)が入ります
membership_capabilities_not_installed / tenant_allocation_api_not_installed / tenant_funding_not_enabled_in_sakura / tenant_funding_internal_error / <upstream error>形式: JSONTenant Funding停止、SAKURA/MatchMove不明状態、または内部一時障害
(allocation.status = SUBMITTING / UNKNOWN / RECONCILE_REQUIRED)形式: JSON一時的な競合・通信障害などで結果が未確定。資金が動いた可能性があるため、新しいキーで再実行せず、同じIdempotency-Keyで再送するか一覧/個別取得で確定を確認
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/tenant-funding/allocations
指定日時以降に更新されたTenant Allocation(TopUp)結果の一覧
tenant_funding.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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_since | ISO-8601 string | 任意 | この日時以降に更新されたものだけ返す(以上)e.g. 2026-10-15T00:00:00+09:00; without offset = UTC; invalid => 422 invalid_updated_since |
status | string | 任意 | 状態で絞り込み(カンマ区切りで複数可)SUBMITTING / UNKNOWN / RECONCILE_REQUIRED / COMPLETED / REJECTED / FAILED / MISMATCH; other => 422 invalid_status |
user_id | string | 任意 | 対象ユーザーで絞り込みusr_...; not in this Merchant => 404 |
limit | integer | 任意 | 1回の件数1–200, default 100 |
cursor | string | 任意 | 前回レスポンスの next_cursorinvalid => 422 invalid_cursor |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data[] | array<object> | 必須 | Allocation一覧。各要素は allocation と同じ項目+updated_at |
data[].id | string | 必須 | 資金割当IDvta_... |
data[].user_id | string | 必須 | 対象V-RECユーザー公開IDusr_... |
data[].amount | decimal string | 必須 | 要求principal |
data[].currency | string | 必須 | 通貨USD |
data[].status | string | 必須 | Allocation状態see allocation.status |
data[].error_code | string|null | 必須 | 理由コード |
data[].sakura_request_uuid | string|null | 必須 | SAKURA Funding Request UUID |
data[].error | string|null | 必須 | 診断メッセージ |
data[].created_at | string | 必須 | 作成時刻UTC 'YYYY-MM-DD HH:MM:SS' |
data[].completed_at | string|null | 必須 | COMPLETED確定時刻 |
data[].updated_at | string | 必須 | 最終更新時刻。結果が変わると更新されるUTC 'YYYY-MM-DD HH:MM:SS' |
next_cursor | string|null | 必須 | 続きを取得するためのカーソルpass as cursor; null の場合 there is no item |
has_more | boolean | 必須 | 続きがあるか |
{
"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
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONMerchant HMAC認証に失敗
merchant_scope_denied形式: JSONtenant_funding.read scopeがCredentialにない
not_found形式: JSONuser_id のユーザーがこのMerchantに存在しない
invalid_updated_since / invalid_status / invalid_cursor形式: JSONクエリの形式が正しくない
tenant_allocation_api_not_installed形式: JSONv2.4.2 allocation migration未適用
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/tenant-funding/allocations/{id}
Tenant Allocation Operation取得
tenant_funding.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | path string | 必須 | 資金割当IDvta_...; 認証済み加盟店に所属する必要がある |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
allocation.id | string | 必須 | V-RECテナント資金割当操作IDvta_... |
allocation.user_id | string | 必須 | 配賦対象V-RECユーザー公開IDusr_... |
allocation.amount | decimal string | 必須 | 要求principalセント単位で指定する正のUSD金額 |
allocation.currency | string | 必須 | 通貨USD |
allocation.status | string | 必須 | Allocation状態。COMPLETED=反映済み、REJECTED=実行されず資金は動いていない(確定)、FAILED/MISMATCH=要確認(確定)、SUBMITTING/UNKNOWN/RECONCILE_REQUIRED=未確定(同じIdempotency-Keyで再送して確定)SUBMITTING / UNKNOWN / RECONCILE_REQUIRED / COMPLETED / REJECTED / FAILED / MISMATCH |
allocation.error_code | string|null | 必須 | 機械判定用のエラーコード(REJECTED等の理由)。例: insufficient_tenant_available, insufficient_merchant_physicalnull の場合 not applicable |
allocation.sakura_request_uuid | string|null | 必須 | SAKURA側Funding Request UUID上流システムの応答後に設定 |
allocation.error | string|null | 必須 | 非正常状態の診断コード/要約シークレットは公開しない |
allocation.created_at | string|null | 必須 | Operation作成時刻DBに保存されたUTC時刻 |
allocation.completed_at | string|null | 必須 | COMPLETED確定時刻完了までnull |
{
"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"
}
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONMerchant HMAC認証に失敗
merchant_scope_denied形式: JSON必要なtenant_funding scopeがCredentialにない
tenant_allocation_not_found形式: JSONAllocationが存在しない、または他MerchantのOperation
tenant_allocation_api_not_installed形式: JSONv2.4.2 allocation migration未適用
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/tenant-funding/allocations/{id}/reverse
特定Allocationの未使用額だけをTenantへ組み戻し
tenant_funding.write
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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文字 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | path string | 必須 | 組み戻すAllocation IDvta_...。COMPLETEDである必要あり |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
amount | decimal string | 必須 | 組み戻し額USDの正の金額(セント単位)。該当資金割当の残存元本を超えてはなりません |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
return.id | string | 必須 | V-RECテナント資金組戻し操作IDvtr_... |
return.amount | decimal string | 必須 | Tenantへ戻すprincipalセント単位で指定する正のUSD金額 |
return.currency | string | 必須 | 通貨USD |
return.status | string | 必須 | Return状態RESERVED / SUBMITTED / RECONCILE_REQUIRED / FAILED / COMPLETED |
return.sakura_request_uuid | string|null | 必須 | SAKURA側Return/Funding Request UUID応答前はnullの場合あり |
return.error | string|null | 必須 | 非正常状態の診断コード/要約 |
return.created_at | string|null | 必須 | Operation作成時刻DBに保存されたUTC時刻 |
return.updated_at | string|null | 必須 | 最終更新時刻DBに保存されたUTC時刻 |
{
"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"
}
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONMerchant HMAC認証に失敗
merchant_scope_denied形式: JSON必要なtenant_funding scopeがCredentialにない
invalid_json形式: JSONrequest bodyがJSON objectではない
tenant_allocation_not_found形式: JSONAllocationが存在しない、または他Merchant
idempotency_key_required / amount_required / invalid_amount / tenant_allocation_not_reversible形式: JSON必須値不備、金額不正、またはCOMPLETEDでないAllocation
reverse_amount_exceeds_remaining / tenant_return_in_progress / idempotency_key_reused / insufficient_tenant_origin_funds形式: JSON当該Allocation未使用残高超過、Return競合、または冪等性競合
<upstream error>形式: JSONSAKURA側結果が一時的に確定できない
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/tenant-funding/users/{id}/return
ユーザーが保持する当該Tenant由来資金をTenantへ返却
tenant_funding.write
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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文字 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | path string | 必須 | 対象V-RECユーザー公開IDusr_...; 会員所属は認証済み加盟店のものであること |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
amount | decimal string | 必須 | 返却額USDの正の金額(セント単位)。このテナント由来ロットの残高以内 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
return.id | string | 必須 | V-RECテナント資金組戻し操作IDvtr_... |
return.amount | decimal string | 必須 | Tenantへ戻すprincipalセント単位で指定する正のUSD金額 |
return.currency | string | 必須 | 通貨USD |
return.status | string | 必須 | Return状態RESERVED / SUBMITTED / RECONCILE_REQUIRED / FAILED / COMPLETED |
return.sakura_request_uuid | string|null | 必須 | SAKURA側Return/Funding Request UUID応答前はnullの場合あり |
return.error | string|null | 必須 | 非正常状態の診断コード/要約 |
return.created_at | string|null | 必須 | Operation作成時刻DBに保存されたUTC時刻 |
return.updated_at | string|null | 必須 | 最終更新時刻DBに保存されたUTC時刻 |
{
"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"
}
}
merchant_auth_required / merchant_timestamp_invalid / merchant_nonce_invalid / merchant_credential_invalid / merchant_signature_invalid / merchant_replay / merchant_rate_limited / merchant_ip_not_allowed形式: JSONMerchant HMAC認証に失敗
merchant_scope_denied形式: JSON必要なtenant_funding scopeがCredentialにない
invalid_json形式: JSONrequest bodyがJSON objectではない
not_found形式: JSON対象ユーザーがこのMerchantに存在しない
idempotency_key_required / amount_required / invalid_amount / sakura_user_link_missing形式: JSON必須値、金額、binding/link前提を満たさない
insufficient_tenant_origin_funds / tenant_return_in_progress / idempotency_key_reused形式: JSON当該Tenant由来の未使用資金不足、Return実行中、または冪等性競合
tenant_funding_not_enforced / <upstream error>形式: JSONSAKURA側結果が一時的に確定できない
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
https://v-rec.xyz
/api/v1/me
本人プロフィール要約取得
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECユーザー公開IDusr_... |
beneficiary_id | string | 必須 | 受取人ID |
email | string | 必須 | SAKURA現在値、無ければV-REC保存値email |
name | string | 必須 | SAKURA現在値、無ければ空文字 |
country | string|null | 必須 | SAKURA profile.country_codeキーは常に存在; null可 |
kyc_status | string | 必須 | SAKURA現在値、無ければV-REC保存値 |
{
"id": "usr_demo",
"beneficiary_id": "VREC-DEMO",
"email": "[email protected]",
"name": "Taro Yamada",
"country": "JP",
"kyc_status": "APPROVED"
}
Location: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headersakura_profile_unavailable形式: JSONSAKURA profile取得不可
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/kyc
本人KYC状態同期
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
status | string | 必須 | V-REC normalized KYC状態NOT_STARTED|PENDING|APPROVED|REJECTED|REVIEW|CORRECTION_REQUIRED |
checked_at | string | 必須 | このsyncで更新された最終同期時刻DBのUTC日時 |
{
"status": "APPROVED",
"checked_at": "2026-10-05 01:00:00"
}
Location: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headerkyc_service_unavailable形式: JSON上流が409を返した場合に安全化して返却
kyc_service_unavailable形式: JSON上流が422を返した場合
kyc_service_unavailable形式: JSON上流rate limit
kyc_service_unavailable形式: JSONKYC service障害。correlation_id付与
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/kyc/form
SAKURA KYCFORMを動的取得
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_ref | string | 条件付き | Connected Apps driver時にSAKURA bridgeが付加するuser ref現行connected_apps経路では存在; モックテストドライバーでは省略 |
kyc_status | string | 必須 | SAKURA KYC状態現行SAKURAアダプター: NOT_STARTED|PENDING|APPROVED|CORRECTION_REQUIRED |
editable | boolean | 必須 | 現在編集可能か |
fields[] | array<object> | 必須 | SAKURA KYCFORM + 未定義のprofile prerequisites |
fields[].name | string | 必須 | submit時に使用するfield名 |
fields[].label | string | 必須 | 表示ラベル |
fields[].type | integer | 必須 | SAKURAフィールドの型2=ファイル、3=テキストエリア、4=日付として扱い、その他は設定に従って文字列/選択項目として処理します |
fields[].required | boolean | 必須 | 必須フラグ |
fields[].control | string | 必須 | 推奨UI controlfile|select|textarea|date|text |
fields[].value | mixed|null | 必須 | 現在値。file fieldは常にnullキーは常に存在 |
fields[].has_file | boolean | 必須 | 保存済みfile有無 |
fields[].options | array<object> | 必須 | 候補。非selectでは空配列になり得る |
fields[].options[].code | string | 必須 | submitする候補値 |
fields[].options[].label | string | 必須 | 候補表示名 |
fields[].section | string | 必須 | 定義元sectionkyc_form|profile |
ekyc | object | 条件付き | Connected Apps driver時のeKYC public stateモックテストドライバーでは省略 |
ekyc.state | string | 必須 | SAKURA eKYCの状態verified|link_ready|link_refresh_required|provider_processing|link_missing_recovery|issue_failed_editable|rejected|issue_required|not_started |
ekyc.verified | boolean | 必須 | 本人確認完了フラグ |
ekyc.has_history | boolean | 必須 | eKYC履歴有無 |
ekyc.has_link | boolean | 必須 | eKYC linkレコード有無 |
ekyc.has_active_link | boolean | 必須 | has_link互換alias |
ekyc.provider_session_fresh | boolean | 必須 | provider sessionがfreshか |
ekyc.action_url | string|null | 必須 | SAKURA stable short URL。本人sessionだけで扱う取り扱いに注意が必要なベアラー形式URL; null可 |
ekyc.expires_at | string|null | 必須 | eKYC link有効期限ISO 8601形式またはnull |
ekyc.editable | boolean | 必須 | 現在KYC編集可能か |
ekyc.can_issue | boolean | 必須 | eKYC issue/reissue可能か |
ekyc.can_open | boolean | 必須 | 既存linkをopen可能か |
next_action.type | string | 必須 | クライアントが次に取るactionredirect|completed|wait|correct|retry |
next_action.url | string | 条件付き | type=redirect時のみSAKURA short URLその他の場合は省略 |
next_action.retry_after_seconds | integer | 条件付き | type=wait時のみ現状5 |
{
"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"
}
}
Location: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headerkyc_service_unavailable形式: JSON上流conflict
kyc_service_unavailable形式: JSON上流validation state
kyc_service_unavailable形式: JSON上流rate limit
kyc_service_unavailable形式: JSON一時障害
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/kyc/submit
動的KYCFORMを本人sessionで送信
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
_csrf | string | 必須 | 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 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_ref | string | 条件付き | Connected Apps driver時にSAKURA bridgeが付加モックテストドライバーでは省略 |
success | boolean | 必須 | eKYC issue結果 |
kyc_status | string | 必須 | submit後KYC状態 |
editable | boolean | 必須 | submit後編集可否 |
error | string | 条件付き | success=false時のみekyc_issue_failed |
reason_code | string | 条件付き | success=false時の公開可能なreason codeidentity_mobile_already_registered|identity_email_already_registered|identity_already_registered|provider_session_unavailable |
reason_field | string|null | 条件付き | success=false時の関連field。null可 |
ekyc | object | 条件付き | Connected Apps driver時のeKYC public stateモックテストドライバーでは省略 |
ekyc.state | string | 必須 | SAKURA eKYCの状態verified|link_ready|link_refresh_required|provider_processing|link_missing_recovery|issue_failed_editable|rejected|issue_required|not_started |
ekyc.verified | boolean | 必須 | 本人確認完了フラグ |
ekyc.has_history | boolean | 必須 | eKYC履歴有無 |
ekyc.has_link | boolean | 必須 | eKYC linkレコード有無 |
ekyc.has_active_link | boolean | 必須 | has_link互換alias |
ekyc.provider_session_fresh | boolean | 必須 | provider sessionがfreshか |
ekyc.action_url | string|null | 必須 | SAKURA stable short URL。本人sessionだけで扱う取り扱いに注意が必要なベアラー形式URL; null可 |
ekyc.expires_at | string|null | 必須 | eKYC link有効期限ISO 8601形式またはnull |
ekyc.editable | boolean | 必須 | 現在KYC編集可能か |
ekyc.can_issue | boolean | 必須 | eKYC issue/reissue可能か |
ekyc.can_open | boolean | 必須 | 既存linkをopen可能か |
next_action.type | string | 必須 | クライアントが次に取るactionredirect|completed|wait|correct|retry |
next_action.url | string | 条件付き | type=redirect時のみSAKURA short URLその他の場合は省略 |
next_action.retry_after_seconds | integer | 条件付き | type=wait時のみ現状5 |
{
"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"
}
}
CSRF validation failed形式: non-JSON_csrf欠落/不一致。Security::requireCsrf()がAuth::requireUser()より先に実行されます。
CSRF validation failedLocation: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headervalidation_error形式: JSONfields別validation errors。errors mapとcorrelation_idを返す
kyc_service_unavailable形式: JSON同時処理等のconflict
kyc_service_unavailable形式: JSON上流rate limit
kyc_service_unavailable形式: JSON一時障害
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/balance
本人V-REC残高・Merchant別残高取得
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
scope_instance_id | integer | 必須 | 現在のV-REC instance内部IDauその後ticated Auth::user requires a positive active instance id |
vrec_raw | decimal-string | 必須 | V-REC生残高 |
vrec_available | decimal-string | 必須 | 利用可能残高 |
vrec_withdrawable | decimal-string | 必須 | 出金可能残高 |
authorization_holds | decimal-string | 必須 | Authorization hold合計 |
expired_locked | decimal-string | 必須 | 期限切れlocked残高認証済み経路では存在 |
merchant_balances[] | array<object> | 必須 | Merchant別残高 |
merchant_balances[].merchant_id | integer | 必須 | 内部Merchant ID |
merchant_balances[].merchant_public_id | string | 必須 | Merchant公開ID |
merchant_balances[].display_name | string | 必須 | Merchant名 |
merchant_balances[].raw_balance | decimal-string | 必須 | 生残高 |
merchant_balances[].display_balance | decimal-string | 必須 | 表示残高 |
merchant_balances[].expired_locked | decimal-string | 条件付き | 期限切れlocked |
merchant_balances[].available | decimal-string | 必須 | 利用可能残高。membership/merchant停止時は0 |
merchant_balances[].membership_status | string | 必須 | membership状態 |
merchant_balances[].merchant_status | string | 必須 | Merchant状態 |
{
"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"
}
]
}
Location: /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など)は例外です。
/api/v1/me/payouts
本人Payout履歴取得
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data[].id | string | 必須 | Payout ID |
data[].amount | decimal-string | 必須 | 金額 |
data[].currency | string | 必須 | 通貨 |
data[].external_reference | string|null | 必須 | 外部参照DBカラムはnull可; キーは常に存在 |
data[].purpose | string | 必須 | 用途 |
data[].status | string | 必須 | 状態 |
data[].created_at | string | 必須 | 作成時刻 |
data[].credited_at | string|null | 必須 | 入金時刻キーは常に存在; null until credited |
data[].company | string | 必須 | 送金企業名 |
{
"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"
}
]
}
Location: /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など)は例外です。
/api/v1/me/transactions
本人カード取引履歴取得
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data[].id | string | 必須 | カード取引ID |
data[].transaction_type | string | 必須 | 取引種別 |
data[].amount | decimal-string | 必須 | 金額 |
data[].currency | string | 必須 | 通貨 |
data[].mcc | string|null | 必須 | 加盟店カテゴリコード(MCC)キーは常に存在; 値はnullの場合あり |
data[].status | string | 必須 | 状態 |
data[].occurred_at | string | 必須 | 発生時刻 |
data[].card_id | string | 必須 | V-RECカードID |
data[].masked_pan | string|null | 必須 | マスクPANキーは常に存在; 値はnullの場合あり |
{
"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"
}
]
}
Location: /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など)は例外です。
/api/v1/me/cards
本人カード一覧取得
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data[] | array<card_list_item> | 必須 | 本人のmask済みカード一覧 |
data[].id | string | 必須 | V-RECカード公開IDcards.public_id; card_... |
data[].card_type | string | 必須 | カード種別VIRTUAL|PHYSICAL |
data[].brand | string|null | 必須 | カードブランドcards.brandはnull可 |
data[].masked_pan | string|null | 必須 | マスク済みPANカード番号全桁(PAN)は返さない; null可 |
data[].last4 | string|null | 必須 | PAN末尾4桁null可 |
data[].currency | string | 必須 | カード通貨cards.currency |
data[].status | string | 必須 | カード状態ACTIVE|FROZEN|CLOSED (保存値/プロバイダー正規化値) |
data[].atm_enabled | integer | 必須 | ATM利用可否のDB値。カード一覧は0/1の数値で返すPDO SELECTから取得したcards.atm_enabledの生値; JSON数値0または1 (ATTR_STRINGIFY_FETCHES=false); 真偽値への変換なし |
data[].created_at | string | 必須 | カード登録時刻cards.created_at NULL不可のDB日時; キーは常に存在 |
{
"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"
}
]
}
Location: /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など)は例外です。
/api/v1/me/cards/{type}
仮想カード新規発行(物理カード新規発行は終了)
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
type | string | 必須 | 発行種別VIRTUAL allowed; PHYSICAL 返却する 410 physical_card_issuance_retired (no issuer call) |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
_csrf | string | 必須 | V-REC sessionのCSRF token$_POSTに含まれるフォーム/multipart項目であること; JSON本文ではSecurity::requireCsrf()の要件を満たさない |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECカード公開IDcards.public_id; card_... |
card_type | string | 必須 | カード種別VIRTUAL|PHYSICAL |
brand | string|null | 必須 | カードブランドcards.brandはnull可 |
masked_pan | string|null | 必須 | マスク済みPANカード番号全桁(PAN)は返さない; null可 |
last4 | string|null | 必須 | PAN末尾4桁null可 |
currency | string | 必須 | カード通貨cards.currency |
status | string | 必須 | カード状態ACTIVE|FROZEN|CLOSED (保存値/プロバイダー正規化値) |
atm_enabled | boolean | 必須 | ATM利用可否。mutationレスポンスではboolにcastレスポンスのcardShape()が明示的に(bool)型変換; キーは常に存在 |
{
"id": "card_demo",
"card_type": "VIRTUAL",
"brand": "MASTERCARD",
"masked_pan": "**** **** **** 1234",
"last4": "1234",
"currency": "USD",
"status": "ACTIVE",
"atm_enabled": false
}
physical_card_issuance_retired形式: JSONPHYSICALの新規発行は廃止。既存カード登録APIを利用。
CSRF validation failed形式: non-JSON_csrf欠落/不一致。Security::requireCsrf()がAuth::requireUser()より先に実行されます。
CSRF validation failedLocation: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headerinvalid_card_type / kyc_not_approved / active_merchant_membership_required / sakura_cards_scope_required / vrec_instance_required / sakura_user_not_linked形式: JSONKYC/住所/card発行条件未達
card_issue_unavailable形式: JSONcard provider一時障害
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/cards/physical/link
既存Physical Cardを本人step-upで紐付け
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
Idempotency-Key | string | 推奨 | Provider冪等性キーoptional; trim; blank/省略時 => normalized association number is used; non-empty >190 => idempotency_key_too_long |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
_csrf | string | 必須 | V-REC sessionのCSRF token$_POSTに含まれるフォーム/multipart項目であること; JSON本文ではSecurity::requireCsrf()の要件を満たさない |
current_password | string | 必須 | 現在のV-RECパスワード追加認証 |
assoc_number | string | 必須 | 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. |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECカード公開IDcards.public_id; card_... |
card_type | string | 必須 | カード種別VIRTUAL|PHYSICAL |
brand | string|null | 必須 | カードブランドcards.brandはnull可 |
masked_pan | string|null | 必須 | マスク済みPANカード番号全桁(PAN)は返さない; null可 |
last4 | string|null | 必須 | PAN末尾4桁null可 |
currency | string | 必須 | カード通貨cards.currency |
status | string | 必須 | カード状態ACTIVE|FROZEN|CLOSED (保存値/プロバイダー正規化値) |
atm_enabled | boolean | 必須 | ATM利用可否。mutationレスポンスではboolにcastレスポンスのcardShape()が明示的に(bool)型変換; キーは常に存在 |
{
"id": "card_demo",
"card_type": "PHYSICAL",
"brand": "MASTERCARD",
"masked_pan": "**** **** **** 1234",
"last4": "1234",
"currency": "USD",
"status": "ACTIVE",
"atm_enabled": true
}
CSRF validation failed形式: non-JSON_csrf欠落/不一致。Security::requireCsrf()がAuth::requireUser()より先に実行されます。
CSRF validation failedLocation: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headercurrent_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形式: JSONstep-upまたはcard link validation失敗
too_many_attempts形式: JSON10分で8回超
physical_card_link_unavailable形式: JSONprovider一時障害
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/cards/{id}/{action}
カード状態変更
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECカードIDcard_... |
action | string | 必須 | カード操作大文字小文字を区別しません。activate|unfreeze=>ACTIVE、freeze=>FROZEN、close=>CLOSED |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
_csrf | string | 必須 | V-REC sessionのCSRF token$_POSTに含まれるフォーム/multipart項目であること; JSON本文ではSecurity::requireCsrf()の要件を満たさない |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECカード公開IDcards.public_id; card_... |
card_type | string | 必須 | カード種別VIRTUAL|PHYSICAL |
brand | string|null | 必須 | カードブランドcards.brandはnull可 |
masked_pan | string|null | 必須 | マスク済みPANカード番号全桁(PAN)は返さない; null可 |
last4 | string|null | 必須 | PAN末尾4桁null可 |
currency | string | 必須 | カード通貨cards.currency |
status | string | 必須 | カード状態ACTIVE|FROZEN|CLOSED (保存値/プロバイダー正規化値) |
atm_enabled | boolean | 必須 | ATM利用可否。mutationレスポンスではboolにcastレスポンスのcardShape()が明示的に(bool)型変換; キーは常に存在 |
{
"id": "card_demo",
"card_type": "VIRTUAL",
"brand": "MASTERCARD",
"masked_pan": "**** **** **** 1234",
"last4": "1234",
"currency": "USD",
"status": "FROZEN",
"atm_enabled": false
}
CSRF validation failed形式: non-JSON_csrf欠落/不一致。Security::requireCsrf()がAuth::requireUser()より先に実行されます。
CSRF validation failedLocation: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headerunsupported_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
card_status_unavailable形式: JSONprovider一時障害
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/cards/{id}/sensitive
PAN/Expiry/CVVを本人step-up後に一時取得
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECカードIDcard_... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
_csrf | string | 必須 | V-REC sessionのCSRF token$_POSTに含まれるフォーム/multipart項目であること; JSON本文ではSecurity::requireCsrf()の要件を満たさない |
current_password | string | 必須 | 現在のV-RECパスワード追加認証 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
card_number | string | 必須 | Full PAN。表示時だけ使用し保存禁止 |
expiry | string | 必須 | 有効期限 |
cvv | string | 必須 | CVV。保存禁止 |
{
"card_number": "5555555555551234",
"expiry": "12/29",
"cvv": "123"
}
CSRF validation failed形式: non-JSON_csrf欠落/不一致。Security::requireCsrf()がAuth::requireUser()より先に実行されます。
CSRF validation failedLocation: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headersakura_card_sensitive_scope_required形式: JSONSAKURA Connected App scope不足
card_not_found形式: JSONカードなし/本人所有外
current_password_invalid / card_sensitive_requires_sakura_driver / vrec_instance_required / sakura_user_not_linked形式: JSONstep-upまたはvalidation失敗
too_many_attempts形式: JSON5分で6回超
card_sensitive_unavailable形式: JSONprovider一時障害
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/cards/{id}/pin
物理カードの4桁PIN設定・変更
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECカードIDcard_... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
_csrf | string | 必須 | V-REC sessionのCSRF token$_POSTに含まれるフォーム/multipart項目であること; JSON本文ではSecurity::requireCsrf()の要件を満たさない |
current_password | string | 必須 | 現在のV-RECパスワード追加認証 |
pin | string | 必須 | 新しい4桁PIN^[0-9]{4}$; must match pin_confirmation |
pin_confirmation | string | 必須 | PINの確認入力exactly equals pin |
bodyなし、またはendpoint固有schemaなし。
{
"success": true
}
CSRF validation failed形式: non-JSONCSRFフィールド欠落・不一致
CSRF validation failedLocation: /v/{instance}/login形式: redirectV-RECログインセッションなし
empty body + Location headercard_not_found形式: JSONカードなし・本人のカードではない
current_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接続要件不足、登録携帯番号不備
too_many_attempts形式: JSON15分で4回超
card_pin_unavailable形式: JSONSAKURAまたはMatchMoveのPIN設定処理が未確認・失敗
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/cards/{id}/issuer-transactions
MatchMoveのカード別決済明細(読み取り専用)
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-RECカードIDcard_... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
from | date | 任意 | 開始日(省略時30日前)YYYY-MM-DD, UTC |
to | date | 任意 | 終了日(省略時当日)YYYY-MM-DD; から <= to; max range 92 days; no later than UTC tomorrow |
page | integer | 任意 | ページ番号1-100; default 1 |
bodyなし、またはendpoint固有schemaなし。
{
"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"
}
Location: /v/{instance}/login形式: redirectV-RECログインセッションがない
empty body + Location headercard_not_found形式: JSON対象カードなし・本人所有外
invalid_page / invalid_date_range / sakura_cards_scope_required形式: JSONページ/日付条件不正、Connected Appのcardsスコープがない場合
too_many_attempts形式: JSON1分間に30回超
card_transactions_unavailable形式: JSONSAKURA/MatchMoveの取得失敗・不正な応答
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/tenant-allocations
本人向け直接テナント割当履歴
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data[] | array | 必須 | User-scoped tenant allocations (up to 100) |
data[].public_id | string | 必須 | Direct allocation reference |
data[].merchant_name | string | 必須 | Funding merchant label |
data[].amount | decimal string | 必須 | Amount in currency (not USDT) |
data[].currency | string | 必須 | USD |
data[].status | string | 必須 | COMPLETED or pending/failed state |
data[].remaining_amount | decimal string|null | 必須 | Remaining source lot; null before completion |
{
"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"
}
]
}
Location: /login形式: redirectV-REC本人ログインが必要
Redirect to login原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/tenant-returns
本人向けテナント組戻し履歴
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data[] | array | 必須 | User-scoped tenant returns (up to 100) |
data[].public_id | string | 必須 | 返還 reference |
data[].amount | decimal string | 必須 | Amount in currency |
data[].currency | string | 必須 | USD |
data[].status | string | 必須 | COMPLETED or in-progress status |
{
"data": []
}
Location: /login形式: redirectV-REC本人ログインが必要
Redirect to login原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/ledger-entries
本人向け資金原資台帳履歴
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data[] | array | 必須 | Attributed V-REC funding ledger, max 100 |
data[].public_id | string | 必須 | Ledger entry id |
data[].entry_type | string | 必須 | CREDIT, DEBIT, TENANT_RETURN, ... |
data[].amount | decimal string | 必須 | Signed source ledger amount |
data[].currency | string | 必須 | USD; never treated as token units |
data[].reference_type | string | 必須 | Source classification |
data[].reference_id | string | 必須 | Underlying event identifier |
{
"data": [
{
"public_id": "le_example",
"entry_type": "CREDIT",
"amount": "10.00000000",
"currency": "USD",
"reference_type": "SAKURA_TENANT_ALLOCATION",
"reference_id": "sakura_request_example"
}
]
}
Location: /login形式: redirectV-REC本人ログインが必要
Redirect to login原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
https://v-rec.xyz
/api/v1/me/wallet
ウォレット概要・USDT/ETH残高・ガスレス可否
SAKURA crypto_wallet
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
skip_balances | any | 任意 | 指定時はブロックチェーン残高を取得しない(高速) |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
enabled | boolean | 必須 | SAKURA側でV-RECウォレット機能が有効か |
access.allowed | boolean | 必須 | この利用者が作成・送金できるか(SAKURAの表示モード/個別有効化) |
access.reason | string|null | 必須 | 不可理由not_enabled_for_user | disabled_by_operator | service_disabled |
features.wallet_creation / wallet_rotation / gasless_transfer | boolean | 必須 | SAKURA機能フラグ |
has_wallet | boolean | 必須 | アクティブなウォレットの有無 |
wallet.address | string | 条件付き | 受取アドレス(Ethereum / ERC-20)^0x[0-9a-f]{40}$ |
wallet.version | integer | 条件付き | 入れ替えごとに+1 |
wallet.key_scheme | string | 条件付き | 鍵方式bip39_bip44 | legacy_random |
wallet.derivation_path | string|null | 条件付き | MetaMask互換の導出パスm/44'/60'/0'/0/0 |
balances.usdt.balance | decimal-string|null | 条件付き | オンチェーンUSDT残高(6桁)。RPC失敗時null |
balances.usdt.pending_incoming | decimal-string | 条件付き | 未確定のUSDT入金 |
balances.usdt.available | decimal-string|null | 条件付き | 送金可能額 = balance − pending_incoming(0未満は0) |
balances.eth.balance | decimal-string|null | 条件付き | ETH残高(18桁)。ガスレス送金では不要 |
balances.complete | boolean | 条件付き | 全残高を取得できたか |
gasless.allowed | boolean | 必須 | ガスレス送金を今利用できるか |
gasless.reason | string|null | 必須 | 判定理由merchant_managed | physical_card_exempt | not_subscriber | card_suspended | past_due | overdue | transfer_blocked ... |
gasless.message | string|null | 必須 | 利用者向け説明(ja/en) |
gasless.daily_limit / daily_remaining | integer | 必須 | 1日の回数上限と残り(失敗も1回) |
transfer_blocked | boolean | 必須 | 運営による送金停止 |
previous_wallets[] | array<object> | 必須 | 入れ替え済みウォレット(address, version, deactivated_at, deactivate_reason) |
{
"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": []
}
Location: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headerwallet_not_available形式: JSONSAKURA連携に crypto_wallet(書込みは crypto_wallet_manage)権限がない
wallet_service_unavailable形式: JSONSAKURA/ブロックチェーンRPCの一時障害。correlation_id付き
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/wallet/transfers
送金履歴と処理中リクエスト
SAKURA crypto_wallet
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
limit | integer | 任意 | 件数1..100, default 20 |
bodyなし、またはendpoint固有schemaなし。
{
"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..."
}
]
}
Location: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headerwallet_not_available形式: JSONSAKURA連携に crypto_wallet(書込みは crypto_wallet_manage)権限がない
wallet_service_unavailable形式: JSONSAKURA/ブロックチェーンRPCの一時障害。correlation_id付き
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/wallet/address-check
送金前の宛先安全チェック(アドレスポイズニング対策)
SAKURA crypto_wallet
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
_csrf | string | 必須 | V-REC sessionのCSRF tokenform field ($_POST); JSON本文ではSecurity::requireCsrf()の要件を満たさない |
address | string | 必須 | 宛先アドレスmax 64 |
bodyなし、またはendpoint固有schemaなし。
{
"address": "0x9b2e...",
"verdict": "danger",
"risk_score": 85,
"checksum_valid": true,
"lookalike": "0x9b2e...1f",
"findings": [
{
"severity": "danger",
"message": "過去の送金先と先頭・末尾が一致する別アドレスです。"
}
],
"requires_acknowledgement": true
}
CSRF validation failed形式: non-JSON_csrf欠落/不一致
CSRF validation failedLocation: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headerwallet_not_available形式: JSONSAKURA連携に crypto_wallet(書込みは crypto_wallet_manage)権限がない
invalid_address形式: JSONaddress未指定/長すぎ
too_many_attempts形式: JSON10分60回超
wallet_service_unavailable形式: JSONSAKURA/ブロックチェーンRPCの一時障害。correlation_id付き
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/wallet
ウォレット作成(シードフレーズを1回だけ返す)
SAKURA crypto_wallet_manage
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
Idempotency-Key | ヘッダー文字列 | 任意 | 再送時の二重作成防止^[A-Za-z0-9._:-]{1,120}$ |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
_csrf | string | 必須 | V-REC sessionのCSRF tokenform field ($_POST); JSON本文ではSecurity::requireCsrf()の要件を満たさない |
current_password | string | 必須 | V-RECログインパスワード(step-up) |
wallet_password | string | 必須 | 新しいウォレットパスワード(送金時に必要)10..512 chars; should differ から the V-REC password |
wallet_password_confirmation | string | 必須 | 確認must equal wallet_password |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
operation_id | string | 必須 | SAKURA操作IDvwo_... |
operation | string | 必須 | 操作種別create | rotate |
replayed | boolean | 必須 | 同じ冪等キーの再送で保存済み結果を返した場合true |
status | string | 必須 | 結果CREATED | ROTATED |
wallet | object | 必須 | 新しいウォレット(wallet_summary.wallet と同形) |
previous_address | string | rotate only | 入れ替え前のアドレス |
mnemonic | string|null | 必須 | BIP-39シードフレーズ12語。この応答で1回だけ。replayed=trueではnullNEVER log, store, cache or send to analytics |
mnemonic_available | boolean | 必須 | mnemonicを含むか |
{
"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
}
CSRF validation failed形式: non-JSON_csrf欠落/不一致
CSRF validation failedLocation: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headerwallet_not_available形式: JSONSAKURA連携に crypto_wallet(書込みは crypto_wallet_manage)権限がない
wallet_access_denied / wallet_creation_disabled形式: JSONこの利用者/機能が無効
wallet_already_exists形式: JSON既にアクティブなウォレットあり(入れ替えを使用)
current_password_invalid / wallet_password_invalid_format形式: JSONstep-up失敗/パスワード要件不足
too_many_attempts形式: JSONstep-up 10分8回超
wallet_creation_unavailable / wallet_service_unavailable形式: JSONSAKURAの復旧鍵未設定など
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/wallet/rotate
ウォレット入れ替え(ローテーション)
SAKURA crypto_wallet_manage
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
Idempotency-Key | ヘッダー文字列 | 任意 | 再送時の二重入れ替え防止^[A-Za-z0-9._:-]{1,120}$ |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
_csrf | string | 必須 | V-REC sessionのCSRF tokenform field ($_POST); JSON本文ではSecurity::requireCsrf()の要件を満たさない |
current_password | string | 必須 | V-RECログインパスワード(step-up) |
new_wallet_password | string | 必須 | 新ウォレットのパスワード10..512 chars |
new_wallet_password_confirmation | string | 必須 | 確認 |
reason | string | 必須 | 入れ替え理由compromised | precaution | other |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
operation_id | string | 必須 | SAKURA操作IDvwo_... |
operation | string | 必須 | 操作種別create | rotate |
replayed | boolean | 必須 | 同じ冪等キーの再送で保存済み結果を返した場合true |
status | string | 必須 | 結果CREATED | ROTATED |
wallet | object | 必須 | 新しいウォレット(wallet_summary.wallet と同形) |
previous_address | string | rotate only | 入れ替え前のアドレス |
mnemonic | string|null | 必須 | BIP-39シードフレーズ12語。この応答で1回だけ。replayed=trueではnullNEVER log, store, cache or send to analytics |
mnemonic_available | boolean | 必須 | mnemonicを含むか |
{
"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
}
CSRF validation failed形式: non-JSON_csrf欠落/不一致
CSRF validation failedLocation: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headerwallet_not_available形式: JSONSAKURA連携に crypto_wallet(書込みは crypto_wallet_manage)権限がない
wallet_not_found形式: JSON入れ替え対象なし(先に作成)
invalid_reason / current_password_invalid / wallet_password_invalid_format形式: JSON入力エラー
too_many_attempts形式: JSONstep-up超過
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/wallet/gasless-transfer
USDTガスレス送金(ガス代はSAKURA負担)
SAKURA crypto_wallet_manage
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
Idempotency-Key | ヘッダー文字列 | 必須 | 送金ごとに一意。同じ送金の再試行時のみ再利用^[A-Za-z0-9._:-]{1,120}$ |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
_csrf | string | 必須 | V-REC sessionのCSRF tokenform field ($_POST); JSON本文ではSecurity::requireCsrf()の要件を満たさない |
to_address | string | 必須 | 宛先^0x[0-9a-fA-F]{40}$ |
amount | decimal-string | 必須 | USDT金額^\d{1,15}(\.\d{1,6})?$, > 0 |
wallet_password | string | 必須 | ウォレットパスワード(SAKURAで鍵を復号し署名) |
risk_acknowledged | boolean-string | 任意 | 危険判定の宛先を承諾1 | true |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
operation_id | string | 必須 | SAKURA操作IDvwo_... |
status | string | 必須 | ブロードキャスト済みSUBMITTED |
transfer_id | integer | 必須 | SAKURA送金ログID |
fee_mode | string | 必須 | ガス負担gasless |
symbol / amount | string / decimal-string | 必須 | 通貨と金額(6桁)USDT |
from_address / to_address | string | 必須 | 送金元・宛先^0x[0-9a-f]{40}$ |
tx_hash / explorer_url | string | 必須 | トランザクションとEtherscan URL |
daily_remaining | integer | 必須 | 本日の残り回数 |
request_key | string | 必須 | 状況確認用キー(/api/v1/me/wallet/requests/{key}) |
{
"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_..."
}
CSRF validation failed形式: non-JSON_csrf欠落/不一致
CSRF validation failedLocation: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headerwallet_not_available形式: JSONSAKURA連携に crypto_wallet(書込みは crypto_wallet_manage)権限がない
transfer_status_unknown形式: JSONSAKURAへのHTTPがタイムアウト。送金は処理中の可能性。再送せず status_url で確認
gasless_not_allowed / transfer_blocked / wallet_access_denied形式: JSON月額利用者でない・未払い・運営停止など(reason付き)
wallet_not_found形式: JSONウォレット未作成
destination_risk / operation_in_progress / idempotency_key_reused形式: JSON危険な宛先(risk_acknowledged必要)/同キー処理中/同キーで内容が違う
wallet_password_invalid / insufficient_balance / invalid_amount / invalid_destination / idempotency_key_required形式: JSON入力・残高エラー
wallet_password_locked / daily_limit_reached / too_many_attempts形式: JSONパスワード連続失敗ロック(30分)/1日上限/V-REC側レート制限
wallet_operation_failed形式: JSONブロックチェーン処理失敗。correlation_id付き。履歴確認後に新しいキーで再試行
wallet_service_unavailable形式: JSONSAKURA/ブロックチェーンRPCの一時障害。correlation_id付き
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/wallet/requests/{key}
送金リクエストの状況確認
SAKURA crypto_wallet
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
key | string | 必須 | request_key(送金応答またはtransfer_status_unknown応答のもの)^[A-Za-z0-9._:-]{1,190}$ |
bodyなし、またはendpoint固有schemaなし。
{
"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..."
}
}
Location: /v/{instance}/login形式: redirect有効なV-REC本人sessionがない場合。JSON bodyではありません。
empty body + Location headeroperation_not_found形式: JSONSAKURAが受け付けていない(安全に新しいキーで再送可)
wallet_service_unavailable形式: JSONSAKURA/ブロックチェーンRPCの一時障害。correlation_id付き
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
https://v-rec.xyz
/api/v1/me/wallet/purchase-catalog
取扱商品・支払方法・売主・手数料
SAKURA crypto_wallet
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
bodyなし、またはendpoint固有schemaなし。
{
"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"
}
}
Location: /v/{instance}/login形式: redirect本人session無し
redirectwallet_not_available形式: JSONSAKURA連携に crypto_wallet / crypto_wallet_manage 権限が無い
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/wallet/purchase-quotes
見積(売買契約の条件を確定)
SAKURA crypto_wallet_manage
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
Idempotency-Key | ヘッダー文字列 | 必須 | 同じ見積の再送で同じ契約番号^[A-Za-z0-9._:-]{1,120}$ |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
_csrf | string | 必須 | V-REC sessionのCSRF tokenform field |
product | string | 必須 | 商品SGP_USD | POINT |
payment_asset | string | 必須 | 代金の暗号資産USDT | CUSTOM_TOKEN |
payment_amount | decimal-string | 必須 | 代金の数量> 0 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
contract_no | string | 必須 | 売買契約番号VCS-... |
contract_type | string | 必須 | 常に SALE(両替ではない) |
status | string | 必須 | 契約状態QUOTED | PAYMENT_PROCESSING | PAYMENT_SUBMITTED | COMPLETED | FAILED | EXPIRED | MANUAL_REVIEW |
product / product_name / product_quantity | string | 必須 | 商品(SGP_USD または POINT)と引渡数量 |
seller | string | 必須 | 売主。USDT払いのSGP-USDのみ SAKURA_EXCHANGE、それ以外は MERCHANTSAKURA_EXCHANGE | MERCHANT |
payment.asset / symbol / amount / unit_price_usd | string | 必須 | 代金(暗号資産)と単価 |
payment.pay_to_address | string | 必須 | 代金の支払先。USDT=当社販売口座、独自トークン=加盟店アドレス |
pricing.gross_usd | decimal-string | 必須 | 代金のUSD相当額(6桁切捨て) |
pricing.company_fee_rate / company_fee_usd | decimal-string | 必須 | 当社手数料(1%。通常ルートは2%) |
pricing.merchant_royalty_rate / merchant_royalty_usd | decimal-string | 必須 | 加盟店ロイヤリティ(加盟店が設定・上乗せ) |
pricing.net_usd | decimal-string | 必須 | 商品の価額 = gross − 手数料 − ロイヤリティ |
merchant_responsibility | boolean | 必須 | 独自トークン払い(加盟店の責任においてのみ受付) |
terms | object | detail only | 契約時点の条件スナップショット(ja/en) |
{
"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
}
CSRF validation failed形式: non-JSON_csrf不一致
CSRF validation failedLocation: /v/{instance}/login形式: redirect本人session無し
redirectwallet_not_available形式: JSONSAKURA連携に crypto_wallet / crypto_wallet_manage 権限が無い
product_not_offered / payment_asset_not_accepted / merchant_sales_not_enabled形式: JSON取扱なし
merchant_pool_insufficient / idempotency_key_reused形式: JSON加盟店担保不足など
invalid_amount / amount_out_of_range / amount_too_small / idempotency_key_required形式: JSON入力エラー
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/wallet/purchases/{contract}/confirm
契約条件に同意して代金を支払う
SAKURA crypto_wallet_manage
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
contract | string | 必須 | 契約番号VCS-... |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
_csrf | string | 必須 | V-REC sessionのCSRF tokenform field |
accept_terms | boolean-string | 必須 | 契約条件への同意1 | true |
wallet_password | string | 必須 | ウォレットパスワード |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
contract_no | string | 必須 | 売買契約番号VCS-... |
contract_type | string | 必須 | 常に SALE(両替ではない) |
status | string | 必須 | 契約状態QUOTED | PAYMENT_PROCESSING | PAYMENT_SUBMITTED | COMPLETED | FAILED | EXPIRED | MANUAL_REVIEW |
product / product_name / product_quantity | string | 必須 | 商品(SGP_USD または POINT)と引渡数量 |
seller | string | 必須 | 売主。USDT払いのSGP-USDのみ SAKURA_EXCHANGE、それ以外は MERCHANTSAKURA_EXCHANGE | MERCHANT |
payment.asset / symbol / amount / unit_price_usd | string | 必須 | 代金(暗号資産)と単価 |
payment.pay_to_address | string | 必須 | 代金の支払先。USDT=当社販売口座、独自トークン=加盟店アドレス |
pricing.gross_usd | decimal-string | 必須 | 代金のUSD相当額(6桁切捨て) |
pricing.company_fee_rate / company_fee_usd | decimal-string | 必須 | 当社手数料(1%。通常ルートは2%) |
pricing.merchant_royalty_rate / merchant_royalty_usd | decimal-string | 必須 | 加盟店ロイヤリティ(加盟店が設定・上乗せ) |
pricing.net_usd | decimal-string | 必須 | 商品の価額 = gross − 手数料 − ロイヤリティ |
merchant_responsibility | boolean | 必須 | 独自トークン払い(加盟店の責任においてのみ受付) |
terms | object | detail only | 契約時点の条件スナップショット(ja/en) |
{
"contract_no": "VCS-...",
"status": "PAYMENT_SUBMITTED",
"payment": {
"tx_hash": "0xabc..."
},
"replayed": false
}
CSRF validation failed形式: non-JSON_csrf不一致
CSRF validation failedLocation: /v/{instance}/login形式: redirect本人session無し
redirectpayment_status_unknown形式: JSONSAKURAへのHTTPタイムアウト。再送せず status_url で確認
quote_expired / wallet_changed / merchant_collateral_shortfall形式: JSON期限切れ等
terms_not_accepted / wallet_password_invalid / insufficient_balance形式: JSON同意なし・パスワード誤り等(見積は再試行可能)
wallet_password_locked / too_many_attempts形式: JSONロック等
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/wallet/purchases
売買契約の一覧
SAKURA crypto_wallet
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
limit | integer | 任意 | 件数1..100 |
bodyなし、またはendpoint固有schemaなし。
{
"data": [
{
"contract_no": "VCS-...",
"status": "COMPLETED"
}
]
}
Location: /v/{instance}/login形式: redirect本人session無し
redirectwallet_not_available形式: JSONSAKURA連携に crypto_wallet / crypto_wallet_manage 権限が無い
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/v1/me/wallet/purchases/{contract}
売買契約の詳細・状況
SAKURA crypto_wallet
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
V-REC session cookie | cookie | 必須 | SESSION_NAMEで設定されるログインsession cookie既定の設定名: vrec_gateway; 実行時設定で変更可能 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
contract | string | 必須 | 契約番号VCS-... |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
contract_no | string | 必須 | 売買契約番号VCS-... |
contract_type | string | 必須 | 常に SALE(両替ではない) |
status | string | 必須 | 契約状態QUOTED | PAYMENT_PROCESSING | PAYMENT_SUBMITTED | COMPLETED | FAILED | EXPIRED | MANUAL_REVIEW |
product / product_name / product_quantity | string | 必須 | 商品(SGP_USD または POINT)と引渡数量 |
seller | string | 必須 | 売主。USDT払いのSGP-USDのみ SAKURA_EXCHANGE、それ以外は MERCHANTSAKURA_EXCHANGE | MERCHANT |
payment.asset / symbol / amount / unit_price_usd | string | 必須 | 代金(暗号資産)と単価 |
payment.pay_to_address | string | 必須 | 代金の支払先。USDT=当社販売口座、独自トークン=加盟店アドレス |
pricing.gross_usd | decimal-string | 必須 | 代金のUSD相当額(6桁切捨て) |
pricing.company_fee_rate / company_fee_usd | decimal-string | 必須 | 当社手数料(1%。通常ルートは2%) |
pricing.merchant_royalty_rate / merchant_royalty_usd | decimal-string | 必須 | 加盟店ロイヤリティ(加盟店が設定・上乗せ) |
pricing.net_usd | decimal-string | 必須 | 商品の価額 = gross − 手数料 − ロイヤリティ |
merchant_responsibility | boolean | 必須 | 独自トークン払い(加盟店の責任においてのみ受付) |
terms | object | detail only | 契約時点の条件スナップショット(ja/en) |
{
"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
}
Location: /v/{instance}/login形式: redirect本人session無し
redirectsale_not_found形式: JSON契約なし
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1
/api/merchant/v1/learning/programs
自社の公開講座を最大100件取得
learning.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data | array | 必須 | 公開済み講座(最大100件) / Merchant-published programs公開済み講座(最大100件) / Merchant-published programs |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/learning/programs/{id}
自社講座の詳細と無料/有料の申込条件
learning.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | integer | 必須 | 講座ID>0 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data | array | 必須 | 公開済み講座(最大100件) / Merchant-published programs公開済み講座(最大100件) / Merchant-published programs |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/learning/programs/{id}/enrollments
本人同意済み会員の無料講座への登録
learning.enroll.write
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | integer | 必須 | 講座ID>0 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-REC会員IDusr_... |
learner_consent | boolean | 必須 | 会員の同意true |
consent_reference | string | 必須 | 加盟店の同意記録ID8..100 characters |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data | array | 必須 | 公開済み講座(最大100件) / Merchant-published programs公開済み講座(最大100件) / Merchant-published programs |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/learning/programs/{id}/sessions
講座の授業日程・受講条件を取得
learning.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | integer | 必須 | SAKURA program ID (positive integer)SAKURA program ID (positive integer) |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
program | object | 必須 | 対象講座 / Course対象講座 / Course |
sessions | array | 必須 | キャンセル除外の授業 / Non-cancelled lessonsキャンセル除外の授業 / Non-cancelled lessons |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/learning/users/{id}/schedule
加盟店所属会員の受講予定
learning.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-REC usr_... ID (ACTIVE/FULL)V-REC usr_... ID (ACTIVE/FULL) |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-REC公開会員ID (usr_...)V-REC usr_... |
data | array | 必須 | 加入済み講座・授業 / Enrolled courses and sessions加入済み講座・授業 / Enrolled courses and sessions |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/learning/users/{id}/progress
外部サイト向け受講進捗・カレンダー登録リンク
learning.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-REC usr_... ID (ACTIVE/FULL)V-REC usr_... ID (ACTIVE/FULL) |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-REC usr_... member IDV-REC usr_... member ID |
google_calendar_connected | boolean | 必須 | Google連携設定 / Google authorization statusGoogle連携設定 / Google authorization status |
data | array | 必須 | 授業毎の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 |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/learning/rewards
学習報酬の直近履歴
learning.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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_id | integer | 任意 | optional positive IDoptional positive ID |
program_id | integer | 任意 | optional positive IDoptional positive ID |
limit | integer | 任意 | 1–100; default 501–100; default 50 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data | array | 必須 | 最大100件。各項目のuser_idはV-REC usr_...。SAKURA内部user_refは返却しません。カスタムトークン付与履歴(最大100件) / Last up to 100 reward rows |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/learning/sessions/{id}/complete
外部講義終了後の出席実績登録
learning.rewards.write
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | integer | 必須 | SAKURA session IDSAKURA session ID |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-REC usr_... IDV-REC usr_... ID |
idempotency_key | string | 必須 | 8–120 chars [A-Za-z0-9._:-]8–120 chars [A-Za-z0-9._:-] |
evidence_ref | string | 必須 | 8–190 chars; auditable provider evidence8–190 chars; auditable provider evidence |
duration_seconds | integer | 必須 | 1–864001–86400 |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
session_id | integer | 必須 | 授業ID / Lesson ID授業ID / Lesson ID |
attendance_status | string | 必須 | 再判定後の出席ステータス / Assessed attendance再判定後の出席ステータス / Assessed attendance |
reward | object|null | 条件付き | 付与台帳の状態。nullの場合もある / May be null付与台帳の状態。nullの場合もある / May be null |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
validation_error形式: JSON入力値・受講状態・残高・ウォレット条件不適合
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/learning/sessions/{id}/rewards
受講完了済み授業の設定済み報酬を再処理
learning.rewards.write
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | integer | 必須 | SAKURA session IDSAKURA session ID |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-REC usr_... IDV-REC usr_... ID |
idempotency_key | string | 必須 | 8–120 chars [A-Za-z0-9._:-]8–120 chars [A-Za-z0-9._:-] |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
reward | object | 必須 | 既存設定のトークン付与結果 / Existing configured grant record既存設定のトークン付与結果 / Existing configured grant record |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
validation_error形式: JSON入力値・受講状態・残高・ウォレット条件不適合
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/learning/users/{id}/calendar-sync
同意済みGoogleカレンダーへの講義予定同期
learning.calendar.write
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | V-REC usr_... IDV-REC usr_... ID |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
program_id | integer | 必須 | positive integer, enrolled programpositive integer, enrolled program |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
user_id | string | 必須 | V-REC member IDV-REC member ID |
sync | object | 必須 | 同期件数・失敗数 / Sync and failure counts同期件数・失敗数 / Sync and failure counts |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
validation_error形式: JSON入力値・受講状態・残高・ウォレット条件不適合
partial_calendar_sync形式: JSON同期が一部失敗
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/token-pool
加盟店専用トークンプール残高と全期間統計
learning.token_pool.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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 | string | 必須 | ERC-20 contractERC-20 contract |
symbol | string | 必須 | Token symbolToken symbol |
onchain_balance | string|null | 条件付き | オンチェーン残高取得結果 / Chain balance when availableオンチェーン残高取得結果 / Chain balance の場合 available |
reserved_amount | string | 必須 | 予約済み数量 / Reserved amount予約済み数量 / Reserved amount |
available_estimate | string|null | 条件付き | 参考利用可能量(確定残高ではない) / Estimated available参考利用可能量(確定残高ではない) / Estimated available |
statistics | object | 必須 | 全期間集計 / All-time totals全期間集計 / All-time totals |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/token-pool/transfers
送金台帳の履歴・全期間統計・ページ送り
learning.token_pool.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
limit | integer | 任意 | 1–100, default 501–100, default 50 |
before_id | integer | 任意 | positive cursor IDpositive cursor ID |
status | string | 任意 | reserved|dispatching|submitted|confirmed|reconcile_required|failedreserved|dispatching|submitted|confirmed|reconcile_required|failed |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
data | array | 必須 | 送金台帳の一ページ / One ledger page送金台帳の一ページ / One ledger page |
statistics | object | 必須 | 全期間集計(total_count, requested_amount, submitted_count, confirmed_count, reconcile_required_count 等)全期間集計(total_count, requested_amount, submitted_count, confirmed_count, reconcile_required_count 等) |
pagination | object | 必須 | limit, has_more, next_before_idlimit, has_more, next_before_id |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/token-pool/transfers/{id}
送金リクエストの状態照合
learning.token_pool.read
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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); 比較 ヘッダー値の英字を小文字化した後 |
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
id | string | 必須 | request_id 8–120 [A-Za-z0-9._:-]request_id 8–120 [A-Za-z0-9._:-] |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
request_id | string | 必須 | 加盟店送金リクエストID / Merchant idempotency identifier加盟店送金リクエストID / Merchant idempotency identifier |
status | string | 必須 | reserved|dispatching|submitted|confirmed|reconcile_required|failedreserved|dispatching|submitted|confirmed|reconcile_required|failed |
tx_hash | string|null | 条件付き | 送信受付時に存在することがある / Optional hash送信受付時に存在することがある / Optional hash |
amount | string | 必須 | 数量 / Exact decimal string数量 / Exact decimal string |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
/api/merchant/v1/token-pool/transfers
加盟店プールから会員ウォレットへのガスレス送金要求
learning.token_pool.write
| 項目 | 型 | 必須 | 制約 / 意味 |
|---|---|---|---|
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_code | string | 必須 | V-REC mrc_... matches HMAC merchantV-REC mrc_... matches HMAC merchant |
user_id | string | 必須 | V-REC usr_... ACTIVE/FULL memberV-REC usr_... ACTIVE/FULL member |
request_id | string | 必須 | unique 8–120 [A-Za-z0-9._:-]unique 8–120 [A-Za-z0-9._:-] |
amount | string | 必須 | decimal string >0, <=18 decimal digits before token precision validationdecimal string >0, <=18 decimal digits before token precision validation |
| 項目 | 型 | 有無 | 制約 / 意味 |
|---|---|---|---|
request_id | string | 必須 | 加盟店送金リクエストID / Merchant idempotency identifier加盟店送金リクエストID / Merchant idempotency identifier |
status | string | 必須 | reserved|dispatching|submitted|confirmed|reconcile_required|failedreserved|dispatching|submitted|confirmed|reconcile_required|failed |
tx_hash | string|null | 条件付き | 送信受付時に存在することがある / Optional hash送信受付時に存在することがある / Optional hash |
amount | string | 必須 | 数量 / Exact decimal string数量 / Exact decimal string |
merchant_auth_required形式: JSONHMAC認証に失敗 / HMAC authentication failed
merchant_scope_denied形式: JSONHMAC scope、所属、SAKURA Connected Appsが不一致 / insufficient grants or merchant mismatch
merchant_learning_shared_instance_not_isolated形式: JSON共有インスタンスは加盟店分離未保証 / shared instance is not isolated
learning_upstream_unavailable形式: JSONSAKURA通信障害。送金の自動再試行は禁止 / Upstream unavailable; do not blindly retry money movement
validation_error形式: JSON入力値・受講状態・残高・ウォレット条件不適合
原則としてAPIエラーはJSON {"error":"<machine_code>"} ですが、各カードで non-JSON / redirect と明記されたレスポンス(現在の本人Session 302、CSRF 419など)は例外です。
Webhook詳細仕様:送信タイミング・状態・会員登録・テナント資金・3DS →
V-REC → MerchantMerchant configured HTTPS URLuser.kyc.updated⌄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)任意の2xxで成功。失敗は最大8 attempts。retry delayは60, 300, 1800, 7200, 21600, 43200, 86400秒。HTTP重複排除はX-VREC-Delivery、業務イベント重複排除はpayload id。
期待する応答: HTTP 200–299
| 通知データの項目 | 型 | 必須 | 意味 |
|---|---|---|---|
id | string | 必須 | 業務イベントID。retryでも同一kyc_ + sha256(membership_id|status|source_event_id)。再試行でも同じ値です |
type | string | 必須 | イベント種別user.kyc.updated |
occurred_at | string | 必須 | 発生時刻ISO 8601 |
data.user_id | string | 必須 | V-RECユーザーID |
data.beneficiary_id | string | 必須 | 受取人ID |
data.external_user_ref | string|null | 必須 | Merchant外部ユーザー参照JSONキーは常に存在; 値はnullの場合あり |
data.kyc_status | string | 必須 | SAKURAから再取得した最新KYC状態 |
data.ekyc_status | string|null | 必須 | eKYC補助状態JSONキーは常に存在; 値はnullの場合あり |
{
"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"
}
}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はこの公開仕様の対象外です。