{"openapi":"3.0.0","paths":{"/auth/register":{"post":{"operationId":"AuthController_register","summary":"Create a merchant account + organization","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDto"}}}},"responses":{"201":{"description":""}},"tags":["auth"]}},"/auth/forgot-password":{"post":{"operationId":"AuthController_forgotPassword","summary":"Request a password-reset email (always 200)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordDto"}}}},"responses":{"201":{"description":""}},"tags":["auth"]}},"/auth/reset-password":{"post":{"operationId":"AuthController_resetPassword","summary":"Set a new password with a reset token","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordDto"}}}},"responses":{"201":{"description":""}},"tags":["auth"]}},"/auth/login":{"post":{"operationId":"AuthController_login","summary":"Log in with email + password","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"201":{"description":""}},"tags":["auth"]}},"/auth/me":{"get":{"operationId":"AuthController_me","summary":"Get the current user + organizations","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"],"security":[{"bearer":[]}]}},"/auth/change-password":{"post":{"operationId":"AuthController_changePassword","summary":"Change password (requires current password)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordDto"}}}},"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"bearer":[]}]}},"/auth/mfa/setup":{"post":{"operationId":"AuthController_mfaSetup","summary":"Begin MFA setup (returns secret + otpauth URL)","parameters":[],"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"bearer":[]}]}},"/auth/mfa/enable":{"post":{"operationId":"AuthController_mfaEnable","summary":"Confirm and enable MFA with a TOTP code","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MfaCodeDto"}}}},"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"bearer":[]}]}},"/auth/mfa/disable":{"post":{"operationId":"AuthController_mfaDisable","summary":"Disable MFA (requires a valid code)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MfaCodeDto"}}}},"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"bearer":[]}]}},"/stores":{"post":{"operationId":"StoresController_create","summary":"Create a store","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStoreDto"}}}},"responses":{"201":{"description":""}},"tags":["stores"],"security":[{"bearer":[]}]},"get":{"operationId":"StoresController_list","summary":"List stores across your organizations","parameters":[],"responses":{"200":{"description":""}},"tags":["stores"],"security":[{"bearer":[]}]}},"/stores/{id}":{"get":{"operationId":"StoresController_get","summary":"Retrieve a store","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["stores"],"security":[{"bearer":[]}]}},"/stores/{id}/branding":{"put":{"operationId":"StoresController_updateBranding","summary":"Update checkout branding","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBrandingDto"}}}},"responses":{"200":{"description":""}},"tags":["stores"],"security":[{"bearer":[]}]}},"/stores/{id}/credentials":{"put":{"operationId":"StoresController_upsertCredential","summary":"Configure encrypted Bakong provider credentials","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertCredentialDto"}}}},"responses":{"200":{"description":""}},"tags":["stores"],"security":[{"bearer":[]}]}},"/stores/{id}/live-mode":{"put":{"operationId":"StoresController_setLiveMode","summary":"Activate or deactivate production (live) mode","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateLiveDto"}}}},"responses":{"200":{"description":""}},"tags":["stores"],"security":[{"bearer":[]}]}},"/verification":{"post":{"operationId":"VerificationController_submit","summary":"Submit merchant verification (KYC)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitVerificationDto"}}}},"responses":{"201":{"description":""}},"tags":["verification"],"security":[{"bearer":[]}]},"get":{"operationId":"VerificationController_get","summary":"Get verification status for an organization","parameters":[{"name":"org_id","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["verification"],"security":[{"bearer":[]}]}},"/stores/{storeId}/branches":{"post":{"operationId":"BranchesController_create","summary":"Create a branch under a store","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBranchDto"}}}},"responses":{"201":{"description":""}},"tags":["branches"],"security":[{"bearer":[]}]},"get":{"operationId":"BranchesController_list","summary":"List branches for a store","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["branches"],"security":[{"bearer":[]}]}},"/branches/{id}":{"patch":{"operationId":"BranchesController_update","summary":"Update a branch","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBranchDto"}}}},"responses":{"200":{"description":""}},"tags":["branches"],"security":[{"bearer":[]}]},"delete":{"operationId":"BranchesController_remove","summary":"Delete or deactivate a branch","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["branches"],"security":[{"bearer":[]}]}},"/v1/customers":{"post":{"operationId":"CustomersController_create","summary":"Create a customer","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCustomerDto"}}}},"responses":{"201":{"description":""}},"tags":["customers"],"security":[{"bearer":[]}]},"get":{"operationId":"CustomersController_list","summary":"List customers","parameters":[{"name":"email","required":true,"in":"query","schema":{"type":"string"}},{"name":"external_id","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["customers"],"security":[{"bearer":[]}]}},"/v1/customers/{id}":{"get":{"operationId":"CustomersController_retrieve","summary":"Retrieve a customer","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["customers"],"security":[{"bearer":[]}]}},"/v1/customers/{id}/preferences":{"get":{"operationId":"CustomersController_getPrefs","summary":"Get a customer’s communication preferences","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["customers"],"security":[{"bearer":[]}]},"put":{"operationId":"CustomersController_setPrefs","summary":"Update a customer’s preferences (records consent)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPreferencesDto"}}}},"responses":{"200":{"description":""}},"tags":["customers"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/customers":{"get":{"operationId":"CustomersDashboardController_list","summary":"List/search a store’s customers","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"search","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["customers"],"security":[{"bearer":[]}]}},"/dashboard/customers/{id}":{"get":{"operationId":"CustomersDashboardController_get","summary":"Customer 360 (profile + lifetime metrics + recent payments)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["customers"],"security":[{"bearer":[]}]}},"/dashboard/customers/{id}/preferences":{"put":{"operationId":"CustomersDashboardController_setPrefs","summary":"Update a customer’s preferences (records consent)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPreferencesDto"}}}},"responses":{"200":{"description":""}},"tags":["customers"],"security":[{"bearer":[]}]}},"/dashboard/customers/{id}/consent-log":{"get":{"operationId":"CustomersDashboardController_consentLog","summary":"Consent change history","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["customers"],"security":[{"bearer":[]}]}},"/dashboard/customers/{id}/pii":{"delete":{"operationId":"CustomersDashboardController_erase","summary":"Right-to-erasure: anonymize PII, preserve financial records","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["customers"],"security":[{"bearer":[]}]}},"/v1/customers/{id}/referral-code":{"post":{"operationId":"ReferralsController_code","summary":"Get or create a customer’s referral code + share URL","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["referrals"],"security":[{"bearer":[]}]}},"/v1/customers/{id}/referral-qr":{"get":{"operationId":"ReferralsController_qr","summary":"Get a scannable QR (PNG data URL + SVG) for the referral link","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["referrals"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/referral-program":{"get":{"operationId":"ReferralsDashboardController_getProgram","summary":"Get referral program config","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["referrals"],"security":[{"bearer":[]}]},"put":{"operationId":"ReferralsDashboardController_updateProgram","summary":"Configure referral rewards (referrer + referee points)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateReferralProgramDto"}}}},"responses":{"200":{"description":""}},"tags":["referrals"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/referrals":{"get":{"operationId":"ReferralsDashboardController_list","summary":"List referrals","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["referrals"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/commissions":{"get":{"operationId":"ReferralsDashboardController_listCommissions","summary":"List affiliate commissions (optionally filter by status)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["referrals"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/commissions/summary":{"get":{"operationId":"ReferralsDashboardController_commissionSummary","summary":"Commission totals per referrer (accrued vs. paid)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["referrals"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/commissions/payout":{"post":{"operationId":"ReferralsDashboardController_payout","summary":"Mark accrued commissions as paid (all or one referrer)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutCommissionsDto"}}}},"responses":{"201":{"description":""}},"tags":["referrals"],"security":[{"bearer":[]}]}},"/dashboard/customers/{customerId}/referral-qr":{"get":{"operationId":"ReferralsDashboardController_customerQr","summary":"Referral QR (PNG + SVG) for a customer","parameters":[{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["referrals"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/referrals/report":{"get":{"operationId":"ReferralsDashboardController_report","summary":"Referral funnel + commission analytics","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["referrals"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/referrals/flagged":{"get":{"operationId":"ReferralsDashboardController_flagged","summary":"List fraud-flagged referrals awaiting review","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["referrals"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/referrals/{referralId}/review":{"post":{"operationId":"ReferralsDashboardController_review","summary":"Review a flagged referral: clear (release) or void (cancel) held commissions","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"referralId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewReferralDto"}}}},"responses":{"201":{"description":""}},"tags":["referrals"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/ledger/trial-balance":{"get":{"operationId":"LedgerController_trialBalance","summary":"Trial balance (account balances + zero-sum check)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ledger"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/ledger/journals":{"get":{"operationId":"LedgerController_journals","summary":"Recent journal entries","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ledger"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/ledger/reconcile":{"get":{"operationId":"LedgerController_reconcile","summary":"Run reconciliation for a store","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ledger"],"security":[{"bearer":[]}]}},"/dashboard/admin/ledger/trial-balance":{"get":{"operationId":"LedgerController_adminTrialBalance","summary":"Platform trial balance (admin)","parameters":[],"responses":{"200":{"description":""}},"tags":["ledger"],"security":[{"bearer":[]}]}},"/dashboard/admin/ledger/reconcile":{"get":{"operationId":"LedgerController_adminReconcile","summary":"Platform-wide reconciliation (admin)","parameters":[],"responses":{"200":{"description":""}},"tags":["ledger"],"security":[{"bearer":[]}]}},"/dashboard/admin/ledger/backfill":{"post":{"operationId":"LedgerController_backfill","summary":"Backfill ledger from historical records (admin, idempotent)","parameters":[],"responses":{"201":{"description":""}},"tags":["ledger"],"security":[{"bearer":[]}]}},"/v1/loyalty/redeem":{"post":{"operationId":"LoyaltyController_redeem","summary":"Redeem a customer’s points (raw points)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiRedeemDto"}}}},"responses":{"201":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/v1/loyalty/rewards":{"get":{"operationId":"LoyaltyController_rewards","summary":"List active rewards","parameters":[],"responses":{"200":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/v1/loyalty/redemptions":{"post":{"operationId":"LoyaltyController_redeemReward","summary":"Redeem points for a reward (returns a voucher code)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemRewardDto"}}}},"responses":{"201":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/v1/loyalty/redemptions/{id}":{"get":{"operationId":"LoyaltyController_getRedemption","summary":"Retrieve a redemption","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/loyalty":{"get":{"operationId":"LoyaltyDashboardController_getProgram","summary":"Get the loyalty program config","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]},"put":{"operationId":"LoyaltyDashboardController_updateProgram","summary":"Configure the loyalty program (active + points per unit)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProgramDto"}}}},"responses":{"200":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/dashboard/customers/{id}/loyalty":{"get":{"operationId":"LoyaltyDashboardController_ledger","summary":"Customer points balance + ledger","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/loyalty/liability":{"get":{"operationId":"LoyaltyDashboardController_liability","summary":"Outstanding points liability (pointValue = currency per point)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"point_value","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/dashboard/customers/{id}/loyalty/adjust":{"post":{"operationId":"LoyaltyDashboardController_adjust","summary":"Manually adjust a customer’s points (+/-)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdjustDto"}}}},"responses":{"201":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/tiers":{"get":{"operationId":"LoyaltyDashboardController_tiers","summary":"List loyalty tiers","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]},"post":{"operationId":"LoyaltyDashboardController_createTier","summary":"Create a tier (threshold + earn multiplier)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTierDto"}}}},"responses":{"201":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/dashboard/tiers/{id}":{"patch":{"operationId":"LoyaltyDashboardController_updateTier","summary":"Update a tier","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTierDto"}}}},"responses":{"200":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]},"delete":{"operationId":"LoyaltyDashboardController_deleteTier","summary":"Delete a tier","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/rewards":{"get":{"operationId":"LoyaltyDashboardController_rewards","summary":"List rewards (catalog)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]},"post":{"operationId":"LoyaltyDashboardController_createReward","summary":"Create a reward","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRewardDto"}}}},"responses":{"201":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/dashboard/rewards/{id}":{"patch":{"operationId":"LoyaltyDashboardController_updateReward","summary":"Update a reward","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRewardDto"}}}},"responses":{"200":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]},"delete":{"operationId":"LoyaltyDashboardController_deleteReward","summary":"Delete or deactivate a reward","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/redemptions":{"get":{"operationId":"LoyaltyDashboardController_redemptions","summary":"List redemptions for a store","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/dashboard/redemptions/{id}/fulfill":{"post":{"operationId":"LoyaltyDashboardController_fulfill","summary":"Mark a redemption fulfilled","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/dashboard/redemptions/{id}/cancel":{"post":{"operationId":"LoyaltyDashboardController_cancel","summary":"Cancel a redemption (refund points + restore stock)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["loyalty"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/promotions":{"get":{"operationId":"CampaignsController_list","summary":"List promotions","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["campaigns"],"security":[{"bearer":[]}]},"post":{"operationId":"CampaignsController_create","summary":"Create a promotion (targets a segment, awards bonus points)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePromotionDto"}}}},"responses":{"201":{"description":""}},"tags":["campaigns"],"security":[{"bearer":[]}]}},"/dashboard/promotions/{id}":{"patch":{"operationId":"CampaignsController_update","summary":"Update a promotion","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePromotionDto"}}}},"responses":{"200":{"description":""}},"tags":["campaigns"],"security":[{"bearer":[]}]},"delete":{"operationId":"CampaignsController_remove","summary":"Delete a promotion","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["campaigns"],"security":[{"bearer":[]}]}},"/dashboard/promotions/{id}/simulate":{"get":{"operationId":"CampaignsController_simulate","summary":"Dry-run: estimate reach + bonus-point cost (last 30d)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["campaigns"],"security":[{"bearer":[]}]}},"/dashboard/promotions/{id}/submit":{"post":{"operationId":"CampaignsController_submit","summary":"Submit a promotion for approval","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["campaigns"],"security":[{"bearer":[]}]}},"/dashboard/promotions/{id}/approve":{"post":{"operationId":"CampaignsController_approve","summary":"Approve a promotion (owner)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["campaigns"],"security":[{"bearer":[]}]}},"/dashboard/promotions/{id}/reject":{"post":{"operationId":"CampaignsController_reject","summary":"Reject a promotion (owner)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectDto"}}}},"responses":{"201":{"description":""}},"tags":["campaigns"],"security":[{"bearer":[]}]}},"/dashboard/promotions/{id}/activate":{"post":{"operationId":"CampaignsController_activate","summary":"Activate a promotion (requires approval)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["campaigns"],"security":[{"bearer":[]}]}},"/dashboard/promotions/{id}/pause":{"post":{"operationId":"CampaignsController_pause","summary":"Pause a promotion","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["campaigns"],"security":[{"bearer":[]}]}},"/dashboard/promotions/{id}/end":{"post":{"operationId":"CampaignsController_end","summary":"End a promotion","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["campaigns"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/segments":{"get":{"operationId":"SegmentsController_list","summary":"List customer segments","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["segments"],"security":[{"bearer":[]}]},"post":{"operationId":"SegmentsController_create","summary":"Create a segment","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSegmentDto"}}}},"responses":{"201":{"description":""}},"tags":["segments"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/segments/preview":{"post":{"operationId":"SegmentsController_previewRules","summary":"Preview a segment size for arbitrary rules","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewRulesDto"}}}},"responses":{"201":{"description":""}},"tags":["segments"],"security":[{"bearer":[]}]}},"/dashboard/segments/{id}/preview":{"get":{"operationId":"SegmentsController_preview","summary":"Preview a saved segment (count + sample)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["segments"],"security":[{"bearer":[]}]}},"/dashboard/segments/{id}":{"patch":{"operationId":"SegmentsController_update","summary":"Update a segment","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSegmentDto"}}}},"responses":{"200":{"description":""}},"tags":["segments"],"security":[{"bearer":[]}]},"delete":{"operationId":"SegmentsController_remove","summary":"Delete a segment","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["segments"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/games":{"get":{"operationId":"GamesDashboardController_list","summary":"List promotional games","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]},"post":{"operationId":"GamesDashboardController_create","summary":"Create a promotional game","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGameDto"}}}},"responses":{"201":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]}},"/dashboard/games/{gameId}":{"get":{"operationId":"GamesDashboardController_get","summary":"Get a game with its prizes","parameters":[{"name":"gameId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]},"put":{"operationId":"GamesDashboardController_update","summary":"Update a game","parameters":[{"name":"gameId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGameDto"}}}},"responses":{"200":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]},"delete":{"operationId":"GamesDashboardController_remove","summary":"Delete a game","parameters":[{"name":"gameId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]}},"/dashboard/games/{gameId}/prizes":{"post":{"operationId":"GamesDashboardController_addPrize","summary":"Add a prize to a game","parameters":[{"name":"gameId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrizeDto"}}}},"responses":{"201":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]}},"/dashboard/prizes/{prizeId}":{"put":{"operationId":"GamesDashboardController_updatePrize","summary":"Update a prize","parameters":[{"name":"prizeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrizeDto"}}}},"responses":{"200":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]},"delete":{"operationId":"GamesDashboardController_removePrize","summary":"Delete a prize","parameters":[{"name":"prizeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]}},"/dashboard/games/{gameId}/plays":{"get":{"operationId":"GamesDashboardController_plays","summary":"Recent plays","parameters":[{"name":"gameId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]}},"/dashboard/games/{gameId}/stats":{"get":{"operationId":"GamesDashboardController_stats","summary":"Play/win stats + prize distribution","parameters":[{"name":"gameId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]}},"/dashboard/games/{gameId}/issue":{"post":{"operationId":"GamesDashboardController_issue","summary":"Manually grant a play (scratch card) to a customer","parameters":[{"name":"gameId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuePlayDto"}}}},"responses":{"201":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]}},"/v1/games/{id}/play":{"post":{"operationId":"GamesController_play","summary":"Play a game once — draws a weighted prize honoring inventory","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayDto"}}}},"responses":{"201":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]}},"/v1/plays/{id}/reveal":{"post":{"operationId":"PlaysController_reveal","summary":"Reveal (scratch) an issued play — draws the prize","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]}},"/v1/customers/{id}/plays":{"get":{"operationId":"PlaysController_customerPlays","summary":"List a customer’s plays / scratch cards (filter by status)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["games"],"security":[{"bearer":[]}]}},"/play/game/{gameId}":{"get":{"operationId":"HostedPlayController_game","summary":"Hosted game metadata (public)","parameters":[{"name":"gameId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["games"]}},"/play/game/{gameId}/play":{"post":{"operationId":"HostedPlayController_instant","summary":"Instant play a spin/lucky-draw game (public)","parameters":[{"name":"gameId","required":true,"in":"path","schema":{"type":"string"}},{"name":"c","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["games"]}},"/play/{playId}":{"get":{"operationId":"HostedPlayController_play","summary":"Hosted play/scratch-card state (public)","parameters":[{"name":"playId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["games"]}},"/play/{playId}/reveal":{"post":{"operationId":"HostedPlayController_reveal","summary":"Reveal a scratch card (public)","parameters":[{"name":"playId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["games"]}},"/dashboard/stores/{storeId}/analytics/timeseries":{"get":{"operationId":"AnalyticsController_timeseries","summary":"Daily revenue/count time-series","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["analytics"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/analytics/forecast":{"get":{"operationId":"AnalyticsController_forecast","summary":"Revenue forecast (linear trend + moving average)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"days","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["analytics"],"security":[{"bearer":[]}]}},"/dashboard/orgs/{orgId}/analytics/executive":{"get":{"operationId":"AnalyticsController_executive","summary":"Org-level executive summary","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["analytics"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/revenue-shares":{"get":{"operationId":"MonetizationController_listShares","summary":"List revenue-share agreements","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["monetization"],"security":[{"bearer":[]}]},"post":{"operationId":"MonetizationController_createShare","summary":"Create a revenue-share agreement","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueShareDto"}}}},"responses":{"201":{"description":""}},"tags":["monetization"],"security":[{"bearer":[]}]}},"/dashboard/revenue-shares/{shareId}":{"put":{"operationId":"MonetizationController_updateShare","summary":"Update a revenue-share agreement","parameters":[{"name":"shareId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["monetization"],"security":[{"bearer":[]}]},"delete":{"operationId":"MonetizationController_deleteShare","summary":"Delete a revenue-share agreement","parameters":[{"name":"shareId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["monetization"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/ledger":{"get":{"operationId":"MonetizationController_ledger","summary":"Derived accounting ledger over a date range","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["monetization"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/risk/cases":{"get":{"operationId":"RiskController_list","summary":"List risk/fraud cases (filter by status)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["risk"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/risk/summary":{"get":{"operationId":"RiskController_summary","summary":"Risk case counts by status","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["risk"],"security":[{"bearer":[]}]}},"/dashboard/risk/cases/{caseId}":{"put":{"operationId":"RiskController_update","summary":"Update a case (status + resolution)","parameters":[{"name":"caseId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCaseDto"}}}},"responses":{"200":{"description":""}},"tags":["risk"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/ai/marketing-copy":{"post":{"operationId":"AiController_marketing","summary":"Generate promotional copy","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingCopyDto"}}}},"responses":{"201":{"description":""}},"tags":["ai"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/ai/campaign-suggest":{"get":{"operationId":"AiController_campaign","summary":"Suggest a promotion from store data","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ai"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/ai/analytics-summary":{"get":{"operationId":"AiController_summary","summary":"Natural-language performance summary","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ai"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/ai/fraud-insights":{"get":{"operationId":"AiController_fraud","summary":"Fraud/risk narrative from open cases","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ai"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/ai/assistant":{"post":{"operationId":"AiController_assistant","summary":"Ask the merchant assistant a question","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantDto"}}}},"responses":{"201":{"description":""}},"tags":["ai"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/ai/usage":{"get":{"operationId":"AiGovernanceController_storeUsage","summary":"AI usage & cost for a store (30 days)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ai"],"security":[{"bearer":[]}]}},"/dashboard/admin/ai/registry":{"get":{"operationId":"AiGovernanceController_registry","summary":"AI model registry (platform admin)","parameters":[],"responses":{"200":{"description":""}},"tags":["ai"],"security":[{"bearer":[]}]}},"/dashboard/admin/ai/usage":{"get":{"operationId":"AiGovernanceController_platformUsage","summary":"Platform-wide AI usage & cost (platform admin)","parameters":[],"responses":{"200":{"description":""}},"tags":["ai"],"security":[{"bearer":[]}]}},"/dashboard/marketplace":{"get":{"operationId":"ConnectorsController_marketplace","summary":"Available integrations (app marketplace)","parameters":[],"responses":{"200":{"description":""}},"tags":["connectors"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/connectors":{"get":{"operationId":"ConnectorsController_list","summary":"Installed connectors","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["connectors"],"security":[{"bearer":[]}]},"post":{"operationId":"ConnectorsController_install","summary":"Install a connector","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorDto"}}}},"responses":{"201":{"description":""}},"tags":["connectors"],"security":[{"bearer":[]}]}},"/dashboard/connectors/{connectorId}":{"put":{"operationId":"ConnectorsController_update","summary":"Update a connector","parameters":[{"name":"connectorId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["connectors"],"security":[{"bearer":[]}]},"delete":{"operationId":"ConnectorsController_remove","summary":"Remove a connector","parameters":[{"name":"connectorId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["connectors"],"security":[{"bearer":[]}]}},"/dashboard/connectors/{connectorId}/test":{"post":{"operationId":"ConnectorsController_test","summary":"Send a test event to a connector","parameters":[{"name":"connectorId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["connectors"],"security":[{"bearer":[]}]}},"/wallet/{customerId}":{"get":{"operationId":"WalletController_get","summary":"Public customer loyalty wallet","parameters":[{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["wallet"]}},"/admin/security/posture":{"get":{"operationId":"SecurityController_posture","summary":"Security-posture self-assessment (platform admin)","parameters":[],"responses":{"200":{"description":""}},"tags":["security"],"security":[{"bearer":[]}]}},"/admin/security/monitoring":{"get":{"operationId":"SecurityController_monitoring","summary":"Synthetic monitoring — dependency health + throughput","parameters":[],"responses":{"200":{"description":""}},"tags":["security"],"security":[{"bearer":[]}]}},"/ecosystem/products":{"get":{"operationId":"EcosystemController_products","summary":"The PayKH ecosystem product catalog + shared services","parameters":[],"responses":{"200":{"description":""}},"tags":["ecosystem"]}},"/dashboard/orgs/{orgId}/access/matrix":{"get":{"operationId":"AccessController_matrix","summary":"RBAC role×permission matrix + ABAC policy catalogue","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["access"],"security":[{"bearer":[]}]}},"/dashboard/orgs/{orgId}/access/check":{"post":{"operationId":"AccessController_check","summary":"Simulate an ABAC decision for the current user","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckDto"}}}},"responses":{"201":{"description":""}},"tags":["access"],"security":[{"bearer":[]}]}},"/admin/settings":{"get":{"operationId":"SettingsController_list","summary":"List platform integration settings (admin)","parameters":[],"responses":{"200":{"description":""}},"tags":["settings"],"security":[{"bearer":[]}]}},"/admin/settings/{key}":{"put":{"operationId":"SettingsController_set","summary":"Set an integration setting (encrypted at rest)","parameters":[{"name":"key","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetSettingDto"}}}},"responses":{"200":{"description":""}},"tags":["settings"],"security":[{"bearer":[]}]},"delete":{"operationId":"SettingsController_clear","summary":"Clear a setting (fall back to env var)","parameters":[{"name":"key","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["settings"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/links":{"get":{"operationId":"LinksDashboardController_list","summary":"List payment links & invoices","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["payment-links"],"security":[{"bearer":[]}]},"post":{"operationId":"LinksDashboardController_create","summary":"Create a payment link or invoice","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLinkDto"}}}},"responses":{"201":{"description":""}},"tags":["payment-links"],"security":[{"bearer":[]}]}},"/dashboard/links/{linkId}":{"put":{"operationId":"LinksDashboardController_setActive","summary":"Activate / deactivate a link","parameters":[{"name":"linkId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["payment-links"],"security":[{"bearer":[]}]},"delete":{"operationId":"LinksDashboardController_remove","summary":"Delete a link","parameters":[{"name":"linkId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["payment-links"],"security":[{"bearer":[]}]}},"/links/{id}":{"get":{"operationId":"LinksPublicController_get","summary":"Public payment-link details","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["payment-links"]}},"/links/{id}/pay":{"post":{"operationId":"LinksPublicController_pay","summary":"Create a payment for a link → hosted checkout URL","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayLinkDto"}}}},"responses":{"201":{"description":""}},"tags":["payment-links"]}},"/v1/payments":{"post":{"operationId":"PaymentsController_create","summary":"Create a KHQR payment","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePaymentDto"}}}},"responses":{"201":{"description":""}},"tags":["payments"],"security":[{"bearer":[]}]},"get":{"operationId":"PaymentsController_list","summary":"List payments","parameters":[],"responses":{"200":{"description":""}},"tags":["payments"],"security":[{"bearer":[]}]}},"/v1/payments/{id}":{"get":{"operationId":"PaymentsController_retrieve","summary":"Retrieve a payment","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["payments"],"security":[{"bearer":[]}]}},"/v1/payments/{id}/cancel":{"post":{"operationId":"PaymentsController_cancel","summary":"Cancel a payment (before completion)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["payments"],"security":[{"bearer":[]}]}},"/v1/payments/{id}/refund":{"post":{"operationId":"PaymentsController_refund","summary":"Refund a paid payment (full or partial)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundDto"}}}},"responses":{"201":{"description":""}},"tags":["payments"],"security":[{"bearer":[]}]}},"/v1/payments/{id}/refunds":{"get":{"operationId":"PaymentsController_listRefunds","summary":"List refunds for a payment","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["payments"],"security":[{"bearer":[]}]}},"/v1/payments/{id}/simulate":{"post":{"operationId":"PaymentsController_simulate","summary":"Simulate a status change (test-mode keys only)","description":"Drives the mock provider through pending → scanned → paid/failed/expired so you can run an end-to-end test payment.","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulateDto"}}}},"responses":{"201":{"description":""}},"tags":["payments"],"security":[{"bearer":[]}]}},"/checkout/{id}":{"get":{"operationId":"CheckoutController_view","summary":"Public checkout view for a payment (no secrets)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["checkout"]}},"/checkout/{id}/events":{"get":{"operationId":"CheckoutController_stream","summary":"Server-Sent Events stream of live payment status","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["checkout"]}},"/webhook-endpoints":{"post":{"operationId":"WebhooksController_create","summary":"Register a webhook endpoint (signing secret shown once)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookDto"}}}},"responses":{"201":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]},"get":{"operationId":"WebhooksController_list","summary":"List webhook endpoints for a store","parameters":[{"name":"store_id","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]}},"/webhook-endpoints/{id}":{"patch":{"operationId":"WebhooksController_update","summary":"Update a webhook endpoint (url, events, enable/disable)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookDto"}}}},"responses":{"200":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]},"delete":{"operationId":"WebhooksController_remove","summary":"Delete a webhook endpoint","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]}},"/webhook-endpoints/{id}/secret":{"get":{"operationId":"WebhooksController_revealSecret","summary":"Reveal the active signing secret","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]}},"/webhook-endpoints/{id}/rotate-secret":{"post":{"operationId":"WebhooksController_rotateSecret","summary":"Rotate the signing secret (old one valid for 24h)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]}},"/webhook-endpoints/{id}/deliveries":{"get":{"operationId":"WebhooksController_deliveries","summary":"List delivery attempts for an endpoint","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]}},"/webhook-endpoints/{id}/test":{"post":{"operationId":"WebhooksController_sendTest","summary":"Send a synthetic test event to the endpoint","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]}},"/webhook-endpoints/deliveries/{deliveryId}/resend":{"post":{"operationId":"WebhooksController_resend","summary":"Resend a specific delivery","parameters":[{"name":"deliveryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/telegram":{"get":{"operationId":"NotificationsController_get","summary":"Get Telegram notification config","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["notifications"],"security":[{"bearer":[]}]},"put":{"operationId":"NotificationsController_update","summary":"Configure Telegram notifications (chat id, events)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTelegramDto"}}}},"responses":{"200":{"description":""}},"tags":["notifications"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/telegram/test":{"post":{"operationId":"NotificationsController_test","summary":"Send a test Telegram message","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["notifications"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/channels":{"get":{"operationId":"NotificationsController_channels","summary":"List messaging channels (WhatsApp/SMS/Signal) config","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["notifications"],"security":[{"bearer":[]}]},"put":{"operationId":"NotificationsController_updateChannel","summary":"Configure a messaging channel","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateChannelDto"}}}},"responses":{"200":{"description":""}},"tags":["notifications"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/channels/{channel}/test":{"post":{"operationId":"NotificationsController_testChannel","summary":"Send a test message on a channel","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"channel","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["notifications"],"security":[{"bearer":[]}]}},"/billing/plans":{"get":{"operationId":"BillingController_plans","summary":"List available plans","parameters":[],"responses":{"200":{"description":""}},"tags":["billing"],"security":[{"bearer":[]}]}},"/billing":{"get":{"operationId":"BillingController_overview","summary":"Billing overview (plan + usage + warnings)","parameters":[{"name":"org_id","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["billing"],"security":[{"bearer":[]}]}},"/billing/{orgId}/subscribe":{"post":{"operationId":"BillingController_subscribe","summary":"Subscribe to a plan (free activates now; paid returns a KHQR invoice)","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePlanDto"}}}},"responses":{"201":{"description":""}},"tags":["billing"],"security":[{"bearer":[]}]}},"/billing/invoices/{id}/simulate-pay":{"post":{"operationId":"BillingController_simulatePay","summary":"Confirm a subscription invoice payment (mock provider only)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["billing"],"security":[{"bearer":[]}]}},"/billing/{orgId}/history":{"get":{"operationId":"BillingController_history","summary":"Plan history","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["billing"],"security":[{"bearer":[]}]}},"/billing/{orgId}/invoices":{"get":{"operationId":"BillingController_invoices","summary":"Invoice history","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["billing"],"security":[{"bearer":[]}]}},"/receipts/{id}":{"get":{"operationId":"ReceiptsController_get","summary":"Public payment receipt","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["receipts"]}},"/api-keys":{"post":{"operationId":"ApiKeysController_create","summary":"Create an API key (secret shown once)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyDto"}}}},"responses":{"201":{"description":""}},"tags":["api-keys"],"security":[{"bearer":[]}]},"get":{"operationId":"ApiKeysController_list","summary":"List API keys for a store","parameters":[{"name":"store_id","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["api-keys"],"security":[{"bearer":[]}]}},"/api-keys/{id}/revoke":{"post":{"operationId":"ApiKeysController_revoke","summary":"Revoke an API key","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["api-keys"],"security":[{"bearer":[]}]}},"/api-keys/{id}/rotate":{"post":{"operationId":"ApiKeysController_rotate","summary":"Rotate an API key (revoke old, issue new)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["api-keys"],"security":[{"bearer":[]}]}},"/team/members":{"get":{"operationId":"TeamController_members","summary":"List organization members","parameters":[{"name":"org_id","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["team"],"security":[{"bearer":[]}]}},"/team/invitations":{"post":{"operationId":"TeamController_invite","summary":"Invite a user to the organization","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteDto"}}}},"responses":{"201":{"description":""}},"tags":["team"],"security":[{"bearer":[]}]},"get":{"operationId":"TeamController_invitations","summary":"List pending invitations","parameters":[{"name":"org_id","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["team"],"security":[{"bearer":[]}]}},"/team/invitations/{id}/revoke":{"post":{"operationId":"TeamController_revoke","summary":"Revoke a pending invitation","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["team"],"security":[{"bearer":[]}]}},"/team/invitations/accept":{"post":{"operationId":"TeamController_accept","summary":"Accept an invitation (as the invited, logged-in user)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInviteDto"}}}},"responses":{"201":{"description":""}},"tags":["team"],"security":[{"bearer":[]}]}},"/team/members/{userId}/role":{"post":{"operationId":"TeamController_changeRole","summary":"Change a member role","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}},{"name":"org_id","required":true,"in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeRoleDto"}}}},"responses":{"201":{"description":""}},"tags":["team"],"security":[{"bearer":[]}]}},"/team/members/{userId}":{"delete":{"operationId":"TeamController_remove","summary":"Remove a member","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}},{"name":"org_id","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["team"],"security":[{"bearer":[]}]}},"/admin/me":{"get":{"operationId":"AdminController_me","summary":"Whether the caller is a platform admin","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/metrics":{"get":{"operationId":"AdminController_metrics","summary":"Platform-wide metrics","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/support/search":{"get":{"operationId":"AdminController_supportSearch","summary":"Universal support lookup (payments/customers/stores/orgs)","parameters":[{"name":"q","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/queues":{"get":{"operationId":"AdminController_queues","summary":"BullMQ queue depths","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/orgs":{"get":{"operationId":"AdminController_orgs","summary":"List all organizations (merchants)","parameters":[{"name":"search","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/orgs/{id}":{"get":{"operationId":"AdminController_org","summary":"Organization detail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/revenue":{"get":{"operationId":"AdminController_revenue","summary":"Platform revenue (transaction fees + subscriptions)","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/orgs/{id}/plan":{"put":{"operationId":"AdminController_setPlan","summary":"Assign a subscription plan to a merchant","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/stores/{id}/fee":{"put":{"operationId":"AdminController_setFee","summary":"Set a store’s per-transaction fee (bps)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/payouts":{"get":{"operationId":"AdminController_payouts","summary":"What the platform owes each merchant (from the ledger)","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/stores/{id}/payout":{"post":{"operationId":"AdminController_payout","summary":"Execute a payout to a merchant (manual or Bakong; posts to the ledger on settle)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/payouts/history":{"get":{"operationId":"AdminController_payoutHistory","summary":"Payout execution history (PENDING/PAID/FAILED)","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/alerts/test":{"post":{"operationId":"AdminController_alertTest","summary":"Send a test operational alert to configured channels","parameters":[],"responses":{"201":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/orgs/{id}/suspend":{"post":{"operationId":"AdminController_suspend","summary":"Suspend a merchant","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/orgs/{id}/reactivate":{"post":{"operationId":"AdminController_reactivate","summary":"Reactivate a merchant","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/verifications":{"get":{"operationId":"AdminController_verifications","summary":"List merchant verifications pending review","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/verifications/{orgId}/approve":{"post":{"operationId":"AdminController_approve","summary":"Approve a merchant verification","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/verifications/{orgId}/reject":{"post":{"operationId":"AdminController_reject","summary":"Reject a merchant verification","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectVerificationDto"}}}},"responses":{"201":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/admin/plans":{"get":{"operationId":"AdminController_plans","summary":"List plans","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]},"post":{"operationId":"AdminController_upsertPlan","summary":"Create or update a plan","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertPlanDto"}}}},"responses":{"201":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/settlements":{"get":{"operationId":"SettlementsController_list","summary":"List settlement batches for a store","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["settlements"],"security":[{"bearer":[]}]}},"/dashboard/settlements/{id}":{"get":{"operationId":"SettlementsController_get","summary":"Settlement detail (with payments)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["settlements"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/settle":{"post":{"operationId":"SettlementsController_settle","summary":"Run settlement now for a store (includes today)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["settlements"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/reconcile":{"post":{"operationId":"SettlementsController_reconcile","summary":"Run reconciliation for a store over a date range","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["settlements"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/reconciliations":{"get":{"operationId":"SettlementsController_reconciliations","summary":"List reconciliation reports for a store","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["settlements"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/overview":{"get":{"operationId":"DashboardController_overview","summary":"Store overview metrics","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["dashboard"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/payments":{"get":{"operationId":"DashboardController_listPayments","summary":"List a store’s payments (dashboard view)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"search","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["dashboard"],"security":[{"bearer":[]}]}},"/dashboard/payments/{id}":{"get":{"operationId":"DashboardController_getPayment","summary":"Payment detail with timeline (dashboard view)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["dashboard"],"security":[{"bearer":[]}]}},"/dashboard/payments/{id}/refund":{"post":{"operationId":"DashboardController_refund","summary":"Refund a payment (dashboard, requires payment:write)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardRefundDto"}}}},"responses":{"201":{"description":""}},"tags":["dashboard"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/pos/charge":{"post":{"operationId":"DashboardController_posCharge","summary":"POS: charge an amount and get a KHQR to display","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["dashboard"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/pos/counter-qr":{"get":{"operationId":"DashboardController_counterQr","summary":"Get the store’s durable counter QR (open-amount link)","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["dashboard"],"security":[{"bearer":[]}]}},"/dashboard/orgs/{orgId}/audit-logs":{"get":{"operationId":"DashboardController_auditLogs","summary":"Read-only audit log (owner/admin)","parameters":[{"name":"orgId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["dashboard"],"security":[{"bearer":[]}]}},"/dashboard/stores/{storeId}/report":{"get":{"operationId":"DashboardController_report","summary":"Settlement / transaction report over a date range","parameters":[{"name":"storeId","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["dashboard"],"security":[{"bearer":[]}]}},"/health":{"get":{"operationId":"HealthController_health","summary":"Liveness probe","parameters":[],"responses":{"200":{"description":""}},"tags":["health"]}},"/ready":{"get":{"operationId":"HealthController_ready","summary":"Readiness probe (DB + provider)","parameters":[],"responses":{"200":{"description":""}},"tags":["health"]}},"/metrics":{"get":{"operationId":"MetricsController_metrics","summary":"Aggregate operational metrics (requires METRICS_TOKEN)","parameters":[],"responses":{"200":{"description":""}},"tags":["health"]}}},"info":{"title":"PayKH API","description":"Bakong KHQR payment gateway — REST API (v1)","version":"0.1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"API key (bk_live_/bk_test_) or dashboard JWT"}},"schemas":{"RegisterDto":{"type":"object","properties":{}},"ForgotPasswordDto":{"type":"object","properties":{}},"ResetPasswordDto":{"type":"object","properties":{}},"LoginDto":{"type":"object","properties":{}},"ChangePasswordDto":{"type":"object","properties":{}},"MfaCodeDto":{"type":"object","properties":{}},"CreateStoreDto":{"type":"object","properties":{}},"UpdateBrandingDto":{"type":"object","properties":{}},"UpsertCredentialDto":{"type":"object","properties":{}},"ActivateLiveDto":{"type":"object","properties":{}},"SubmitVerificationDto":{"type":"object","properties":{}},"CreateBranchDto":{"type":"object","properties":{}},"UpdateBranchDto":{"type":"object","properties":{}},"CreateCustomerDto":{"type":"object","properties":{}},"SetPreferencesDto":{"type":"object","properties":{}},"UpdateReferralProgramDto":{"type":"object","properties":{}},"PayoutCommissionsDto":{"type":"object","properties":{}},"ReviewReferralDto":{"type":"object","properties":{}},"ApiRedeemDto":{"type":"object","properties":{}},"RedeemRewardDto":{"type":"object","properties":{}},"UpdateProgramDto":{"type":"object","properties":{}},"AdjustDto":{"type":"object","properties":{}},"CreateTierDto":{"type":"object","properties":{}},"UpdateTierDto":{"type":"object","properties":{}},"CreateRewardDto":{"type":"object","properties":{}},"UpdateRewardDto":{"type":"object","properties":{}},"CreatePromotionDto":{"type":"object","properties":{}},"UpdatePromotionDto":{"type":"object","properties":{}},"RejectDto":{"type":"object","properties":{}},"CreateSegmentDto":{"type":"object","properties":{}},"PreviewRulesDto":{"type":"object","properties":{}},"UpdateSegmentDto":{"type":"object","properties":{}},"CreateGameDto":{"type":"object","properties":{}},"UpdateGameDto":{"type":"object","properties":{}},"PrizeDto":{"type":"object","properties":{}},"IssuePlayDto":{"type":"object","properties":{}},"PlayDto":{"type":"object","properties":{}},"RevenueShareDto":{"type":"object","properties":{}},"UpdateCaseDto":{"type":"object","properties":{}},"MarketingCopyDto":{"type":"object","properties":{}},"AssistantDto":{"type":"object","properties":{}},"ConnectorDto":{"type":"object","properties":{}},"CheckDto":{"type":"object","properties":{}},"SetSettingDto":{"type":"object","properties":{}},"CreateLinkDto":{"type":"object","properties":{}},"PayLinkDto":{"type":"object","properties":{}},"CreatePaymentDto":{"type":"object","properties":{}},"RefundDto":{"type":"object","properties":{}},"SimulateDto":{"type":"object","properties":{}},"CreateWebhookDto":{"type":"object","properties":{}},"UpdateWebhookDto":{"type":"object","properties":{}},"UpdateTelegramDto":{"type":"object","properties":{}},"UpdateChannelDto":{"type":"object","properties":{}},"ChangePlanDto":{"type":"object","properties":{}},"CreateApiKeyDto":{"type":"object","properties":{}},"InviteDto":{"type":"object","properties":{}},"AcceptInviteDto":{"type":"object","properties":{}},"ChangeRoleDto":{"type":"object","properties":{}},"RejectVerificationDto":{"type":"object","properties":{}},"UpsertPlanDto":{"type":"object","properties":{}},"DashboardRefundDto":{"type":"object","properties":{}}}}}