Payment methods
One integration, 40+ ways to pay. Set payment_method to a method code, handle next_action, and Finscale does the rest — including picking the right provider for that method. This page covers the families, their payload shapes, and the full catalog.
Method families
Every method belongs to a family. The family is a docs-side grouping (the API only ever sees the method code in payment_method) — but it predicts how the flow feels, how refunds work, and whether chargebacks exist.
| Family | How it feels | Chargebacks |
|---|---|---|
| Cards | Tokenized card, optional 3-D Secure challenge. Instant answer. | Yes |
| Bank redirects | Customer is redirected to their bank, approves, returns. iDEAL, Bancontact, EPS, Przelewy24, FPX, Trustly. | No — push payments |
| Wallets | Device or app confirms: Apple Pay, Google Pay, PayPal, Alipay, WeChat Pay, Cash App Pay, Kakao Pay, MobilePay, Vipps, TWINT, Satispay, GrabPay, GoPay. | Card-funded wallets: yes |
| Real-time payments | QR code, app push, or a short code: UPI, PIX, Blik, Swish, MB Way, PayNow, PromptPay. Settles in seconds. | No |
| Buy now, pay later | The BNPL provider approves the customer for installments or deferred payment and pays you up front, in full — it owns the credit and fraud risk. Klarna, Affirm, Afterpay / Clearpay. | No — disputes go via the provider |
| Vouchers | Customer gets a cash reference — barcode, slip, or code — and pays at a store, bank, or ATM: OXXO, Boleto, Konbini, Multibanco. Succeeds when the cash is registered, hours or days later. | No |
| Bank transfers | Customer pushes a credit transfer with a reference: SEPA Credit Transfer, SPEI. | No |
| Direct debit | You pull from the account under a mandate: SEPA Direct Debit, ACH, Bacs, BECS, ACSS. Days to settle, returnable. | Returns, up to 8 weeks (SEPA) |
| Mobile money | Customer approves a debit from their mobile-money balance on their phone: M-Pesa. | No — reversals only |
| Crypto | Customer sends USDC to a one-time address; you settle in fiat or USDC. | No — irreversible |
Payload shapes by family
Same endpoint, same envelope — only payment_method changes, plus payment_method_id when charging a saved instrument (pm_…, created via POST /v1/payment_methods). Everything method-specific — bank selection, QR codes, wallet approval — happens on the Finscale-hosted page behind next_action.url.
// 1. Exchange the hosted-checkout token for an instrument
// POST /v1/payment_methods
{ "type": "card", "token": "tok_2Fj9dW7xPq" }
// → { "id": "pm_7Wq2xN9dT4Ls", … }
// 2. Charge it — POST /v1/payments
{
"amount": 4900,
"currency": "EUR",
"payment_method": "card",
"payment_method_id": "pm_7Wq2xN9dT4Ls",
"reference": "ord_9f21_0716",
"return_url": "https://shop.example.com/checkout/return"
}
The one-time tok_… comes from Finscale fields or hosted checkout — in live mode the API rejects raw card numbers, so card data never touches your servers. If the issuer demands 3-D Secure, the payment returns requires_action with a redirect.
{
"amount": 4900,
"currency": "EUR",
"payment_method": "ideal",
"reference": "ord_9f21_0716",
"customer": { "email": "anna@example.com" },
"return_url": "https://shop.example.com/checkout/return"
}
No details object needed — the customer picks their bank on the redirect page. You get back next_action.type: "redirect"; send the customer to next_action.url and wait for the webhook. return_url is required for every redirect method.
Buy now, pay later uses the exact same shape: set payment_method to klarna, affirm, or afterpay_clearpay and the customer completes the provider's approval flow behind next_action.url. You are paid up front, in full — the BNPL provider carries the installments and the credit risk.
// 1. Finscale checkout components wrap the device's encrypted
// payment token into a one-time tok_… — exchange it:
// POST /v1/payment_methods
{ "type": "apple_pay", "token": "tok_8Rc4kY2mVs" }
// → { "id": "pm_3Kd8wQ5rN2Xv", … }
// 2. Charge it — POST /v1/payments
{
"amount": 4900,
"currency": "EUR",
"payment_method": "apple_pay",
"payment_method_id": "pm_3Kd8wQ5rN2Xv",
"reference": "ord_9f21_0716"
}
Behind the pm_… sits the device's encrypted payment token — Finscale decrypts it and routes it like a card, so device-wallet payments inherit card routing and failover. App wallets (PayPal, Alipay, WeChat Pay, Cash App Pay, Kakao Pay, MobilePay, Vipps, TWINT, Satispay, GrabPay, GoPay) skip the instrument step entirely and return a redirect next_action that opens or deep-links the wallet app.
// UPI — the hosted page collects the customer's VPA and
// pushes an approval request to their UPI app
{
"amount": 419900,
"currency": "INR",
"payment_method": "upi",
"reference": "ord_9f21_0716",
"return_url": "https://shop.example.com/checkout/return"
}
// → next_action: { "type": "redirect", "url": "https://pay.finscale.dev/r/7Nu4pV2r" }
// PIX — the hosted page shows a QR code for the banking app
{
"amount": 26500,
"currency": "BRL",
"payment_method": "pix",
"reference": "ord_9f21_0716",
"return_url": "https://shop.example.com/checkout/return"
}
// → next_action: { "type": "redirect", "url": "https://pay.finscale.dev/r/2Xw9cJ6p" }
Every RTP method returns a redirect next_action: the Finscale-hosted page collects the UPI VPA, shows the PIX, PayNow, or PromptPay QR code, collects the 6-digit Blik code, or takes the phone number that MB Way pushes an approval prompt to. RTP payments confirm in seconds; the terminal webhook is the source of truth.
{
"amount": 89900,
"currency": "MXN",
"payment_method": "oxxo",
"reference": "ord_9f21_0716",
"customer": { "email": "anna@example.com" },
"return_url": "https://shop.example.com/checkout/return"
}
// → next_action: { "type": "redirect", "url": "https://pay.finscale.dev/r/6Tb3wM8k" }
The hosted page behind next_action.url issues the cash reference — a barcode for OXXO and Konbini, a numbered slip for Boleto, an entity + reference pair for Multibanco. The customer then pays at a store, bank, or ATM, so the flow is asynchronous: the payment stays requires_action until the scheme reports the cash, then payment.succeeded fires — hours or days later. Unpaid vouchers expire to failed. Fulfill from the webhook, never from the return redirect.
{
"amount": 4900,
"currency": "EUR",
"payment_method": "sepa_debit",
"payment_method_id": "pm_9Sd4bT7kW2Qn",
"reference": "ord_9f21_0716",
"customer": { "email": "anna@example.com" }
}
The pm_… instrument carries the IBAN and the SEPA mandate — hosted checkout collects both and records mandate acceptance, then POST /v1/payment_methods (type: "sepa_debit" + the checkout token) turns them into a reusable instrument. Direct debit is asynchronous: the payment sits in processing for 2–5 business days before payment.succeeded — and can still be returned after that (see chargeback risk).
Every direct-debit method follows the same mandate model, each under its local scheme's rules: ACH carries routing and account numbers under an ACH authorization, Bacs (UK) a Direct Debit Instruction, BECS (Australia/New Zealand) a Direct Debit Request, and ACSS (Canada) a pre-authorized debit agreement. Hosted checkout records the right mandate text per scheme; the instrument is reusable until the mandate is revoked.
{
"amount": 4900,
"currency": "EUR",
"payment_method": "usdc",
"reference": "ord_9f21_0716",
"return_url": "https://shop.example.com/checkout/return"
}
// → next_action: { "type": "redirect", "url": "https://pay.finscale.dev/r/9Fc1nS8v" }
You price in fiat; the hosted page behind next_action.url quotes the USDC amount, shows a one-time deposit address, and confirms on-chain receipt. Settlement lands in your normal payout, in fiat or USDC per your account settings. Transfers are irreversible — refunds go back to the sending address as a new transfer.
The method catalog
Every method, its code, and its operational profile. Refunds says how money goes back — natively on the same rail, or via credit transfer (see refund caveats). Chargeback risk is the dispute exposure inherent to the rail.
| Method | Code | Family | Countries | Currencies | Refunds | Chargeback risk |
|---|---|---|---|---|---|---|
| Cards | card | Card | Global | 135+ | Full + partial | High |
| Apple Pay | apple_pay | Wallet | Global | As card | Full + partial | As card |
| Google Pay | google_pay | Wallet | Global | As card | Full + partial | As card |
| PayPal | paypal | Wallet | Global | Major currencies | Full + partial | Medium — provider disputes |
| USDC | usdc | Crypto | Global | Priced in fiat, paid in USDC | Full + partial | None — irreversible |
| UPI | upi | Real-time | IN | INR | Full + partial | None |
| iDEAL | ideal | Bank redirect | NL | EUR | Via credit transfer | None |
| Bancontact | bancontact | Bank redirect | BE | EUR | Via credit transfer | None |
| Blik | blik | Real-time | PL | PLN | Full + partial | None |
| Przelewy24 | p24 | Bank redirect | PL | PLN, EUR | Via credit transfer | None |
| PIX | pix | Real-time | BR | BRL | Full + partial | None |
| Boleto | boleto | Voucher | BR | BRL | Via credit transfer | None |
| MB Way | mb_way | Real-time | PT | EUR | Full + partial | None |
| Multibanco | multibanco | Voucher | PT | EUR | Via credit transfer | None |
| Trustly | trustly | Bank redirect | EU + Nordics | EUR, SEK, DKK, NOK, GBP | Full + partial | None |
| EPS | eps | Bank redirect | AT | EUR | Via credit transfer | None |
| Satispay | satispay | Wallet | IT | EUR | Full + partial | Low |
| MobilePay | mobilepay | Wallet | DK, FI | DKK, EUR | Full + partial | Low |
| Vipps | vipps | Wallet | NO | NOK | Full + partial | Low |
| Swish | swish | Real-time | SE | SEK | Full + partial | None |
| TWINT | twint | Wallet | CH | CHF | Full + partial | Low |
| Klarna | klarna | Buy now, pay later | EU, UK, US | EUR, GBP, USD, SEK, NOK, DKK, PLN, CHF | Full + partial | Low — provider disputes |
| Affirm | affirm | Buy now, pay later | US, CA | USD, CAD | Full + partial | Low — provider disputes |
| Afterpay / Clearpay | afterpay_clearpay | Buy now, pay later | US, UK, AU, NZ | USD, GBP, AUD, NZD | Full + partial | Low — provider disputes |
| Cash App Pay | cashapp | Wallet | US | USD | Full + partial | Low |
| Alipay | alipay | Wallet | CN + Asia | CNY + major currencies | Full + partial | Low |
| WeChat Pay | wechat_pay | Wallet | CN + Asia | CNY + major currencies | Full + partial | Low |
| Kakao Pay | kakao_pay | Wallet | KR | KRW | Full + partial | Low |
| Konbini | konbini | Voucher | JP | JPY | Via credit transfer | None |
| GrabPay | grabpay | Wallet | SG, MY, PH, TH, VN, ID | SGD, MYR, PHP, THB, VND, IDR | Full | Low |
| GoPay | gopay | Wallet | ID | IDR | Full | Low |
| FPX | fpx | Bank redirect | MY | MYR | Via credit transfer | None |
| PayNow | paynow | Real-time | SG | SGD | Full + partial | None |
| PromptPay | promptpay | Real-time | TH | THB | Full + partial | None |
| M-Pesa | mpesa | Mobile money | KE | KES | Via reversal | None |
| OXXO | oxxo | Voucher | MX | MXN | Via credit transfer | None |
| SPEI | spei | Bank transfer | MX | MXN | Via credit transfer | None |
| SEPA Direct Debit | sepa_debit | Direct debit | SEPA (36) | EUR | Full + partial | High — 8-week returns |
| SEPA Credit Transfer | sepa_credit | Bank transfer | SEPA (36) | EUR | Via credit transfer | None |
| ACH | ach | Direct debit | US | USD | Full + partial | Medium — returns |
| Bacs Direct Debit | bacs_debit | Direct debit | UK | GBP | Full + partial | Medium — indemnity claims |
| BECS Direct Debit | becs_debit | Direct debit | AU, NZ | AUD, NZD | Full + partial | Medium — returns |
| ACSS Debit | acss_debit | Direct debit | CA | CAD | Full + partial | Medium — returns |
Enabling methods
Methods are enabled per merchant account. Card payments work out of the box; local methods are switched on in Dashboard → Settings → Payment methods. Most activate instantly — a few (direct debit, USDC) need extra business information first, and the dashboard tells you what's missing.
Note that GET /v1/payment_methods is not a method catalog — it lists a customer's saved instruments (customer is a required query parameter). Use it to offer "pay with your saved card" at checkout:
{
"object": "list",
"data": [
{
"id": "pm_7Wq2xN9dT4Ls",
"object": "payment_method",
"type": "card",
"customer": "cus_4T8nQb2Wp1Zr",
"card": {
"brand": "visa",
"last4": "4242",
"exp_month": 12,
"exp_year": 2028,
"funding": "debit",
"country": "NL"
},
"livemode": false,
"created_at": "2026-07-16T09:24:31Z"
}
],
"has_more": false
}