Create Setup Intent
Saves a buyer’s payment method for later without charging it — one the buyer just supplied through the payment elements in setup mode, or one already on file to re-verify. The setup completes in the background, so the response is the setup intent as created, not its outcome: hand client_secret to the elements’ handleNextAction, or poll Retrieve setup status. A buyer’s own token holding member:payment_methods:use may create a setup intent for itself from a confirmation token.
Authorizations
An Account API key, an App API key, an account access token, an account-scoped user token, or a user OAuth token. Prepend the key or token with Bearer, for example Bearer ***************************. See Auth & API keys for how to get each one.
Headers
A unique key that makes this request safe to retry. See Idempotent requests.
255"d9105228-4a08-46b1-8b91-42fed586d383"
Body
A confirmation token describing a payment method the buyer just supplied, collected by the payment elements in setup mode. Provide this or payment_method_id, not both. The buyer is resolved from the token's billing email, or from email, and may still have a step to complete — poll Retrieve setup status for what to do next.
"ctok_xxxxxxxxxxxxxx"
Who the saved payment method belongs to. Pass account_id to save it on the account itself, which needs payment:charge on the account. Pass your own user ID, prefixed user_, to save it on the authenticated user. Omit it to save it on the buyer: the caller when it is the buyer, otherwise the user the confirmation token names. Not available with payment_method_id, which keeps its current owner, or with purpose.
"biz_xxxxxxxxxxxxxx"
What the saved payment method will pay for. Set to ads_billing when saving a card to pay for Whop Ads on account_id: the card is verified by Whop Ads, the merchant that charges it, which helps minimize security declines on ad payments, and it requires ad_campaign:create on account_id. Omit it for any other payment method.
ads_billing, null "ads_billing"
3D Secure behavior for supported on-session card payments. mandate_challenge requires a 3DS challenge before payment processing; mandate_if_required mandates a challenge only when the payment processor requires it; frictionless_if_required uses the regular frictionless 3DS flow. Payments of $1,000 or more use mandate_if_required unless mandate_challenge is selected. Risk and authentication recovery requirements can override the preference. Applies to this setup only, and only while the buyer is present: ignored with payment_method_id, which re-verifies off session. Not available with purpose: ads_billing. Defaults to frictionless_if_required.
mandate_challenge, mandate_if_required, frictionless_if_required, null "mandate_challenge"
Response
setup intent created from a confirmation token
The credential a buyer's surface presents to poll this setup and set its return URL — hand it to the elements' handleNextAction. Only on setups created through this API, and always null in list responses — retrieve the setup intent for it.
"sint_xxxxxxxxxxxxxx_secret_vdefault_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
The kind of instrument being saved, for example card or us_bank_account.
acss_debit, addi, affirm, afterpay_clearpay, alipay, alipayhk, alma, amazon_pay, apple, apple_pay, au_bank_transfer, au_becs_debit, bacs_debit, bancolombia, bancontact, bank_wire, billie, blik, boleto, bre_b, ca_bank_transfer, capchase_pay, card, card_present, card_installments_three, card_installments_six, card_installments_twelve, cashapp, claritypay, coinbase, crypto, crypto_subscription, custom, customer_balance, demo_pay, duitnow_qr, efecty, eps, eu_bank_transfer, fpx, flex_pay, gb_bank_transfer, gcash, giropay, google_pay, gopay, grabpay, id_bank_transfer, ideal, interac, international_bank_wire, kakao_pay, klarna, klarna_pay_now, konbini, kr_card, kr_market, kriya, kueski, link, mb_way, m_pesa, mercado_pago, mercado_pago_ar, mercado_pago_mx, mobilepay, modo, mondu, multibanco, naver_pay, nequi, netbanking, ng_bank, ng_bank_transfer, ng_card, ng_market, ng_ussd, ng_wallet, nupay, nz_bank_account, oney, oney_3x, oney_4x, opay, oxxo, p24, pago_efectivo, pse, pay_by_bank, payco, paynow, paypal, paypal_express, paypay, payto, payto_email, payto_phone, payto_bank_account, pix, platform_balance, promptpay, qris, rapipago, rechnung, revolut_pay, samsung_pay, satispay, scalapay, sencillito, sepa_debit, sequra, servipag, sezzle, shop_pay, shopeepay, sofort, south_korea_market, spei, splitit, sunbit, swish, tabby, tamara, touch_n_go, twint, upi, us_bank_account, us_bank_transfer, venmo, verve, vipps, webpay, wechat_pay, whop_pay, yape, zip, coinflow, unknown "acss_debit"
How far the setup has got. A 201 or 200 means we answered, not that the method was saved — always branch on this. requires_action — the buyer has a step outstanding; hand client_secret to the elements or poll Retrieve setup status. processing — the processor is deciding. succeeded — the method is saved, and only this one means saved. canceled — abandoned or refused; see last_setup_error.
processing, succeeded, canceled, requires_action "requires_action"
3D Secure behavior for supported on-session card payments. mandate_challenge requires a 3DS challenge before payment processing; mandate_if_required mandates a challenge only when the payment processor requires it; frictionless_if_required uses the regular frictionless 3DS flow. Payments of $1,000 or more use mandate_if_required unless mandate_challenge is selected. Risk and authentication recovery requirements can override the preference. The setting requested for this setup, or null when unset.
mandate_challenge, mandate_if_required, frictionless_if_required, null "frictionless_if_required"

