Skip to main content

Payment methods

A payment method code names the rail a payment or transfer moves over - a card, a bank debit, a local wallet, a cash voucher. You send it as payment_method.code when you create a payment or a transfer, and it comes back as payment_method on the resulting order and transactions. Codes are snake_case strings; lowercase is canonical and requests accept any case (see Conventions).

This page lists every code the Merchant API knows, grouped by family. It is the companion to the PaymentMethodCode schema in the API reference.

Where the code appears​

FieldDirectionWhere
payment_method.codeRequestPOST /v1/payments (direct payments) and POST /v1/transfers (transfers). Required.
payment_methodResponseTransaction and Order objects returned by the search, get, and by-reference endpoints. null while unknown.
payment_methodWebhookPayment event payloads.
codeResponseGET /v1/payment-methods and GET /v1/payment-methods/{code}/fields - the methods you can charge in a given context, with the body fields each needs (discovery).

A checkout session takes no code when you create it - the customer picks a method on the hosted page, and the chosen code then appears on the resulting order and transactions.

Two umbrella codes
  • card covers every card scheme. The scheme is detected from the card number, so you never send visa or mastercard. See Card payments.
  • bank covers every regional bank-transfer rail (SEPA, Faster Payments, ACH, SPEI, Zengin…). The provider you route to maps it to the concrete rail from the currency, country, and account fields you supply. See Transfers.

Availability​

Being on this page does not mean a code is live on your account. A method works only when a provider channel configured on your account supports it for the transaction's country and currency; the catalog below is the superset across all providers. Which methods you can offer is agreed during onboarding; to see what is live for a given country and currency right now - and which fields each method needs - call GET /v1/payment-methods.

The errors you will see when a code is not usable:

Error codeMeaning
unknown_payment_methodThe code is not one listed on this page.
payment_method_not_supported_by_providerThe code exists, but the provider your request routed to does not support it.
payment_unroutableNo provider channel on your account can take this method for this country and currency.

Discovering methods and required fields​

Which methods are live on your account for a given country and currency is decided by your routing configuration - and so is which POST /v1/payments body fields each one needs, because different providers ask for different customer details. Rather than hard-code either, ask the API:

EndpointReturns
GET /v1/payment-methods?country=BR&currency=BRL&amount=150.00Every method you can charge in that context, each with its required_fields.
GET /v1/payment-methods/{code}/fields?country=BR&currency=BRL&amount=150.00The same descriptor for one method. 404 payment_unroutable when it cannot be routed for you there.

country and currency are required and mean the same as on the payment you are about to create. amount is optional; pass it when you know it, so amount-range routing rules are applied and the primary/fallback split is exact. Both are GETs with no body: sign timestamp + path + "" - the query string is not part of the signed string (see Signing).

REQ_PATH="/v1/payment-methods/pix/fields"
TS=$(date +%s)
SIG=$(printf '%s' "${TS}${REQ_PATH}" \
| openssl dgst -sha256 -hmac "$UPPROVE_SIGNING_SECRET" | sed 's/^.*= //')

curl -sS "https://api.sandbox.upprove.com${REQ_PATH}?country=BR&currency=BRL&amount=150.00" \
-H "Authorization: Bearer $UPPROVE_SECRET_KEY" \
-H "X-Signature: t=${TS}, v1=${SIG}"
{
"code": "pix",
"display_name": "Pix",
"type": "real_time_payment",
"requires_redirect": false,
"required_fields": [
{
"path": "customer.name",
"field_type": "text",
"required": true,
"reason": "primary",
"label": "Full name"
},
{
"path": "customer.email",
"field_type": "email",
"required": true,
"reason": "primary",
"label": "Email"
},
{
"path": "payment_method.details.document_id",
"field_type": "text",
"required": true,
"reason": "primary",
"label": "National ID number"
},
{
"path": "customer.billing_address.country",
"field_type": "country",
"required": false,
"reason": "fallback",
"label": "Country"
}
]
}

The list endpoint wraps the same objects in the usual list envelope, unpaged: has_more is always false and there are no page/limit fields. type is the method's family, using the same names as the sections below (card, wallet, real_time_payment, …). requires_redirect is indicative only - always act on the next_action.type the payment response gives you.

Reading required_fields​

Each entry is one field of the create-payment body, identified by its path (customer.email, payment_method.details.document_id, …), with a field_type you can validate against and a label you can show. What matters is reason:

  • primary - the provider your payment will be routed to first needs it. required is that provider's rule: leave a required primary field out and POST /v1/payments fails with validation_failed.
  • fallback - only a provider further down your routing chain needs it. It is always optional. If you send it, the payment can cascade to that provider after the primary declines; if you don't, that fallback is skipped.

A field is listed once - as primary if the primary provider wants it, otherwise as fallback. customer.name and the pair customer.first_name + customer.last_name satisfy each other, so send whichever you hold. card is listed like any other method, but its required_fields is empty: the card itself is collected by Upprove.js after next_action: collect_card (see Card payments), so nothing card-specific belongs in the body.

