Skip to main content
All routes require:
Paths are store-scoped. The key must include the scope for that method and access to that shop. Dashboard permission ceiling: managePayments. storeId in the JSON body is ignored. The shop is the {storeId} in the path. These routes are rate limited to 120 requests per 60 seconds (429).

Payment method ids

Payment method ids that exist are only: customer-balance, stripe, paypal, mollie, square, sumup, revolut, authorizenet, skrill, misticpay, rewarble, paypal-ff, venmo-ff, cash-app, shopify, adyen, lemon-squeezy, whop, overpay, paymongo, dodo, pandabase, moneymotion, amazon-ps, custom, cryptomus, nowpayments, join-markt-crypto. Those are the only catalog method ids. paymentNotesConfig.lists[].method is only cash-app, paypal-ff, or venmo-ff. paymentOptionsConfig.methods keys are trimmed strings and are not limited to that list: a blank key is dropped, a catalog id used as a key is one of the ids above, and any other key is stored. Checkout reads a custom method presentation at custom:{id}. That key is not another catalog method id. Enable flags map to method ids as follows. custom has no enable flag on this resource. customer-balance is paymentOptionsConfig.customerBalanceEnabled. Setting an enable flag to true for a method the platform has disabled returns 403 when that flag is not already true on the store. The error is This payment method is disabled by the platform administrator, with the administrator reason appended when one is set. If the store already has that flag true, the save turns the flag off and does not return 403. Setting a flag to false is allowed. customer-balance has no stale-enable exception: turning customerBalanceEnabled on while the platform has disabled customer-balance returns 403. joinMarktCryptoEnabled: true also requires Premium or Business (403, code plan_join_markt_crypto).

Get

Scope: payment:read Returns the payment settings object. A missing store returns 404. Non-empty values whose names match these patterns are replaced with the string [redacted]. Null and empty string are left as stored. Secret, ApiKey, ClientSecret, TransactionKey, SignatureKey, WebhookSecret, ShaRequestPhrase, ShaResponsePhrase, AccessCode, Password, botToken (each matched at the end of the field name, case-insensitive). Fields that do not match are returned as stored. A name ending in SecretKey does not match Secret. That includes stripeSecretKey, squareAccessToken, skrillSecretWord, adyenWebhookHmacKey, overpayPublicKey, overpaySecretKey, and paymongoSecretKey. paypalIntegrationType is rest when the stored value is null. paypalFfUnderpayPercent, venmoFfUnderpayPercent, and cashAppUnderpayPercent are 5 when the stored value is null. joinMarktCryptoPayoutEmail is the store owner’s platform account email when that email exists, otherwise the stored payout email. cryptomusCommissionPercentage and nowpaymentsCommissionPercentage are not in this object. GET returns paymongoPaymentMethodTypes as stored. On update it is parsed to PayMongo checkout type ids on the paymongo method: card, gcash, paymaya, grab_pay, shopee_pay, qrph, dob, brankas, billease, atome. Those are not extra payment method ids. Unknown ids are dropped. A non-array, or an array that keeps nothing, is stored as card, gcash, paymaya, grab_pay, qrph.

Update

Scope: payment:write PUT runs the same handler as PATCH. Status 200. The response is the same object as GET, after redaction. A new secret can be written. Matching secret fields come back as [redacted]. The body must be a JSON object. An empty object, or an object that only contains storeId, returns 400 (No updatable payment fields provided). Invalid JSON returns 400. These keys return 403 and nothing is saved:
  • cryptomusCommissionPercentage
  • nowpaymentsCommissionPercentage
  • joinMarktCryptoCommissionPercentage
  • joinMarktCryptoPayoutEmail
The message is {key} cannot be changed via the Merchant API. Recognized payment fields from the GET table are applied. Other keys the store update understands are also applied. Keys it does not read are ignored. The response is still only the payment settings object. Write rules that differ from a plain assign: joinMarktCryptoPayoutWallets shape:

paymentOptionsConfig

Invalid options return 400.

paymentNotesConfig

lists max 100. Each list requires id (1–64), name (1–80), method (cash-app, paypal-ff, or venmo-ff), notes (1–50 strings, each 1–200), enabled, and updatedAt as a datetime string. Invalid notes return 400.

Errors

Error JSON is { "success": false, "error": "...", "code": "..." }. Plan gates add requiredPlan and upgradePath.