The answer is resolved against your routing at request time, so it changes when your configuration changes or a provider is temporarily unavailable - a method none of whose channels can currently take the payment is left out of the list and is 404 payment_unroutable on lookup. Cache it briefly at most, and re-check just before you create the payment.

Redirects and next actions​

Most non-card methods send the customer away to approve the payment - to their bank, a wallet app, or a hosted page. Do not decide this from the code: the payment response tells you what to do next through next_action.type - redirect, collect_card, qr (e.g. Pix), voucher (e.g. OXXO, Boleto), bank_transfer (e.g. SPEI), or three_ds_challenge. See Direct payments and the NextAction schema in the API Reference.

Identity documents for LATAM methods​

For pix, boleto, spei, oxxo, and pse, pass the paying customer's national identity document in payment_method.details.document_id - the CPF in Brazil, CURP or RFC in Mexico, cedula in Colombia. The payment is rejected with a validation error when it is missing or malformed for the method's country. See the note in Direct payments.

Payments vs transfers​

A transfer uses the same payment_method.code, but there it names the destination rail rather than the way a customer pays. The accompanying payment_method.details describes the destination payment instrument - a bank account for bank, a holder email or phone for a wallet, an alias for a real-time-payment method, or a tokenized card for card. A code that cannot receive funds is rejected with payment_method_not_supported_as_destination.

Codes by family​

The family headings below are a documentation grouping only - the API returns the code, never the family. Within each family the codes are listed alphabetically.

Cards​

CodeMethod
cardCard

Every card scheme is charged with the single code card; see Card payments.

Card wallets​

CodeMethod
apple_payApple Pay
google_payGoogle Pay

Bank transfers​

CodeMethod
bankBank Transfer
brebBre-B
codiCoDi
cvuTransferencia CVU
oxxo_payOXXO Pay
speiSPEI

Bank debits​

CodeMethod
instant_bankInstant Bank Payments
psePSE

Bank redirects​

CodeMethod
bancontactBancontact
blikBLIK
epsEPS
fpxFPX
idealiDEAL
interac_etransferInterac e-Transfer
khipuKhipu
p24Przelewy24
paynowPayNow
rapid_transferRapid Transfer
trustlyTrustly
twintTWINT
webpayWebpay

Real-time payments​

CodeMethod
paytoPayTo
pixPix
promptpayPromptPay
swishSwish
upiUPI

Wallets​

CodeMethod
aeon_payAEON Pay
alipayAlipay
bakongBakong
bkashbKash
boost_myBoost
bpi_onlineBPI Online
cash_app_payCash App Pay
danaDANA
dbs_paylahDBS PayLah!
easycardEasyCard
easypaisaEasypaisa
ezlinkEZ-Link
gcashGCash
grabpayGrabPay
hipayHipay
jazzcashJazzCash
jkopayJKOPay
kakao_payKakao Pay
kplusK PLUS
krungthai_nextKrungthai NEXT
lankapayLankaPay
linkLink
linkajaLinkAja
m_pesaM-Pesa
machMach
mayaMaya
maybank_qrMaybank QR
mercadopagoMercado Pago
mobilepayMobilePay
momoMoMo
mpayMPay
mtn_momoMTN Mobile Money
naver_payNaver Pay
nequiNequi
netellerNeteller
orange_moneyOrange Money
ovoOVO
paycoPAYCO
paypalPayPal
paypayPayPay
pi_payPi Pay
picpayPicPay
plinPlin
rabbit_line_payRabbit LINE Pay
revolut_payRevolut Pay
rumc_hkRuMC
samsung_paySamsung Pay
satispaySatispay
skrill_walletSkrill Wallet
stc_paySTC Pay
tngTouch'n Go
toditoTodito Cash
tosspayToss Pay
tpagaTPaga
truemoneyTrueMoney
venmoVenmo
vnpayVNPAY
wechat_payWeChat Pay
yapeYape
zalopayZaloPay

Buy now, pay later​

CodeMethod
affirmAffirm
afterpayAfterpay/Clearpay
klarnaKlarna
meses_sin_interesesMeses sin intereses
tabbyTabby
tamaraTamara
zipZip

Vouchers and cash​

CodeMethod
boletoBoleto
efectyEfecty
fawryFawry
konbiniKonbini
multibancoMultibanco
oxxoOXXO
pagoefectivoPagoEfectivo
pagofacilPago Fácil
paynetPayNet
paysafecardPaysafecard
paysafecashPaysafecash
rapipagoRapipago
servipagServipag
tupayTupay

Crypto​

CodeMethod
cryptoCrypto

You charge a fixed fiat amount and are settled in fiat; the payer picks the coin and network on the provider's hosted page. A payer who sends less or more than asked leaves the payment held for your decision - see Under- and overpayments.